ClearCase: Trouvez des fichiers ayant exactement une étiquette spécifique et pas plus

StackOverflow https://stackoverflow.com/questions/1037659

  •  10-07-2019
  •  | 
  •  

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

Était-ce utile?

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 "
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top