pre-commit 0.1.11 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/pre-commit/checks.rb +1 -33
- data/lib/pre-commit/checks/js_check.rb +59 -0
- data/lib/pre-commit/checks/jshint_check.rb +12 -72
- data/lib/pre-commit/checks/jslint_check.rb +22 -26
- data/lib/support/all.rb +0 -1
- metadata +31 -7
- data/lib/support/jslint/jslint_checker.rb +0 -43
data/lib/pre-commit/checks.rb
CHANGED
@@ -10,7 +10,7 @@ require 'pre-commit/checks/migration_check'
|
|
10
10
|
|
11
11
|
class PreCommit
|
12
12
|
|
13
|
-
WhiteSpace = lambda {
|
13
|
+
WhiteSpace = lambda {
|
14
14
|
WhiteSpaceChecker.check
|
15
15
|
}
|
16
16
|
|
@@ -24,38 +24,6 @@ class PreCommit
|
|
24
24
|
end
|
25
25
|
}
|
26
26
|
|
27
|
-
JSLintCheck = lambda { |files|
|
28
|
-
errors = []
|
29
|
-
files.each do |file|
|
30
|
-
errors << JSLint.lint_file(file)
|
31
|
-
end
|
32
|
-
|
33
|
-
# JSLint.lint_file returns an array.
|
34
|
-
# Therefore no errors looks like this: [[]]
|
35
|
-
# And errors.empty? returns false
|
36
|
-
errors.flatten!
|
37
|
-
|
38
|
-
if errors.empty?
|
39
|
-
true
|
40
|
-
else
|
41
|
-
$stderr.puts errors.join("\n")
|
42
|
-
$stderr.puts
|
43
|
-
$stderr.puts 'pre-commit: You can bypass this check using `git commit -n`'
|
44
|
-
$stderr.puts
|
45
|
-
false
|
46
|
-
end
|
47
|
-
}
|
48
|
-
|
49
|
-
JSLintNew = lambda {
|
50
|
-
new_js_files = Utils.new_files('.').split(" ").reject {|f| f !~ /\.js$/}
|
51
|
-
JSLintCheck[new_js_files]
|
52
|
-
}
|
53
|
-
|
54
|
-
JSLintAll = lambda {
|
55
|
-
staged_js_files = Utils.staged_files('.').split(" ").reject {|f| f !~ /\.js$/}
|
56
|
-
JSLintCheck[staged_js_files]
|
57
|
-
}
|
58
|
-
|
59
27
|
Checks = {
|
60
28
|
:white_space => WhiteSpace,
|
61
29
|
:console_log => ConsoleLog,
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'pre-commit/base'
|
2
|
+
require 'pre-commit/utils'
|
3
|
+
require 'execjs'
|
4
|
+
|
5
|
+
class PreCommit
|
6
|
+
class JsCheck
|
7
|
+
|
8
|
+
def call
|
9
|
+
js_files = reject_non_js(files_to_check)
|
10
|
+
if should_run?(js_files)
|
11
|
+
run(js_files)
|
12
|
+
else
|
13
|
+
# pretend the check passed and move on
|
14
|
+
true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def run(js_files)
|
19
|
+
errors = []
|
20
|
+
|
21
|
+
js_files.each do |file|
|
22
|
+
error_list = run_check(file)
|
23
|
+
error_list.each { |error_object| errors << display_error(error_object, file) }
|
24
|
+
end
|
25
|
+
|
26
|
+
if errors.empty?
|
27
|
+
true
|
28
|
+
else
|
29
|
+
$stderr.puts errors.join("\n")
|
30
|
+
$stderr.puts
|
31
|
+
$stderr.puts 'pre-commit: You can bypass this check using `git commit -n`'
|
32
|
+
$stderr.puts
|
33
|
+
false
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def should_run?(js_files)
|
38
|
+
js_files.any?
|
39
|
+
end
|
40
|
+
|
41
|
+
def reject_non_js(staged_files)
|
42
|
+
staged_files.select { |f| f =~ /\.js$/ }
|
43
|
+
end
|
44
|
+
|
45
|
+
def check_name
|
46
|
+
raise "Must be defined by subclass"
|
47
|
+
end
|
48
|
+
|
49
|
+
def linter_src
|
50
|
+
raise "Must be defined by subclass"
|
51
|
+
end
|
52
|
+
|
53
|
+
def display_error(error_object, file)
|
54
|
+
line = error_object['line'].to_i + 1
|
55
|
+
"pre-commit: #{check_name.upcase} #{error_object['reason']}\n#{file}:#{line} #{error_object['evidence']}"
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -1,87 +1,27 @@
|
|
1
|
-
require 'pre-commit/
|
2
|
-
require 'pre-commit/utils'
|
1
|
+
require 'pre-commit/checks/js_check'
|
3
2
|
|
4
3
|
class PreCommit
|
5
|
-
class JshintCheck
|
4
|
+
class JshintCheck < JsCheck
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
@therubyracer_installed = ruby_racer_installed?
|
11
|
-
end
|
12
|
-
|
13
|
-
def call
|
14
|
-
js_files = reject_non_js(load_staged_files)
|
15
|
-
|
16
|
-
if should_run?(js_files)
|
17
|
-
run(js_files)
|
18
|
-
else
|
19
|
-
$stderr.puts 'pre-commit: Skipping JSHint check (to run it: `gem install therubyracer`)' if !ruby_racer_installed?
|
20
|
-
# pretend the check passed and move on
|
21
|
-
true
|
22
|
-
end
|
6
|
+
def check_name
|
7
|
+
"JSHint"
|
23
8
|
end
|
24
9
|
|
25
|
-
def
|
26
|
-
|
27
|
-
|
28
|
-
js_files.each do |file|
|
29
|
-
V8::Context.new do |context|
|
30
|
-
context.load(jshint_src)
|
31
|
-
context['source'] = lambda { File.read(file) }
|
32
|
-
context['report'] = lambda do |array|
|
33
|
-
array.each { |error_object| errors << display_error(error_object, file) }
|
34
|
-
end
|
35
|
-
|
36
|
-
context.eval('var result = JSHINT(source());')
|
37
|
-
context.eval('report(JSHINT.errors);')
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
if errors.empty?
|
42
|
-
true
|
43
|
-
else
|
44
|
-
$stderr.puts errors.join("\n")
|
45
|
-
$stderr.puts
|
46
|
-
$stderr.puts 'pre-commit: You can bypass this check using `git commit -n`'
|
47
|
-
$stderr.puts
|
48
|
-
false
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def should_run?(js_files)
|
53
|
-
ruby_racer_installed? && js_files.any?
|
10
|
+
def files_to_check
|
11
|
+
Utils.staged_files('.').split(" ")
|
54
12
|
end
|
55
13
|
|
56
|
-
def
|
57
|
-
|
58
|
-
|
14
|
+
def run_check(file)
|
15
|
+
context = ExecJS.compile(File.read(linter_src))
|
16
|
+
if !(context.call('JSHINT', File.read(file)))
|
17
|
+
context.exec('return JSHINT.errors;')
|
59
18
|
else
|
60
|
-
|
61
|
-
require 'v8'
|
62
|
-
@therubyracer_installed = true
|
63
|
-
rescue LoadError
|
64
|
-
@therubyracer_installed = false
|
65
|
-
end
|
19
|
+
[]
|
66
20
|
end
|
67
21
|
end
|
68
22
|
|
69
|
-
def
|
23
|
+
def linter_src
|
70
24
|
File.join(PreCommit.root, 'lib', 'support', 'jshint', 'jshint.js')
|
71
25
|
end
|
72
|
-
|
73
|
-
def load_staged_files
|
74
|
-
Utils.staged_files('.').split(" ")
|
75
|
-
end
|
76
|
-
|
77
|
-
def reject_non_js(staged_files)
|
78
|
-
staged_files.select { |f| f =~ /\.js$/ }
|
79
|
-
end
|
80
|
-
|
81
|
-
def display_error(error_object, file)
|
82
|
-
line = error_object['line'].to_i + 1
|
83
|
-
"pre-commit: JSHINT #{error_object['reason']}\n#{file}:#{line} #{error_object['evidence']}"
|
84
|
-
end
|
85
|
-
|
86
26
|
end
|
87
27
|
end
|
@@ -1,44 +1,40 @@
|
|
1
|
+
require 'pre-commit/checks/js_check'
|
2
|
+
|
1
3
|
# This (PreCommit) should be a module
|
2
4
|
# ... it should also have a cooler name :P
|
3
5
|
class PreCommit
|
4
|
-
class JslintCheck
|
6
|
+
class JslintCheck < JsCheck
|
5
7
|
|
6
|
-
attr_accessor :
|
8
|
+
attr_accessor :type
|
7
9
|
|
8
|
-
def
|
9
|
-
|
10
|
-
@therubyracer_installed = check_for_therubyracer_install
|
10
|
+
def check_name
|
11
|
+
"JSLint"
|
11
12
|
end
|
12
13
|
|
13
|
-
def
|
14
|
-
@
|
14
|
+
def initialize(type = :all)
|
15
|
+
@type = type
|
15
16
|
end
|
16
17
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
18
|
+
def files_to_check
|
19
|
+
case @type
|
20
|
+
when :new
|
21
|
+
Utils.new_files('.').split(" ")
|
20
22
|
else
|
21
|
-
|
22
|
-
# pretend the check passed and move on
|
23
|
-
true
|
23
|
+
Utils.staged_files('.').split(" ")
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
def run_check(file)
|
28
|
+
context = ExecJS.compile(File.read(linter_src))
|
29
|
+
if !(context.call('JSLINT', File.read(file)))
|
30
|
+
context.exec('return JSLINT.errors;')
|
31
|
+
else
|
32
|
+
[]
|
33
|
+
end
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
def check_for_therubyracer_install
|
38
|
-
require 'v8'
|
39
|
-
@therubyracer_installed = true
|
40
|
-
rescue LoadError
|
41
|
-
@therubyracer_installed = false
|
36
|
+
def linter_src
|
37
|
+
File.join(PreCommit.root, 'lib', 'support', 'jslint', 'lint.js')
|
42
38
|
end
|
43
39
|
|
44
40
|
end
|
data/lib/support/all.rb
CHANGED
metadata
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pre-commit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 3
|
4
5
|
prerelease:
|
5
|
-
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 12
|
10
|
+
version: 0.1.12
|
6
11
|
platform: ruby
|
7
12
|
authors:
|
8
13
|
- Shajith Chacko, Josh Lubaway
|
@@ -10,11 +15,24 @@ autorequire:
|
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2011-
|
18
|
+
date: 2011-06-03 00:00:00 -07:00
|
14
19
|
default_executable: pre-commit
|
15
|
-
dependencies:
|
16
|
-
|
17
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: execjs
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :runtime
|
34
|
+
version_requirements: *id001
|
35
|
+
description: A git pre-commit hook written in ruby with a few more tricks up it's sleeve
|
18
36
|
email: dontneedmoreemail@example.com
|
19
37
|
executables:
|
20
38
|
- pre-commit
|
@@ -26,6 +44,7 @@ files:
|
|
26
44
|
- lib/pre-commit/base.rb
|
27
45
|
- lib/pre-commit/checks/console_log.rb
|
28
46
|
- lib/pre-commit/checks/debugger_check.rb
|
47
|
+
- lib/pre-commit/checks/js_check.rb
|
29
48
|
- lib/pre-commit/checks/jshint_check.rb
|
30
49
|
- lib/pre-commit/checks/jslint_check.rb
|
31
50
|
- lib/pre-commit/checks/merge_conflict.rb
|
@@ -39,7 +58,6 @@ files:
|
|
39
58
|
- lib/support/closure/closure_checker.rb
|
40
59
|
- lib/support/closure/compiler.jar
|
41
60
|
- lib/support/jshint/jshint.js
|
42
|
-
- lib/support/jslint/jslint_checker.rb
|
43
61
|
- lib/support/jslint/lint.js
|
44
62
|
- lib/support/whitespace/whitespace
|
45
63
|
- lib/support/whitespace/whitespace_checker.rb
|
@@ -60,12 +78,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
60
78
|
requirements:
|
61
79
|
- - ">="
|
62
80
|
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
82
|
+
segments:
|
83
|
+
- 0
|
63
84
|
version: "0"
|
64
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
65
86
|
none: false
|
66
87
|
requirements:
|
67
88
|
- - ">="
|
68
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
69
93
|
version: "0"
|
70
94
|
requirements: []
|
71
95
|
|
@@ -73,6 +97,6 @@ rubyforge_project:
|
|
73
97
|
rubygems_version: 1.5.2
|
74
98
|
signing_key:
|
75
99
|
specification_version: 3
|
76
|
-
summary:
|
100
|
+
summary: A slightly better git pre-commit hook
|
77
101
|
test_files: []
|
78
102
|
|
@@ -1,43 +0,0 @@
|
|
1
|
-
|
2
|
-
class JSLint
|
3
|
-
OK_REASONS = [ "Expected an identifier and instead saw 'undefined' (a reserved word).",
|
4
|
-
"Use '===' to compare with 'null'.",
|
5
|
-
"Use '!==' to compare with 'null'.",
|
6
|
-
"Expected an assignment or function call and instead saw an expression.",
|
7
|
-
"Expected a 'break' statement before 'case'.",
|
8
|
-
"'e' is already defined." ]
|
9
|
-
|
10
|
-
LINT_PATH = File.join(File.dirname(__FILE__), "lint.js")
|
11
|
-
|
12
|
-
def self.lint_file(file)
|
13
|
-
errors = []
|
14
|
-
V8::Context.new do |context|
|
15
|
-
context.load(LINT_PATH)
|
16
|
-
context['input'] = lambda{
|
17
|
-
File.read(file)
|
18
|
-
}
|
19
|
-
|
20
|
-
context['reportErrors'] = lambda{|js_errors|
|
21
|
-
js_errors.each do |e|
|
22
|
-
next if e.nil? || OK_REASONS.include?(e.reason)
|
23
|
-
|
24
|
-
errors << "\n\e[1;31mJSLINT: #{file}\e[0m"
|
25
|
-
errors << " Error at line #{e['line'].to_i + 1} " +
|
26
|
-
"character #{e['character'].to_i + 1}: \e[1;33m#{e['reason']}\e[0m"
|
27
|
-
errors << "#{e['evidence']}"
|
28
|
-
end
|
29
|
-
}
|
30
|
-
|
31
|
-
context.eval %{
|
32
|
-
JSLINT(input(), { evil: true, forin: true, maxerr: 100 });
|
33
|
-
reportErrors(JSLINT.errors);
|
34
|
-
}
|
35
|
-
end
|
36
|
-
|
37
|
-
return errors
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
if __FILE__ == $0
|
42
|
-
puts JSLint.lint_file(ARGV[0]).join("\n")
|
43
|
-
end
|