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?