Pourquoi mon SVN pre-commit travail crochet au niveau local, mais pas commettre?
-
30-09-2019 - |
Question
J'ai le pre-commit crochet à utiliser JavaScript suivant Lint pour la vérification des fichiers JavaScript avant de vous engager:
#!/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
Ce code fonctionne localement comme suit: ./pre-commit / ma / svn / repo / location 6781 # le numéro est le numéro de transaction
et ne pas correctement l'erreur svn commit.
Je l'ai déjà pris en compte:
- En l'absence $ PATH, je définir explicitement tous les chemins de commande.
- Je suis attrapant le code d'erreur correct de la commande pour la sortie JSL.
- Je poussais STDOUT STDERR pour la commande JSL il sera affiché dans la validation échoue.
Qu'est-ce que je manque?
Bien à vous,
Trevor
La solution 2
Je découvre la réponse après une route longue et sinueuse. En fait, dans mon script ci-dessus, je suis en utilisant -r dans mes commandes svn, et pre-commit crochet vous devez utiliser -t , non -r . Le script complet est ci-dessous:
#!/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
Autres conseils
Il est possible que l'un des programmes que vous exécutez certaines variables se attendent environnement à définir.
De Repository Création et configuration :
Pour des raisons de sécurité, le dépôt Subversion exécute les scripts hook avec un environnement qui vide est, pas de variables d'environnement sont du tout, même pas $ PATH ou% PATH%. À cause de cela, beaucoup d'administrateurs sont perplexes quand leur script crochet fonctionne très bien à la main, mais ne fonctionne pas lorsqu'il est exécuté par Subversion. Assurez-vous de définir des variables d'environnement explicitement dans votre crochet et / ou utiliser des chemins absolus aux programmes.
Essayez de les exécuter localement sans aucune variables d'environnement définies et voir si cela fonctionne.
Je finissent généralement importer tout mon environnement dans la première ligne de mes scripts crochet:
source /home/username/.bash_profile
Si l'erreur que vous cherchez vient svn
dans le pipeline plutôt que jsl
, alors $?
ne va pas contenir le code de retour. Utilisez ${PIPESTATUS[@]}
à la place. Il est un tableau qui contient les codes de retour de chaque membre du pipeline. Un moyen rapide de vérifier toute défaillance non spécifiée serait:
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ! ${PIPESTATUS[@]} =~ 1 ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]
ou
$SVN cat -r$TXN file://$REPOS/$FILE | $JSL -conf $JSL_CONF -stdin 1>&2
[[ ${PIPESTATUS[@]} != *1* ]]
JSL_ERROR_CODE=$?
if [ $JSL_ERROR_CODE != 0 ]