Хук предварительной фиксации для JSLint в Mercurial и Git
-
11-09-2019 - |
Вопрос
Я хочу запустить 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
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