Подтвердить что ты не робот

Pre Commit Hook для JSLint в Mercurial и Git

Я хочу запустить JSLint перед фиксацией в репозитории Mercurial или Git.

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

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

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

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

Обновление: у меня что-то работает, оно видно здесь: http://github.com/jrburke/dvcs_jslint/

4b9b3361

Ответ 1

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

Ответ 2

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

Дополнительно script:

  • Запускает 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

Ответ 3

JSLint с 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