pre-commit 0.12.0 → 0.13.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +39 -16
- data/bin/pre-commit +1 -12
- data/lib/plugins/pluginator/extensions/find_check.rb +26 -0
- data/lib/plugins/pre_commit/checks/before_all.rb +23 -7
- data/lib/plugins/pre_commit/checks/ci.rb +10 -3
- data/lib/plugins/pre_commit/checks/closure.rb +12 -4
- data/lib/plugins/pre_commit/checks/coffeelint.rb +9 -4
- data/lib/plugins/pre_commit/checks/common.rb +17 -0
- data/lib/plugins/pre_commit/checks/console_log.rb +23 -7
- data/lib/plugins/pre_commit/checks/csslint.rb +32 -0
- data/lib/plugins/pre_commit/checks/debugger.rb +14 -10
- data/lib/plugins/pre_commit/checks/gemfile_path.rb +18 -7
- data/lib/plugins/pre_commit/checks/jshint.rb +10 -4
- data/lib/plugins/pre_commit/checks/jslint.rb +11 -5
- data/lib/plugins/pre_commit/checks/local.rb +10 -2
- data/lib/plugins/pre_commit/checks/merge_conflict.rb +15 -6
- data/lib/plugins/pre_commit/checks/migration.rb +32 -26
- data/lib/plugins/pre_commit/checks/nb_space.rb +10 -2
- data/lib/plugins/pre_commit/checks/php.rb +10 -4
- data/lib/plugins/pre_commit/checks/pry.rb +15 -6
- data/lib/plugins/pre_commit/checks/rails.rb +17 -0
- data/lib/plugins/pre_commit/checks/rspec_focus.rb +19 -7
- data/lib/plugins/pre_commit/checks/rubocop.rb +20 -8
- data/lib/plugins/pre_commit/checks/ruby.rb +17 -0
- data/lib/plugins/pre_commit/checks/ruby_symbol_hashrockets.rb +17 -8
- data/lib/plugins/pre_commit/checks/tabs.rb +15 -8
- data/lib/plugins/pre_commit/checks/whitespace.rb +28 -5
- data/lib/plugins/pre_commit/configuration/providers/README.md +10 -0
- data/lib/plugins/pre_commit/configuration/providers/default.rb +34 -0
- data/lib/plugins/pre_commit/configuration/providers/git.rb +26 -0
- data/lib/plugins/pre_commit/configuration/providers/git_old.rb +28 -0
- data/lib/plugins/pre_commit/configuration/providers/yaml.rb +67 -0
- data/lib/pre-commit.rb +28 -1
- data/lib/pre-commit/checks.rb +1 -98
- data/lib/pre-commit/checks/grep.rb +57 -0
- data/lib/{plugins/pre_commit → pre-commit}/checks/js.rb +15 -7
- data/lib/pre-commit/checks/plugin.rb +13 -0
- data/lib/pre-commit/cli.rb +46 -19
- data/lib/pre-commit/configuration.rb +54 -0
- data/lib/pre-commit/configuration/providers.rb +53 -0
- data/lib/pre-commit/installer.rb +54 -0
- data/lib/pre-commit/list_evaluator.rb +85 -0
- data/lib/pre-commit/plugins_list.rb +87 -0
- data/lib/pre-commit/runner.rb +54 -9
- data/lib/pre-commit/support/csslint/csslint.js +9259 -0
- data/lib/pre-commit/utils/git_conversions.rb +56 -0
- data/lib/pre-commit/utils/staged_files.rb +21 -0
- metadata +47 -30
- data/lib/pre-commit/support/templates/automatic_hook +0 -35
- data/lib/pre-commit/support/templates/default_hook +0 -35
- data/lib/pre-commit/support/templates/manual_hook +0 -14
- data/lib/pre-commit/utils.rb +0 -27
@@ -1,13 +1,14 @@
|
|
1
|
-
require '
|
1
|
+
require 'pre-commit/checks/js'
|
2
2
|
|
3
3
|
module PreCommit
|
4
4
|
module Checks
|
5
5
|
class Jslint < Js
|
6
|
-
|
7
|
-
|
6
|
+
|
7
|
+
def self.aliases
|
8
|
+
[ :js_lint, :js_lint_all, :js_lint_new ]
|
8
9
|
end
|
9
10
|
|
10
|
-
def
|
11
|
+
def run_check(file)
|
11
12
|
context = ExecJS.compile(File.read(linter_src))
|
12
13
|
if !(context.call('JSLINT', File.read(file)))
|
13
14
|
context.exec('return JSLINT.errors;')
|
@@ -16,9 +17,14 @@ module PreCommit
|
|
16
17
|
end
|
17
18
|
end
|
18
19
|
|
19
|
-
def
|
20
|
+
def linter_src
|
20
21
|
File.expand_path("../../../../pre-commit/support/jslint/lint.js", __FILE__)
|
21
22
|
end
|
23
|
+
|
24
|
+
def self.description
|
25
|
+
"Checks javascript files with JSLint."
|
26
|
+
end
|
27
|
+
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
@@ -1,13 +1,21 @@
|
|
1
|
+
require 'pre-commit/checks/plugin'
|
2
|
+
|
1
3
|
module PreCommit
|
2
4
|
module Checks
|
3
|
-
class Local
|
5
|
+
class Local < Plugin
|
6
|
+
|
4
7
|
DEFAULT_LOCATION = "config/pre-commit.rb"
|
5
8
|
|
6
|
-
def
|
9
|
+
def call(staged_files, script=Local::DEFAULT_LOCATION)
|
7
10
|
return unless File.exist?(script)
|
8
11
|
output = `ruby #{script} #{staged_files.join(" ")} 2>&1`
|
9
12
|
"#{script} failed:\n#{output}" unless $?.success?
|
10
13
|
end
|
14
|
+
|
15
|
+
def self.description
|
16
|
+
"Executes 'ruby #{DEFAULT_LOCATION}'."
|
17
|
+
end
|
18
|
+
|
11
19
|
end
|
12
20
|
end
|
13
21
|
end
|
@@ -1,12 +1,21 @@
|
|
1
|
+
require 'pre-commit/checks/grep'
|
2
|
+
|
1
3
|
module PreCommit
|
2
4
|
module Checks
|
3
|
-
class MergeConflict
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
return unless $?.success?
|
8
|
-
"detected a merge conflict\n#{errors}"
|
5
|
+
class MergeConflict < Grep
|
6
|
+
|
7
|
+
def message
|
8
|
+
"detected a merge conflict\n"
|
9
9
|
end
|
10
|
+
|
11
|
+
def pattern
|
12
|
+
"'<<<<<<<'"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.description
|
16
|
+
"Finds files with unresolved merge conflicts."
|
17
|
+
end
|
18
|
+
|
10
19
|
end
|
11
20
|
end
|
12
21
|
end
|
@@ -1,38 +1,44 @@
|
|
1
|
+
require 'pre-commit/checks/plugin'
|
2
|
+
|
1
3
|
module PreCommit
|
2
4
|
module Checks
|
3
|
-
class Migration
|
4
|
-
def self.
|
5
|
-
|
5
|
+
class Migration < Plugin
|
6
|
+
def self.aliases
|
7
|
+
[:migrations]
|
6
8
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
end
|
9
|
+
|
10
|
+
def call(staged_files)
|
11
|
+
migration_files = migration_files(staged_files)
|
12
|
+
schema_files = schema_files(staged_files)
|
13
|
+
|
14
|
+
if migration_files.any? && schema_files.none?
|
15
|
+
"It looks like you're adding a migration, but did not update the schema file"
|
16
|
+
elsif migration_files.none? && schema_files.any?
|
17
|
+
"You're trying to change the schema without adding a migration file"
|
18
|
+
elsif migration_files.any? && schema_files.any?
|
19
|
+
versions = migration_files.map { |f| f[/\d+/] }
|
20
|
+
schema = schema_files.map { |f| File.read(f) }.join
|
21
|
+
missing_versions = versions.select { |version| !schema.include?(version) }
|
22
|
+
if missing_versions.any?
|
23
|
+
"You did not add the schema versions for #{versions.join(', ')} to #{schema_files.join(' or ')}"
|
23
24
|
end
|
24
25
|
end
|
26
|
+
end
|
25
27
|
|
26
|
-
|
28
|
+
private
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
def migration_files(staged_files)
|
31
|
+
staged_files.grep(/db\/migrate\/.*\.rb/)
|
32
|
+
end
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
end
|
34
|
+
def schema_files(staged_files)
|
35
|
+
staged_files.select { |f| File.basename(f) =~ /schema\.rb|structure.*\.sql/ }
|
35
36
|
end
|
37
|
+
|
38
|
+
def self.description
|
39
|
+
"Detects rails database migrations and schema incompatibilities."
|
40
|
+
end
|
41
|
+
|
36
42
|
end
|
37
43
|
end
|
38
44
|
end
|
@@ -1,8 +1,11 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require 'pre-commit/checks/plugin'
|
3
|
+
|
2
4
|
module PreCommit
|
3
5
|
module Checks
|
4
|
-
class NbSpace
|
5
|
-
|
6
|
+
class NbSpace < Plugin
|
7
|
+
|
8
|
+
def call(staged_files)
|
6
9
|
nb_space = " "
|
7
10
|
raise "you messed that up" unless nb_space.bytes.to_a == [194, 160]
|
8
11
|
|
@@ -18,6 +21,11 @@ module PreCommit
|
|
18
21
|
return if bad.empty?
|
19
22
|
"Detected non-breaking space in #{bad.map { |f,l,c| "#{f}:#{l+1} character:#{c+1}" }.join(" and")}, remove it!"
|
20
23
|
end
|
24
|
+
|
25
|
+
def self.description
|
26
|
+
"Detected non-breaking spaces 194, 160."
|
27
|
+
end
|
28
|
+
|
21
29
|
end
|
22
30
|
end
|
23
31
|
end
|
@@ -1,9 +1,10 @@
|
|
1
|
-
require 'pre-commit/
|
1
|
+
require 'pre-commit/checks/plugin'
|
2
2
|
|
3
3
|
module PreCommit
|
4
4
|
module Checks
|
5
|
-
class Php
|
6
|
-
|
5
|
+
class Php < Plugin
|
6
|
+
|
7
|
+
def call(staged_files)
|
7
8
|
staged_files = staged_files.grep /\.(php|engine|theme|install|inc|module|test)$/
|
8
9
|
return if staged_files.empty?
|
9
10
|
|
@@ -13,7 +14,7 @@ module PreCommit
|
|
13
14
|
errors.join("\n")
|
14
15
|
end
|
15
16
|
|
16
|
-
def
|
17
|
+
def run_check(file)
|
17
18
|
# We force PHP to display errors otherwise they will likely end up in the
|
18
19
|
# error_log and not in stdout.
|
19
20
|
result = `php -d display_errors=1 -l #{file} 2>&1`
|
@@ -22,6 +23,11 @@ module PreCommit
|
|
22
23
|
# If PHP exited non-zero then there was a parse error.
|
23
24
|
result.strip unless $? == 0
|
24
25
|
end
|
26
|
+
|
27
|
+
def self.description
|
28
|
+
"Detects PHP errors."
|
29
|
+
end
|
30
|
+
|
25
31
|
end
|
26
32
|
end
|
27
33
|
end
|
@@ -1,12 +1,21 @@
|
|
1
|
+
require 'pre-commit/checks/grep'
|
2
|
+
|
1
3
|
module PreCommit
|
2
4
|
module Checks
|
3
|
-
class Pry
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
return unless $?.success?
|
8
|
-
"binding.pry found:\n#{result}"
|
5
|
+
class Pry < Grep
|
6
|
+
|
7
|
+
def message
|
8
|
+
"binding.pry found:\n"
|
9
9
|
end
|
10
|
+
|
11
|
+
def pattern
|
12
|
+
"binding\.pry"
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.description
|
16
|
+
"Finds files with 'binding.pry'."
|
17
|
+
end
|
18
|
+
|
10
19
|
end
|
11
20
|
end
|
12
21
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'pre-commit/checks/plugin'
|
2
|
+
|
3
|
+
module PreCommit
|
4
|
+
module Checks
|
5
|
+
class Rails < Plugin
|
6
|
+
|
7
|
+
def self.includes
|
8
|
+
[:ruby, :jshint, :console_log, :migration]
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.description
|
12
|
+
"Plugins common for ruby on rails."
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,13 +1,25 @@
|
|
1
|
+
require 'pre-commit/checks/grep'
|
2
|
+
|
1
3
|
module PreCommit
|
2
4
|
module Checks
|
3
|
-
class RspecFocus
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
result = `#{PreCommit::Utils.grep} ':focus' #{staged_files.join(" ")}`.strip
|
8
|
-
return unless $?.success?
|
9
|
-
":focus found in specs:\n#{result}"
|
5
|
+
class RspecFocus < Grep
|
6
|
+
|
7
|
+
def files_filter(staged_files)
|
8
|
+
staged_files.grep(/_spec\.rb$/)
|
10
9
|
end
|
10
|
+
|
11
|
+
def message
|
12
|
+
":focus found in specs:\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
def pattern
|
16
|
+
"':focus'"
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.description
|
20
|
+
"Finds ruby specs with ':focus'."
|
21
|
+
end
|
22
|
+
|
11
23
|
end
|
12
24
|
end
|
13
25
|
end
|
@@ -1,20 +1,26 @@
|
|
1
|
-
require 'pre-commit/utils'
|
2
1
|
require 'stringio'
|
2
|
+
require 'pre-commit/checks/plugin'
|
3
3
|
|
4
4
|
module PreCommit
|
5
5
|
module Checks
|
6
|
-
class Rubocop
|
7
|
-
|
8
|
-
|
6
|
+
class Rubocop < Plugin
|
7
|
+
|
8
|
+
def self.aliases
|
9
|
+
[ :rubocop_all, :rubocop_new ]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.excludes
|
13
|
+
[ :ruby_symbol_hashrocket ]
|
9
14
|
end
|
10
|
-
|
15
|
+
|
16
|
+
def call(staged_files)
|
11
17
|
require 'rubocop'
|
12
18
|
rescue LoadError => e
|
13
19
|
$stderr.puts "Could not find rubocop: #{e}"
|
14
20
|
else
|
15
21
|
staged_files = staged_files.grep(/\.rb$/)
|
16
22
|
return if staged_files.empty?
|
17
|
-
config_file =
|
23
|
+
config_file = config.get_combined('rubocop.config')
|
18
24
|
|
19
25
|
args = staged_files
|
20
26
|
if !config_file.empty?
|
@@ -22,17 +28,19 @@ module PreCommit
|
|
22
28
|
$stderr.puts "Warning: rubocop config file '" + config_file + "' does not exist"
|
23
29
|
$stderr.puts "Set the path to the config file using:"
|
24
30
|
$stderr.puts "\tgit config pre-commit.rubocop.config 'path/relative/to/git/dir/rubocop.yml'"
|
31
|
+
$stderr.puts "Or in 'config/pre-commit.yml':"
|
32
|
+
$stderr.puts "\trubocop.config: path/relative/to/git/dir/rubocop.yml"
|
25
33
|
$stderr.puts "rubocop will use its default configuration or look for a .rubocop.yml file\n\n"
|
26
34
|
else
|
27
35
|
args = ['-c', config_file] + args
|
28
36
|
end
|
29
37
|
end
|
30
38
|
|
31
|
-
success, captured = capture { Rubocop::CLI.new.run(args) == 0 }
|
39
|
+
success, captured = capture { ::Rubocop::CLI.new.run(args) == 0 }
|
32
40
|
captured unless success
|
33
41
|
end
|
34
42
|
|
35
|
-
def
|
43
|
+
def capture
|
36
44
|
$stdout, stdout = StringIO.new, $stdout
|
37
45
|
$stderr, stderr = StringIO.new, $stderr
|
38
46
|
result = yield
|
@@ -41,6 +49,10 @@ module PreCommit
|
|
41
49
|
$stdout = stdout
|
42
50
|
$stderr = stderr
|
43
51
|
end
|
52
|
+
|
53
|
+
def self.description
|
54
|
+
"Runs rubocop to detect errors."
|
55
|
+
end
|
44
56
|
end
|
45
57
|
end
|
46
58
|
end
|
@@ -1,16 +1,25 @@
|
|
1
|
-
require 'pre-commit/
|
1
|
+
require 'pre-commit/checks/grep'
|
2
2
|
|
3
3
|
module PreCommit
|
4
4
|
module Checks
|
5
|
-
class RubySymbolHashrockets
|
6
|
-
HASHROCKET_PATTERN = '[^:](:{1}(?:\$|@|@@|[_A-Za-z])?\w*[=!?]?\s*=>\s*)'
|
5
|
+
class RubySymbolHashrockets < Grep
|
7
6
|
|
8
|
-
def
|
9
|
-
|
10
|
-
lines = `#{PreCommit::Utils.grep} '#{HASHROCKET_PATTERN}' #{staged_files.join(" ")}`.strip
|
11
|
-
return unless $?.success?
|
12
|
-
"detected :symbol => value hashrocket:\n#{lines}"
|
7
|
+
def files_filter(staged_files)
|
8
|
+
staged_files.grep(/\.rb$/)
|
13
9
|
end
|
10
|
+
|
11
|
+
def message
|
12
|
+
"detected :symbol => value hashrocket:\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
def pattern
|
16
|
+
'\'[^:](:{1}(?:\$|@|@@|[_A-Za-z])?\w*[=!?]?\s*=>\s*)\''
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.description
|
20
|
+
"Finds ruby 1.8 '=>' hash definitions."
|
21
|
+
end
|
22
|
+
|
14
23
|
end
|
15
24
|
end
|
16
25
|
end
|
@@ -1,14 +1,21 @@
|
|
1
|
+
require 'pre-commit/checks/grep'
|
2
|
+
|
1
3
|
module PreCommit
|
2
4
|
module Checks
|
3
|
-
class Tabs
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
"
|
5
|
+
class Tabs < Grep
|
6
|
+
|
7
|
+
def message
|
8
|
+
"detected tab before initial space:\n"
|
9
|
+
end
|
10
|
+
|
11
|
+
def pattern
|
12
|
+
"'^ *\t'"
|
11
13
|
end
|
14
|
+
|
15
|
+
def self.description
|
16
|
+
"Finds ruby files with tabulation character before text in line."
|
17
|
+
end
|
18
|
+
|
12
19
|
end
|
13
20
|
end
|
14
21
|
end
|