Pre Commit Hook для JSLint в Mercurial и Git - PullRequest
17 голосов
/ 03 декабря 2009

Я хочу запустить JSLint до того, как будет сделана фиксация в Mercurial или Git-репо.

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

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

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

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

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

Ответы [ 3 ]

11 голосов
/ 12 сентября 2011

Ниже приведен вариант решения @ Bitbieger's Git, которое работает с 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
2 голосов
/ 03 декабря 2009

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

1 голос
/ 06 декабря 2009

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
...