git - setup pre-commit hook jshint
github pre-commit-hook (4)
Pero es esto posible ...
¡Sí! Esto es posible. Recientemente escribí sobre eso . Tenga en cuenta que no es específico de GitHub, solo Git en general, ya que es un enlace de precompromiso, se ejecuta antes de que se envíe cualquier información a GitHub.
Cualquier archivo ejecutable apropiadamente nombrado en el directorio /.git/hooks de su repositorio se ejecutará como ganchos. Es probable que haya muchos ganchos de ejemplo allí de forma predeterminada. Aquí hay un script de shell simple que utilizo como enlace de precomisión de JSLint (en su lugar, podría modificarlo muy fácilmente para trabajar con JSHint):
#!/bin/sh
files=$(git diff --cached --name-only --diff-filter=ACM | grep "/.js$")
if [ "$files" = "" ]; then
exit 0
fi
pass=true
echo "/nValidating JavaScript:/n"
for file in ${files}; do
result=$(jslint ${file} | grep "${file} is OK")
if [ "$result" != "" ]; then
echo "/t/033[32mJSLint Passed: ${file}/033[0m"
else
echo "/t/033[31mJSLint Failed: ${file}/033[0m"
pass=false
fi
done
echo "/nJavaScript validation complete/n"
if ! $pass; then
echo "/033[41mCOMMIT FAILED:/033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again./n"
exit 1
else
echo "/033[42mCOMMIT SUCCEEDED/033[0m/n"
fi
Simplemente puede poner eso en un archivo ejecutable llamado pre-commit en su directorio de hooks Git, y se ejecutará antes de cada commit.
Recientemente comencé un proyecto en github . Pude configurar las pruebas automáticas después de cada commit usando Travis. Pero ahora me gustaría configurar un enganche precompromiso con jshint también. Entonces, si jshint informa errores, la confirmación debería fallar. Pero, ¿es esto posible y, si es así, cómo hacerlo?
Algunos cambios al guión de @James Allardice para acomodar JSHint . Gracias por el código original.
#!/bin/sh
#
# Run JSHint validation before commit.
files=$(git diff --cached --name-only --diff-filter=ACMR -- *.js **/*.js)
pass=true
if [ "$files" != "" ]; then
for file in ${files}; do
result=$(jshint ${file})
if [ "$result" != "" ]; then
echo "$result"
echo "/n"
pass=false
fi
done
fi
if $pass; then
exit 0
else
echo ""
echo "COMMIT FAILED:"
echo "Some JavaScript files are invalid. Please fix errors and try committing again."
exit 1
fi
Hay una forma más fácil de realizar verificaciones previas a la confirmación (por ejemplo, JSHint) en su flujo de trabajo de Node.js:
Instala jshint desde NPM:
npm install jshint
Luego crea un archivo .jshintrc en tu proyecto si aún no tienes uno. por ejemplo: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc
Ahora instale el módulo pre-commit (y guárdelo como una dependencia dev):
npm install pre-commit --save-dev
A continuación, deberá definir la tarea (script) que se ejecutará para JSHint en su paquete. Json
p.ej:
{ "scripts": { "jshint": "jshint -c .jshintrc --exclude-path .gitignore ." } }
a continuación, registra los scripts que desea que se ejecuten antes de la confirmación (también en package.json), por ejemplo:
"pre-commit": [ "jshint", "coverage", "etc" ]
Esto le permite tener más de una verificación en su flujo de trabajo previo a la confirmación. (Tenemos controles para garantizar que el código de los miembros del equipo cumpla con JSHint, Estilo de código y Cobertura de prueba es 100%)
Para obtener un tutorial más detallado que puede compartir con su equipo, consulte: https://github.com/nelsonic/learn-pre-commit
Un script similar al de @ igor con algunas mejoras:
- indicadores de color
- no --diff-filter, grep used insead
- mensaje de ayuda (estilo git) para evitar la llamada previa a la confirmación
#!/bin/sh
#
# Run JSHint validation before commit.
RED=''/033[0;31m''
REDBOLD=''/033[1;31m''
ORANGE=''/033[0;33m''
NC=''/033[0m'' # No Color
files=$(git diff --cached --name-only | grep .js)
pass=true
totalErrors=0
if [ "$files" != "" ]; then
for file in ${files}; do
result=$(jshint ${file})
if [ "$result" != "" ]; then
echo "${RED}$result${NC}"
pass=false
totalErrors=$((totalErrors+1))
fi
echo ""
done
fi
if $pass; then
exit 0
else
echo "${ORANGE}===== ${totalErrors} JSHint Error${NC}"
echo ""
echo "${REDBOLD}COMMIT FAILED: Some JavaScript files are invalid. Please fix errors and try committing again.${NC}"
echo ""
echo " (use -n option /"git commit -n -m <message>/" to avoid call pre-commit hook and JSHint check)"
echo ""
exit 1
fi