Pre Commit Hook para JSLint en Mercurial y Git
pre-commit-hook (3)
Quiero ejecutar JSLint antes de realizar una confirmación en Mercurial o Git repo.
Quiero esto como un paso automático que se configura en lugar de confiar en el desarrollador (principalmente yo), recordando ejecutar JSLint de antemano. Normalmente ejecuto JSLint durante el desarrollo, pero quiero especificar un contrato en los archivos JS que pasan a JSLint antes de comprometerme con el repositorio.
Para Mercurial, esta página explica la sintaxis de confirmación previa, pero las únicas variables que parecen estar disponibles son las ID de conjunto de cambios parent1 y parent2 involucradas en la confirmación. Lo que realmente quiero es una lista de los nombres de archivos que están involucrados con la confirmación, para que luego pueda elegir el archivo .js y ejecutar jslint sobre ellos.
Un problema similar para GIT , la información predeterminada disponible como parte de la secuencia de comandos precommit parece ser limitada.
Lo que podría funcionar es llamar a hg status / git status como parte del script precommit, analizar esa salida para encontrar archivos JS y luego hacer el trabajo de esa manera. Sin embargo, esperaba algo más fácil y no estoy seguro si el estado de las llamadas como parte de un enlace previo a la entrega refleja la información correcta. Por ejemplo, en Git, si los archivos de cambios aún no se han agregado, pero el uso de git commit -a, ¿aparecerán los archivos en la sección correcta de la salida del estado de git como parte del conjunto de confirmación?
Actualización : Tengo algo funcionando, se puede ver aquí: http://github.com/jrburke/dvcs_jslint/
La siguiente es una variación de la solución Git de @ Bitbieger que funciona con Node.js y una copia local de node-jslint (es decir, necesita npm install jslint
en su directorio del repositorio raíz).
Además el guión:
- Ejecuta jslint sobre todos los archivos .html y .json, así como .js
- Solo ejecuta jslint sobre archivos que se han agregado, copiado o modificado. Esto evita que jslint produzca errores en los archivos 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 coherencia del código fuente
Para que funcione, copie lo siguiente en .git/hooks/pre-commit
y no olvide 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
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
Para git, hay ejemplos en el directorio .git / hooks. Si solo necesita los nombres de archivo para JSLint, puede usar git diff --name-only
, que en mi ejemplo listará los nombres de los archivos que difieren de la HEAD
actual.