2009-12-23 12 views
8

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?

risposta

0

Non ho davvero i tuoi punti, ma ho iniziato a migliorare il tuo script prima.

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") 

Quindi, nel ciclo for, potresti spiegare i dettagli, di quale risultato hai bisogno? Puoi mostrare un esempio di svnversion_template.h?

0

Quindi sembra che potrebbe essere necessario analizzare il contenuto della query git svn info per ottenere ciò che è normalmente memorizzato in WCREV. I risultati di esempio simile a questa per me:

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) 

Ora per la seconda parte della tua domanda, anche se non si può dire se la tua testa git corrisponde l'ultima cassa svn, è necessario utilizzare il comando git diff git-svn comando. "git-svn" qui è il nome del ramo che il programma git-svn sta mantenendo, e se tutto è aggiornato, i risultati saranno vuoti.

Problemi correlati