pre-commit 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +2 -3
- data/bin/pre-commit +1 -2
- data/lib/pre-commit/checks/ci_check.rb +3 -42
- data/lib/pre-commit/checks/closure_check.rb +13 -0
- data/lib/pre-commit/checks/console_log_check.rb +11 -0
- data/lib/pre-commit/checks/debugger_check.rb +5 -42
- data/lib/pre-commit/checks/gemfile_path_check.rb +12 -0
- data/lib/pre-commit/checks/js_check.rb +10 -36
- data/lib/pre-commit/checks/jshint_check.rb +9 -18
- data/lib/pre-commit/checks/jslint_check.rb +4 -21
- data/lib/pre-commit/checks/local_check.rb +4 -21
- data/lib/pre-commit/checks/merge_conflict_check.rb +10 -0
- data/lib/pre-commit/checks/migration_check.rb +5 -32
- data/lib/pre-commit/checks/nb_space_check.rb +21 -0
- data/lib/pre-commit/checks/php_check.rb +9 -57
- data/lib/pre-commit/checks/pry_check.rb +5 -42
- data/lib/pre-commit/checks/rspec_focus_check.rb +6 -49
- data/lib/pre-commit/checks/rubocop_check.rb +17 -34
- data/lib/pre-commit/checks/ruby_symbol_hashrockets.rb +5 -46
- data/lib/pre-commit/checks/tabs_check.rb +12 -0
- data/lib/pre-commit/checks/whitespace_check.rb +16 -0
- data/lib/pre-commit/checks.rb +39 -41
- data/lib/pre-commit/cli.rb +1 -28
- data/lib/{support → pre-commit/support}/closure/compiler.jar +0 -0
- data/lib/{support → pre-commit/support}/jshint/jshint.js +0 -0
- data/lib/{support → pre-commit/support}/jslint/lint.js +0 -0
- data/{templates → lib/pre-commit/support/templates}/pre-commit-hook +0 -0
- data/lib/pre-commit/utils.rb +9 -12
- metadata +20 -24
- data/lib/pre-commit/base.rb +0 -7
- data/lib/pre-commit/checks/console_log.rb +0 -43
- data/lib/pre-commit/checks/merge_conflict.rb +0 -34
- data/lib/pre-commit/checks/tabs.rb +0 -54
- data/lib/support/all.rb +0 -2
- data/lib/support/closure/closure_checker.rb +0 -10
- data/lib/support/whitespace/whitespace +0 -46
- data/lib/support/whitespace/whitespace_checker.rb +0 -9
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6287e78942b84e9f14387a16d0995edbd49e6818
|
4
|
+
data.tar.gz: 86896dde7b2c8297c94daf14597c3f0e318cf413
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 21d22b4b4cb415f30d4b47342e82c406acc47de83759d7b3afa66770824639baf5102025e9a0a2f50bfa6ac63028b618cd21361a8af416217a38514002af711b
|
7
|
+
data.tar.gz: 813cd48195f51c2b7d5048aadebb55d478933f2984e5b0398b70a0bc5dee9618b889217814cef621a112694c4fd27b91ffad5a89e5e36abcb3841dae5a31df7b
|
data/README.md
CHANGED
@@ -26,8 +26,7 @@ These are the available checks:
|
|
26
26
|
* pry
|
27
27
|
* tabs
|
28
28
|
* jshint
|
29
|
-
*
|
30
|
-
* js\_lint\_new (Runs JSLint on all new staged JS files)
|
29
|
+
* js_lint
|
31
30
|
* closure\_syntax\_check
|
32
31
|
* php (Runs php -l on all staged files)
|
33
32
|
* rspec_focus (Will check if you are about to check in a :focus in a spec file)
|
@@ -36,7 +35,7 @@ These are the available checks:
|
|
36
35
|
* merge_conflict (Will check if you are about to check in a merge conflict)
|
37
36
|
* migrations (Will make sure you check in the proper files after creating a Rails migration)
|
38
37
|
* ci (Will run the `pre_commit:ci` rake task and pass or fail accordingly)
|
39
|
-
* rubocop
|
38
|
+
* rubocop (Check ruby code style using the rubocop gem. Rubocop must be installed)
|
40
39
|
|
41
40
|
To configure which checks you would like to run, simply set the `pre-commit.checks` git configuration setting.
|
42
41
|
|
data/bin/pre-commit
CHANGED
@@ -1,49 +1,10 @@
|
|
1
1
|
module PreCommit
|
2
2
|
class CiCheck
|
3
|
-
|
4
3
|
CI_TASK_NAME = 'pre_commit:ci'
|
5
4
|
|
6
|
-
def call
|
7
|
-
if
|
8
|
-
|
9
|
-
else
|
10
|
-
$stderr.puts "pre-commit: skipping ci check. The `#{CI_TASK_NAME}` task is not defined."
|
11
|
-
|
12
|
-
# pretend the check passed and move on
|
13
|
-
true
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def run
|
18
|
-
if tests_passed?
|
19
|
-
true
|
20
|
-
else
|
21
|
-
$stderr.puts 'pre-commit: your test suite has failed'
|
22
|
-
$stderr.puts "for the full output run `#{CI_TASK_NAME}`"
|
23
|
-
$stderr.puts
|
24
|
-
|
25
|
-
false
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
def tests_passed?
|
30
|
-
system("rake #{CI_TASK_NAME} --silent")
|
31
|
-
end
|
32
|
-
|
33
|
-
def rakefile_present?
|
34
|
-
['rakefile', 'Rakefile', 'rakefile.rb', 'Rakefile.rb'].any? do |file|
|
35
|
-
File.exist?(file)
|
36
|
-
end
|
5
|
+
def self.call(_)
|
6
|
+
return if system("rake #{CI_TASK_NAME} --silent")
|
7
|
+
"your test suite has failed, for the full output run `#{CI_TASK_NAME}`"
|
37
8
|
end
|
38
|
-
|
39
|
-
def has_ci_task?
|
40
|
-
require 'rake'
|
41
|
-
Rake.application.init
|
42
|
-
Rake.application.load_rakefile
|
43
|
-
Rake::Task.task_defined?(CI_TASK_NAME)
|
44
|
-
rescue LoadError
|
45
|
-
$stderr.puts 'pre-commit: rake not found, skipping ci check'
|
46
|
-
end
|
47
|
-
|
48
9
|
end
|
49
10
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module PreCommit
|
2
|
+
class ClosureCheck
|
3
|
+
CLOSURE_PATH = File.expand_path("../../support/closure/compiler.jar", __FILE__)
|
4
|
+
|
5
|
+
def self.call(staged_files)
|
6
|
+
return if staged_files.empty?
|
7
|
+
js_args = staged_files.map {|arg| "--js #{arg}"}.join(' ')
|
8
|
+
errors = `java -jar #{CLOSURE_PATH} #{js_args} --js_output_file /tmp/jammit.js 2>&1`.strip
|
9
|
+
return if errors.empty?
|
10
|
+
errors
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module PreCommit
|
2
|
+
class ConsoleLogCheck
|
3
|
+
def self.call(staged_files)
|
4
|
+
staged_files.reject! { |f| File.extname(f) != ".js" }
|
5
|
+
return if staged_files.empty?
|
6
|
+
errors = `#{Utils.grep} -e "console\\.log" #{staged_files.join(" ")} | grep -v \/\/`.strip
|
7
|
+
return unless $?.success?
|
8
|
+
"console.log found:\n#{errors}"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -1,47 +1,10 @@
|
|
1
1
|
module PreCommit
|
2
2
|
class DebuggerCheck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
check = new
|
9
|
-
check.staged_files = Utils.staged_files(*dirs)
|
10
|
-
|
11
|
-
result = check.run
|
12
|
-
if !quiet && !result
|
13
|
-
$stderr.puts check.error_message
|
14
|
-
$stderr.puts
|
15
|
-
check.print_dash_n_reminder
|
16
|
-
end
|
17
|
-
result
|
3
|
+
def self.call(staged_files)
|
4
|
+
return if staged_files.empty?
|
5
|
+
errors = `#{Utils.grep} debugger #{staged_files.join(" ")}`.strip
|
6
|
+
return unless $?.success?
|
7
|
+
"debugger statement(s) found:\n#{errors}"
|
18
8
|
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
return true if staged_files.empty?
|
22
|
-
|
23
|
-
if detected_bad_code?
|
24
|
-
@error_message = "pre-commit: debugger statement(s) found:\n"
|
25
|
-
@error_message += instances_of_debugger_violations
|
26
|
-
false
|
27
|
-
else
|
28
|
-
true
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def detected_bad_code?
|
33
|
-
!system("git diff --cached -Sdebugger --quiet --exit-code")
|
34
|
-
end
|
35
|
-
|
36
|
-
def instances_of_debugger_violations
|
37
|
-
cmd = grep_command || "git grep"
|
38
|
-
`#{cmd} -nH debugger #{staged_files}`
|
39
|
-
end
|
40
|
-
|
41
|
-
def print_dash_n_reminder
|
42
|
-
$stderr.puts 'You can bypass this check using `git commit -n`'
|
43
|
-
$stderr.puts
|
44
|
-
end
|
45
|
-
|
46
9
|
end
|
47
10
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'pre-commit/utils'
|
2
|
+
|
3
|
+
module PreCommit
|
4
|
+
class GemfilePathCheck
|
5
|
+
def self.call(staged_files)
|
6
|
+
return unless staged_files.include?("Gemfile")
|
7
|
+
errors = `#{Utils.grep} 'path:|:path\\s*=>' Gemfile`.strip
|
8
|
+
return unless $?.success?
|
9
|
+
"local path found in Gemfile:\n#{errors}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -1,61 +1,35 @@
|
|
1
|
-
require 'pre-commit/base'
|
2
1
|
require 'pre-commit/utils'
|
3
2
|
require 'execjs'
|
4
3
|
|
5
4
|
module PreCommit
|
6
5
|
class JsCheck
|
6
|
+
def self.call(staged_files)
|
7
|
+
staged_files = staged_files.select { |f| File.extname(f) == ".js" }
|
8
|
+
return if staged_files.empty?
|
7
9
|
|
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
10
|
errors = []
|
20
|
-
|
21
|
-
js_files.each do |file|
|
11
|
+
staged_files.each do |file|
|
22
12
|
error_list = Array(run_check(file))
|
23
13
|
error_list.each { |error_object| errors << display_error(error_object, file) }
|
24
14
|
end
|
25
15
|
|
26
|
-
if errors.empty?
|
27
|
-
|
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?
|
16
|
+
return if errors.empty?
|
17
|
+
errors.join("\n")
|
39
18
|
end
|
40
19
|
|
41
|
-
def
|
42
|
-
staged_files.select { |f| f =~ /\.js$/ }
|
43
|
-
end
|
44
|
-
|
45
|
-
def check_name
|
20
|
+
def self.check_name
|
46
21
|
raise "Must be defined by subclass"
|
47
22
|
end
|
48
23
|
|
49
|
-
def linter_src
|
24
|
+
def self.linter_src
|
50
25
|
raise "Must be defined by subclass"
|
51
26
|
end
|
52
27
|
|
53
|
-
def display_error(error_object, file)
|
28
|
+
def self.display_error(error_object, file)
|
54
29
|
return "" unless error_object
|
55
30
|
|
56
31
|
line = error_object['line'].to_i + 1
|
57
|
-
"
|
32
|
+
"#{error_object['reason']}\n#{file}:#{line} #{error_object['evidence']}"
|
58
33
|
end
|
59
|
-
|
60
34
|
end
|
61
35
|
end
|
@@ -2,34 +2,25 @@ require 'pre-commit/checks/js_check'
|
|
2
2
|
|
3
3
|
module PreCommit
|
4
4
|
class JshintCheck < JsCheck
|
5
|
-
|
6
|
-
|
7
|
-
"JSHint"
|
8
|
-
end
|
9
|
-
|
10
|
-
def files_to_check
|
11
|
-
Utils.staged_files('.').split(" ")
|
12
|
-
end
|
13
|
-
|
14
|
-
def config
|
15
|
-
config_file = ENV['JSHINT_CONFIG']
|
16
|
-
config_file ||= File.exists?(".jshintrc") ? ".jshintrc" : nil
|
17
|
-
|
18
|
-
if config_file
|
5
|
+
def self.config
|
6
|
+
if config_file = [ENV['JSHINT_CONFIG'], ".jshintrc"].compact.detect { |f| File.exist?(f) }
|
19
7
|
ExecJS.exec("return (#{File.read(config_file)});")
|
20
8
|
else
|
21
9
|
{}
|
22
10
|
end
|
23
11
|
end
|
24
12
|
|
25
|
-
def
|
13
|
+
def self.check_name
|
14
|
+
"JSHint"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.run_check(file)
|
26
18
|
context = ExecJS.compile(File.read(linter_src))
|
27
19
|
context.call('JSHINT', File.read(file), config)
|
28
20
|
end
|
29
21
|
|
30
|
-
def linter_src
|
31
|
-
File.
|
22
|
+
def self.linter_src
|
23
|
+
File.expand_path("../../support/jshint/jshint.js", __FILE__)
|
32
24
|
end
|
33
|
-
|
34
25
|
end
|
35
26
|
end
|
@@ -2,27 +2,11 @@ require 'pre-commit/checks/js_check'
|
|
2
2
|
|
3
3
|
module PreCommit
|
4
4
|
class JslintCheck < JsCheck
|
5
|
-
|
6
|
-
attr_accessor :type
|
7
|
-
|
8
|
-
def check_name
|
5
|
+
def self.check_name
|
9
6
|
"JSLint"
|
10
7
|
end
|
11
8
|
|
12
|
-
def
|
13
|
-
@type = type
|
14
|
-
end
|
15
|
-
|
16
|
-
def files_to_check
|
17
|
-
case @type
|
18
|
-
when :new
|
19
|
-
Utils.new_files('.').split(" ")
|
20
|
-
else
|
21
|
-
Utils.staged_files('.').split(" ")
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def run_check(file)
|
9
|
+
def self.run_check(file)
|
26
10
|
context = ExecJS.compile(File.read(linter_src))
|
27
11
|
if !(context.call('JSLINT', File.read(file)))
|
28
12
|
context.exec('return JSLINT.errors;')
|
@@ -31,9 +15,8 @@ module PreCommit
|
|
31
15
|
end
|
32
16
|
end
|
33
17
|
|
34
|
-
def linter_src
|
35
|
-
File.
|
18
|
+
def self.linter_src
|
19
|
+
File.expand_path("../../support/jslint/lint.js", __FILE__)
|
36
20
|
end
|
37
|
-
|
38
21
|
end
|
39
22
|
end
|
@@ -1,28 +1,11 @@
|
|
1
|
-
require 'pre-commit/utils'
|
2
|
-
|
3
1
|
module PreCommit
|
4
2
|
class LocalCheck
|
5
|
-
|
6
3
|
DEFAULT_LOCATION = "config/pre-commit.rb"
|
7
|
-
attr_accessor :error_message
|
8
4
|
|
9
|
-
def self.call(
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
result
|
5
|
+
def self.call(staged_files, script=DEFAULT_LOCATION)
|
6
|
+
return unless File.exist?(script)
|
7
|
+
output = `ruby #{script} #{staged_files.join(" ")} 2>&1`
|
8
|
+
"#{script} failed:\n#{output}" unless $?.success?
|
14
9
|
end
|
15
|
-
|
16
|
-
def run(file, staged_files)
|
17
|
-
return true unless File.exist?(file)
|
18
|
-
output = `ruby #{file} #{staged_files} 2>&1`
|
19
|
-
if $?.success?
|
20
|
-
true
|
21
|
-
else
|
22
|
-
self.error_message = "#{file} failed:\n#{output}"
|
23
|
-
false
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
10
|
end
|
28
11
|
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module PreCommit
|
2
|
+
class MergeConflictCheck
|
3
|
+
def self.call(staged_files)
|
4
|
+
return if staged_files.empty?
|
5
|
+
errors = `#{Utils.grep} '<<<<<<<' #{staged_files.join(" ")}`.strip
|
6
|
+
return unless $?.success?
|
7
|
+
"detected a merge conflict\n#{errors}"
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -1,39 +1,21 @@
|
|
1
1
|
module PreCommit
|
2
2
|
class MigrationCheck
|
3
|
-
|
4
|
-
attr_accessor :error_message
|
5
|
-
|
6
|
-
def call
|
7
|
-
staged_files = load_staged_files
|
8
|
-
run(staged_files)
|
9
|
-
|
10
|
-
if !passed? && error_message
|
11
|
-
$stderr.puts "pre-commit: #{error_message}"
|
12
|
-
end
|
13
|
-
|
14
|
-
passed?
|
15
|
-
end
|
16
|
-
|
17
|
-
def run(staged_files)
|
3
|
+
def self.call(staged_files)
|
18
4
|
migration_present = migration_file_present?(staged_files)
|
19
5
|
schema_change = schema_file_present?(staged_files)
|
20
6
|
|
21
7
|
if migration_present && !schema_change
|
22
|
-
|
23
|
-
@passed = false
|
8
|
+
"It looks like you're adding a migration, but did not update the schema file"
|
24
9
|
elsif schema_change && !migration_present
|
25
|
-
|
26
|
-
@passed = false
|
27
|
-
else
|
28
|
-
@passed = true
|
10
|
+
"You're trying to change the schema without adding a migration file"
|
29
11
|
end
|
30
12
|
end
|
31
13
|
|
32
|
-
def migration_file_present?(staged_files)
|
14
|
+
def self.migration_file_present?(staged_files)
|
33
15
|
staged_files.any? { |file| file =~ /db\/migrate\/.*\.rb/ }
|
34
16
|
end
|
35
17
|
|
36
|
-
def schema_file_present?(staged_files)
|
18
|
+
def self.schema_file_present?(staged_files)
|
37
19
|
staged_files.any? do |file|
|
38
20
|
basename = File.basename(file)
|
39
21
|
|
@@ -42,14 +24,5 @@ module PreCommit
|
|
42
24
|
end
|
43
25
|
end
|
44
26
|
end
|
45
|
-
|
46
|
-
def passed?
|
47
|
-
@passed
|
48
|
-
end
|
49
|
-
|
50
|
-
def load_staged_files
|
51
|
-
Utils.staged_files('.').split(" ")
|
52
|
-
end
|
53
|
-
|
54
27
|
end
|
55
28
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PreCommit
|
3
|
+
class NbSpaceCheck
|
4
|
+
def self.call(staged_files)
|
5
|
+
nb_space = " "
|
6
|
+
raise "you messed that up" unless nb_space.bytes.to_a == [194, 160]
|
7
|
+
|
8
|
+
staged_files.reject! { |f| f =~ /^vendor\// || !File.read(f).include?(nb_space) }
|
9
|
+
|
10
|
+
bad = staged_files.map do |file|
|
11
|
+
content = File.read(file).lines.to_a
|
12
|
+
line_no = content.index { |l| l.include?(nb_space) }
|
13
|
+
char_no = content[line_no].index(nb_space)
|
14
|
+
[file, line_no, char_no]
|
15
|
+
end
|
16
|
+
|
17
|
+
return if bad.empty?
|
18
|
+
"Detected non-breaking space in #{bad.map { |f,l,c| "#{f}:#{l+1} character:#{c+1}" }.join(" and")}, remove it!"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,73 +1,25 @@
|
|
1
|
-
require 'pre-commit/base'
|
2
1
|
require 'pre-commit/utils'
|
3
2
|
|
4
3
|
module PreCommit
|
5
4
|
class PhpCheck
|
5
|
+
def self.call(staged_files)
|
6
|
+
staged_files = staged_files.grep /\.(php|engine|theme|install|inc|module|test)$/
|
7
|
+
return if staged_files.empty?
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
end
|
10
|
-
|
11
|
-
def call
|
12
|
-
php_files = reject_non_php(files_to_check)
|
13
|
-
if should_run?(php_files)
|
14
|
-
run(php_files)
|
15
|
-
else
|
16
|
-
# pretend the check passed and move on
|
17
|
-
true
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def check_name
|
22
|
-
"PHP Lint"
|
23
|
-
end
|
24
|
-
|
25
|
-
def run(php_files)
|
26
|
-
errors = []
|
27
|
-
|
28
|
-
php_files.each do |file|
|
29
|
-
error = run_check(file)
|
30
|
-
unless error.nil?
|
31
|
-
errors << display_error(error)
|
32
|
-
end
|
33
|
-
end
|
9
|
+
errors = staged_files.map { |file| run_check(file) }.compact
|
10
|
+
return if errors.empty?
|
34
11
|
|
35
|
-
|
36
|
-
true
|
37
|
-
else
|
38
|
-
$stderr.puts errors.join("\n")
|
39
|
-
$stderr.puts
|
40
|
-
$stderr.puts 'pre-commit: You can bypass this check using `git commit -n`'
|
41
|
-
$stderr.puts
|
42
|
-
false
|
43
|
-
end
|
12
|
+
errors.join("\n")
|
44
13
|
end
|
45
14
|
|
46
|
-
def
|
47
|
-
php_files.any?
|
48
|
-
end
|
49
|
-
|
50
|
-
def reject_non_php(staged_files)
|
51
|
-
staged_files.select { |f| f =~ /\.(php|engine|theme|install|inc|module|test)$/ }
|
52
|
-
end
|
53
|
-
|
54
|
-
def run_check(file)
|
15
|
+
def self.run_check(file)
|
55
16
|
# We force PHP to display errors otherwise they will likely end up in the
|
56
17
|
# error_log and not in stdout.
|
57
|
-
|
58
|
-
result = %x[ #{cmd} ]
|
18
|
+
result = `php -d display_errors=1 -l #{file}`
|
59
19
|
# Filter out the obvious note from PHP.
|
60
20
|
result = result.split($/).find_all {|line| line !~ /Errors/}.join($/)
|
61
21
|
# If PHP exited non-zero then there was a parse error.
|
62
|
-
|
63
|
-
result
|
64
|
-
end
|
22
|
+
result.strip unless $? == 0
|
65
23
|
end
|
66
|
-
|
67
|
-
# Format an error line.
|
68
|
-
def display_error(error)
|
69
|
-
"pre-commit: #{check_name.upcase} #{error}"
|
70
|
-
end
|
71
|
-
|
72
24
|
end
|
73
25
|
end
|
@@ -1,47 +1,10 @@
|
|
1
1
|
module PreCommit
|
2
2
|
class PryCheck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
check = new
|
9
|
-
check.staged_files = Utils.staged_files(*dirs)
|
10
|
-
|
11
|
-
result = check.run
|
12
|
-
if !quiet && !result
|
13
|
-
$stderr.puts check.error_message
|
14
|
-
$stderr.puts
|
15
|
-
check.print_dash_n_reminder
|
16
|
-
end
|
17
|
-
result
|
3
|
+
def self.call(staged_files)
|
4
|
+
return if staged_files.empty?
|
5
|
+
result = `#{Utils.grep} binding.pry #{staged_files.join(" ")}`.strip
|
6
|
+
return unless $?.success?
|
7
|
+
"binding.pry found:\n#{result}"
|
18
8
|
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
return true if staged_files.empty?
|
22
|
-
|
23
|
-
if detected_bad_code?
|
24
|
-
@error_message = "pre-commit: binding.pry statement(s) found:\n"
|
25
|
-
@error_message += instances_of_pry_violations
|
26
|
-
false
|
27
|
-
else
|
28
|
-
true
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def detected_bad_code?
|
33
|
-
!system("git diff --cached -S binding.pry --quiet --exit-code")
|
34
|
-
end
|
35
|
-
|
36
|
-
def instances_of_pry_violations
|
37
|
-
cmd = grep_command || "git grep"
|
38
|
-
`#{cmd} -nH "binding\.pry" #{staged_files}`
|
39
|
-
end
|
40
|
-
|
41
|
-
def print_dash_n_reminder
|
42
|
-
$stderr.puts 'You can bypass this check using `git commit -n`'
|
43
|
-
$stderr.puts
|
44
|
-
end
|
45
|
-
|
46
9
|
end
|
47
10
|
end
|
@@ -1,54 +1,11 @@
|
|
1
1
|
module PreCommit
|
2
2
|
class RSpecFocusCheck
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
check.staged_files = Utils.staged_files(*dirs)
|
10
|
-
|
11
|
-
result = check.run
|
12
|
-
if !quiet && !result
|
13
|
-
$stderr.puts check.error_message
|
14
|
-
$stderr.puts
|
15
|
-
check.print_dash_n_reminder
|
16
|
-
end
|
17
|
-
result
|
3
|
+
def self.call(staged_files)
|
4
|
+
staged_files = staged_files.grep(/_spec\.rb$/)
|
5
|
+
return if staged_files.empty?
|
6
|
+
result = `#{Utils.grep} ':focus' #{staged_files.join(" ")}`.strip
|
7
|
+
return unless $?.success?
|
8
|
+
":focus found in specs:\n#{result}"
|
18
9
|
end
|
19
|
-
|
20
|
-
def run
|
21
|
-
return true if staged_files.empty?
|
22
|
-
|
23
|
-
if detected_bad_code?
|
24
|
-
@error_message = "pre-commit: :focus in spec(s) found:\n"
|
25
|
-
@error_message += instances_of_rspec_focus_violations
|
26
|
-
false
|
27
|
-
else
|
28
|
-
true
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def detected_bad_code?
|
33
|
-
spec_files = staged_files.split(' ').select do |file|
|
34
|
-
file =~ /_spec\.rb$/
|
35
|
-
end
|
36
|
-
|
37
|
-
return false if spec_files.empty?
|
38
|
-
|
39
|
-
diff = `git diff --cached -G:focus #{spec_files.join(" ")}`
|
40
|
-
!!(diff =~ /[\W\s]:focus[\W\s]/)
|
41
|
-
end
|
42
|
-
|
43
|
-
def instances_of_rspec_focus_violations
|
44
|
-
cmd = grep_command || "git grep"
|
45
|
-
`#{cmd} -nHw ':focus' #{staged_files}`
|
46
|
-
end
|
47
|
-
|
48
|
-
def print_dash_n_reminder
|
49
|
-
$stderr.puts 'You can bypass this check using `git commit -n`'
|
50
|
-
$stderr.puts
|
51
|
-
end
|
52
|
-
|
53
10
|
end
|
54
11
|
end
|