Frage

Könnten Sie mir bitte zeigen, wie svnlook arbeitet unten.Ich möchte dies in einen Hook aufnehmen, um Commits in einem Tag darunter zu verhindern /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
War es hilfreich?

Lösung

Ein Subversion-Pre-Commit-Hook ermöglicht das Durchlaufen eines Commits, wenn er einen Exit-Code von zurückgibt 0.Andernfalls wird der Pre-Commit-Hook Scheitern und das Commit wird nicht verarbeitet.

Der $SVNLOOK changed -t "$TXN" "$REPOS" zeigt die Änderungen in $REPOS das fand in statt $TXN.Die Shell-Variablen müssen von Ihnen festgelegt werden.Wenn man sich die pre-commit skript, das mit Subversion geliefert wird, werden Sie sehen:

$TXN=$1
$REPO=$2

Die Ausgabe des svnlook changed der Befehl sieht folgendermaßen aus:

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

Die erste Spalte ist, ob etwas war Uprated, Added, oder Dgewählt.Die zweite Spalte bezieht sich auf Attribute.

Der Rest ist der Name der Datei, auf die reagiert wurde.Das kannst du sehen baguette.txt gelöscht wurde, und dass eine Eigenschaft auf croissant.txt wurde geändert, aber die Datei selbst wurde nicht aktualisiert.

Angenommen, jemand hat versucht, ein Tag zu ändern.Die Ausgabe von svnlook changed wird so aussehen:

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

Der Befehl grep lautet wie folgt:

grep "^U\W.*\/tags\/" 

Dies sucht nach einer Zeile, die mit beginnt ^U das heißt, es war ein Update.Dann sucht es nach einer Zeichenfolge, die mit beginnt /tags.Hmmm...das könnte ein Problem sein.Es stimmt nicht mit der Ausgabe des überein svnlook changed Befehl.

Vielleicht sollte es sein:

grep -q "^U.[[\s+tags/"

Dies entspricht jeder Zeichenfolge, die mit beginnt U, möglicherweise gefolgt von einem anderen Zeichen, gefolgt von Leerzeichen und dann sofort dem Wort tags/.

Vielleicht möchten Sie diesen Ausdruck überprüfen.

Der && ist ein listenoperator.Wenn der Ausdruck auf der linken Seite von && wird erfolgreich ausgeführt (d. h.es gibt einen Null-Exit-Code zurück), wird die Anweisung auf der rechten Seite ausgeführt.Andernfalls wird die Anweisung auf der rechten Seite nicht ausgeführt.

Also, wenn dein grep passt zu einem Muster, das aussieht, als hätte jemand ein Tag aktualisiert, es wird wahr sein.Die Aussage auf der rechten Seite des && wird ausgeführt.

So,

/bin/echo "Cannot commit to tags!" 1>&2

wird ausgeführt.Dies wird an STDERR gesendet, das an den Subversion-Client gesendet wird, aber nur, wenn der Exit-Code des Pre-Commit-Hooks Null ist.

Also der Befehl next list Operator exit 1 wird ausgeführt, wenn die /bin/echo ist erfolgreich.(Es könnte nicht sein, aber normalerweise wird es sein).Damit wird der Pre-Commit-Hook mit einem Exit-Code ungleich Null beendet, der Hook schlägt fehl und der Cannot commit to tags! wird an den SVN-Client gesendet, damit der Benutzer ihn sehen kann.

Es gibt absolut keinen Grund auf der Welt, dass diese Aussage so aussieht.Dies ist fast gleichwertig und leichter zu verstehen:

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

Schließlich müssen Sie dies in ein Shell-Skript namens einfügen pre-commit wie auch immer und habe die Shell-Variablen $SVNLOOK, $REPOS, und $TXN set sowieso.

Der Grund, warum dies nicht ganz gleichwertig ist, ist, dass dies das Commit fehlschlägt, selbst wenn das /bin/echo Scheitern.


Wenn Sie nach einem Pre-Commit-Hook zum Steuern von Tags suchen, sollten Sie sich Folgendes ansehen Mine.Dies wurde auf Hunderten von Websites getestet und gibt Ihnen viel mehr Kontrolle über Ihr Repository und führt eine bessere Fehlerprüfung durch.

Dieser Hook verwendet eine Steuerdatei, um den Zugriff auf das Repository zu steuern.Zum Beispiel möchten Sie vielleicht in der Lage sein, sich bei Bedarf Tags ändern zu lassen.

[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

Schau dir den Haken an.Es funktioniert mit der Standardinstallation von Perl 5.8.8 und höher.Es werden keine weiteren Module benötigt.Wenn Sie jedoch LDAP oder Active Directory für die Subversion-Zugriffskontrolle verwenden, können Sie das installieren Net::LDAP Perl-Modul und verwenden Sie LDAP- oder Active Directory-Gruppen in Ihrem Pre-Commit-Hook für die Zugriffskontrolle.

Andere Tipps

$SVNLOOK changed -t "$TXN" "$REPOS" druckt alle Pfade, die geändert wurden.Weitere Informationen zu den Parametern finden Sie hier:http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

Als nächstes wird die Liste der geänderten Pfade an grep weitergeleitet, das überprüft, ob sich etwas geändert hat, das "/ tags /" im Pfad enthält, | grep "^U\W.*\/tags\/".

Das && ist ein UND-Operator in der Shell.Wenn der Befehl grep eine Übereinstimmung findet, gibt er den Statuscode 0 zurück, der in diesem Fall "TRUE" entspricht, und der Befehl nach dem && wird ausgeführt, andernfalls nicht.

Der Teil nach dem &&, /bin/echo "Cannot commit to tags!" 1>&2 führt den Befehl echo aus und schreibt die Nachricht von 1 (Standardausgabe) nach &2, was der Standardfehler ist.Wenn dies erfolgreich ist, wird der Befehl mit einem Statuscode 1 beendet exit 1.Dies führt dazu, dass Ihr Hook-Skript mit einem Statuscode ungleich Null zurückgegeben wird und Ihr Commit fehlschlägt und die Meldung "Kann nicht an Tags übergeben werden!" nachricht an den Benutzer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top