svn - una - ¿Cómo acceder al número de versión de Subversion actual?
svn tutorial point (16)
Agregue svn: palabras clave a las propiedades SVN del archivo fuente:
svn:keywords Revision
Luego en el archivo fuente incluye:
private const string REVISION = "$Revision$";
La revisión se actualizará con el número de revisión en el siguiente compromiso para (por ejemplo) "$Revision: 4455$"
. Puede analizar esta cadena para extraer solo el número de revisión.
¿Cómo se puede importar automáticamente el último número de compilación / revisión en subversión?
El objetivo sería tener ese número visible en el pie de página de su página web como lo hace SO.
Aquí hay una pista, cómo podría usar las capacidades de Netbeans para
crear tareas personalizadas que generarían scm-version.txt:
Abra su archivo build.xml y agregue el siguiente código inmediatamente después
<import file="nbproject/build-impl.xml"/>
<!-- STORE SUBVERSION BUILD STRING -->
<target name="-pre-compile">
<exec executable="svnversion"
output="${src.dir}/YOUR/PACKAGE/NAME/scm-version.txt"/>
</target>
Ahora, Netbeans modifica la cadena de la versión de Subversion a scm-version.txt cada vez que hace clean / build .
Puede leer el archivo durante el tiempo de ejecución haciendo:
getClass().getResourceAsStream("scm-version.txt"); // ...
No olvide marcar el archivo scm-version.txt como svn: ignorar .
Bueno, puedes ejecutar ''svn info'' para determinar el número de revisión actual, y probablemente puedas extraer eso bastante fácilmente con una expresión regular, como "Revisión: ([0-9] +)".
Desea el subcomando de información de Subversion, de la siguiente manera:
$ svn info .
Path: .
URL: http://trac-hacks.org/svn/tracdeveloperplugin/trunk
Repository Root: http://trac-hacks.org/svn
Repository UUID: 7322e99d-02ea-0310-aa39-e9a107903beb
Revision: 4190
Node Kind: directory
Schedule: normal
Last Changed Author: coderanger
Last Changed Rev: 3397
Last Changed Date: 2008-03-19 00:49:02 -0400 (Wed, 19 Mar 2008)
En este caso, hay dos números de revisión: 4190 y 3397. 4190 es el último número de revisión para el repositorio, y 3397 es el número de revisión del último cambio al subárbol del que se ha extraído este espacio de trabajo. Puede especificar una ruta a un espacio de trabajo o una URL a un repositorio.
El fragmento de AC # para extraer esto en Windows se vería así:
Process process = new Process();
process.StartInfo.FileName = @"svn.exe";
process.StartInfo.Arguments = String.Format(@"info {0}", path);
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
// Parse the svn info output for something like "Last Changed Rev: 1234"
using (StreamReader output = process.StandardOutput)
{
Regex LCR = new Regex(@"Last Changed Rev: (/d+)");
string line;
while ((line = output.ReadLine()) != null)
{
Match match = LCR.Match(line);
if (match.Success)
{
revision = match.Groups[1].Value;
}
}
}
(En mi caso, utilizamos la revisión de Subversion como parte del número de versión para ensamblajes).
El comando svnversion
es la forma correcta de hacer esto. Muestra el número de revisión en el que está toda su copia de trabajo, o un rango de revisiones si su copia de trabajo es mixta (por ejemplo, algunos directorios están actualizados y otros no). También indicará si la copia de trabajo tiene modificaciones locales. Por ejemplo, en un directorio de trabajo bastante sucio:
$ svnversion
662:738M
La palabra clave $ Revision $ no hace lo que desea: solo cambia cuando lo hace el archivo que lo contiene. El libro de Subversion brinda más detalles . El comando "svn info" tampoco hace lo que desea, ya que solo le informa el estado de su directorio actual, ignorando el estado de los subdirectorios. En el mismo árbol de trabajo que el ejemplo anterior, tenía algunos subdirectorios que eran más nuevos que el directorio en el que estaba, pero "svn info" no se da cuenta:
$ svn info
... snip ...
Revision: 662
Es fácil incorporar svnversion en su proceso de compilación, de modo que cada compilación obtenga el número de revisión en alguna forma accesible en tiempo de ejecución. Para un proyecto Java, por ejemplo, nuestro archivo Makefile convirtió el resultado de svnversion en un archivo .properties.
En Rails utilizo este fragmento en mi environment.rb, que me proporciona una constante que puedo usar en toda la aplicación (como en el pie de página del diseño de una aplicación).
SVN_VERSION = IO.popen("svn info").readlines[4].strip.split[1]
En mi último proyecto, resolví este problema usando varias herramientas, SVN, NAnt y una tarea NAnt personalizada.
- Use NAnt para ejecutar
svn info --xml ./svnInfo.xml
- Use NAnt para extraer el número de revisión del archivo xml con
<xmlpeek>
- Use una tarea NAnt personalizada para actualizar el atributo AssemblyVersion en el archivo AssemblyInfo.cs con la última versión con el número de versión (por ejemplo, major.minor.maintenance, revision) antes de compilar el proyecto.
Las secciones relacionadas con la versión de mi script de compilación se ven así:
<!-- Retrieve the current revision number for the working directory -->
<exec program="svn" commandline=''info --xml'' output="./svnInfo.xml" failonerror="false"/>
<xmlpeek file="./svnInfo.xml" xpath="info/entry/@revision" property="build.version.revision" if="${file::exists(''./svnInfo.xml'')}"/>
<!-- Custom NAnt task to replace strings matching a pattern with a specific value -->
<replace file="${filename}"
pattern="AssemblyVersion(?:Attribute)?/(/s*?/"(?<version>(?<major>[0-9]+)/.(?<minor>[0-9]+)/.(?<build>[0-9]+)/.(?<revision>[0-9]+))/"/s*?/)"
value="AssemblyVersion(${build.version})"
outfile="${filename}"/>
El crédito para la expresión regular va a: http://code.mattgriffith.net/UpdateVersion/ . Sin embargo, descubrí que UpdateVersion no satisfacía mis necesidades ya que la función pin se rompió en la construcción que tenía. De ahí la tarea NAnt personalizada.
Si alguien está interesado en el código, para la tarea de replace
NAnt personalizada, házmelo saber. Como esto fue para un proyecto relacionado con el trabajo, tendré que consultar con la administración para ver si podemos publicarlo bajo una licencia amigable (gratuita).
Haga que su proceso de creación llame al comando svnversion e incruste su salida en {source | binaries} generado. Esto no solo proporcionará la revisión actual (como muchos otros ejemplos aquí), sino que su cadena de salida también indicará si se está realizando una construcción en un árbol mixto o en un árbol que no coincide exactamente con el número de revisión en cuestión (es decir, un árbol con cambios locales).
Con un árbol estándar:
$ svnversion
3846
Con un árbol modificado:
$ echo ''foo'' >> project-ext.dtd
$ svnversion
3846M
Con un árbol modificado de revisión mixta:
$ (cd doc; svn up >/dev/null 2>/dev/null)
$ svnversion
3846:4182M
Si está ejecutando bajo GNU / Linux, cd al directorio de la copia de trabajo y ejecute:
svn -u status | grep Status/ against/ revision: | awk ''{print $4}''
Desde mi experiencia, svn info no da números confiables después de renombrar directorios.
Si tiene tortuga SVN, puede usar SubWCRev.exe
Crea un archivo llamado:
RevisionInfo.tmpl
SvnRevision = $WCREV$;
Luego ejecuta este comando:
SubWCRev.exe . RevisionInfo.tmpl RevisionInfo.txt
Creará un archivo ReivisonInfo.txt con su número de revisión de la siguiente manera:
SvnRevision = 5000;
Pero en lugar de usar el archivo .txt puede usar cualquier archivo fuente que desee y tener acceso al número de reivisión dentro de su código fuente.
Usando c # y SharpSvn (desde http://sharpsvn.net ) el código sería:
//using SharpSvn;
long revision = -1;
using(SvnClient client = new SvnClient())
{
client.Info(path,
delegate(object sender, SvnInfoEventArgs e)
{
revision = e.Revision;
});
}
Uso el proyecto MSBuild Community Tasks , que tiene una herramienta para recuperar el número de revisión de SVN y agregarlo a su AssemblyInfo.vb. A continuación, puede usar la reflexión para recuperar esta cadena para mostrarla en su UI.
Aquí hay una publicación completa del blog con instrucciones .
Usted no dice qué lenguaje / marco de programación está usando. He aquí cómo hacerlo en Python usando PySVN
import pysvn
repo = REPOSITORY_LOCATION
rev = pysvn.Revision( pysvn.opt_revision_kind.head )
client = pysvn.Client()
info = client.info2(repo,revision=rev,recurse=False)
revno = info[0][1].rev.number # revision number as an integer
si está utilizando svnant, puede usar wcVersion, que duplica svnveresion y devuelve valores digeribles. ver: http://subclipse.tigris.org/svnant/svn.html#wcVersion
Creé un complemento de la versión SVN para el proyecto Build Version Increment en CodePlex. Este complemento SVN extraerá el último número de revisión de cambio de su copia de trabajo y le permitirá usarlo en su número de versión, que debería lograr exactamente lo que está tratando de hacer. Build Version Increment es bastante flexible y le permitirá configurar cómo se realiza el control de versiones de varias maneras.
BVI solo funciona con Visual Studio, pero ya que estás usando Asp.Net, eso no será un problema. No requiere escribir ningún código ni editar xml, ¡así que sí!
svn info <Repository-URL>
o
svn info --xml <Repository-URL>
Luego mira el resultado. Para xml, parse / info / entry / @ revision para la revisión del repositorio (151 en este ejemplo) o / info / entry / commit / @ revision para la revisión del último commit contra esta ruta (133, útil cuando se trabaja con etiquetas):
<?xml version="1.0"?>
<info>
<entry
kind="dir"
path="cmdtools"
revision="151">
<url>http://myserver/svn/stumde/cmdtools</url>
<repository>
<root>http://myserver/svn/stumde</root>
<uuid>a148ce7d-da11-c240-b47f-6810ff02934c</uuid>
</repository>
<commit
revision="133">
<author>mstum</author>
<date>2008-07-12T17:09:08.315246Z</date>
</commit>
</entry>
</info>
Escribí una herramienta ( cmdnetsvnrev , código fuente incluido) para mí que reemplaza la revisión en mis archivos AssemblyInfo.cs. Sin embargo, está limitado a ese propósito, pero generalmente svn info y luego el procesamiento es el camino a seguir.