2009-09-20 10 views

Respuesta

25

No estoy seguro acerca de los detalles de Python, pero si coloca la cadena $ Revision $ en su archivo en alguna parte y tiene enable-auto-props = true en su configuración de SVN, se reescribirá en algo como $ Revisión: 144 $. A continuación, puede analizar esto en su secuencia de comandos.

Hay a number of property keywords you can use in this way.

Esto no tendrá ningún costo adicional, p. consultar el repositorio SVN, porque la cadena está codificada en su archivo en commit o update.

No estoy seguro de cómo le gustaría analizar esta en Python, pero en PHP que lo haría:

$revString = '$Revision: 144$'; 
if(preg_match('/: ([0-9]+)\$/', $revString, $matches) { 
    echo 'Revision is ' . $matches[1]; 
} 
+0

¡Esta es la respuesta correcta! Además, recuerde establecer la propiedad 'keywords = Revision' en cada archivo al que desee hacer esto. –

+0

Drew: creo que si habilita enable-auto-props = true, ¿las palabras clave predeterminadas están todas establecidas? –

+3

+1 ¡Eso es increíble! En mi caso, sin embargo, ¿hay alguna manera de que SVN edite el número de revisión si se trata de un archivo diferente que se modificó en esta revisión? Por ejemplo, si tengo la palabra clave de número de revisión en version.py, pero no cambio version.py en revisión nnn, no la actualizará, ¿o sí? Si no, ¿hay alguna manera de utilizar este método de esa manera? – Smashery

4

El archivo hooks/pre-commit en su repositorio es un script o programa que lo hará ser ejecutado antes de un commit exitoso. Simplemente conviértalo en una secuencia de comandos que actualice su archivo con el número de versión correcto a medida que se compromete (el número de revisión se pasa al script a medida que se ejecuta). Aquí hay un tutorial con un ejemplo de cómo escribir un enlace precompromiso: http://wordaligned.org/articles/a-subversion-pre-commit-hook

+2

Ay. Permitir que el enlace de precompilación modifique archivos generalmente es una mala idea. La versión en el repositorio será diferente de la versión en la copia de trabajo, y esto puede generar cierta confusión. El committer tiene que volver a una versión anterior del archivo y luego obtener la nueva, lo que probablemente resulte en algún tipo de conflicto, ya que svn ha almacenado la versión original en la base de texto de la copia de trabajo. – sunny256

+0

Estoy de acuerdo en que esto es peligroso y generalmente no es un comportamiento deseado, pero si te limitas apropiadamente, entonces no veo el problema. Por ejemplo, si tiene un archivo "svn_version.txt" que no contiene nada más que el número de revisión actual, entonces sería perfectamente seguro; su copia local siempre tendrá la versión que ha revisado y el repositorio siempre tendrá la última (a menudo igual que su copia de trabajo). –

3

Consulte pysvn. expone extensiones en Python para la funcionalidad de tiempo de ejecución de Subversion.

+1

+1 para pysvn, pero es mejor evitar enlazar con "esto" –

4

Hay un fragmento de código en Django que le permite hacer esto, recomendaría mirarlo. http://code.djangoproject.com/browser/django/trunk/django/utils/version.py

+0

Esta función solo funciona cuando se ejecuta desde un proceso de subversión. Si esto es lo que quiere el OP, entonces se resuelve el problema. Sin embargo, sospecho que puede querer que el script contenga dentro de sí mismo o un archivo de configuración o algo así como su revisión de subversión, incluso si el script ya no está bajo subversión, en cuyo caso ese enlace no será útil. –

+0

Sí, esta es una gran opción alternativa, pero tener el número de versión también bajo control de fuente sería mejor. ¡Gracias! +1 – Smashery

3

Lo hago simplemente ejecutando un pequeño script al construir mi proyecto. La secuencia de comandos simplemente llama a svn info en combinación con sed para obtener los datos de revisión desnudos e inyecta ese número en el archivo revision.txt.

El servidor de compilación Hudson lo hace aún más fácil ya que establece el número de revisión SVN como una variable de entorno justo antes de invocar los scripts de compilación.

+0

Hacemos eso también, funciona bien – orip

1

puedo encontrar la sección cuando se ejecuta un poco ambigua - cuando se ejecuta desde dónde? ¿De un pago SVN o del código publicado? Todas las soluciones funcionan al inyectar la versión de SVN de algún modo en el origen de Python o en algún lugar del repositorio en un archivo de versión por separado.

El archivo de versión se cambia en las cajas nuevas, por lo que es necesario realizar una limpieza antes de la distribución. Entonces mi pregunta de dónde se está ejecutando el programa permanece.

13

Similar a, pero un poco más pitónico que la respuesta PHP; poner esto en su módulo de __init__.py:

__version__ = filter(str.isdigit, "$Revision: 13 $") 

y asegúrese de agregar la propiedad de revisión:

svn propset svn:keywords Revision __init__.py 
+1

o '' .join (c para c en "$ LastChangedRevision: 1546 $" si c.isdigit()) si no te gusta el filtro. –

7

O puede hacer como esto:

import re,subprocess 

svn_info = subprocess.check_output("svn info") 

print (re.search(ur"Revision:\s\d+", svn_info)).group() 

imprime "Revision: 2874" en mi proyecto

O como esto:

print (subprocess.check_output("svnversion")).split(":")[0] 

imprime "2874" en mi proyecto

+0

Funciona solo con una copia de trabajo. – bahrep

+0

No solo con copia de trabajo. Puede recuperar svn URL remota de "svn info" primero, como ejecutar "svn info", luego tomar el valor de parámetro "URL" de la salida y ejecutar el mismo código, pero usando "svn info value_of_URL_param" Entonces, el código actualizado es: import re, de subproceso svn_info = subprocess.check_output ("info https SVN: //svn.you_remote_repo_url") de impresión (re.búsqueda (ur "Revisión: \ s \ d +", svn_info)). grupo() –

Cuestiones relacionadas