2009-12-03 2 views
17

Я хочу запустить JSLint, прежде чем совершить коммит в Mercurial или Git repo.Pre Commit Hook для JSLint в Mercurial и Git

Я хочу, чтобы это было автоматическим шагом, созданным вместо того, чтобы полагаться на разработчика (в основном на меня), помня, что я запускал JSLint раньше. Обычно я запускаю JSLint при разработке, но хочу указать контракт на JS-файлах, который они передают JSLint, прежде чем он будет привязан к репо.

Для Mercurial this page описывает синтаксис precommit, но единственными переменными, которые кажутся доступными, являются идентификаторы parent1 и parent2 changeset, участвующие в фиксации. Мне действительно нужен список имен файлов, которые связаны с фиксацией, поэтому я могу выбрать файл .js и запустить jslint над ними.

Similar issue for GIT, информация по умолчанию, доступная как часть сценария precommit, кажется ограниченной.

Что может работать, так называемый статус hg status/git как часть сценария precommit, проанализировать этот вывод для поиска файлов JS, а затем выполнить эту работу. Я надеялся на что-то более легкое, хотя, и я не уверен, что если статус вызова как часть крючка precommit отражает правильную информацию. Например, в Git, если файлы изменений еще не добавлены, но git commit использует -a, будут ли файлы отображаться в правильном разделе вывода статуса git как часть набора фиксации?

Update: Я получил что-то работает, это видно здесь: http://github.com/jrburke/dvcs_jslint/

+1

Для получения полной информации, пожалуйста, ознакомьтесь с инструкциями по настройке [JSLint в качестве подцепителя Subversion Commit Hook] (http://www.amaxus.com/cms-blog/jslint-as-subversion-hook). – 2010-03-24 08:17:56

+0

Была такая же потребность, поэтому я написал это http://bitbucket.org/robmadole/hgjslint/ – 2010-05-13 20:34:09

ответ

2

Для мерзавца, есть примеры в каталоге .git/крюков. Если вам просто нужны имена файлов для JSLint, вы можете использовать git diff --name-only, который в моем примере отобразит имена файлов, которые отличаются от текущего HEAD.

+0

Спасибо за подсказку команды git.Поэтому мне кажется, что мне нужно будет использовать команду dvcs, чтобы получить список файлов и проанализировать файлы для подачи на jslint. По крайней мере, git diff -name-только сделает парсинг довольно простым. – 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

Ниже приведен вариант @ решения Git Bitbieger, что работает с Node.js и локальной копией node-jslint (т.е. вы должны npm install jslint в корневом каталоге репозитория).

Дополнительно сценарий:

  • Запускается JSLint по всем .html и .json файлы, а также .js
  • только работает JSLint над файлами, которые были добавлены, скопированы или изменены. Это предотвращает ошибку jslint для файлов, которые были переименованы или удалены.
  • Репликация ошибки JSLint для пользователя, чтобы увидеть
  • Использует --indent 4 --white true варианты JSLint обеспечить исходный код консистенции

Чтобы заставить его работать скопировать следующее .git/hooks/pre-commit и не забудьте 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

должен ли «выход 0» находиться вне цикла? Таким образом, цикл будет проверять каждый файл, а не возвращаться на первый переданный. –

+2

Я получаю следующее, пытаясь использовать этот параметр grep: invalid - P Использование: grep [OPTION] ... PATTERN [FILE] ... Попробуйте «grep --help» для получения дополнительной информации. 'Любые идеи? Я не знаком с grep, но '-P' действительно является допустимым [option] (http://unixhelp.ed.ac.uk/CGI/man-cgi?grep). – James

Смежные вопросы