Perché la mia SVN sarebbe pre-commit hook lavoro a livello locale, ma non su commettere?
-
30-09-2019 - |
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
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 ]