2009-12-03 13 views
17

Quiero ejecutar JSLint antes de que se realice una confirmación en un repositorio Mercurial o Git.Gancho precommitido para JSLint en Mercurial y Git

Quiero esto como un paso automático que se configura en lugar de depender del desarrollador (sobre todo yo) recordando ejecutar JSLint de antemano. Normalmente corro JSLint mientras desarrollo, pero quiero especificar un contrato en archivos JS que pasen JSLint antes de comprometerse con el repositorio.

Para Mercurial this page, explica la sintaxis precommit, pero las únicas variables que parecen estar disponibles son los ID Parent1 y del conjunto de cambios parent2 involucrados en la confirmación. Lo que realmente quiero es una lista de nombres de archivos que están involucrados con la confirmación, para poder elegir el archivo .js y ejecutar jslint sobre ellos.

Similar issue for GIT, la información predeterminada disponible como parte de la secuencia previa de ejecución parece limitada.

Lo que podría funcionar es llamar al estado hg status/git como parte del script precommit, analizar ese resultado para encontrar archivos JS y luego hacer el trabajo de esa manera. Sin embargo, esperaba algo más fácil y no estoy seguro de si el estado de las llamadas como parte de un enlace precommitido refleja la información correcta. Por ejemplo, en Git, si aún no se han agregado los archivos de cambios, pero la confirmación de git usa -a, ¿aparecerían los archivos en la sección correcta del resultado del estado de git como parte del conjunto de compromisos?

actualización: Tengo algo de trabajo, se puede ver aquí: http://github.com/jrburke/dvcs_jslint/

+1

simplemente para la corrección, aquí hay algunas instrucciones para configurar [JSLint como una confirmación en Subversion Hook] (http://www.amaxus.com/cms-blog/jslint-as-subversion-hook). –

+0

Tenía la misma necesidad, así que escribí este http://bitbucket.org/robmadole/hgjslint/ –

Respuesta

2

Para Git, hay ejemplos en el directorio .git/ganchos. Si solo necesita los nombres de archivo para JSLint, puede usar git diff --name-only, que en mi ejemplo enumerará los nombres de los archivos que difieren del actual HEAD.

+0

Gracias por la pista sobre el comando git.Por lo tanto, parece que necesitaré usar un comando dvcs para obtener la lista de archivos y analizar los archivos para enviar a jslint. Al menos git diff --name-only hará que el análisis sea bastante fácil. – jrburke

1

JSLint with SpiderMonkey

for js in $(git diff-index --name-only --cached HEAD -- | grep '\.js$'); do 
    if jslint.sh $js 2>&1 | grep 'Lint at line' ; then 
     echo $js 
     exit 1 
    else 
     echo "js files validated" 
     exit 0 
    fi 
done 
11

La siguiente es una variación de Git @ solución de Bitbieger que trabaja con Node.js y una copia local de node-jslint (es decir, que necesita para npm install jslint en el directorio raíz del repositorio).

Además el guión:

  • ejecuta JSLint sobre todos los archivos .html y .json, así como .js
  • sólo se ejecuta JSLint sobre los archivos que se han añadido, copiados y modificados. Esto evita jslint de error en archivos que han sido renombrados o eliminados.
  • Replica cualquier error JSLint para que el usuario vea
  • Utiliza las opciones --indent 4 --white true JSLint para garantizar la coherencia código fuente

Para conseguir que funcione copiar el siguiente para .git/hooks/pre-commit y no se olvide de chmod +x .git/hooks/pre-commit

# Pre-commit hook passing files through jslint 
# 
# This ensures that all js, html and json files are valid and conform 
# to expectations. 

ROOT_DIR=$(git rev-parse --show-toplevel) 
JSLINT="${ROOT_DIR}/node_modules/.bin/jslint --indent 4 --white true" 

for file in $(git diff-index --name-only --diff-filter=ACM --cached HEAD -- | grep -P '\.((js)|(html)|(json))$'); do 
    if node $JSLINT $file 2>&1 | grep 'No errors found' ; then 
     echo "jslint passed ${file}" 
     exit 0 
    else 
     node $JSLINT $file 
     exit 1 
    fi 
done 
+1

¿debería la "salida 0" estar fuera del ciclo? De esta forma, el ciclo revisará cada archivo, en lugar de volver al primero que pasó. –

+2

Obtengo lo siguiente tratando de usar esta opción 'grep: invalid - P Uso: grep [OPTION] ... PATTERN [FILE] ... Pruebe' grep --help 'para más información. ¿Alguna idea? No estoy familiarizado con grep pero '-P' parece ser una [opción] válida (http://unixhelp.ed.ac.uk/CGI/man-cgi?grep). – James

Cuestiones relacionadas