Ответ 1
Для git есть примеры в каталоге .git/hooks. Если вам просто нужны имена файлов для JSLint, вы можете использовать git diff --name-only
, который в моем примере отобразит имена файлов, которые отличаются от текущего HEAD
.
Я хочу запустить 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/
Для git есть примеры в каталоге .git/hooks. Если вам просто нужны имена файлов для JSLint, вы можете использовать git diff --name-only
, который в моем примере отобразит имена файлов, которые отличаются от текущего HEAD
.
Ниже приведен вариант решения @Bitbieger Git, который работает с Node.js и локальной копией node-jslint (т.е. вам нужно npm install jslint
в каталоге корневого репозитория).
Дополнительно script:
--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