Registro de SVN: obtenga solo revisiones con el patrón en los comentarios

Intento crear un script bash simple que verifique qué revisiones no contienen un cierto patrón en su comentario.

Por ejemplo:

------------------------------------------------------------------------ r272876 | user | 2014-10-30 11:15:06 +0000 (Qui, 30 Out 2014) | 1 line PATTERN-17278: My comment. ------------------------------------------------------------------------ r272877 | user | 2014-10-31 12:06:41 +0000 (Sex, 31 Out 2014) | 1 line My problematic revision ------------------------------------------------------------------------ r273529 | user | 2014-10-20 17:45:36 +0000 (Seg, 20 Nov 2014) | 2 lines PATTERN-17297: Erro no angulo do vetor velocidade ------------------------------------------------------------------------ r273797 | user | 2014-10-14 11:35:05 +0000 (Ter, 4 Nov 2014) | 1 line Other problematic revision ------------------------------------------------------------------------ r274096 | user | 2014-08-26 11:18:31 +0000 (Qua, 5 Nov 2014) | 1 line And another 

¿Cómo imprimo fácilmente las revisiones como r272877, r273797 y r274096 en una list?

Primero, definamos una variable de shell que contiene la línea discontinua que SVN usa para separar las inputs de logging:

 RS='\n------------------------------------------------------------------------' 

Ahora, podemos imprimir todas las inputs de logging que no contienen pattern :

 svn log . | awk -v "RS=$RS" '!/pattern/{print RS,$0}' 

Alternativamente, si solo desea inputs de logging que sí lo contengan, utilice:

 svn log . | awk -v "RS=$RS" '/pattern/{print RS,$0}' 

Cómo funciona

  • -v "RS=$RS"

    awk divide su input en loggings y lee en un logging a la vez. Aquí, definimos el separador de loggings como el que SVN usa para separar las inputs de logging.

  • !/pattern/{print RS,$0}

    awk loops implícitamente a través de cada logging en la input. Esto busca loggings que no contengan pattern donde el pattern puede ser cualquier expresión regular. El signo de exclamación,! , significa "no". Los loggings que cumplen con este criterio se imprimen. print RS,$0 le dice a awk que imprima el separador de logging y luego el contenido de esta input de logging.

Mi versión de subversión usa 72 guiones como el separador de logging. No sé si esto está sujeto a cambios de una versión a otra. Si es así, es posible que deba ajustar la definición de RS adecuadamente.

Ejemplo

Usando su salida de logging de muestra como guardada en un file llamado log , esto imprime todos los loggings que no contienen PATTERN-17278 :

 $ awk -v "RS=$RS" '!/PATTERN-17278/{print RS,$0}' log ------------------------------------------------------------------------ r272877 | user | 2014-10-31 12:06:41 +0000 (Sex, 31 Out 2014) | 1 line My problematic revision ------------------------------------------------------------------------ 

Salida alternativa: devuelve solo los numbers de revisión

Los numbers de revisión son el primer elemento después del separador de logging. Para imprimir solo numbers de revisión, use:

 svn log . | awk -v "RS=$RS" '!/pattern/{print $1}' 

Usando la input de muestra [antes de la pregunta actualizada] como ejemplo:

 $ awk -v "RS=$RS" '!/PATTERN-17278/{print $1}' log2 r2728 

Usando un patrón variable

 awk -v "RS=$RS" -vp='PATTERN-17278|PATTERN-17297' '$0 !~ p{print $1}' log3 r272877 r273797 r274096