2009-12-23 18 views
8

Utilizo git-svn para interactuar con un repositorio SVN existente que contiene algunos proyectos C++. subwcrev.exe se usa como un evento de preconstrucción para actualizar algunas cadenas en un encabezado C++ (svnversion.h). Estas cadenas se compilan de forma rígida para formar información de versión para el binario resultante.Emular subwcrev al usar git-svn

Dado que subwcrev requiere que los metadatos .svn funcionen, el evento de preconstrucción fallará cuando se use en la copia de trabajo de git-svn. Así que se me ocurrió el siguiente script bash que utilizo como ganchos post-commit y post-checkout para mi repositorio de git. El script intenta hacer lo mismo que subwcrev basado en el resultado de git svn info (almacenado en un archivo local).

#!/bin/sh 
if [ ! -f svninfo ] ; then 
    git svn info > svninfo 
fi 

revision=`sed -e "/Revision/!d" -e "s/Revision: \(.*\)/\1/" svninfo` 
lastchange=`sed -e "/Last Changed Rev/!d" -e "s/Last Changed Rev: \(.*\)/\1/" svninfo` 
# Get the last changed date, extract timestamp, replaces dashes with slashes 
changedate=`sed -e "/Last Changed Date/!d" -e "s/Last Changed Date: \(.\{19\}\).*/\1/" -e "s!-!\\\\\\/!g" svninfo` 
now=`date "+%Y\/%m\/%d %H:%M:%S"` 

gitcommit=`git show --abbrev-commit | sed -n -e "s/commit //p"` 

for entry in $(find -name svnversion_template.h); do 
    newname=`echo $entry|sed -e "s/_template//"` 
    sed -e "s/\\\$WCRANGE\\\$/${revision}/" \ 
     -e "s/\\\$WCREV\\\$/${lastchange}-${gitcommit}/" \ 
     -e "s/\\\$WCDATE\\\$/${changedate}/" \ 
     -e "s/\\\$WCNOW\\\$/${now}/" \ 
     -e "s/\\\$WCURL\\\$/local git repo/" \ 
     -e "s/\\\$WCMODS.*\\\$/(true)/" \ 
     -e "s/\\\$WCMIXED.*\\\$/(false)/" \ 
     $entry > `echo $entry|sed -e "s/_template//"` 
done 

Lo que realmente no puedo emular hasta ahora es la detección automática de un cambios no confirmados locales (en base a la última consulta a cabo la revisión SVN) que hace SubWCRev tan útil.

Estoy reemplazando $WCREV$ con el número de revisión del repositorio SVN (como lo haría subwcrev) pero esta vez agrego mi hash abreviado de commit de git para identificar el código que compilé. Mi pregunta ahora es: ¿hay alguna manera de distinguir en un script de shell si mi HEAD actual difiere de la última revisión de SVN obtenida para que yo pueda omitir agregar la parte -${gitcommit} y establecer $WCMODS$ en falso?

Si hubiera algo como un gancho post-"git svn dcommit", mi problema se resolvería, también, desde entonces ese gancho especial crearía el svnversion.h de manera diferente. ¿Se puede agregar tal gancho de alguna manera?

Respuesta

0

Realmente no entiendo sus puntos, pero primero empiezo a mejorar su script.

revision=$(grep -Po "(?<=Revision:).*" svninfo) 
lastchange=$(grep -Po "(?<=Last Changed Rev:).*" svninfo) 
# Get the last changed date, extract timestamp, replaces dashes with slashes 
changedate=$(grep -Po "(?<=Last Changed Date:).{19}" svninfo) 
changedate=${changedate//-//} 
now=$(date "+%Y\/%m\/%d %H:%M:%S") 

Luego, en bucle, ¿podría explicar detalles, qué resultado necesita? ¿Puedes mostrar una muestra de svnversion_template.h?

0

Parece que tendrá que analizar el contenido de la consulta git svn info usted mismo para obtener lo que normalmente se almacena en WCREV. Los resultados ejemplo de este aspecto para mí:

git svn info 
Path: . 
URL: http://myurl.com/trunk/myrepo 
Repository Root: http://myurl.com 
Repository UUID: 15fed3e9-81ce-ef4a-a7da-fc36e3df1edc 
Revision: 14106 
Node Kind: directory 
Schedule: normal 
Last Changed Author: myusername 
Last Changed Rev: 14106 
Last Changed Date: 2015-05-29 10:23:10 -0400 (Fri, 29 May 2015) 

Ahora para la segunda parte de su pregunta, si es o no se puede saber si la cabeza git coincide con la última svn checkout, tendrá que utilizar el comando git diff git-svn mando. "git-svn" aquí está el nombre de la rama que mantiene el programa git-svn, y si todo está actualizado, los resultados estarán vacíos.