Pergunta

Eu gostaria de encontrar arquivos em ClearCase que são rotulados com um rótulo específico, mas que não tem quaisquer outros rótulos set .

Por exemplo, se eu tiver arquivos rotulados como esta:

file1 LBL_A, LBL_B
file2 LBL_A

Eu gostaria de ter uma consulta que me dá apenas arq2 e não file1.

Existe uma maneira de fazer isso com find cleartool? Se isso não for possível fazer com uma única consulta, eu também ficaria feliz para todas as idéias como fazer isso em várias etapas (eu vou estar chamando cleartool a partir de um script Perl, por isso vai ser fácil para salvar listas de arquivos temporariamente e executar comandos adicionais sobre eles).

Muito obrigado antecipadamente!

Jan

Foi útil?

Solução

Assumindo LBL_A é a (única) etiqueta que deseja executar

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

deve dar

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

como saída que você então pode verificar no seu script Perl ou filtro através sed -n 's/\(.*\): (LBL_A)/\1/p' (assumindo que não há dois pontos em nomes de arquivos).

Update: Como VonC assinala corretamente, o comando acima irá falhar para arquivos com espaços em lidar com esse prazo, como:.

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

que se traduzirá novas linhas em nula ascii e depois ter xargs usar isso como delimitador.

Outras dicas

Você pode fazer isso diretamente sem ter que pipe:

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

de hlovdal ilustra que, neste caso, você tem que encontrar mais elementos do que você precisa, e depois filtrá-los (apesar de todo o ClearCase achado apresenta ).

Nota:

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

poderia dar-lhe diretamente os elementos (e não a versão que pode não ser interessante, neste caso). Você pode encontrar a versão com -version e uma directiva formato conforme explicado abaixo.

Com a ajuda de fmt_ccase , você pode adaptar a saída para obter precisamente que o seu script perl terá que ir em:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
  • -fmt "%En %l\n" irá exibir o caminho completo do elemento (em vez da versão: / a / b / myFile @@ / main / myVersion). => /a/b/myFile'. the ' \ n` garantir um resultado por linha
  • -version e -fmt "%n %l\n" iria exibir a versão
  • \"$CLEARCASE_XPN\":. As aspas duplas arount o caminho estendida da versão encontrada garantir um arquivo com espaços em seu nome continuará a funcionar
  • grep -v ",": se houver qualquer vírgula, o que significa "mais de um rótulo"
  • %Cl: evitar a exibição do todas lista de etiquetas. De qualquer forma, se houver mais de um, você não está interessado!

Assim, para encontrar o exato versão :

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

Nota:
As obras acima com unix sintaxe. A sintaxe janelas seria:

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

, que iria listar a versão dos arquivos com apenas um rótulo (correto).

  • awk '{sub(/ \(.*/,"");print}' vai transformar "myFile@@/main/myVersion (LBL_A)" em "myFile @@ / main / myVersion"
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top