2009-06-24 5 views
5

Je voudrais trouver des fichiers dans ClearCase qui sont étiquetés avec une étiquette spécifique, mais que n'a pas d'autres étiquettes définies.ClearCase: Trouver des fichiers ayant exactement une étiquette spécifique et pas plus

Par exemple, si j'ai des fichiers étiquetés comme ceci:

file1 LBL_A, LBL_B 
file2 LBL_A 

Je voudrais avoir une requête qui me donne juste fichier2 et non fichier1.

Existe-t-il un moyen de le faire avec la recherche de cleartool? Si cela n'est pas possible avec une seule requête, je serais également heureux pour toutes les idées comment faire ceci en plusieurs étapes (j'appellerai cleartool d'un manuscrit de perl, ainsi il sera facile de sauver des listes de dossiers temporairement et exécuter d'autres commandes sur eux).

Merci beaucoup d'avance!

Jan

+0

juste mis à jour mes lignes de commande à afficher les versions au lieu de l'élément – VonC

Répondre

6

Si l'on suppose LBL_A est (seulement) étiquette que vous voulez courir

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) 

en sortie que vous pouvez vérifier dans votre script perl ou filtrer sed -n 's/\(.*\): (LBL_A)/\1/p' (en supposant qu'il n'y a pas de deux-points dans les noms de fichiers).

Mise à jour: Comme VonC souligne à juste titre, la commande ci-dessus échoue pour les fichiers avec espaces Pour gérer cette course comme:.

cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool .... 

qui se traduira par des sauts de ligne dans ascii nul et alors xargs l'utiliser comme délimiteur.

+0

@hlovdal vous n'avez rien manqué (comme je l'ai fait). Je viens d'annuler le downvote et réécrire mon post :) – VonC

+0

@hlovdal Je corrige mon post et propose un autre moyen (simple) de filtrer le résultat. Puisque votre message est essentiellement correct: +1 – VonC

+0

Merci, c'est exactement ce dont j'ai besoin! – Jan

2

hlovdal's answer illustre que, dans ce cas, vous devez trouver plus d'éléments que vous avez besoin, puis les filtrer (malgré tous les ClearCase find features).

Note:

cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print 

pourrait vous donner directement les éléments (et non la version qui ne peut être intéressant dans ce cas). Vous pouvez trouver la version avec -version et une directive de format comme expliqué ci-dessous.

Avec l'aide de fmt_ccase, vous pouvez adapter la sortie pour obtenir précisément ce que votre script perl devra continuer:

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 du élément (au lieu de la version:/a/b/monFichier @@/main/myVersion) => /a/b/myFile'. the ' \ n` assurer un résultat par ligne.
  • -version et -fmt "%n %l\n" afficherait la version
  • \"$CLEARCASE_XPN\": les guillemets doubles arount le chemin étendu de la version d'un fichier vous garantira des espaces dans son nom sera toujours.
  • grep -v ",": s'il y a une virgule, cela signifie « plus d'une étiquette »
  • %Cl: éviter d'afficher la liste toutes d'étiquettes. En tout cas, s'il y en a plus d'un, ça ne vous intéresse pas!

Alors, 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:
Les travaux ci-dessus 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 répertorierait la version des fichiers avec une seule étiquette (correcte).

  • awk '{sub(/ \(.*/,"");print}' transformera "[email protected]@/main/myVersion (LBL_A)" en "myFile @@/main/myVersion"
+0

Eh, ai-je raté quelque chose? La question dit "autres labels", vous testez uniquement explicitement LBL_B. – hlovdal

+0

@hlovdal Vous avez raison, et j'ai réécrit ma réponse pour répondre réellement à l'OP;) – VonC

+0

grâce à vous aussi - parce que j'ai besoin de la version, la version de hlovdal me convient mieux, mais aussi le lien de fmtccase ! – Jan

5

Vous pouvez le faire directement, sans avoir à tuyau:

cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print 
+0

Est-ce que quelqu'un a vérifié si cela fonctionnait réellement? Cela ressemble à une solution beaucoup plus efficace que de filtrer la sortie de cleartool après le fait. Bien sûr, cette méthode ne répond pas exactement à la question, à moins de savoir exactement quelles étiquettes peuvent apparaître. – clacke

Questions connexes