¿Obteniendo el último número de revisión en SVN?

103

Usando PHP, Perl o Python (preferiblemente PHP), necesito una forma de consultar una base de datos SVN y averiguar el último número de revisión enviado a SVN. No necesito nada más que eso. Debe ser no intensivo (así que lo hago cada 5 minutos como un trabajo cron; el rendimiento de SVN no debería verse afectado).

SVN se encuentra en mi Intranet, pero no en mi computadora específica.

Tengo SVN instalado, pero no hay enlaces instalados para PHP / Perl / Python. Estoy usando Windows XP, pero preferiría una solución independiente de la plataforma que también funcione en Linux. Si tiene una solución solo para Linux (o solo para XP), eso también sería útil.

Coltin
fuente
2
"svn info --show-item revision" dará la revisión actual a la que se actualiza el directorio actual.
GreatAndPowerfulOz
1
$ svn info --show-item revision svn: invalid option: --show-itemUsando Apache Subversion 1.8.16 (r1740329) compilado el 26 de abril de 2016. También probado con CollabNet 1.6.11 (r934486) compilado el 6 de marzo de 2014.
IceArdor
En relación con estos comentarios, consulte svn help infolas opciones legales parasvn info
XavierStuvw
@IceArdor Estoy usando SVN v1.9.5 y --show-itemestá disponible
icc97

Respuestas:

68
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

Puede obtener la salida en XML así:

$output = `svn info $url --xml`;

Si hay un error, la salida se dirigirá a stderr. Para capturar stderr en su salida use así:

$output = `svn info $url 2>&1`;
Daniel X Moore
fuente
2
Si hay un error, la salida se dirigirá a stderr. Para capturar stderr en su salida use así: $ salida = svn info $url 2>&1;
Daniel X Moore
3
¡Gracias! Usé --xml para construir mi propia herramienta C # que me ayuda a generar un atributo AssemblyFileVersion. PD: El inglés no es mi idioma principal y me desconcertó la palabra "así" que nunca antes había escuchado. Por cierto, su origen es bastante divertido: cf ( en.wiktionary.org/wiki/thusly ); ¿Lo usó intencionalmente (juego de palabras?) O es común que lo use así en lugar de así?
odalet
7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
Cobra_Fast
7
@Cobra_Fast, no necesitas canalizar, puedes hacerlo svn info --show-item revision $urlo svn info --show-item last-changed-revision $url.
cp.engr
2
@ cp.engr Creo que eso es solo desde SVN v1.9 más o menos, es decir, lo tengo en v1.9.5 y no existe en v1.8.6
icc97
131

Si desea analizar una copia de trabajo local, la mejor herramienta es la svnversionque viene con Subversion y produce resultados como 968:1000M. La documentación dice:

El número de versión será un solo número si la copia de trabajo es de revisión única, sin modificar, sin cambiar y con una URL que coincide con el argumento TRAIL_URL. Si la copia de trabajo es inusual, el número de versión será más complejo:

4123:4168     mixed revision working copy
4168M         modified working copy
4123S         switched working copy
4123:4168MS   mixed revision, modified, switched working copy
algo
fuente
2
de acuerdo, mucho mejor que svn info
Richard
32
svnversion es para copias de trabajo locales y no accederá al repositorio en la intranet como se especifica en la pregunta.
Daniel X Moore
5
Para aquellos que no están familiarizados con svnversion, es parte del cliente de línea de comandos estándar y aquí está la página del manual: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html .
Michael Sorens
45

svn info -r HEAD

Esto le dará el último número de revisión en el encabezado de su repositorio.

Hay algunas publicaciones de blog interesantes sobre la integración de números de subversión en su script de compilación:

Nick Haddad
fuente
Esta es la forma más sencilla, ya que no es necesario que averigüe primero la URL del repositorio. ¡Gracias!
derFunk
Recibí errores al usar comillas alrededor de HEAD, por lo que debería sersvn info -r HEAD
icc97
38

Esto debería funcionar en Bash, desde un directorio de trabajo. Lo he usado en Windows con unixutils instalado:

