2009-09-30 14 views
7

Like this question, pero sin la necesidad de consultar realmente el servidor SVN. Este es un proyecto basado en la web, así que supongo que usaré el repositorio como vista pública (a menos que alguien me aconseje por qué es una mala idea). Supongo que esta información está en un archivo en la carpeta .svn en algún lugar, pero ¿dónde y cómo la analizo? Quiero hacer algo como SO, teniendo la revisión en la esquina inferior derecha.¿Cómo obtener programáticamente el número de revisión SVN?

Código en Python o PHP apreciado si lo tienes a la mano, o solo un punto en la dirección correcta.

Respuesta

13

Subversion incluye la herramienta svnversion precisamente para este propósito. Una copia de trabajo puede tener modificaciones locales, o puede consistir en una combinación de revisiones. svnversion sabe cómo manejar eso; ver los ejemplos en la documentación vinculada.

Puede invocar svnversion del pitón de esta manera:

import subprocess 

def svnversion(): 
    p = subprocess.Popen("svnversion", stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    (stdout, stderr) = p.communicate() 
    return stdout 
+0

¿Por qué 'shell = True'? Ver https://docs.python.org/2/library/subprocess.html#frequently-used-arguments – lorenzog

+0

@lorenzog: Esta respuesta tiene casi 7 años, así que no recuerdo. Si ha verificado que funciona sin shell = True, hágamelo saber y lo editaré. –

+0

Parece que funciona bien al menos para mí: http://stackoverflow.com/a/37157630/204634 (por alguna razón, no puedo @ -su nick ...?) – lorenzog

3

Puede obtener el número de revisión actual de un pago usando, en la línea de comando, "svn info".

Por ejemplo:

$ svn info 
Chemin : . 
URL : http://.../trunk 
Racine du dépôt : http://... 
UUID du dépôt : 128b9c1a-...-612a326c9977 
Révision : 185 
Type de nœud : répertoire 
Tâche programmée : normale 
Auteur de la dernière modification : ... 
Révision de la dernière modification : 185 
Date de la dernière modification: 2009-09-28 20:12:29 +0200 (lun. 28 sept. 2009) 

Nota que está localizada; si estás en Linux, se podría tratar de usar:

$ LANG=en svn info 
svn: warning: cannot set LC_CTYPE locale 
svn: warning: environment variable LANG is en 
svn: warning: please check that your locale name is correct 
Path: . 
URL: http://.../trunk 
Repository Root: http://... 
Repository UUID: 128b9c1a-...-612a326c9977 
Revision: 185 
Node Kind: directory 
Schedule: normal 
Last Changed Author: mzeis 
Last Changed Rev: 185 
Last Changed Date: 2009-09-28 20:12:29 +0200 (Mon, 28 Sep 2009) 

Si se usa esto desde PHP, sin embargo, conseguir que como XML podría ser más útil (más fácil de analizar, y no locale-consciente):

$ svn info --xml 
<?xml version="1.0"?> 
<info> 
<entry 
    kind="dir" 
    path="." 
    revision="185"> 
<url>http://.../trunk</url> 
<repository> 
<root>http://...</root> 
<uuid>128b9c1a-...-612a326c9977</uuid> 
</repository> 
<wc-info> 
<schedule>normal</schedule> 
<depth>infinity</depth> 
</wc-info> 
<commit 
    revision="185"> 
<author>...</author> 
<date>2009-09-28T18:12:29.130307Z</date> 
</commit> 
</entry> 
</info> 

Sólo tiene que utilizar simplexml_load_string en que, a buscar el atributo de la etiqueta revisionentry.


Tenga en cuenta que no haría eso en cada vista de página: no tan rápido como uno esperaría para su aplicación.

En cambio, obtendría ese número de revisión al crear el archivo que luego enviaré al servidor de producción y lo almacenaré en algún tipo de archivo de configuración.

De esta manera, no necesita usar el comando svn en su servidor de producción, y tampoco necesita hacer el pago en ese servidor.

+0

Esperaba un método que no sea el de 'svn info', pero supongo que es una solución válida. Probablemente produce información más consistente que el análisis de un archivo ... la opción '--xml' que no conocía; debería hacer las cosas más fáciles. – mpen

4

Probablemente escriba el número de versión en un archivo de texto en algún lugar dentro del sitio web usando el gancho post-commit y luego simplemente lea ese archivo al cargar su página.

More on using hooks here

+0

¡Ahora que suena eficiente! – mpen

+0

No puedo decir si eres sarcástico o no, pero me suena mucho más eficiente que bombardear o derivar a svn y luego analizar un montón de resultados. – glomad

+0

No ... en absoluto. No quise que salga de esa manera :) – mpen

0

Se podía pagar a la línea de comandos y ejecutar svn info. Solo ten en cuenta que esto podría ser una revisión mixta. También podría ejecutar un svn y la última línea de STDOUT le dará el número de revisión.

O, ¿quieres utilizar la API svn? También es posible que desee ver el código TortoiseSVN de SubWCRev que se utiliza para reemplazar un token en un archivo con las revisiones actuales del WC.

2

Si usted está buscando una implementación de Python, echa un vistazo a pysvn, puede invocar el info command para obtener detalles, incluyendo la revisión actual:

entry = info(path) 
3

Esto funciona para svn versión 1.6.2.Pero tenga cuidado, diferentes versiones de SVN usan diferentes formatos de la carpeta .svn.

<?php 

$contents = file_get_contents(dirname(__FILE__) . '/.svn/entries'); 
preg_match("/dir\n(.+)/", $contents, $matches); 
$svnRevision = $matches[1]; 

print "This Directory's SVN Revsion = $svnRevision\n"; 
3

Siguiendo a Lance, aquí hay una línea de comando de un solo liner.

svn log -q --limit 1 http://svnbox/path/to/repo/trunk \ 
| php -r 'fgets(STDIN); preg_match("/(\d+)/", fgets(STDIN), $m); echo $m[0];' 
1

Sé que esto es bastante viejo, pero pensé que ofrecería hasta cómo hacer esto en PHP para mis aplicaciones web:

Coloque esto en un archivo PHP en su aplicación y configure la propiedad SVN Keywords for "Date Review Author AuthorURL Id" (sustitución de palabras clave en el archivo).

$SVN_rev = "\$LastChangedRevision$"; 
$SVN_headURL = "\$HeadURL$"; 

function stripSVNstuff($s) 
{ 
    $s = substr($s, strpos($s, ":")+1); 
    $s = str_replace("$", "", $s); 
    return trim($s); 
} 

Así que después de SVN hace la sustitución de palabras clave en el archivo de origen, la línea de $ SVN_rev se verá así:

$SVN_rev = "\$LastChangedRevision: 6 $"; 

lo que la salida de stripSVNstuff ($ SVN_rev) habría "6" (sin comillas)

Cuestiones relacionadas