-je utiliser pour interagir avec svn-git un dépôt SVN existant qui contient certains projets C++. subwcrev.exe est utilisé comme un événement de pré-construction pour mettre à jour certaines chaînes dans un en-tête C++ (svnversion.h). Ces chaînes sont compilées pour former des informations de version pour le binaire résultant.Emuler SubWCRev lors de l'utilisation git-svn
Depuis SubWCRev nécessite des métadonnées svn pour travailler, l'événement pré-construction va échouer lorsqu'il est utilisé sur la copie de travail git-svn. J'ai donc créé le script bash suivant que j'utilise comme hook post-commit et post-checkout pour mon dépôt git. Le script essaie de faire la même chose que subwcrev en fonction de la sortie de git svn info (mise en cache dans un fichier 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
Ce que je ne peux pas imiter vraiment à ce jour est la détection automatique d'un des changements locaux non engagés (en fonction de la dernière vérification sur la révision SVN) qui fait SubWCRev si utile.
Je remplace $WCREV$
par le numéro de révision du dépôt SVN (comme subwcrev le ferait) mais cette fois j'ajoute mon hachage abrégé git commit pour identifier le code que j'ai compilé. Ma question est maintenant: Est-il possible de distinguer dans un script shell si ma tête diffère de la dernière révision SVN tiré par les cheveux pour que je puisse omettre d'ajouter la partie -${gitcommit}
et mettre $WCMODS$
false?
S'il y avait quelque chose comme un hook post-"git svn dcommit"
, mon problème serait également résolu, puisque ce hook spécial créerait svnversion.h différemment. Un tel crochet peut-il être ajouté d'une manière ou d'une autre?