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

War es hilfreich?

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 ]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top