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

Était-ce utile?

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 ]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top