2009-12-23 6 views
8

-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?

Répondre

0

Je ne comprends vraiment pas vos points, mais commencer à améliorer votre premier 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") 

Puis, dans la boucle, pourriez-vous expliquer les détails, de quel résultat avez-vous besoin? Pouvez-vous montrer un exemple de svnversion_template.h?

0

il semble donc que vous pourriez avoir à analyser le contenu du git svn info vous interroger pour obtenir ce qui est normalement stocké dans WCREV. Les exemples de résultats ressemblent à ceci pour moi:

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) 

Maintenant, pour la deuxième partie de votre question, si vous pouvez dire si votre git HEAD correspond à la dernière caisse svn, vous devrez utiliser la commande git diff git-svn commander. "git-svn" est le nom de la branche que le programme git-svn gère, et si tout est à jour, les résultats seront vides.