17

Mercurial または Git リポジトリへのコミットが完了する前に、JSLint を実行したいと考えています。

私はこれを、開発者 (主に私) が事前に JSLint を実行することを覚えていることに頼るのではなく、セットアップされる自動ステップとして望んでいます。私は通常、開発中に JSLint を実行しますが、リポジトリにコミットする前に JSLint を渡す JS ファイルのコントラクトを指定したいと考えています。

Mercurial の場合、このページにはコミット前の構文が詳しく説明されていますが、使用できると思われる変数は、コミットに含まれる親 1 および親 2 チェンジセット ID だけです。私が本当に必要としているのは、コミットに関係するファイル名のリストです。これにより、.js ファイルを選択してそれらに対して jslint を実行できるようになります。

GITの同様の問題、precommit スクリプトの一部として利用可能なデフォルト情報は制限されているようです。

機能する可能性があるのは、プリコミット スクリプトの一部として hg status/git status を呼び出し、その出力を解析して JS ファイルを見つけ、その方法で作業を行うことです。私はもっ​​と簡単なことを望んでいましたが、precommit フックの一部としてステータスを呼び出すことが正しい情報を反映しているかどうかはわかりません。たとえば、Git で変更ファイルがまだ追加されていないが、git コミットが -a を使用している場合、ファイルはコミット セットの一部として git ステータス出力の正しいセクションに表示されますか?

更新: 何かが機能しています。ここに表示されます: http://github.com/jrburke/dvcs_jslint/

4

3 に答える 3

12

以下は、 Node.jsとnode-jslintのローカル コピー(つまりnpm install jslint、ルート リポジトリ ディレクトリにある必要があります)で動作する @Bitbieger の Git ソリューションのバリエーションです。

さらにスクリプト:

  • すべての .html および .json ファイルと .js に対して jslint を実行します
  • 追加、コピー、または変更されたファイルに対してのみ jslint を実行します。これにより、名前が変更または削除されたファイルで jslint がエラーになるのを防ぎます。
  • ユーザーが確認できるように、jslint エラーを複製します。
  • --indent 4 --white truejslint オプションを使用して、ソース コードの一貫性を確保します

それを機能させるには、次をにコピーし、.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
于 2011-09-12T09:45:22.790 に答える
2

git の場合、.git/hooks ディレクトリにサンプルがあります。JSLint のファイル名だけが必要な場合は、 を使用できますgit diff --name-only。これは、私の例では、現在の とは異なるファイルの名前を一覧表示しますHEAD

于 2009-12-03T10:26:24.767 に答える
1

SpiderMonkey を使用した JSLint

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
于 2009-12-06T11:15:20.687 に答える