2009-12-03 15 views
17

Voglio correre JSLint prima di un commit in sia un repo Mercurial o Git è fatto.Pre commit hook per JSLint in Mercurial e Git

Voglio che questo come passo automatico che è impostato, invece di basarsi sul sviluppatore (soprattutto me) ricordando di eseguire JSLint prima mano. Normalmente eseguo JSLint durante lo sviluppo, ma voglio specificare un contratto su file JS che passino a JSLint prima di essere impegnati nel repository.

Per Mercurial, this page specifica la sintassi di precommit, ma le uniche variabili che sembrano disponibili sono gli ID di changeset parent1 e parent2 coinvolti nel commit. Quello che voglio veramente è un elenco di nomi di file che sono coinvolti con il commit, così posso scegliere il file .js ed eseguire jslint su di essi.

Similar issue for GIT, le informazioni di default disponibile come parte dello script precommit sembra limitata.

cosa 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 comunque in qualcosa di più semplice, e non sono sicuro se chiamare lo stato come parte di un hook di precommit rifletta le informazioni corrette. Ad esempio in Git se i file delle modifiche non sono stati ancora aggiunti, ma il commit git usa -a, i file verranno visualizzati nella sezione corretta dell'output git status come parte del commit set?

Aggiornamento: ho qualcosa di lavoro, è visibile qui: http://github.com/jrburke/dvcs_jslint/

+1

Solo per completezza, ecco alcune istruzioni per l'impostazione di [JSLint come hook di Subversion Commit] (http://www.amaxus.com/cms-blog/jslint-as-subversion-hook). –

+0

aveva lo stesso bisogno così ho scritto questo http://bitbucket.org/robmadole/hgjslint/ –

risposta

2

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 si differenziano dagli attuali HEAD.

+0

Grazie per il suggerimento sul comando git.Sembra quindi che avrò bisogno di usare un comando dvcs per ottenere l'elenco dei file e analizzare i file da inviare a jslint. Almeno git diff --name-only renderà l'analisi abbastanza facile. – 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

Quello che segue è una variante della soluzione @ Git di Bitbieger che funziona con Node.js e una copia locale di node-jslint (vale a dire è necessario npm install jslint nella directory repository root).

Inoltre lo script:

  • Corre JSLint su tutti i file .html e .json nonché .js
  • gira solo JSLint sui file che sono stati aggiunti, copiati o modificati. Ciò impedisce a jslint di generare errori sui file che sono stati rinominati o cancellati.
  • Replica dei eventuali errori JSLint per l'utente di vedere
  • utilizza le opzioni JSLint --indent 4 --white true al fine di garantire la coerenza del codice sorgente

Per farlo funzionare copiare il seguente al .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 
+1

dovrebbe il "exit 0" essere fuori dal ciclo? In questo modo il ciclo controllerà effettivamente ogni file, invece di tornare sul primo passaggio. –

+2

Ho ottenuto il seguente tentativo di utilizzare questo 'grep: opzione non valida - P Utilizzo: grep [OPZIONE] ... PATTERN [FILE] ... Prova 'grep --help' per ulteriori informazioni. Qualche idea? Non ho familiarità con grep ma '-P' sembra essere una valida [opzione] (http://unixhelp.ed.ac.uk/CGI/man-cgi?grep). – James

Problemi correlati