2009-12-03 34 views
17

Tôi muốn chạy JSLint trước khi commit vào một repo Mercurial hoặc Git được thực hiện.Pre Commit Hook cho JSLint trong Mercurial và Git

Tôi muốn đây là bước tự động được thiết lập thay vì dựa vào nhà phát triển (chủ yếu là tôi) đang nhớ chạy JSLint trước đó. Tôi thường chạy JSLint trong khi phát triển, nhưng muốn chỉ định một hợp đồng trên các tệp JS mà họ vượt qua JSLint trước khi được cam kết với repo.

Đối với Mercurial, this page giải thích cú pháp precommit, nhưng các biến duy nhất dường như có sẵn là ID thay đổi parent1 và parent2 liên quan đến cam kết. Những gì tôi thực sự muốn là một danh sách các tên tập tin có liên quan đến cam kết, để tôi có thể chọn tập tin .js và chạy jslint trên chúng.

Similar issue for GIT, thông tin mặc định có sẵn như một phần của tập lệnh precommit có vẻ bị giới hạn.

Điều gì có thể hoạt động là gọi trạng thái hg/trạng thái git như một phần của tập lệnh precommit, phân tích cú pháp đầu ra đó để tìm tệp JS rồi thực hiện công việc theo cách đó. Tôi đã hy vọng cho một cái gì đó dễ dàng hơn mặc dù, và tôi không chắc chắn nếu tình trạng gọi là một phần của một móc precommit phản ánh thông tin chính xác. Ví dụ trong Git nếu các tập tin thay đổi chưa được thêm vào, nhưng git commit sử dụng -a, liệu các tệp có hiển thị trong phần chính xác của đầu ra trạng thái git như là một phần của bộ cam kết không?

Cập nhật: Tôi đã nhận một cái gì đó làm việc, nó có thể nhìn thấy ở đây: http://github.com/jrburke/dvcs_jslint/

+1

Chỉ để hoàn thành, dưới đây là một số hướng dẫn thiết lập [JSLint dưới dạng móc cam kết lật đổ] (http://www.amaxus.com/cms-blog/jslint-as-subversion-hook). –

+0

Có cùng nhu cầu vì vậy tôi đã viết http://bitbucket.org/robmadole/hgjslint/ –

Trả lời

2

Đối với git, có ví dụ trong .git/móc thư mục. Nếu bạn chỉ cần tên tệp cho JSLint, bạn có thể sử dụng git diff --name-only, trong ví dụ của tôi sẽ liệt kê tên của các tệp khác với HEAD hiện tại.

+0

Cảm ơn gợi ý này trên lệnh git.Vì vậy, nó vẫn có vẻ như tôi sẽ cần phải sử dụng một lệnh dvcs để có được danh sách các tập tin và phân tích các tập tin để ăn để jslint. Ít nhất git diff --name-only sẽ làm cho việc phân tích cú pháp khá dễ dàng. – jrburke

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

Sau đây là một biến thể của @ giải pháp Git Bitbieger của làm việc với Node.js và một bản sao cục bộ của node-jslint (tức là bạn cần npm install jslint trong thư mục kho lưu trữ thư mục gốc của bạn).

Ngoài ra kịch bản:

  • Chạy JSLint trên tất cả các file .html và .json cũng như .js
  • Chỉ chạy JSLint qua các tập tin đã được thêm vào, sao chép hoặc sửa đổi. Điều này ngăn không cho jslint bị lỗi trên các tệp đã được đổi tên hoặc xóa.
  • tái tạo bất kỳ lỗi nào JSLint cho người sử dụng để xem
  • Sử dụng các tùy chọn --indent 4 --white true JSLint để đảm bảo tính thống nhất mã nguồn

Để có được nó để làm việc sao chép như sau để .git/hooks/pre-commit và đừng quên 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

nên "thoát 0" nằm ngoài vòng lặp? Bằng cách đó, vòng lặp thực sự sẽ kiểm tra từng tệp, thay vì quay lại trên tệp đầu tiên đã qua. –

+2

Tôi nhận được những điều sau đây cố gắng sử dụng tùy chọn 'grep: invalid' - P Cách sử dụng: grep [TÙY CHỌN] ... MẪU [FILE] ... Thử 'grep --help' để biết thêm thông tin. Tôi không quen thuộc với grep nhưng '-P' dường như là một [tùy chọn] hợp lệ (http://unixhelp.ed.ac.uk/CGI/man-cgi?grep). – James

Các vấn đề liên quan