2009-12-03 38 views
17

我想在提交到Mercurial或Git仓库之前运行JSLint。对于Mercurial和Git中的JSLint提交前钩子

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

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

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

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

更新:我得到的东西的工作,它是在这里看到:http://github.com/jrburke/dvcs_jslint/

+1

为了完整起见,下面是一些设置[JSLint作为Subversion提交钩子]的说明(http://www.amaxus.com/cms-blog/jslint-as-subversion-hook)。 – 2010-03-24 08:17:56

+0

有同样的需要,所以我写了这个http://bitbucket.org/robmadole/hgjslint/ – 2010-05-13 20:34:09

回答

2

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

+0

感谢您对git命令的提示。因此,我似乎仍然需要使用dvcs命令来获取文件列表并解析出要提交给jslint的文件。至少git diff --name-only会使解析变得相当容易。 – jrburke 2009-12-03 19:17:59

1

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 
11

以下是Bitbieger的Git的解决方案@变化与Node.jsnode-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 
+1

应该“退出0”在循环之外吗?这样循环会实际检查每个文件,而不是在第一个文件上返回。 – 2012-09-07 05:12:43

+2

我得到以下尝试使用这个'grep:无效选项 - P 用法:grep [选项] ... PATTERN [文件] ... 尝试'grep --help'获取更多信息。我对grep不熟悉,但'-P'似乎是一个有效的[选项](http://unixhelp.ed.ac.uk/CGI/man-cgi?grep)。 – James 2013-12-04 16:48:17