2008-08-19 10 views
39

Me gustaría implementar una forma de registrar la versión de un proyecto dentro del código, para que se pueda usar al probar y ayudar a rastrear errores. Parece que el mejor número de versión para usar sería simplemente el número de revisión actual de Subversion. ¿Hay alguna manera fácil de enganchar este número en un archivo de encabezado (C++ en mi caso) o algo así, que luego pueda obtener en el código? Supongo que esto es un gancho de commit de post o algo así?Obteniendo el número del repositorio de subversión en el código

¿Alguien tiene alguna experiencia en la implementación de esto (con código para compartir, por favor?), O puede sugerir una mejor alternativa? Gracias.

Respuesta

14

Aunque ingenioso, la palabra clave de revisión truco sólo actualiza el archivo cuando se ha cambiado en esa revisión - si no cambia el archivo , entonces continuará reflejando la revisión anterior.

Si desea que el software siempre refleje el número de revisión general, entonces deberá profundizar en el relevant SVN entries file y extraerlo, que no es demasiado difícil (es un archivo XML).

Wikipedia hace esto en their version page para indicar la revisión del software que se está ejecutando en vivo; the code is here - busque el método getSvnRevision().

+0

Debería verificar recursivamente todos los archivos de entradas para encontrar el número de revisión más alto. Supongo que eso es lo que hace svnversion. –

+3

svnversion parece devolver la última revisión modificada de todo el repositorio (no solo la ruta de su WC). Ver mi respuesta a esta pregunta relacionada sobre cómo he resuelto esto: http://stackoverflow.com/questions/56227/how-do-you-determine-the-latest-svn-revision-number-rooted-in-a -directory # 249905 – hasseg

+0

Parece que esto se rompe con Subversion 1.7, que elimina el directorio .svn en todas partes, excepto en el nivel superior del sandbox. –

4

Puede usar la propiedad svn:keywords para habilitar la palabra clave Rev.

A continuación, puede utilizar $Rev$ en el código y SVN se ampliará automáticamente al actualizar a $Rev: 256 $ que luego pueden analizar ...

More info on the Subversion manual

+5

Esto no es lo correcto si desea un número de versión de proyecto completo, ya que $ Rev $ cambia solo cuando ese archivo se actualiza, no cuando se actualiza algo en el proyecto. –

27

dos maneras:

Insertar $ Id $ o $ Revisión $ dentro del código. A continuación, establezca svn: keywords = "Id Revision" propiedad en el archivo. Esto le dará la última revisión modificada de ese archivo fuente. Bueno para pequeños proyectos y scripts.

Como alternativa, utilice un proceso impulsado por Makefile y la herramienta de línea de comandos svnversion. (Lenguaje específico - esto debería funcionar para C/C++)

echo -n "#define VERSION 1.0.1-" > version.h 
svnversion -n . >> version.h 

O algún script de construcción más compleja con SED y version.h.in. Entonces solo #include version.h

Esto le dará el número de versión del repositorio, que cambiará con cada confirmación/actualización, y es probablemente un número de versión más apropiado para la mayoría de los proyectos.

Nota: También utilicé una cadena de versión legible que actualicé manualmente. El ejemplo daría: Versión: 1.0.1-r13445

~ J

13

También puede usar SubWCRev, que es parte de TortoiseSVN.

SubWCRev es un programa de consola de Windows que se puede utilizar para leer el estado de una copia de trabajo de Subversion y opcionalmente realizar una sustitución de palabras clave en un archivo de plantilla.Esto se usa a menudo como parte del proceso de compilación como medio para incorporar información de copia de trabajo en el objeto que está creando. Normalmente, se puede usar para incluir el número de revisión en un cuadro "Acerca de".

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html

6

en su Makefile, añadir:

SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"' 
CFLAGS := $(SVNDEV) ... 

continuación, puede utilizar la macro SVN_REV cualquier parte del código, por ejemplo:

printf ("Version: SVN %s\n", SVN_REV); 
0

Una buena puesta al día solución:

Crear un Makefile que contiene la siguiente línea (en la misma carpeta que YourFile.dox):

sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox 

Y YourFile.dox debe contener lo siguiente:

... 
PROJECT_NUMBER   = "Revision RevNumber" 
... 

Ahora:

  1. sed reemplaza RevNumber en el .dox con la salida de svnversion (ejecutada en la carpeta principal de su repositorio) y guarda el archivo modificado en YourFileDummy.dox
  2. doxygen se ejecuta en YourFileDummy.dox para generar la documentación
  3. La documentación contendrá ahora el número de revisión!
Cuestiones relacionadas