svn info |grep Revision: |cut -c11-
Blorgbeard está fuera
fuente
Funciona si pones la URL del repositorio donde tienes% *, lo que sea que quieras decir con eso. Buena sintaxis de corte, no lo sabía antes.
ypnos
1
Nota: dado que carece de -rHEAD, devolverá la revisión de confirmación para el archivo o directorio solicitado. Es posible que esta no sea la última revisión general (porque es posible que se hayan realizado otros cambios en otro lugar o en un subárbol).
Mr Fooz
4
Además, esto no funciona para versiones localizadas de SVN (en polaco debe ser | cut -c9-).
zgoda
2
esa es, por cierto, la razón por la que no me gustan las herramientas de desarrollo de línea de comandos localizadas; ventaja cero, montón de problemas. Normalmente elimino las localizaciones exactamente por este motivo.
gimpf
7
Pasar un delimitador en lugar de un recuento de caracteres funciona mejor para el contenido localizado; por ejemplo svn info | grep Revision | cut -d " " -f 2, devolverá la segunda cadena después de dividirla con espacios.
Butifarra
34

Lo siguiente debería funcionar:

svnlook youngest <repo-path>

Devuelve un solo número de revisión.

Magentus
fuente
15

Para obtener realmente el número de revisión más reciente ("revisión principal") en su repositorio remoto , use esto:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

Salidas por ejemplo:

35669
derFunk
fuente
12

Una nota sobre cómo obtener el último número de revisión:

Digamos que he cd-ed en un subdirectorio revisado ( MyProjectDir). Entonces, si llamo svnversion:

$ svnversion .
323:340

... obtengo " 323:340", que supongo que significa: " tienes elementos aquí, que van desde la revisión 323 a la 340 ".

 

Entonces, si llamo svn info:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... obtengo " 323" como revisión, que en realidad es la revisión más baja de las informadas por svnversion!

 

Luego podemos usar svn infoen modo recursivo para obtener más información del directorio local:

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... (elimine el greppara ver más detalles).

 

Por último, ¿qué hacer cuando queremos comprobar cuál es la última revisión del repositorio online (en este caso, @ server.com)? Luego emitimos nuevamente svn info, pero con -r HEAD(observe la diferencia entre la -Ropción de capital anteriormente y -rahora en minúsculas ):

> svn info -r 'HEAD'
[email protected]'s password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

Lo interesante es que, svn infotodavía se refiere al subdirectorio actual ( MyProjectDir), sin embargo, la ruta en línea se informa como MyProjectDir(a diferencia de .para el caso local) y la revisión en línea informada es la más alta (a 340diferencia de la más baja, 323informada en la zona).

sdaau
fuente
9
  • A partir de Subversion 1.9 puede usar la opción --show-item para obtener un valor de uno de los campos de svn infosalida del comando. Este comando mostrará solo el número de revisión:

    svn info --show-item=revision <URL-to-repository>
    
  • Obtenga la salida XML de svn info usando la --xmlopción y use PowerShell para obtener el número de revisión. He aquí un ejemplo sencillo:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • Con VisualSVN Server 3.4 o posterior, puede obtener la cantidad de revisiones en un repositorio ejecutando estos comandos:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    Consulte la Get-SvnRepositoryreferencia de cmdlet de PowerShell para obtener más información.

bahrep
fuente
7

Creo que estas buscando

svn info -r HEAD

¿Puedes acceder a ese comando?

Probablemente también necesitará proporcionar credenciales de inicio de sesión con el repositorio.

Tim
fuente
Creo que debe ser svn info -r HEAD
Stephen
-r se puede omitir fácilmente entonces.
ypnos
Correcto, no especifiqué la opción para -r, esto fue solo para que él encontrara lo que necesitaba y comenzara con la ayuda / libro.
Tim
4

Alguien más me ganó para publicar la respuesta sobre svnversion, que definitivamente es la mejor solución si tiene una copia de trabajo (IIRC, no funciona con URL). Agregaré esto: si está en el servidor que aloja SVN, la mejor manera es usar el svnlookcomando. Este es el comando que usa cuando escribe un script de gancho para inspeccionar el repositorio (e incluso la transacción actual, en el caso de los ganchos de confirmación previa). Puede escribir svnlook helppara obtener detalles. Probablemente quieras usar el svnlook youngestcomando. Tenga en cuenta que requiere acceso directo al directorio del repositorio, por lo que debe usarse en el servidor.

rmeador
fuente
2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

O

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

O

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335
Nick Henry
fuente
2

Puede usar cualquiera de los comandos:

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found
Angelin Nadar
fuente
2

Si quieres uno realmente corto:

svn info ^/

