Pré commit gancho para JSLint em Mercurial e Git
-
11-09-2019 - |
Pergunta
Eu quero correr JSLint antes de uma confirmação em qualquer um repositório Mercurial ou Git é feito.
Eu quero isso como uma etapa automática que está configurado em vez de depender do desenvolvedor (principalmente me) lembrando-se de executar JSLint antes de mão. Eu normalmente executado JSLint durante o desenvolvimento, mas deseja especificar um contrato em arquivos JS que eles passam JSLint antes de ser comprometida com o repo.
Para Mercurial, este feitiços página fora a sintaxe precommit, mas as únicas variáveis ??que parecem estar disponível são o Parent1 e parent2 changeset IDs envolvido no cometer. O que eu realmente quero é uma lista de nomes de arquivos que estão envolvidos com a cometer, para que eu possa, em seguida, escolha o arquivo .js e JSLint passar por cima deles.
problema semelhante para GIT , a informação padrão disponível como parte do script precommit parece limitado.
O trabalho de força está chamando estado hg / git status como parte do script precommit, analisar a saída para encontrar JS arquivos, em seguida, fazer o trabalho dessa forma. Eu estava esperando por algo mais fácil, porém, e eu não tenho certeza se chamar status como parte de um gancho precommit refletir as informações corretas. Por exemplo, no Git se as mudanças de arquivos não foram adicionados ainda, mas o git commit usos -a, que os arquivos aparecem na seção correta da saída git status como sendo parte do commit set?
Atualizar : I tem algo de trabalho, é visível aqui: http: // github.com/jrburke/dvcs_jslint/
Solução
Para git, há exemplos no diretório .git / ganchos. Se você só precisa os nomes de arquivo para JSLint, você poderia usar git diff --name-only
, que no meu exemplo irá listar os nomes dos arquivos que diferem do HEAD
atual.
Outras dicas
O seguinte é uma variação da @ solução Git do Bitbieger que funciona com Node.js e uma cópia local do nó-JSLint (ou seja, você precisa npm install jslint
na raiz do seu diretório do repositório).
Além disso, o script:
- Executa JSLint sobre todos os arquivos .html e .json, bem como .js
- Apenas corre JSLint sobre os arquivos que foram adicionados, copiados ou modificados. Isso evita que JSLint de erroring em arquivos que foram renomeados ou excluídos.
- Replica quaisquer erros JSLint para que o usuário veja
- Usa as opções
--indent 4 --white true
JSLint para garantir a consistência código-fonte
Para obtê-lo para o trabalho copiar o seguinte para .git/hooks/pre-commit
e não se esqueça 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
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