Warum sollte mein SVN pre-commit lokal Haken Arbeit, aber nicht auf begehen?
-
30-09-2019 - |
Frage
Ich habe folgende pre-commit Haken verwenden JavaScript Lint zur Überprüfung JavaScript-Dateien, bevor ich:
#!/bin/env bash
REPOS="$1"
TXN="$2"
ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed
SVN=/usr/bin/svn
SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -r$TXN $REPOS | $SED -e "s/^....//g"`
JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.conf
for FILE in $FILES_CHANGED
do
if $ECHO $FILE | $GREP "\.js$"
then
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
then
exit $JSL_ERROR_CODE
fi
fi
done
# If we got here, nothing is wrong.
exit 0
Dieser Code arbeitet lokal wie folgt: ./pre-commit / my / svn / repo / location 6781 # die Nummer ist die Transaktionsnummer
ABER es Fehler nicht richtig auf svn commit.
Ich habe bereits berücksichtigt:
- Es gibt keine $ PATH zu sein, ich alle Befehlswege explizit festgelegt.
- Ich bin der richtigen Fehlercode aus dem JSL Befehl zum Ausgang zu erreichen.
- Ich bin STDOUT STDERR für die JSL Befehl drückt, so wird es in der angezeigt commit fehl.
Was bin ich?
Mit freundlichen Grüßen
Trevor
Lösung 2
entdeckte ich die Antwort nach einer langen und kurvigen Straße. Im Grunde genommen in meinem Skript oben Ich bin mit -r in meinen SVN-Befehlen, und in pre-commit Haken Sie müssen stark mit <> t , nicht -r . Der komplette Skript ist unter:
#!/bin/sh
REPOS="$1"
TXN="$2"
ECHO=/bin/echo
GREP=/bin/grep
SED=/bin/sed
SVNLOOK=/usr/bin/svnlook
FILES_CHANGED=`$SVNLOOK changed -t$TXN $REPOS | $SED -e "s/^....//g"`
JSL=/usr/local/bin/jsl
JSL_CONF=/usr/local/etc/jsl.default.conf
for FILE in $FILES_CHANGED
do
if $ECHO $FILE | $GREP "\.js$"
then
$SVNLOOK cat -t$TXN $REPOS $FILE | $JSL -conf $JSL_CONF -stdin -nologo 1>&2
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
then
exit $JSL_ERROR_CODE
fi
fi
done
# If we got here, nothing is wrong.
exit 0
Andere Tipps
Es ist möglich, dass eines der Programme, die Sie erwarten, dass einige Umgebungsvariablen ausführen gesetzt werden.
Repository Erstellung und Konfiguration :
Aus Sicherheitsgründen führt Subversion Hook-Scripts mit einem leeren Umgebung, das heißt, werden keine Umweltvariablen gesetzt, nicht einmal $ PATH oder% PATH%. Aus diesem Grund sind viele Administratoren verwirrt, wenn ihre Hook-Skript fein von Hand ausgeführt wird, aber nicht funktioniert, wenn sie von Subversion laufen. Achten Sie darauf, explizit Set Umgebungsvariablen in Ihrem Haken und / oder verwenden Sie absolute Pfade zu den Programmen.
Versuchen Sie, sie lokal ohne Umgebungsvariablen ausführen und sehen, ob das funktioniert.
ich am Ende in der Regel alle in der ersten Zeile meines Hook-Scripts meiner Umgebung importieren:
source /home/username/.bash_profile
Wenn der Fehler Sie suchen herkommt svn
in der Pipeline eher, dass jsl
, dann $?
nicht den Return-Code enthalten wird. Verwenden ${PIPESTATUS[@]}
statt. Es ist ein Array, das die Rückkehr-Codes für jedes Mitglied der Pipeline enthält. Eine schnelle Möglichkeit für eine beliebige nicht spezifizierte Ausfall zu prüfen wäre:
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ! ${PIPESTATUS[@]} =~ 1 ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
oder
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ${PIPESTATUS[@]} != *1* ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]