2008-10-03 30 views
9

Tengo un .bat y dentro del .bat me gustaría ejecutar un código especial si hay alguna modificación dentro del repositorio svn (por ejemplo, compilar).detectar cambios svn en .bat

Respuesta

6

Para Windows 2000 y más tarde, que se asignaría la última fila de salida del commmand svn status a la variable svnOut y luego probar si la variable contiene nada:

@echo off 
set svnOut= 
set svnDir=C:Your\path\to\svn\dir\to\check 
for /F "tokens=*" %%I in ('svn status %svnDir%') do set svnOut=%%I 

if "%svnOut%"=="" (
    echo No changes 
) else (
    echo Changed files! 
) 

¿Por qué no hay una línea como esta

set svnOut= 

tiene que resolverlo usted mismo. ;-)

+0

Muchas gracias. Es perfecto, lo probaré lo antes posible. – acemtp

+0

De hecho, no funciona. Por ejemplo, svn status devuelve alguna línea con: ? archivos M archivos2 que son modificaciones locales o archivos que no están en el repositorio. Solo quiero ver "Cambios de archivos" cuando hay algunos cambios en el repositorio. – acemtp

+0

Publiqué la respuesta con una versión modificada – acemtp

1

¿Quieres que esto sea reactivo? O, a pedido?

Para reactivo, consulte hooks. El script tendrá que ser nombrado de acuerdo a su propósito: pre-commit.bat, post-commit.bat. Los guiones son llamados como: [script] [repos-ruta] [revisión-número]

Para, a la carta:

  • copia de trabajo
    • svn log
    • svn st
    • svn diff
    • SVN proplist
  • Repositorio
    • svnlook autor
    • svnlook cambiado
    • fecha svnlook
    • svnlook diff
    • historia svnlook

Ejemplo:

svn st "C:\path\to\working\directory\" >> C:\path\to\working\project.log 

Cada vez que se ejecuta el BAT, que va a añadir el st salida a proyecto. registro. Ajustar según sea necesario.

+0

Bajo demanda. Conozco el comando svn (es fácil encontrarlos en todos lados). La cuestión es saber cómo utilizar que en un script .bat – acemtp

+0

no quiero poner el estado en un archivo de registro :) Quiero el código de la .bat que hacer algo como: si (svn_changed()) haga esto else haga eso – acemtp

3

Ok, la solución que encontré con la ayuda de Tooony:

set vHEAD = 0 
set vBASE = 0 

set svnDir=<path to local svn directory> 

for /F "tokens=1,2" %%I in ('svn info -r HEAD %svnDir%') do if "%%I"=="Revision:" set vHEAD=%%J 
for /F "tokens=1,2" %%I in ('svn info -r BASE %svnDir%') do if "%%I"=="Revision:" set vBASE=%%J 

if "%vBASE%"=="%vHEAD%" (
    echo No changes 
) else (
    echo Changed files! 
) 
2

que su.ejecute svnversion (si está utilizando Subversion) o SvnWCRev.exe (si está utilizando TortoiseSVN) en el nivel más alto de su copia de trabajo.

Ambos salen si su copia de trabajo ha sido modificada.

svnversion añade una "M" a su salida. SvnWCRev.exe imprimirá una línea de texto que el WC ha sido modificado.

0

Esta versión se basa en @ tooony pero comprueba las actualizaciones del servidor en lugar del cliente.

@echo off 
set svnOut= 

rem Check svn server status of current working directory repository and see if first or second token is an * 
for /F "tokens=1" %%I in ('svn status --show-updates') do if "%%I"=="*" set svnOut=%%I 
rem echo "%svnOut%" 

if "%svnOut%"=="" (
    echo No changes 
) else (
    echo Changed files! 
) 
Cuestiones relacionadas