PRE commit hook per JSLint in Mercurial e Git
-
11-09-2019 - |
Domanda
Voglio correre JSLint prima di un commit in sia un repo Mercurial o Git è fatto.
Voglio che questo come passo automatico che è impostato, invece di basarsi sul sviluppatore (soprattutto me) ricordando di eseguire JSLint prima mano. Normalmente io eseguo JSLint durante lo sviluppo, ma voglio specificare un contratto file JS che passano JSLint prima di essere impegnato nella repo.
Per Mercurial, questo pagina enuncia la sintassi precommit, ma le uniche variabili che sembrano essere a disposizione sono gli ID parent1 e parent2 changeset coinvolte nel commettere. Quello che voglio davvero è un elenco di nomi di file che sono coinvolti con il commit, in modo che possa poi scegliere il file .js e correre JSLint su di loro.
problema simile per GIT , le informazioni di default disponibile come parte dello script precommit sembra limitata.
Ciò che potrebbe funzionare sta chiamando hg status / git status come parte dello script precommit, analizzare che l'uscita di trovare file JS poi fare il lavoro in questo modo. Speravo in qualcosa di più facile, però, e non sono sicuro se chiamate lo stato come parte di un gancio precommit riflettere le informazioni corrette. Per esempio in Git se i cambiamenti file non sono stati ancora aggiunti, ma il git commit -a utilizza, farebbe con i file visualizzati nella sezione corretta dell'output git status come facenti parte del commit set?
Aggiorna : ho qualcosa di lavoro, è visibile qui: http: // github.com/jrburke/dvcs_jslint/
Soluzione
Per git, ci sono esempi nella directory .git / ganci. Se avete solo bisogno i nomi dei file per JSLint, è possibile utilizzare git diff --name-only
, che nel mio esempio vengono elencati i nomi dei file che differiscono dal HEAD
corrente.
Altri suggerimenti
La seguente è una variante della soluzione @ Git di Bitbieger che funziona con Node.js e una copia locale di nodo-JSLint (cioè è necessario npm install jslint
nella directory repository root).
Inoltre lo script:
- Esegue JSLint su tutti i file .html e .json così come js
- Solo corre JSLint sui file che sono stati aggiunti, copiati o modificati. Questo impedisce JSLint da erroring sui file che sono stati rinominati o cancellati.
- Replica eventuali errori JSLint per l'utente per vedere
- Utilizza le opzioni
--indent 4 --white true
JSLint per garantire la coerenza del codice sorgente
Per farlo funzionare copiare il testo seguente .git/hooks/pre-commit
e non dimenticate di 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