2010-04-22 15 views
12

Estoy tratando de ajustar una secuencia estándar de pasos en un script de shell (linux/bash) y no puedo encontrar la manera de saber si la ejecución de svn status devolvió algo. Por ejemploSVN: y bash: cómo saber si hay cambios no confirmados

~/sandbox/$svn status 
?  pat/foo 
~/sandbox/$echo $? 
0 

Si elimino el archivo foo, entonces el

svn status 

retorno nada, pero el echo $? sigue siendo 0

quiero no hacer algunos pasos si hay cambios no confirmados .

Punteros muy apreciados.

Respuesta

2

He implementado algo similar hace un tiempo. No debe confiar en el valor de retorno de svn status, sino analizar su resultado en su lugar. Por ejemplo, debería buscar líneas que comiencen con "M", "A", "D", etc. Puede usar perl para ayudarlo con esto. Según el resultado de ese análisis, sabrá si hay cambios o no.

Por cierto, no es normal que svn status devuelva 0 si no hay cambios; después de todo, este código de retorno simplemente significa que no se han producido errores.

6

¿Por qué no probar el resultado en svn status -q? Algo así como:

result=`svn status -q` 
[ -z "$result" ] && echo "No changes" && exit 1 

echo "Changes found" 
exit 0 

Si está utilizando svn:externals en tu repositorio vea los comentarios y las respuestas a continuación para métodos adicionales.

+2

Sí, tomé esta idea y terminé con algo muy similar: [código] if [-z "$ (svn st)"]; luego echo "la copia de trabajo es prístina" else echo "la copia de trabajo tiene cambios" exit; fi [/ code] – fishtoprecords

+1

@fishtoprecords, por favor envíela como respuesta. Está bien enviar una respuesta a tu propia pregunta. – Nowaker

+1

Tenga en cuenta: no creo que esto funcione si tiene elementos externos. Puedes agregar '-ignore-externals' para que funcione, pero luego, por supuesto, no verificará los elementos externos (si te importa eso). – histumness

3

O usted podría intentar

svn status | grep [AMCDG] 
echo $? 

debe devolver 0 si hay cambios y 1 si no hay ninguno

+2

el comando debería ser: estado svn | grep '^ [AMCDG]' – Speq

3

La respuesta aceptada no funcionará si su proyecto contiene referencias svn:externals. En ese caso, svn status -q todavía producirá salida incluso si la copia de trabajo no tiene modificaciones locales. Por ejemplo, mi proyecto depende de varias bibliotecas que están cada mantenidos en una parte separada del repositorio:

$ svn status -q 
X  Externals/ETCKit 
X  Externals/RulesParser 
X  Externals/XMLRPC 

Performing status on external item at 'Externals/ETCKit': 

Performing status on external item at 'Externals/XMLRPC': 

Performing status on external item at 'Externals/RulesParser': 

Para tener en cuenta esta salida adicional, que terminé usando awk:

if [[ -n $(svn status -q . | awk '$1 ~ /[!?ABCDGKLMORST]/') ]]; then 
    echo "The working copy at $(pwd) appears to have local modifications" 
fi 

Este script toma la salida de svn status -q y filtra las líneas que no comienzan con un código de estado que indique un cambio local. Si el resultado final es la cadena vacía, entonces la copia de trabajo está limpia.

0

He aquí una solución que he usado. Funciona con svn externals y evita listar explícitamente los estados de svn en tus scripts (lo que puede o no ser bueno dependiendo de tu punto de vista).

# tested with svn 1.6.11/bash 4.1.2 
if [ "$(svn st -q | cut -c -8 | sed '/^[^ ]*$/d' | grep -m 1 '[^ ]')" ]; then 
    echo "changes detected" 
fi 

svn st -q - enumera los estados sin la X para directorios externos.
cut -c -8 - coloca todas excepto las primeras 8 columnas.
sed '/^[^ ]*$/d' - descarta las líneas 'Realizando ...' que se ven al trabajar con elementos externos.
grep -m 1 '[^ ]' - el primer espacio no implica una modificación.

Cuestiones relacionadas