Mercurial および Git での JSLint のプリコミットフック
-
11-09-2019 - |
質問
Mercurial または Git リポジトリへのコミットが完了する前に JSLint を実行したいと考えています。
これを、開発者 (主に私) が事前に JSLint を実行することを忘れないように依存するのではなく、自動的に設定されるステップとして設定したいと考えています。通常、開発中に JSLint を実行しますが、リポジトリにコミットされる前に JSLint を渡すという JS ファイルのコントラクトを指定したいと考えています。
マーキュリアルの場合、 このページ は、プリコミット構文を詳しく説明していますが、使用できると思われる唯一の変数は、コミットに含まれるparent1 およびparent2 チェンジセット ID です。私が本当に欲しいのは、コミットに関係するファイル名のリストです。これにより、.js ファイルを選択して、それらに対して jslint を実行できるようになります。
GIT に関する同様の問題, 、プリコミットスクリプトの一部として利用できるデフォルト情報は限られているようです。
うまくいく可能性があるのは、プリコミット スクリプトの一部として hg status/git status を呼び出し、その出力を解析して JS ファイルを見つけて、その方法で作業を行うことです。ただし、もっと簡単なことを期待していましたが、プリコミットフックの一部としてのステータスの呼び出しが正しい情報を反映しているかどうかはわかりません。たとえば、Git で変更ファイルがまだ追加されていないが、git コミットで -a が使用されている場合、ファイルはコミット セットの一部として git ステータス出力の正しいセクションに表示されますか?
アップデート:何かが動作していることがわかりました。ここに表示されます。 http://github.com/jrburke/dvcs_jslint/
解決
git の場合は、.git/hooks ディレクトリにサンプルがあります。JSLint のファイル名だけが必要な場合は、次のように使用できます。 git diff --name-only
, 、私の例では、現在のファイル名とは異なるファイルの名前がリストされます。 HEAD
.
他のヒント
以下は @Bitbieger の Git ソリューションのバリエーションであり、 Node.js とローカルコピー ノードjslint (すなわち、必要がある npm install jslint
ルート リポジトリ ディレクトリ内)。
さらにスクリプトは次のとおりです。
- .js だけでなく、すべての .html ファイルと .json ファイルに対して jslint を実行します。
- 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