2010-01-02 13 views
44

¿Hay un comando Subversion para mostrar el número de revisión actual?Comando de revisión de Subversion actual

Después de svn checkout Quiero comenzar un script y necesito el número de revisión en una variable. Sería genial si hay un comando como svn info get_revision_number.

+8

Con la última SVN, 'svn info --show-elemento revision' mostrará sólo el número de revisión de la fuente en el directorio actual. – GreatAndPowerfulOz

+1

Para obtener el número de revisión de su copia de trabajo local, use 'svn info --show-item last-changed-revision' – domih

Respuesta

72

Puede utilizar os.system() para ejecutar una línea de comandos así:

svn info | grep "Revision" | awk '{print $2}' 

yo que en mis scripts de construcción nocturnas.

También en algunas plataformas hay un comando svnversion, pero creo que tenía una razón para no usarlo. Ahh, cierto. No puede obtener el número de revisión de un repositorio remoto para compararlo con el local utilizando svnversión.

+1

Tenga en cuenta que había una etiqueta 'cmd.exe' en la pregunta original, lo que implica que OP está en Windows, donde no puede usar' grep' y 'awk'. – iamamac

+1

os.system solo le dice el código de salida, no proporciona una forma de obtener el resultado. En su lugar, ejecutando 'svn info' (como con el módulo de subproceso), leyendo el resultado y haciendo los pasos grep/awk directamente en Python (' if "Revision" en línea: return line.split() [1] ') es por lo general, es más simple y fácil que tratar de escribir comandos bash en Python. –

+0

Iamamac: hay cygwin y puertos independientes (más SfU y lo que sea que msft lo llame ahora), pero su punto de que no es tan comúnmente disponible es correcto. –

2

svn info, creo, es lo que quieres.

si sólo quería la revisión, tal vez usted podría hacer algo como:

svn info | grep "Revision:" 
22

También es una forma más cómoda (para algunos) svnversion comando.

salida podría ser un único número de revisión o algo así (entre -H):

4123:4168  mixed revision working copy 
    4168M   modified working copy 
    4123S   switched working copy 
    4123:4168MS mixed revision, modified, switched working copy 

utilizo este código Python fragmento de extraer información de revisión:

import re 
import subprocess 

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE) 
p.wait() 
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read()) 
rev = int(m.group(2)) 
if m.group(3) == 'M': 
    rev += 1 
4
  1. Primera de todo el estado svn tiene el número de revisión, puede leerlo desde allí.

  2. Además, cada archivo que almacena en SVN puede almacenar el número de revisión en sí mismo - añadir la palabra clave $Rev$ a su archivo y correr propset: svn propset svn:keywords "Revision" file

  3. Por último, el número de revisión también está en .svn/entries archivo , cuarta línea

Ahora, cada vez que finalice la compra de ese archivo, tendrá la revisión en sí misma.

+0

Para el ítem 3, ¿es razonable esperar que el número de revisión siempre esté en la 4ª línea? Si es una expectativa razonable, esta parece ser la forma más fácil de hacerlo en casi cualquier entorno. – grimus

+0

Sí, al menos en un rango razonable de versiones de subversión. Si cambian el formato en alguna versión futura (posible pero no muy pronto), entonces tendrías que adaptarte. –

+0

Analicé esto un poco, y encontré esto: http://svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html Parece que el formato es probable que cambie de vez en cuando . Estoy seguro de que para la mayoría de las cosas, leer el archivo de entradas funcionará bien, pero deberá asegurarse de mantener su código si el archivo de entradas cambia. – grimus

0

creo que tengo que hacer svn info y luego recuperar el número con una manipulación de cadenas de "Revisión: xxxxxx" sería simplemente agradable, si había un comando que devuelve sólo el número :)

2

usar algo como lo siguiente, aprovechando la salida XML de la subversión:

# parse rev from popen "svn info --xml" 
dom = xml.dom.minidom.parse(os.popen('svn info --xml')) 
entry = dom.getElementsByTagName('entry')[0] 
revision = entry.getAttribute('revision') 

Tenga en cuenta también que, dependiendo de lo que necesita para este, la entrada <commit revision=...> puede ser más de lo que estás buscando. Eso da la "última modificación modificada", que no cambiará hasta que el código en el árbol actual realmente cambie, en lugar de "revisión" (lo que se indica arriba) que cambiará cada vez que cambie cualquier cosa en el repositorio (incluso ramas) y haces un "svn up", que no es lo mismo, ni a menudo tan útil.

+0

¿Pedirle a svn que genere XML y luego analizarlo? ¿Está pensado como una broma? –

+1

@JulienGuertault, no, el resultado XML * se entiende * para el uso programático mientras que el no XML no lo es. Analizar el resultado humano es arriesgarse a que el formato cambie en el futuro y romper su código, y dependiendo del contexto puede requerir un trabajo personalizado cada vez que necesite hacer cosas similares. Si utiliza el enfoque XML, puede ahorrar esfuerzo en infraestructura a lo largo del tiempo. No es broma, pero tampoco diría que hacerlo de la otra forma es de ninguna manera * incorrecto *. Solo preferencia personalHe hecho ambas cosas, en diferentes contenidos. –

+0

El análisis de la máquina frente a la salida del ser humano es un punto válido (vale la pena enfatizar en su respuesta). ¿Pero por qué no simplemente usar 'svnversion'? Tiene una salida compacta documentada y no requiere algo tan complejo para analizarlo. –

1

mención Nadie para Windows mundo SubWCRev, el cual, se utiliza correctamente, puede sustituir los datos necesarios en los lugares necesarios automágicamente, si SubWCRev llamada secuencia de comandos en forma SubWCRev WC_PATH TPL-FILE READY-FILE

muestra de mi gancho post-commit (parte de)

SubWCRev.exe CustomLocations Builder.tpl z:\Builder.bat 
... 
call z:\Builder.bat 

donde mi Builder.tpl es

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$ 

como resultado, tengo todos los archivos bat-tiempo con parte variable - nam e del dir - que corresponde a los metadatos de la copia de trabajo

2

acaba de utilizar @ respuesta de badcat en una versión modificada, utilizando subprocess.check_output():

import subprocess 
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip() 

creo que también se puede, instalar y utilizar pysvn si quieres usa python para interactuar con svn.

3

REV = svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep 'Revision:' | cut -d\ -f2

+0

Tenga en cuenta que RetroShare puede tener algunos problemas de seguridad http://specialmeaning.blogspot.com/2016/09/retroshare-scandal-of-free-communication.html – Sergei

Cuestiones relacionadas