Pregunta

Me gustaría encontrar archivos en ClearCase que estén etiquetados con una etiqueta específica pero que no tengan otras etiquetas establecidas .

Por ejemplo, si tengo archivos etiquetados así:

file1 LBL_A, LBL_B
file2 LBL_A

Me gustaría tener una consulta que me dé solo file2 y no file1.

¿Hay alguna manera de hacer esto con cleartool find? Si esto no es posible con una sola consulta, también me agradaría tener alguna idea de cómo hacer esto en varios pasos (llamaré a cleartool desde un script perl, por lo que será fácil guardar listas de archivos temporalmente y ejecutar más comandos en ellos).

¡Muchas gracias de antemano!

Jan

¿Fue útil?

Solución

Suponiendo que LBL_A es la (única) etiqueta que desea ejecutar

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

debería dar

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

como salida que luego puede verificar en su script perl o filtrar a través de sed -n 's / \ (. * \): (LBL_A) / \ 1 / p' (suponiendo que no haya dos puntos en nombres de archivo).

Actualización: como VonC señala correctamente, el comando anterior fallará para los archivos con espacios. Para manejar esa ejecución como:

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

que traducirá nuevas líneas en ascii nulo y luego hará que xargs lo use como delimitador.

Otros consejos

Puede hacer esto directamente sin tener que canalizar:

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

respuesta de hlovdal ilustra que, en este caso, debe encontrar más elementos de los que necesita y luego filtrarlos (a pesar de todos los Funciones de búsqueda de ClearCase ).

Nota:

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

podría darle directamente los elementos (y no la versión que puede no ser interesante en este caso). Puede encontrar la versión con -version y una directiva de formato como se explica a continuación.

Con la ayuda de fmt_ccase , puede adaptar la salida para obtener con precisión lo que su script de Perl necesitará:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
  • -fmt "% En% l \ n " mostrará la ruta completa del elemento (en lugar de la versión: / a / b / myFile @@ / main / myVersion) = > / a / b / myFile '. el ' \ n` garantiza un resultado por línea.
  • -version y -fmt "% n% l \ n " mostrarían la versión
  • \ " $ CLEARCASE_XPN \ " : las comillas dobles alrededor de la ruta extendida de la versión encontrada aseguran que un archivo con espacios en su nombre seguirá funcionando.
  • grep -v ", " : si hay alguna coma, eso significa " más de una etiqueta "
  • % Cl : evite mostrar la lista de etiquetas all . De todos modos, si hay más de uno, ¡no estás interesado!

Entonces, para encontrar la versión exacta de :

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

Nota:
Lo anterior funciona con la sintaxis de Unix. La sintaxis de Windows sería:

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

, que enumeraría la versión de los archivos con una sola etiqueta (correcta).

  • awk '{sub (/ \ (. * /, " "); print}' transformará " myFile @@ / main / myVersion (LBL_A) " en " myFile @@ / main / myVersion "
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top