La notación de intercalación es una forma abreviada de "la URL del directorio raíz del repositorio".

Sanghyun Lee
fuente
2

Si tiene la desgracia de tener que hacer esto desde un archivo por lotes de Windows, aquí está el encantamiento que está buscando:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

Esto ejecuta "svn info", iterando a través de cada línea de salida generada. Utiliza dos puntos como delimitador entre el primer y el segundo token de la línea. Cuando el primer token es "Revisión", establece la variable de entorno REV en el segundo token.

yoyó
fuente
1
también puede utilizar FINDSTR:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97
vea esta otra respuesta SO para la base de esto
icc97
2

Estás buscando una llamada similar a la llamada de línea de comandos

svn info URL

Parece que esto es posible usando la biblioteca pysvn, y hay una receta que debería ayudarlo a comenzar. No estoy seguro de si hay algo similar para PHP.

Si necesita recurrir a llamar al binario SVN usted mismo, asegúrese de usar el --xmlparámetro para obtener el resultado como XML. Eso debería ser más fácil de analizar que la salida de la línea de comandos.

Sander Rijken
fuente
Lo uso subprocess.check_outputen Python para evitar otra llamada a la biblioteca. Si solo está verificando los números de revisión / bajando las últimas copias, es más simple usar svn desde la línea de comandos a través de subprocess. Ahora, si está haciendo registros automáticos y fusiones ...
Droogans
2

Puede utilizar el formato de salida XML, por ejemplo:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

Ejemplo: usar el número de revisión

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml
Fitorec
fuente
2

Puedes probar el siguiente comando:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'
mrajiv
fuente
1

Solo svn infoen BASH te daremos todos los detalles

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

Obtendrá la REVISIÓN de este

D_D
fuente
1

La forma más simple y limpia de hacerlo (en realidad svn 1.9, lanzado en 2015) es usando:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

La salida es el número de la última revisión (joungest) para SVNURL, o el número de la revisión actual de la copia de trabajo de SVNPATH. El --no-newlinees opcional, indica que svnno se emita una nueva línea cosmética ( \n) después del valor, si necesita una salida mínima (solo el número de revisión).

Ver: https://subversion.apache.org/docs/release-notes/1.9.html#svn-info-item

F. Igor
fuente
1
Probé svn 1.9.3, y el comando aquí es svn info --show-item, en lugar de--show item
elopio
0

Las soluciones publicadas no manejan el caso cuando se utilizan externos.

Si tengo una URL o una copia de trabajo con la svn:externalspropiedad configurada, los externos pueden cambiar y, por lo tanto, cambiará la última revisión del servidor de subversión. Pero la última revisión de la copia de trabajo o URL solo informará el número de revisión cuando se modificó la propiedad svn: externals o cualquier elemento más bajo en la ruta de la URL, que es el comportamiento esperado.

Entonces, o obtiene la svn:externalspropiedad e itera sobre las URL y elige la revisión de alturas o consulta la URL base desde el servidor de subversión. La versión informada desde la URL base contendrá la última revisión para TODO en el servidor.

Por lo tanto, si está utilizando externos, es mejor usar svn info BASE_URLdónde BASE_URLestá la URL raíz para todas las rutas en el servidor de Subversion.

Mella
fuente
0

Esto obtendrá solo el número de revisión de la última revisión modificada:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

Espero que esto ayude.

Kram
fuente
0

$ svn log | head -10 en cualquier directorio que tenga una .svncarpeta

kip2
fuente
0

svn infoo svnversionno tomará en consideración los subdirectorios, para encontrar la última 'revisión' del código base en vivo, la forma pirateada a continuación funcionó para mí; puede llevar un tiempo ejecutarla:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$
Daniel Sokolowski
fuente
0

Esto se puede obtener usando la biblioteca "SVN" :

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

Head_revision debe contener el último número de revisión del archivo

Naga Ravi Teja Lella
fuente
-1

Parece que hay una entrada en las preguntas frecuentes oficiales para esto . El código fuente está en C pero se aplica el mismo principio, como se describe aquí en esta publicación de la lista de correo .

mate b
fuente
Esta es una gran herramienta / respuesta, pero no creo que necesite tanto; entendí que solo necesitaba la última revisión, por lo que tal vez pueda comenzar una compilación si su revisión actual es diferente de una anterior desde la última vez que verificó. Quizás lo entendí mal.
Tim