ClearCase: Trouvez des fichiers ayant exactement une étiquette spécifique et pas plus
Question
Je souhaite rechercher dans ClearCase des fichiers portant une étiquette spécifique mais pour lesquels aucune autre étiquette n'est définie .
Par exemple, si j'ai des fichiers portant le libellé suivant:
file1 LBL_A, LBL_B
file2 LBL_A
J'aimerais avoir une requête qui me donne juste fichier2 et non fichier1.
Existe-t-il un moyen de le faire avec cleartool find? Si cela n'est pas possible avec une seule requête, je serais également heureux de savoir comment le faire en plusieurs étapes (j'appellerai cleartool à partir d'un script Perl, il sera donc facile de sauvegarder des listes de fichiers temporairement et exécutez d’autres commandes sur eux).
Merci beaucoup d'avance!
Jan
La solution
En supposant que LBL_A est la (seule) étiquette à exécuter
cleartool find /some/dir -version 'lbtype(LBL_A)' -print | xargs cleartool describe -fmt "%n: %l"
devrait donner
file1: (LBL_A, LBL_B)
file2: (LBL_A)
comme sortie que vous pouvez ensuite vérifier dans votre script Perl ou filtrer à travers sed -n 's / \ (. * \): (LBL_A) / \ 1 / p'
(en supposant qu'il n'y ait pas de virgule) dans les noms de fichiers).
Mise à jour: Comme le souligne correctement VonC, la commande ci-dessus échouera pour les fichiers contenant des espaces. Pour gérer cette exécution en tant que:
cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool ....
qui traduira les nouvelles lignes en ascii null et que xargs l'utilisera comme séparateur.
Autres conseils
Vous pouvez le faire directement sans avoir à canaliser:
cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print
La réponse de hlovdal montre que, dans ce cas, vous devez trouver plus d'éléments que nécessaire, puis les filtrer (malgré tous les Fonctions de recherche ClearCase ).
Remarque:
cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print
pourrait vous donner directement les éléments (et non la version qui pourrait ne pas être intéressante dans ce cas). Vous pouvez trouver la version avec -version
et une directive de format, comme expliqué ci-dessous.
À l'aide de fmt_ccase , vous pouvez personnaliser le résultat pour obtenir précisément ce dont votre script Perl aura besoin:
. cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
-
-fmt "% En% l \ n"
affichera le chemin complet de l'élément (au lieu de la version: / a / b / monFichier @@ / main / myVersion)= > / a / b / monFichier '. les '
\ n` garantissent un résultat par ligne. -
-version
et-fmt "% n% l \ n"
afficheraient la version -
\ "$ CLEARCASE_XPN \"
: les guillemets doubles autour du chemin étendu de la version trouvée garantissent qu'un fichier avec des espaces dans son nom fonctionnera toujours. -
grep -v ","
: s'il y a une virgule, cela signifie "plus d'une étiquette" -
% Cl
: évitez d'afficher la liste des étiquettes toutes . Quoi qu'il en soit, s'il y en a plus d'un, cela ne vous intéresse pas!
Donc, pour trouver la version exacte :
cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}'
Note:
Ce qui précède fonctionne avec la syntaxe unix. La syntaxe de Windows serait:
cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}"
, qui listerait la version des fichiers avec une seule étiquette (correcte).
-
awk '{sub (/ \ (. * /, "")); print}'
transformera"monFichier @@ / main / maVersion (LBL_A)
"dans" monFichier @@ / main / maVersion "