Pregunta

Tengo el siguiente gancho pre-confirmación de usar Javascript Lint para el control de los archivos de JavaScript antes de comprometerse:

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

Este código funciona localmente de la siguiente manera:     ./pre-commit / mi / svn / repos / localidad 6781 # El número es el número de transacción

y no error correctamente en SVN.

Ya han representado:

  • No habiendo $ PATH, que establece explícitamente todos los caminos de comando.
  • Me estoy poniendo el código de error correcto del comando jsl de salida.
  • estoy empujando a STDOUT STDERR para el comando jsl por lo que se mostrará en la confirmación fallar.

¿Qué me falta?

El suyo, España Trevor

¿Fue útil?

Solución 2

Me descubrió la respuesta después de un largo y sinuoso camino. Básicamente, en mi anterior script que estoy usando r en mis comandos SVN, y en un pre-commit gancho debe utilizar -t , no -r . El guión completo es el siguiente:

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

Otros consejos

Es posible que uno de los programas que está ejecutando esperar algunas variables de entorno que se creará.

Repositorio Creación y configuración :

  

Por razones de seguridad, el depósito de la subversión ejecuta scripts gancho con un entorno, es decir, no hay variables de entorno se establecen en absoluto, ni siquiera $ PATH o% PATH% vacío. Debido a esto, muchos administradores están desconcertados cuando su script gancho funciona muy bien con la mano, pero no funciona cuando se ejecuta por Subversion. Asegúrese de variables de entorno definidas explícitamente en su gancho y / o usar rutas absolutas a los programas.

Trate de ejecutar de forma local sin ningún tipo de variables de entorno y ver si funciona.

Por lo general terminan importando todo mi entorno, en la primera línea de mis scripts de enganche:

source /home/username/.bash_profile

Si el error que estás buscando está viniendo de svn en la tubería en lugar de que jsl, entonces $? no va a contener el código de retorno. Uso ${PIPESTATUS[@]} lugar. Es una matriz que contiene los códigos de retorno de cada miembro de la tubería. Una forma rápida de comprobar si existe algún fallo no especificado sería:

$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 ]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top