Come usare svnlook in SVN per cercare elementi modificati
Domanda
Potresti guidarmi su come svnlook
sta funzionando di seguito.Voglio includere questo in un gancio per prevenire i commit in un tag sotto /tags
:
$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
. Soluzione
Un gancio di pre-commit di sovversione consentirà a un commit di passare se restituisce un codice di uscita di 0
. In caso contrario, il gancio di pre-commit sarà will e il commit non verrà elaborato.
Il $SVNLOOK changed -t "$TXN" "$REPOS"
mostrerà le modifiche in $REPOS
che ha avuto luogo in $TXN
. Le variabili della shell devono essere impostate da te. Se guardi lo script pre-commit
che viene fornito con Subversion, vedrai:
$TXN=$1
$REPO=$2
.
L'uscita del comando svnlook changed
è simile a questo:
$ $SVNLOOK changed -t $TXN $REPOS
A trunk/vendors/deli/
A trunk/vendors/deli/chips.txt
A trunk/vendors/deli/sandwich.txt
A trunk/vendors/deli/pickle.txt
U trunk/vendors/baker/bagel.txt
_U trunk/vendors/baker/croissant.txt
UU trunk/vendors/baker/pretzel.txt
D trunk/vendors/baker/baguette.txt
.
La prima colonna è se qualcosa fosse u preted, a ingleso o D eletinato. La seconda colonna si riferisce agli attributi.
Il resto è il nome del file che è stato recitato. È possibile vedere che baguette.txt
è stato cancellato e che una proprietà su croissant.txt
è stata modificata, ma il file stesso non è stato aggiornato.
Diciamo che qualcuno ha provato a cambiare un tag. L'output di svnlook changed
sarà simile a questo:
$SVNLOOK changed -t $TXN $REPOS
U tags/4.2.1/vendors/baker/bagel.txt
.
Il comando grep è questo:
grep "^U\W.*\/tags\/"
.
Questo è alla ricerca di una linea che inizia con ^U
, il che significa che è stato un aggiornamento. Quindi, cerca una stringa che inizia con /tags
. Hmmm ... potrebbe essere un problema. Non corrisponde all'output del comando svnlook changed
.
Forse dovrebbe essere:
grep -q "^U.[[\s+tags/"
.
Questo corrisponderà a qualsiasi stringa che inizia con U
, eventualmente seguito da un altro carattere, seguito da spazi bianchi, quindi immediatamente la parola tags/
.
Potresti voler verificare quell'espressione.
Il &&
è un operatore di elenco . Se l'espressione sul lato sinistro del &&
viene eseguito correttamente (I.e. restituisce un codice di uscita zero), la dichiarazione sul lato destro verrà eseguita. Altrimenti, la dichiarazione a destra non verrà eseguita.
Quindi, se il tuo grep
corrisponde a un modello che sembra che qualcuno abbia aggiornato un tag, sarà vero. La dichiarazione sul lato destro del &&
verrà eseguita.
quindi,
/bin/echo "Cannot commit to tags!" 1>&2
.
verrà eseguito. Questo viene inviato a Stderr che verrà inviato al client Subversion, ma solo se il codice di uscita del gancio di pre-commit è zero.
Quindi il comando Operatore successivo Elenco exit 1
verrà eseguito se il /bin/echo
ha esito positivo. (Potrebbe non essere, ma di solito lo sarà). Con ciò, il gancio di pre-commit esce con un codice di uscita non zero, il gancio fallisce e il Cannot commit to tags!
verrà inviato al client SVN per l'utente da vedere.
Non c'è assolutamente motivo nel mondo per questa affermazione per sembrare così. Questo è quasi equivalente ed è più facile da capire:
if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
/bin/echo "Cannot commit to tags!" 1>&2"
exit 1
fi
exit 0
.
Dopotutto, è necessario inserire questo in uno script di shell chiamato pre-commit
comunque e avere le variabili di shell $SVNLOOK
, $REPOS
e $TXN
Set.
Il motivo per cui questo non è abbastanza equivalente è che questo fallirà il commit anche se il /bin/echo
non riesce.
.
Se stai cercando un gancio di pre-commit per controllare i tag dei tag, dovresti dare un'occhiata a Miniera . Questo è stato testato su centinaia di sedi e ti darà molto più controllo sul tuo repository e fa un migliore controllo degli errori.
Questo gancio utilizza un file di controllo per controllare l'accesso al repository. Ad esempio, potresti voler essere in grado di lasciarti cambiare i tag se necessario.
[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL
[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL
[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr
.
Dai un'occhiata al gancio. Funziona con l'installazione standard perl 5.8.8 e su. Non richiede altri moduli. Tuttavia, se si utilizza LDAP o Active Directory per il controllo degli accessi di subversion, è possibile installare il modulo Net::LDAP
Perl e utilizzare i gruppi LDAP o Active Directory nel gancio di pre-commit per il controllo degli accessi.
Altri suggerimenti
$SVNLOOK changed -t "$TXN" "$REPOS"
stampa tutti i percorsi modificati. Vedi qui per maggiori informazioni sui parametri:
http://svnbollo.red-bean.com /en/1.7/svn.ref.svnlook.c.changed.html
Avanti, l'elenco dei percorsi modificati viene convogliata in grep che sta controllando se qualcosa è cambiato che ha "/ tag /" nel percorso, | grep "^U\W.*\/tags\/"
.
&& è un e operatore nel guscio. Se il comando grep trova una corrispondenza, restituisce il codice di stato 0 che in questo caso è equivalente a "true" e il comando dopo il && verrà eseguito, altrimenti non lo farà.
La parte dopo il &&, /bin/echo "Cannot commit to tags!" 1>&2
esegue il comando echo e scrive il messaggio da 1 (standard out) a & 2 che è l'errore standard. Se questo ha successo, il comando uscita con un codice di stato 1 exit 1
. Ciò causerà lo script del gancio di tornare con un codice di stato non zero e il tuo commit non riuscirà a restituire il "Impossibile impegnare per taggare!" messaggio all'utente.