overcommit 0.8.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +39 -0
- data/lib/overcommit/configuration.rb +1 -1
- data/lib/overcommit/hook/pre_commit/berksfile_check.rb +24 -0
- data/lib/overcommit/hook/pre_commit/brakeman.rb +16 -0
- data/lib/overcommit/hook/pre_commit/bundle_check.rb +2 -1
- data/lib/overcommit/hook/pre_commit/chamber_security.rb +15 -0
- data/lib/overcommit/hook/pre_commit/json_syntax.rb +22 -0
- data/lib/overcommit/hook/pre_commit/jsx_hint.rb +17 -0
- data/lib/overcommit/hook/pre_commit/local_paths_in_gemfile.rb +14 -0
- data/lib/overcommit/hook/pre_commit/merge_conflicts.rb +14 -0
- data/lib/overcommit/hook/pre_commit/pry_binding.rb +14 -0
- data/lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb +38 -0
- data/lib/overcommit/hook/pre_commit/rubocop.rb +1 -1
- data/lib/overcommit/hook_context/base.rb +1 -1
- data/lib/overcommit/hook_loader/plugin_hook_loader.rb +1 -1
- data/lib/overcommit/hook_signer.rb +7 -1
- data/lib/overcommit/user_input.rb +2 -2
- data/lib/overcommit/utils.rb +1 -1
- data/lib/overcommit/version.rb +1 -1
- metadata +25 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f85ad2d80c2da4defeec5bce808514385a27c6e6
|
4
|
+
data.tar.gz: e547ff585ce285436624840c7b16e32ab79677a7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e7633bf2eccb141b29a8b0bb69910ceb3810badc570a9573f3a6ce069988af8a436ee7b91f2802bf8f305be92aac98c1f603d9570690f7bad5ecae4bf6bff5c
|
7
|
+
data.tar.gz: 5988d0a37ca6bf001019e94c19e11e97aeb52cc1bec66e75478d1c5bb04f231c43f77447702b579c3a468d9248c6515d62fa28337b93cd92725e33b47eec665b
|
data/config/default.yml
CHANGED
@@ -53,6 +53,12 @@ PreCommit:
|
|
53
53
|
required: true
|
54
54
|
quiet: true
|
55
55
|
|
56
|
+
Brakeman:
|
57
|
+
enabled: false
|
58
|
+
description: 'Checking for security vulnerabilities'
|
59
|
+
include:
|
60
|
+
- '**/*.rb'
|
61
|
+
|
56
62
|
BundleCheck:
|
57
63
|
description: 'Checking Gemfile dependencies'
|
58
64
|
include:
|
@@ -60,6 +66,11 @@ PreCommit:
|
|
60
66
|
- 'Gemfile.lock'
|
61
67
|
- '*.gemspec'
|
62
68
|
|
69
|
+
ChamberSecurity:
|
70
|
+
enabled: false
|
71
|
+
description: 'Checking that settings have been secured with Chamber'
|
72
|
+
include: 'config/settings.yml'
|
73
|
+
|
63
74
|
CoffeeLint:
|
64
75
|
description: 'Analyzing with coffeelint'
|
65
76
|
include: '**/*.coffee'
|
@@ -91,10 +102,38 @@ PreCommit:
|
|
91
102
|
description: 'Analyzing with JSHint'
|
92
103
|
include: '**/*.js'
|
93
104
|
|
105
|
+
JsonSyntax:
|
106
|
+
description: 'Validating JSON syntax'
|
107
|
+
include: '**/*.json'
|
108
|
+
|
109
|
+
JsxHint:
|
110
|
+
description: 'Analyzing with JSXHint'
|
111
|
+
include: '**/*.jsx'
|
112
|
+
|
113
|
+
LocalPathsInGemfile:
|
114
|
+
description: 'Checking for references to local paths in your Gemfile'
|
115
|
+
include: '**/Gemfile'
|
116
|
+
|
117
|
+
MergeConflicts:
|
118
|
+
description: 'Checking for merge conflicts'
|
119
|
+
|
120
|
+
PryBinding:
|
121
|
+
description: 'Checking for instances of binding.pry'
|
122
|
+
include:
|
123
|
+
- '**/*.rb'
|
124
|
+
- '**/*.rake'
|
125
|
+
|
94
126
|
PythonFlake8:
|
95
127
|
description: 'Analyzing with flake8'
|
96
128
|
include: '**/*.py'
|
97
129
|
|
130
|
+
RailsSchemaUpToDate:
|
131
|
+
description: 'Checking if database schema is up to date'
|
132
|
+
include:
|
133
|
+
- 'db/migrate/*.rb'
|
134
|
+
- 'db/schema.rb'
|
135
|
+
- 'db/structure.sql'
|
136
|
+
|
98
137
|
Rubocop:
|
99
138
|
description: 'Analyzing with Rubocop'
|
100
139
|
include:
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Check if local Berksfile.lock matches Berksfile when either changes, unless
|
3
|
+
# Berksfile.lock is ignored by git.
|
4
|
+
class BerksfileCheck < Base
|
5
|
+
LOCK_FILE = 'Berksfile.lock'
|
6
|
+
|
7
|
+
def run
|
8
|
+
unless in_path?('berks')
|
9
|
+
return :warn, 'Berkshelf not installed -- run `gem install berkshelf`'
|
10
|
+
end
|
11
|
+
|
12
|
+
# Ignore if Berksfile.lock is not tracked by git
|
13
|
+
ignored_files = execute(%w[git ls-files -o -i --exclude-standard]).stdout.split("\n")
|
14
|
+
return :good if ignored_files.include?(LOCK_FILE)
|
15
|
+
|
16
|
+
result = execute(%w[berks list --quiet])
|
17
|
+
unless result.success?
|
18
|
+
return :bad, result.stderr
|
19
|
+
end
|
20
|
+
|
21
|
+
:good
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Runs `brakeman` against any modified Ruby/Rails files.
|
3
|
+
class Brakeman < Base
|
4
|
+
def run
|
5
|
+
unless in_path?('brakeman')
|
6
|
+
return :warn, 'Run `gem install brakeman`'
|
7
|
+
end
|
8
|
+
|
9
|
+
result = execute(%w[brakeman --exit-on-warn --quiet --summary --only-files] +
|
10
|
+
applicable_files)
|
11
|
+
return :good if result.success?
|
12
|
+
|
13
|
+
[:bad, result.stdout]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -10,7 +10,8 @@ module Overcommit::Hook::PreCommit
|
|
10
10
|
end
|
11
11
|
|
12
12
|
# Ignore if Gemfile.lock is not tracked by git
|
13
|
-
|
13
|
+
ignored_files = execute(%w[git ls-files -o -i --exclude-standard]).stdout.split("\n")
|
14
|
+
return :good if ignored_files.include?(LOCK_FILE)
|
14
15
|
|
15
16
|
result = execute(%w[bundle check])
|
16
17
|
unless result.success?
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Runs `chamber secure` against any modified Chamber settings files
|
3
|
+
class ChamberSecurity < Base
|
4
|
+
def run
|
5
|
+
unless in_path?('chamber')
|
6
|
+
return :warn, 'Run `gem install chamber`'
|
7
|
+
end
|
8
|
+
|
9
|
+
result = execute(%w[chamber secure --echo --files] + applicable_files)
|
10
|
+
|
11
|
+
return :good if result.stdout.empty?
|
12
|
+
[:bad, "These settings appear to need to be secured but were not: #{result.stdout}"]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Overcommit::Hook::PreCommit
|
4
|
+
# Checks the syntax of any modified JSON files.
|
5
|
+
class JsonSyntax < Base
|
6
|
+
def run
|
7
|
+
output = []
|
8
|
+
|
9
|
+
applicable_files.each do |file|
|
10
|
+
begin
|
11
|
+
File.open(file) { |io| JSON.load(io) }
|
12
|
+
rescue JSON::ParserError => e
|
13
|
+
output << "#{e.message} parsing #{file}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
return :good if output.empty?
|
18
|
+
|
19
|
+
[:bad, output]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Runs `jsxhint` against any modified JSX files.
|
3
|
+
class JsxHint < Base
|
4
|
+
def run
|
5
|
+
unless in_path?('jsxhint')
|
6
|
+
return :warn, 'jsxhint not installed -- run `npm install -g jsxhint`'
|
7
|
+
end
|
8
|
+
|
9
|
+
result = execute(%w[jsxhint] + applicable_files)
|
10
|
+
output = result.stdout
|
11
|
+
|
12
|
+
return :good if output.empty?
|
13
|
+
|
14
|
+
[:bad, output]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Checks for local paths in files and issues a warning
|
3
|
+
class LocalPathsInGemfile < Base
|
4
|
+
def run
|
5
|
+
result = execute(%w[grep -IHnE (\s*path:\s*)|(\s*:path\s*=>)] + applicable_files)
|
6
|
+
|
7
|
+
unless result.stdout.empty?
|
8
|
+
return :warn, "Avoid pointing to local paths in Gemfiles:\n#{result.stdout}"
|
9
|
+
end
|
10
|
+
|
11
|
+
:good
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Checks for unresolved merge conflicts
|
3
|
+
class MergeConflicts < Base
|
4
|
+
def run
|
5
|
+
result = execute(%w[grep -IHn ^<<<<<<<\s] + applicable_files)
|
6
|
+
|
7
|
+
unless result.stdout.empty?
|
8
|
+
return :bad, "Merge conflict markers detected:\n#{result.stdout}"
|
9
|
+
end
|
10
|
+
|
11
|
+
:good
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Adds a check to make sure no `binding.pry`'s have been left in the code
|
3
|
+
class PryBinding < Base
|
4
|
+
def run
|
5
|
+
result = execute(%w[grep -IHnE ^\s*binding\.pry] + applicable_files)
|
6
|
+
|
7
|
+
unless result.stdout.empty?
|
8
|
+
return :bad, "Found a `binding.pry` call left in:\n#{result.stdout}"
|
9
|
+
end
|
10
|
+
|
11
|
+
:good
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Overcommit::Hook::PreCommit
|
2
|
+
# Check to see whether the schema file is in line with the migrations
|
3
|
+
class RailsSchemaUpToDate < Base
|
4
|
+
def run
|
5
|
+
if migration_files.any? && schema_files.none?
|
6
|
+
return :bad, "It looks like you're adding a migration, but did not update the schema file"
|
7
|
+
elsif migration_files.none? && schema_files.any?
|
8
|
+
return :bad, "You're trying to change the schema without adding a migration file"
|
9
|
+
elsif migration_files.any? && schema_files.any?
|
10
|
+
latest_version = migration_files.map { |file| file[/\d+/] }.sort.last
|
11
|
+
schema = schema_files.map { |file| File.read(file) }.join
|
12
|
+
up_to_date = schema.include?(latest_version)
|
13
|
+
|
14
|
+
unless up_to_date
|
15
|
+
return :bad, "The latest migration version you're committing is " \
|
16
|
+
"#{latest_version}, but your schema file " \
|
17
|
+
"#{schema_files.join(' or ')} is on a different version."
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
:good
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def migration_files
|
27
|
+
@migration_files ||= applicable_files.select do |file|
|
28
|
+
file.match %r{db/migrate/.*\.rb}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def schema_files
|
33
|
+
@schema_files ||= applicable_files.select do |file|
|
34
|
+
file.match %r{db/schema\.rb|db/structure.*\.sql}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -6,7 +6,7 @@ module Overcommit::Hook::PreCommit
|
|
6
6
|
return :warn, 'Rubocop not installed -- run `gem install rubocop`'
|
7
7
|
end
|
8
8
|
|
9
|
-
result = execute(%w[rubocop --format=emacs] + applicable_files)
|
9
|
+
result = execute(%w[rubocop --format=emacs --force-exclusion] + applicable_files)
|
10
10
|
return :good if result.success?
|
11
11
|
|
12
12
|
output = result.stdout + result.stderr
|
@@ -61,7 +61,7 @@ module Overcommit::HookContext
|
|
61
61
|
#
|
62
62
|
# By default, this returns an empty set. Subclasses should implement if
|
63
63
|
# there is a concept of files changing for the type of hook being run.
|
64
|
-
def modified_lines(
|
64
|
+
def modified_lines(_file)
|
65
65
|
Set.new
|
66
66
|
end
|
67
67
|
end
|
@@ -28,7 +28,7 @@ module Overcommit::HookLoader
|
|
28
28
|
return if modified_plugins.empty?
|
29
29
|
|
30
30
|
log.bold_warning "The following #{@context.hook_script_name} plugins " \
|
31
|
-
|
31
|
+
'have been added, changed, or had their configuration modified:'
|
32
32
|
log.log
|
33
33
|
|
34
34
|
modified_plugins.each do |signer|
|
@@ -3,6 +3,10 @@ module Overcommit
|
|
3
3
|
class HookSigner
|
4
4
|
attr_reader :hook_path, :hook_name
|
5
5
|
|
6
|
+
# We don't want to include the skip setting as it is set by Overcommit
|
7
|
+
# itself
|
8
|
+
IGNORED_CONFIG_KEYS = %w[skip]
|
9
|
+
|
6
10
|
# @param hook_path [String] path to the actual hook definition
|
7
11
|
# @param config [Overcommit::Configuration]
|
8
12
|
# @param context [Overcommit::HookContext]
|
@@ -42,7 +46,9 @@ module Overcommit
|
|
42
46
|
# This way, if either the plugin code changes or its configuration changes,
|
43
47
|
# the hash will change and we can alert the user to this change.
|
44
48
|
def signature
|
45
|
-
hook_config = @config.for_hook(@hook_name, @context.hook_class_name)
|
49
|
+
hook_config = @config.for_hook(@hook_name, @context.hook_class_name).
|
50
|
+
dup.
|
51
|
+
tap { |config| IGNORED_CONFIG_KEYS.each { |k| config.delete(k) } }
|
46
52
|
|
47
53
|
Digest::SHA256.hexdigest(hook_contents + hook_config.to_s)
|
48
54
|
end
|
@@ -9,7 +9,7 @@ module Overcommit
|
|
9
9
|
end
|
10
10
|
|
11
11
|
# Get a string of input from the user (up to the next newline character).
|
12
|
-
def get
|
12
|
+
def get
|
13
13
|
@io.gets
|
14
14
|
end
|
15
15
|
|
@@ -19,7 +19,7 @@ module Overcommit
|
|
19
19
|
def reopen_tty
|
20
20
|
# If the hook isn't interactive, we need to map STDIN to keyboard manually
|
21
21
|
STDIN.reopen('/dev/tty') if STDIN.eof?
|
22
|
-
rescue
|
22
|
+
rescue # rubocop:disable HandleExceptions
|
23
23
|
# Happens in tests run with no console available
|
24
24
|
end
|
25
25
|
end
|
data/lib/overcommit/utils.rb
CHANGED
@@ -72,7 +72,7 @@ module Overcommit
|
|
72
72
|
|
73
73
|
# Calls a block of code with a modified set of environment variables,
|
74
74
|
# restoring them once the code has executed.
|
75
|
-
def with_environment(env
|
75
|
+
def with_environment(env)
|
76
76
|
old_env = {}
|
77
77
|
env.each do |var, value|
|
78
78
|
old_env[var] = ENV[var.to_s]
|
data/lib/overcommit/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: overcommit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Causes Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-05-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: childprocess
|
@@ -25,6 +25,20 @@ dependencies:
|
|
25
25
|
- - '>='
|
26
26
|
- !ruby/object:Gem::Version
|
27
27
|
version: 0.5.1
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '1.8'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '1.8'
|
28
42
|
- !ruby/object:Gem::Dependency
|
29
43
|
name: rspec
|
30
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -85,22 +99,31 @@ files:
|
|
85
99
|
- lib/overcommit/hook/post_checkout/base.rb
|
86
100
|
- lib/overcommit/hook/base.rb
|
87
101
|
- lib/overcommit/hook/pre_commit/author_email.rb
|
102
|
+
- lib/overcommit/hook/pre_commit/pry_binding.rb
|
88
103
|
- lib/overcommit/hook/pre_commit/image_optim.rb
|
89
104
|
- lib/overcommit/hook/pre_commit/css_lint.rb
|
105
|
+
- lib/overcommit/hook/pre_commit/jsx_hint.rb
|
106
|
+
- lib/overcommit/hook/pre_commit/local_paths_in_gemfile.rb
|
90
107
|
- lib/overcommit/hook/pre_commit/travis_lint.rb
|
91
108
|
- lib/overcommit/hook/pre_commit/bundle_check.rb
|
92
109
|
- lib/overcommit/hook/pre_commit/yaml_syntax.rb
|
110
|
+
- lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb
|
111
|
+
- lib/overcommit/hook/pre_commit/berksfile_check.rb
|
112
|
+
- lib/overcommit/hook/pre_commit/merge_conflicts.rb
|
93
113
|
- lib/overcommit/hook/pre_commit/trailing_whitespace.rb
|
94
114
|
- lib/overcommit/hook/pre_commit/author_name.rb
|
95
115
|
- lib/overcommit/hook/pre_commit/rubocop.rb
|
96
116
|
- lib/overcommit/hook/pre_commit/python_flake8.rb
|
97
117
|
- lib/overcommit/hook/pre_commit/js_hint.rb
|
118
|
+
- lib/overcommit/hook/pre_commit/chamber_security.rb
|
98
119
|
- lib/overcommit/hook/pre_commit/hard_tabs.rb
|
99
120
|
- lib/overcommit/hook/pre_commit/haml_lint.rb
|
100
121
|
- lib/overcommit/hook/pre_commit/coffee_lint.rb
|
122
|
+
- lib/overcommit/hook/pre_commit/brakeman.rb
|
101
123
|
- lib/overcommit/hook/pre_commit/jscs.rb
|
102
124
|
- lib/overcommit/hook/pre_commit/scss_lint.rb
|
103
125
|
- lib/overcommit/hook/pre_commit/base.rb
|
126
|
+
- lib/overcommit/hook/pre_commit/json_syntax.rb
|
104
127
|
- lib/overcommit/hook_signer.rb
|
105
128
|
- lib/overcommit/hook_context/pre_commit.rb
|
106
129
|
- lib/overcommit/hook_context/commit_msg.rb
|