2009-06-24 7 views
5

Vorrei trovare i file in ClearCase etichettati con un'etichetta specifica ma che non ha nessun altro set di etichette.ClearCase: trova i file che hanno esattamente un'etichetta specifica e non più

Per esempio, se ho file etichettati come questo:

file1 LBL_A, LBL_B 
file2 LBL_A 

Mi piacerebbe avere una query che mi dà solo file2 e non file1.

C'è un modo per farlo con cleartool find? Se questo non è possibile fare con una singola query, sarei felice anche per qualsiasi idea su come farlo in più passaggi (chiamerò cleartool da uno script perl, quindi sarà facile salvare liste di file temporaneamente ed esegui ulteriori comandi su di loro).

Grazie mille in anticipo!

gen

+0

appena aggiornato le mie righe di comando a mostra versioni invece dell'elemento – VonC

risposta

6

Supponendo LBL_A è il (solo) etichetta che si desidera correre

cleartool find /some/dir -version 'lbtype(LBL_A)' -print | xargs cleartool describe -fmt "%n: %l" 

dovrebbe dare

file1: (LBL_A, LBL_B) 
file2: (LBL_A) 

come uscita che poi può controllare nello script Perl o filtrare sed -n 's/\(.*\): (LBL_A)/\1/p' (presupponendo l'assenza di due punti nei nomi dei file).

Aggiornamento: Come VonC sottolinea correttamente, il comando di cui sopra non riuscirà per i file con spazi per gestire questo periodo, come:.

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

che si tradurrà a capo in ASCII nulla e poi hanno xargs utilizzarlo come delimitatore.

+0

@hlovdal non ti sei perso nulla (come ho fatto io). Ho appena cancellato il downvote e riscrivo il mio post :) – VonC

+0

@hlovdal Ho corretto il mio post e ho proposto un altro (semplice) modo per filtrare il risultato. Poiché il tuo post segue è sostanzialmente corretto: +1 – VonC

+0

Grazie, è esattamente ciò di cui ho bisogno! – Jan

2

hlovdal's answer illustra che, in questo caso, è necessario trovare più elementi di quelli necessari e quindi filtrarli (nonostante tutto lo ClearCase find features).

Nota:

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

potrebbe dare direttamente gli elementi (e non la versione che non può essere interessante in questo caso). È possibile trovare la versione con -version e una direttiva di formato come spiegato di seguito.

Con l'aiuto di fmt_ccase, è possibile personalizzare l'output per ottenere precisamente ciò che il vostro script perl avrà bisogno di andare avanti:

cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v "," 
  • -fmt "%En %l\n" visualizzerà il percorso completo del elemento (invece della versione:/a/b/myFile @@/main/myVersion) => /a/b/myFile'. the ' \ n` assicurati un risultato per riga.
  • -version e -fmt "%n %l\n" sarebbe visualizzare la versione
  • \"$CLEARCASE_XPN\": i doppi apici arount il percorso esteso della versione trovato assicurare un file con spazi nel nome sarà ancora lavorare.
  • grep -v ",": se c'è qualche virgola, che significa "più di un'etichetta"
  • %Cl: evitare la visualizzazione della lista tutte di etichette. Ad ogni modo, se ce ne sono più di uno, non sei interessato!

Così, per trovare l'esatto versione:

cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}' 

Nota:
I lavori di cui sopra con la sintassi Unix. La sintassi di Windows potrebbe essere:

cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}" 

, che elenca la versione dei file con una sola etichetta (corretta).

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

Eh, mi sono perso qualcosa? La domanda dice "altre etichette", stai solo testando esplicitamente LBL_B. – hlovdal

+0

@hlovdal Hai corretto, e hai riscritto la mia risposta per rispondere effettivamente all'OP;) – VonC

+0

grazie anche a te - perché ho bisogno della versione, la versione di hlovdal mi si addice meglio, ma anche il link a fmtccase è stato molto utile ! – Jan

5

È possibile farlo direttamente, senza dover tubo:

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

Qualcuno ha verificato se questo funziona davvero? Sembra una soluzione molto più efficiente del filtrare l'output cleartool dopo il fatto. Ovviamente questo metodo non risponde esattamente alla domanda, a meno che non si sappia esattamente quali etichette possono verificarsi. – clacke

Problemi correlati