Uso git-svn per interagire con un repository SVN esistente che contiene alcuni progetti C++. subwcrev.exe è usato come evento pre-build per aggiornare alcune stringhe in un'intestazione C++ (svnversion.h). Queste stringhe vengono compilate in modo da formare alcune informazioni sulla versione per il file binario risultante.Emula subwcrev quando si utilizza git-svn
Poiché subwcrev richiede che i metadati di .svn funzionino, l'evento di pre-build fallirà se utilizzato sulla copia di lavoro di git-svn. Così ho trovato il seguente script bash che uso come hook post-commit e post-checkout per il mio repository git. Lo script cerca di fare la stessa cosa di subwcrev in base all'output di git svn info (memorizzato in cache in un file locale).
#!/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
Quello che non riesco davvero emulare finora è il rilevamento automatico di un modifiche non locali (in base all'ultimo controllato di revisione SVN) che rende subwcrev così utile.
Sto sostituendo $WCREV$
con il numero di revisione del repository SVN (come farebbe subwcrev) ma questa volta aggiungo il mio hash del commit git abbreviato per identificare il codice che ho compilato. La mia domanda ora è: c'è un modo per distinguere in uno script di shell se il mio attuale HEAD differisce dall'ultima revisione SVN recuperata in modo che potessi omettere di aggiungere la parte -${gitcommit}
e impostare $WCMODS$
su falso?
Se ci fosse qualcosa come un aggancio post-"git svn dcommit"
, il mio problema sarebbe risolto, dato che quel gancio speciale avrebbe creato svnversion.h in modo diverso. Questo gancio può essere aggiunto in qualche modo?