pre-commit 0.12.0 → 0.13.0
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.
- 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
|