Precommitir gancho para JSLint en Mercurial y Git

Quiero ejecutar JSLint antes de que se realice una confirmación en un repository de Mercurial o Git.

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

Para Mercurial, esta página detalla la syntax de precomisión, pero las únicas variables que parecen estar disponibles son los ID de sets de cambios parent1 y parent2 involucrados en la confirmación. Lo que realmente quiero es una list de nombres de files que están involucrados con la confirmación, para poder elegir el file .js y ejecutar jslint sobre ellos.

Problema similar para GIT , la información pnetworkingeterminada disponible como parte de la secuencia previa de ejecución parece limitada.

Lo que podría funcionar es llamar al estado de hg / estado de git como parte del script de precomisión, analizar ese resultado para encontrar files 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 files de cambios, pero la confirmación de git usa -a, ¿aparecerían los files en la sección correcta del resultado del estado de git como parte del set de compromisos?

Actualización : Tengo algo funcionando, está visible aquí: http://github.com/jrburke/dvcs_jslint/

Para git, hay ejemplos en el directory .git / hooks. Si solo necesita los nombres de file para JSLint, podría usar git diff --name-only , que en mi ejemplo enumerará los nombres de los files que difieren del HEAD actual.

La siguiente es una variación de la solución @ Bitbieger's Git que funciona con Node.js y una copy local de node-jslint (es decir, necesita npm install jslint en su directory raíz del repository).

Además, el guión:

  • Ejecuta jslint sobre todos los files .html y .json, así como .js
  • Solo ejecuta jslint sobre los files que se agregaron, copyron o modificaron. Esto evita jslint de error en files que han sido renombrados o eliminados.
  • Replica cualquier error jslint para que el usuario lo vea
  • Utiliza las --indent 4 --white true jslint para garantizar la coinheritance del código fuente

Para que funcione, copy lo siguiente a .git/hooks/pre-commit y no te olvides 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 

JSLint con 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