2008-12-12 12 views
9

Me gustaría tener el número de revisión del código fuente del código fuente y la versión de Delphi. ¿Cuál es la mejor manera de hacer esto automáticamente?Cómo incluir el número de revisión de Subversion en el proyecto Delphi

Me gustaría mostrar el número de revisión en la pantalla "Acerca de" y en la información de la versión del proyecto.

Actualmente estoy usando Delphi IDE (2006/2007) y Tortoise SVN.

Respuesta

9

Estoy de acuerdo con los comentarios sobre $ Revisión $ no siendo la herramienta adecuada para el trabajo. Usando una herramienta para extraer el número de revisión de la salida de svninformación es de hecho lo correcto.Sin embargo

hay dos cosas a tener en cuenta:

  1. SVNinformación sólo devolverá la información correcta si SVNactualización se ha ejecutado en el directorio con las fuentes controladas a cabo . Si usa pasos de compilación personalizados, probablemente también deba agregar un comando.

  2. SVNinformación le da también información sobre la ruta del repositorio. Esta es la única forma de diferenciar entre fuentes en troncal y en otro lugar, como en etiquetas. Si desea que su cuadro Acerca de contenga una cadena para identificar correctamente las fuentes utilizadas para compilar la aplicación, asegúrese de que la ruta del repositorio esté disponible también.

Editar:

Ésta es una secuencia de comandos que deben copiarse en el directorio de nivel superior del proyecto. Actualizará las fuentes del repositorio, obtendrá el número de revisión SVN de la llamada svn info y lo comparará con la constante SVN_REVISION del archivo src \ SvnRev.inc. Si falta el archivo, lo creará; si la revisión es diferente, se sobrescribirá. Si svn no está disponible, escribirá el número de revisión 0 en el archivo.

El archivo resultante src \ SvnRev.inc se puede simplemente incluir en un archivo de origen. Se podría crear un archivo similar para incluirlo en el recurso de versión.

@echo off 

setlocal 
rem determine project top level directory from command file name 
set PRJDIR=%~dp0 
cd %PRJDIR% 

set SVNREVFILE=src\SvnRev.inc 

rem execute "svn info", extract "Revision: 1234" line, and take SVN rev from there 
svn update 
for /F " usebackq tokens=1,2 delims=: " %%i in (`svn info`) do set key=%%i&set value=%%j&call :read-svn-rev 
@echo SVN revision "%SVNREV%" 

rem extract "const SVN_REVISION = 1234;" line, and take header SVN rev from there 
for /F " usebackq tokens=2,4 " %%i in (%SVNREVFILE%) do set name=%%i&set value=%%j&call :read-file-rev 
@echo Include file revision "%FILEREV%" 

rem check for valid SVN rev 
if "%SVNREV%" EQU "" goto :no-svn-ref 
rem do not write file if SVN ref is equal 
if "%FILEREV%" EQU "%SVNREV%" goto :EOF 

@echo Writing svn revision %SVNREV% to %SVNREVFILE% 
@echo const SVN_REVISION = %SVNREV% ; > %SVNREVFILE% 
goto :EOF 

:no-svn-ref 
if not exist %SVNREVFILE% goto :no-header-file 
rem do not write file if SVN ref is already unset 
if "%FILEREV%" EQU "0" goto :EOF 
@echo Writing svn revision 0 to %SVNREVFILE% 
goto :write-no-version 

:no-header-file 
@echo Creating %SVNREVFILE% with svn revision 0 
:write-no-version 
@echo const SVN_REVISION = 0 ; > %SVNREVFILE% 
goto :EOF 

endlocal 
goto :EOF 

:read-svn-rev 
if "%key%" EQU "Revision" set SVNREV=%value%& 
goto :EOF 

:read-file-rev 
if "%name%" EQU "SVN_REVISION" set FILEREV=%value%& 
goto :EOF 
+0

Encontré que esto no funcionaba correctamente. Creo que la razón probablemente sea porque mi copia de trabajo siempre contiene la estructura completa de mi proyecto, incluidas las etiquetas y las ramas. Por lo tanto, el script tomará el número de revisión del último cambio globalmente, en lugar de solo la carpeta donde se ejecuta. SubWCRev.exe por otro lado funciona perfectamente con mi escenario de uso. –

+0

@Timo: Ciertamente funciona correctamente, aunque no haga lo que espera que haga. Este script devuelve la revisión global, que es la que solicitó OP. Nunca reclamé esto para devolver la última revisión de compromiso, que es por supuesto diferente. Gracias por el voto negativo, sin embargo. – mghie

+0

@mghie: Después de volver a leer tu respuesta, lo admito, sí, tienes razón. Nunca afirmó que devolvería la última revisión de confirmación en la copia de trabajo actual. Por lo tanto, he eliminado mi voto a la baja. Todavía no es la solución adecuada para mí, pero estoy seguro de que otros encontraron esta respuesta útil. –

1

Sugerencia: modifique sus scripts de compilación para cambiar algún archivo de versión que se compila posteriormente. Es difícil sugerir algo más específico sin conocer el entorno de compilación que estás utilizando.

13

Hay un programa llamado SubWCRev.exe que viene con TortoiseSVN que reemplazará el token por usted. Por lo tanto, en algún lugar de su fuente, inserte el token y pase los nombres de archivo de entrada y salida a SubWCRev.exe, y reemplazará el token con varias informaciones SVN, por ejemplo, número de revisión. Tenga en cuenta que este es un programa independiente que puede usar con su script de compilación, no necesita usar TortoiseSVN con él.

+0

Así es como lo uso. Utilizamos el script anterior pero hoy estábamos creando una etiqueta de lanzamiento y el script incluía el número de versión incorrecto en la compilación por las razones explicadas anteriormente. Mi error. Cambiamos a usar SubWCRev.exe ahora. –

1

Si usa svn:keywords, e incluye $Revision$ en su archivo, se actualizará cada vez que se confirma el archivo.

Así que pegue eso en un archivo version en el nivel superior de su proyecto, que puede cambiar/confirmar en cada compilación, y lea eso para obtener la versión.

+0

Suena genial, excepto que me gustaría obtener la "revisión global", que se analiza en la documentación. – Harriv

+0

Esto no funcionará a menos que haya alguna forma automática de cambiar ese archivo, de lo contrario no se confirmará y el número de revisión no cambiará. Y aún así es un truco en el mejor de los casos, porque obtienes muchos cambios SVN innecesarios y contaminación de diffs. – mghie

5

En un comentario menciona que desea la revisión global, no la revisión de ningún archivo en particular. No va a obtener ese número en una palabra clave ya que el número no está relacionado con ningún archivo, sino con el archivo que se haya registrado más recientemente en cualquier lugar del árbol.

Puede hacer una secuencia de comandos o un pequeño programa que ejecute svn info y luego analiza la salida para obtener el número de revisión que está buscando. Puede usar ese número junto con una plantilla de un archivo RC para insertar el número de revisión en el registro de información de la versión. Este archivo generado no se verificará. Ejecute el script como parte de su procedimiento MSBuild.

Para versiones anteriores a MSBuild Delphi, cree un grupo de proyectos y luego conviértalo en el primer proyecto del grupo. "Build all" o "Compile all" ejecutará el script antes de compilar el proyecto principal.

También podría tener un código en la sección initialization de cada unidad que agregue su revisión (según lo obtenido por la respuesta de Ieure) a una lista global. Luego seleccione el número más alto en la lista en tiempo de ejecución. Eso puede darle el número para mostrar en el cuadro "sobre", pero no puede usarlo en la información de la versión de su programa.

Cuestiones relacionadas