Domanda

Vorrei trovare i file in ClearCase che sono etichettati con un'etichetta specifica ma che non ha altre etichette impostate .

Ad esempio, se ho file etichettati in questo modo:

file1 LBL_A, LBL_B
file2 LBL_A

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

C'è un modo per farlo con cleartool find? Se ciò non fosse possibile con una singola query, sarei anche felice per qualsiasi idea su come farlo in diversi passaggi (chiamerò cleartool da uno script perl, quindi sarà facile salvare elenchi di file temporaneamente ed esegui altri comandi su di essi).

Grazie mille in anticipo!

Jan

È stato utile?

Soluzione

Supponendo che LBL_A sia la (sola) etichetta che vuoi eseguire

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 output che puoi quindi controllare nel tuo script perl o filtrare attraverso sed -n 's / \ (. * \): (LBL_A) / \ 1 / p' (assumendo che non ci siano due punti nei nomi dei file).

Aggiornamento: come sottolinea correttamente VonC, il comando sopra fallirà per i file con spazi dentro. Per gestirlo come:

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

che tradurrà le nuove righe in ascii null e che quindi xargs lo utilizzerà come delimitatore.

Altri suggerimenti

Puoi farlo direttamente senza dover eseguire il pipe:

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

risposta di hlovdal illustra che, in questo caso, devi trovare più elementi del necessario e quindi filtrarli (nonostante tutti i ClearCase trova funzionalità ).

Nota:

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

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

Con l'aiuto di fmt_ccase , puoi personalizzare l'output per ottenere precisamente ciò di cui il tuo script perl dovrà continuare:

 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 dell'elemento (invece della versione: / a / b / myFile @@ / main / myVersion) = > / A / b / myFile'. il ' \ n` garantisce un risultato per riga.
  • -version e -fmt "% n% l \ n " visualizzerebbe la versione
  • \ " $ CLEARCASE_XPN \ " : le doppie virgolette attestano il percorso esteso della versione trovata assicurano che un file con spazi nel suo nome continui a funzionare.
  • grep -v ", " : se è presente una virgola, ciò significa "più di un'etichetta"
  • % Cl : evita di visualizzare l'elenco tutto delle etichette. Ad ogni modo, se ce ne sono più di uno, non sei interessato!

Quindi, per trovare la versione esatta :

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

Nota:
Quanto sopra funziona con la sintassi unix. La sintassi di Windows sarebbe:

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 (corretta) etichetta.

  • awk '{sub (/ \ (. * /, " "); print}' trasformerà " myFile @@ / main / myVersion (LBL_A) " in " myFile @@ / main / myVersion "
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top