2009-12-03 73 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