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
.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top