hlovdal's answer illustrates that, in this case, you have to find more elements than you need, and then filter them (despite all the ClearCase find features).
Note:
cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print
could give you directly the elements (and not the version which may not be interesting in this case). You can find the version with -version
and a format directive as explained below.
With the help of fmt_ccase, you can tailor the output to get precisely what your perl script will need to go on:
cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
-fmt "%En %l\n"
will display the full path of the element (instead of the version: /a/b/myFile@@/main/myVersion) => /a/b/myFile'. the '
\n` ensure one result per line.
-version
and -fmt "%n %l\n"
would display the version
\"$CLEARCASE_XPN\"
: the double quotes arount the extended path of the version found ensure a file with spaces in its name will still work.
grep -v ","
: if there is any comma, that means "more than one label"
%Cl
: avoid displaying the all list of labels. Anyway, if there are more than one, you are not interested!
So, for finding the exact version:
cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}'
Note:
The above works with unix syntax. The windows syntax would be:
cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}"
, which would list the version of files with only one (correct) label.
awk '{sub(/ \(.*/,"");print}'
will transform "myFile@@/main/myVersion (LBL_A)
" into "myFile@@/main/myVersion"