Domanda

Ho la seguente pre-commit hook di utilizzare JavaScript Lint per controllare i file JavaScript prima di impegnarsi:

#!/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

Questo codice lavora a livello locale nel modo seguente:     ./pre-commit / my / svn / repo / posizione 6781 # il numero è il numero di transazione

MA non da errori correttamente su svn commit.

ho già rappresentato:

  • Non essendoci $ PATH, ho impostato in modo esplicito tutti i percorsi di comando.
  • Sto Facendo il codice di errore corretto dal comando JSL per l'uscita.
  • sto spingendo STDOUT STDERR per il comando JSL così sarà visualizzato nella commit fallire.

Che cosa mi manca?

I tuoi,
Trevor

È stato utile?

Soluzione 2

ho scoperto la risposta, dopo una strada lunga e tortuosa. In sostanza, nel mio script precedente sto usando -r nei miei comandi svn, ma in pre-commit gancio è necessario utilizzare -t , non -r . Lo script completo è qui sotto:

#!/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

Altri suggerimenti

E 'possibile che uno dei programmi si sta eseguendo aspettare alcuni variabili d'ambiente da impostare.

Repository creazione e la configurazione :

  

Per ragioni di sicurezza, il repository Subversion esegue gli script gancio con un vuoto ambiente, cioè, non le variabili di ambiente sono impostate a tutti, nemmeno $ PATH o% PATH%. A causa di questo, molti amministratori sono sconcertati quando il loro script di aggancio funziona bene a mano, ma non funziona quando viene eseguito da Subversion. Assicurarsi di impostare in modo esplicito le variabili d'ambiente nel vostro gancio e / o utilizzare percorsi assoluti ai programmi.

Prova a eseguirli localmente senza variabili di ambiente impostate e vedere se funziona.

Io di solito finiscono per l'importazione di tutto il mio ambiente nella prima riga del mio script di aggancio:

source /home/username/.bash_profile

Se l'errore che stai cercando è venuta da svn in cantiere piuttosto che jsl, allora $? non sta per contenere il codice di ritorno. Usa ${PIPESTATUS[@]} invece. Si tratta di un array che contiene i codici di ritorno di ogni membro del gasdotto. Un modo rapido per verificare la presenza di eventuali guasti non specificata potrebbe essere:

$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ! ${PIPESTATUS[@]} =~ 1 ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]

o

$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ${PIPESTATUS[@]} != *1* ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top