Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

Ниже приведен вариант решения Git от @Bitbieger, которое работает с Node.js и локальная копия узел-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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top