【问题标题】:Pre Commit Hook for JSLint in Mercurial and GitMercurial 和 Git 中 JSLint 的预提交挂钩
【发布时间】:2010-12-22 16:49:41
【问题描述】:

我想在提交到 Mercurial 或 Git 存储库之前运行 JSLint。

我希望这是一个自动设置的步骤,而不是依赖开发人员(主要是我)记住事先运行 JSLint。我通常在开发时运行 JSLint,但想在提交到 repo 之前通过 JSLint 的 JS 文件指定一个合同。

对于 Mercurial,this page 说明了预提交语法,但似乎唯一可用的变量是提交中涉及的 parent1 和 parent2 变更集 ID。我真正想要的是与提交有关的文件名列表,这样我就可以选择 .js 文件并在它们上运行 jslint。

Similar issue for GIT,作为预提交脚本的一部分可用的默认信息似乎有限。

可能的工作是调用 hg status/git status 作为预提交脚本的一部分,解析该输出以查找 JS 文件,然后以这种方式完成工作。不过,我希望有一些更简单的东西,我不确定作为预提交钩子的一部分调用状态是否反映了正确的信息。例如,在 Git 中,如果尚未添加更改文件,但 git commit 使用 -a,这些文件是否会作为提交集的一部分显示在 git status 输出的正确部分?

更新:我得到了一些工作,它在这里可见:http://github.com/jrburke/dvcs_jslint/

【问题讨论】:

标签: git mercurial jslint pre-commit-hook


【解决方案1】:

以下是 @Bitbieger 的 Git 解决方案的变体,它与 Node.jsnode-jslint 的本地副本一起使用(即您需要在根存储库目录中使用 npm install jslint)。

另外脚本:

  • 对所有 .html 和 .json 文件以及 .js 运行 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

【讨论】:

  • “exit 0”应该在循环之外吗?这样循环实际上会检查每个文件,而不是返回第一个通过的文件。
  • 我得到以下尝试使用这个grep: invalid option -- P Usage: grep [OPTION]... PATTERN [FILE]... Try 'grep --help' for more information. 任何想法?我不熟悉 grep 但-P 似乎是一个有效的option
【解决方案2】:

对于 git,.git/hooks 目录中有示例。如果您只需要 JSLint 的文件名,可以使用 git diff --name-only,在我的示例中,它将列出与当前 HEAD 不同的文件名。

【讨论】:

  • 感谢 git 命令的提示。所以看起来我仍然需要使用 dvcs 命令来获取文件列表并解析出要提供给 jslint 的文件。至少 git diff --name-only 会让解析变得相当容易。
【解决方案3】:

JSLint with 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

【讨论】:

    猜你喜欢
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 2012-01-25
    • 2015-09-10
    相关资源
    最近更新 更多