overcommit 0.36.0 → 0.37.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3b67aff142df04c21f3edc1e45cb5e8e71b0f613
4
- data.tar.gz: 148dede395ec550657a9d3b7c4bb9fa661784b7e
3
+ metadata.gz: eeddd35416c0acbfbcd95473bf9026cce4f3bf5e
4
+ data.tar.gz: 9f805e9ee12b8db38da383c162c61f989f8d9ab1
5
5
  SHA512:
6
- metadata.gz: d9ec483cba901e73e9346682f6597f9d75dfc793bbabfc30a706cb04a633e2f33e20502d936478d34b834a53ea300402458adecee606d261dd55bf61838bc60f
7
- data.tar.gz: 91ca7dd2c169bfc3ee5f464094d5decd186324bd765b7d7fd7a04f91a0335267eec065d7f21b1cf3756f64ff537d10c2dd26515d42dd9c027d77ef355ad8cf54
6
+ metadata.gz: 78894882777c8c82ddf27f57f3da0a502cbf7adc0360004d126b438110c974792011543cbcc4d7251561d595199d23043c230db5a2c45e2654abb51e076da371
7
+ data.tar.gz: 22ae853f2b0ee843890098c5364d2f30fe25e9abe4df61e9c011acbec4ace2c034673c193c55b8d3c812bfb29f1b85e658d152f5b489e69f86d5e282a4b8adda
@@ -254,6 +254,20 @@ PreCommit:
254
254
  install_command: 'gem install fasterer'
255
255
  include: '**/*.rb'
256
256
 
257
+ FixMe:
258
+ enabled: false
259
+ description: 'Check for "token" strings'
260
+ required_executable: 'grep'
261
+ flags: ['-IEHnw']
262
+ keywords: ['BROKEN', 'BUG', 'ERROR', 'FIXME', 'HACK', 'NOTE', 'OPTIMIZE', 'REVIEW', 'TODO', 'WTF', 'XXX']
263
+
264
+ Foodcritic:
265
+ enabled: false
266
+ description: 'Analyze with Foodcritic'
267
+ required_executable: 'foodcritic'
268
+ flags: ['--epic-fail=any']
269
+ install_command: 'gem install foodcritic'
270
+
257
271
  ForbiddenBranches:
258
272
  enabled: false
259
273
  description: 'Check for commit to forbidden branch'
@@ -367,6 +381,11 @@ PreCommit:
367
381
  install_command: 'gem install json'
368
382
  include: '**/*.json'
369
383
 
384
+ LicenseHeader:
385
+ enabled: false
386
+ license_file: 'LICENSE.txt'
387
+ description: 'Check source files for license headers'
388
+
370
389
  LocalPathsInGemfile:
371
390
  enabled: false
372
391
  description: 'Check for local paths in Gemfile'
@@ -610,6 +629,11 @@ PreCommit:
610
629
  include:
611
630
  - '**/*.html'
612
631
 
632
+ LineEndings:
633
+ description: 'Check line endings'
634
+ enabled: false
635
+ eol: "\n" # or "\r\n" for Windows-style newlines
636
+
613
637
  XmlLint:
614
638
  enabled: false
615
639
  description: 'Analyze with xmllint'
@@ -627,6 +651,16 @@ PreCommit:
627
651
  - '**/*.xml'
628
652
  - '**/*.svg'
629
653
 
654
+ YamlLint:
655
+ enabled: false
656
+ description: 'Analyze with YAMLlint'
657
+ required_executable: 'yamllint'
658
+ flags: ['--format=parsable']
659
+ install_command: 'pip install yamllint'
660
+ include:
661
+ - '**/*.yaml'
662
+ - '**/*.yml'
663
+
630
664
  YamlSyntax:
631
665
  enabled: false
632
666
  description: 'Check YAML syntax'
@@ -4,7 +4,8 @@ module Overcommit::Hook::CommitMsg
4
4
  def run
5
5
  return :pass if empty_message?
6
6
 
7
- subject = commit_message_lines[0].to_s
7
+ # Git treats the first non-empty line as the subject
8
+ subject = commit_message_lines.find { |line| !line.strip.empty? }.to_s
8
9
  first_letter = subject.match(/^[[:punct:]]*(.)/)[1]
9
10
  unless special_prefix?(subject) || first_letter =~ /[[:upper:]]/
10
11
  return :warn, 'Subject should start with a capital letter'
@@ -0,0 +1,15 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Check for "token" strings
3
+ class FixMe < Base
4
+ def run
5
+ keywords = config['keywords']
6
+ result = execute(command, args: [keywords.join('|')] + applicable_files)
7
+
8
+ extract_messages(
9
+ result.stdout.split("\n"),
10
+ /^(?<file>(?:\w:)?[^:]+):(?<line>\d+)/,
11
+ lambda { |_type| :warning }
12
+ )
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,147 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Runs `foodcritic` against any modified Ruby files from Chef directory structure.
3
+ #
4
+ # @see http://www.foodcritic.io/
5
+ #
6
+ # There are two "modes" you can run this hook in based on the repo:
7
+ #
8
+ # SINGLE COOKBOOK REPO MODE
9
+ # -------------------------
10
+ # The default. Use this if your repository contains just a single cookbook,
11
+ # i.e. the top-level repo directory contains directories called `attributes`,
12
+ # `libraries`, `recipes`, etc.
13
+ #
14
+ # To get this to work well, you'll want to set your Overcommit configuration
15
+ # for this hook to something like:
16
+ #
17
+ # PreCommit:
18
+ # Foodcritic:
19
+ # enabled: true
20
+ # include:
21
+ # - 'attributes/**/*'
22
+ # - 'definitions/**/*'
23
+ # - 'files/**/*'
24
+ # - 'libraries/**/*'
25
+ # - 'providers/**/*'
26
+ # - 'recipes/**/*'
27
+ # - 'resources/**/*'
28
+ # - 'templates/**/*'
29
+ #
30
+ # MONOLITHIC REPO MODE
31
+ # --------------------
32
+ # Use this if you store multiple cookbooks, environments, and roles (or any
33
+ # combination thereof) in a single repository.
34
+ #
35
+ # There are three configuration options relevant here:
36
+ #
37
+ # * `cookbooks_directory`
38
+ # When set, hook will treat the path as a directory containing cookbooks.
39
+ # Each subdirectory of this directory will be treated as a separate
40
+ # cookbook.
41
+ #
42
+ # * `environments_directory`
43
+ # When set, hook will treat the path as a directory containing environment
44
+ # files.
45
+ #
46
+ # * `roles_directory`
47
+ # When set, hook will treat the given path as a directory containing role
48
+ # files.
49
+ #
50
+ # In order to run in monolithic repo mode, YOU MUST SET `cookbooks_directory`.
51
+ # The other configuration options are optional, if you happen to store
52
+ # environments/roles in another repo.
53
+ #
54
+ # To get this to work well, you'll want to set your Overcommit configuration
55
+ # for this hook to something like:
56
+ #
57
+ # PreCommit:
58
+ # Foodcritic:
59
+ # enabled: true
60
+ # cookbooks_directory: 'cookbooks'
61
+ # environments_directory: 'environments'
62
+ # roles_directory: 'roles'
63
+ # include:
64
+ # - 'cookbooks/**/*'
65
+ # - 'environments/**/*'
66
+ # - 'roles/**/*'
67
+ #
68
+ # ADDITIONAL CONFIGURATION
69
+ # ------------------------
70
+ # You can disable rules using the `flags` hook option. For example:
71
+ #
72
+ # PreCommit:
73
+ # Foodcritic:
74
+ # enabled: true
75
+ # ...
76
+ # flags:
77
+ # - '--epic-fail=any'
78
+ # - '-t~FC011' # Missing README in markdown format
79
+ # - '-t~FC064' # Ensure issues_url is set in metadata
80
+ #
81
+ # Any other command line flag supported by the `foodcritic` executable can be
82
+ # specified here.
83
+ #
84
+ # If you want the hook run to fail (and not just warn), set the `on_warn`
85
+ # option for the hook to `fail`:
86
+ #
87
+ # PreCommit:
88
+ # Foodcritic:
89
+ # enabled: true
90
+ # on_warn: fail
91
+ # ...
92
+ #
93
+ # This will treat any warnings as failures and cause the hook to exit
94
+ # unsuccessfully.
95
+ class Foodcritic < Base
96
+ def run
97
+ args = modified_cookbooks_args + modified_environments_args + modified_roles_args
98
+ result = execute(command, args: args)
99
+
100
+ if result.success?
101
+ :pass
102
+ else
103
+ return [:warn, result.stderr + result.stdout]
104
+ end
105
+ end
106
+
107
+ private
108
+
109
+ def directories_changed(dir_prefix)
110
+ applicable_files.
111
+ select { |path| path.start_with?(dir_prefix) }.
112
+ map { |path| path.gsub(%r{^#{dir_prefix}/}, '') }.
113
+ group_by { |path| path.split('/').first }.
114
+ keys.
115
+ map { |path| File.join(dir_prefix, path) }
116
+ end
117
+
118
+ def modified_environments_args
119
+ modified('environments').map { |env| %W[-E #{env}] }.flatten
120
+ end
121
+
122
+ def modified_roles_args
123
+ modified('roles').map { |role| %W[-R #{role}] }.flatten
124
+ end
125
+
126
+ def modified_cookbooks_args
127
+ # Return the repo root if repository contains a single cookbook
128
+ if !config['cookbooks_directory'] || config['cookbooks_directory'].empty?
129
+ ['-B', Overcommit::Utils.repo_root]
130
+ else
131
+ # Otherwise return all modified cookbooks in the cookbook directory
132
+ modified('cookbooks').map { |cookbook| ['-B', cookbook] }.flatten
133
+ end
134
+ end
135
+
136
+ def modified(type)
137
+ return [] if !config["#{type}_directory"] || config["#{type}_directory"].empty?
138
+ @modified ||= {}
139
+ @modified[type] ||= directories_changed(full_directory_path("#{type}_directory"))
140
+ end
141
+
142
+ def full_directory_path(config_option)
143
+ return config[config_option] if config[config_option].start_with?(File::SEPARATOR)
144
+ File.absolute_path(File.join(Overcommit::Utils.repo_root, config[config_option]))
145
+ end
146
+ end
147
+ end
@@ -0,0 +1,46 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Checks for license headers in source files
3
+ class LicenseHeader < Base
4
+ def run
5
+ begin
6
+ license_contents = license_lines
7
+ rescue Errno::ENOENT
8
+ return :fail, "Unable to load license file #{license_file}"
9
+ end
10
+
11
+ messages = applicable_files.map do |file|
12
+ check_file(file, license_contents)
13
+ end.compact
14
+
15
+ return :fail, messages.join("\n") if messages.any?
16
+
17
+ :pass
18
+ end
19
+
20
+ def check_file(file, license_contents)
21
+ File.readlines(file).each_with_index do |l, i|
22
+ if i >= license_contents.length
23
+ break
24
+ end
25
+
26
+ l.chomp!
27
+ unless l.end_with?(license_contents[i])
28
+ message = "#{file} missing header contents from line #{i} of "\
29
+ "#{license_file}: #{license_contents[i]}"
30
+ return message
31
+ end
32
+ end
33
+ end
34
+
35
+ def license_file
36
+ config['license_file']
37
+ end
38
+
39
+ def license_lines
40
+ @license_regex ||= begin
41
+ file_root = Overcommit::Utils.convert_glob_to_absolute(license_file)
42
+ File.read(file_root).split("\n")
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,55 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Checks for line endings in files.
3
+ #
4
+ # WARNING: Works with Git 2.10.0 or newer.
5
+ class LineEndings < Base
6
+ def run
7
+ messages = []
8
+
9
+ offending_files.map do |file_name|
10
+ file = File.open(file_name)
11
+ file.each_line do |line|
12
+ # remove configured line-ending
13
+ line.gsub!(/#{config['eol']}/, '')
14
+
15
+ # detect any left over line-ending characters
16
+ next unless line.end_with?("\n", "\r")
17
+
18
+ messages << Overcommit::Hook::Message.new(
19
+ :error,
20
+ file_name,
21
+ file.lineno,
22
+ "#{file_name}:#{file.lineno}:#{line.inspect}"
23
+ )
24
+ end
25
+ end
26
+
27
+ messages
28
+ end
29
+
30
+ private
31
+
32
+ def offending_files
33
+ result = execute(%w[git ls-files --eol -z --], args: applicable_files)
34
+ raise 'Unable to access git tree' unless result.success?
35
+
36
+ result.stdout.split("\0").map do |file_info|
37
+ i, _w, _attr, path = file_info.split
38
+ next if i == 'l/-text' # ignore binary files
39
+ next if i == "l/#{eol}"
40
+ path
41
+ end.compact
42
+ end
43
+
44
+ def eol
45
+ @eol ||= case config['eol']
46
+ when "\n"
47
+ 'lf'
48
+ when "\r\n"
49
+ 'crlf'
50
+ else
51
+ raise 'Invalid `eol` option specified: must be "\n" or "\r\n"'
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,10 +1,13 @@
1
1
  module Overcommit::Hook::PreCommit
2
- # Check to see whether the schema file is in line with the migrations
2
+ # Check to see whether the schema file is in line with the migrations. When a
3
+ # schema file is present but a migration file is not, this is usually a
4
+ # failure. The exception is if the schema is at version 0 (i.e before any
5
+ # migrations have been run). In this case it is OK if there are no migrations.
3
6
  class RailsSchemaUpToDate < Base
4
7
  def run # rubocop:disable CyclomaticComplexity, PerceivedComplexity
5
8
  if migration_files.any? && schema_files.none?
6
9
  return :fail, "It looks like you're adding a migration, but did not update the schema file"
7
- elsif migration_files.none? && schema_files.any?
10
+ elsif migration_files.none? && schema_files.any? && non_zero_schema_version?
8
11
  return :fail, "You're trying to change the schema without adding a migration file"
9
12
  elsif migration_files.any? && schema_files.any?
10
13
  # Get the latest version from the migration filename. Use
@@ -15,7 +18,6 @@ module Overcommit::Hook::PreCommit
15
18
  File.basename(file)[/\d+/]
16
19
  end.sort.last
17
20
 
18
- schema = schema_files.map { |file| File.read(file) }.join
19
21
  up_to_date = schema.include?(latest_version)
20
22
 
21
23
  unless up_to_date
@@ -41,5 +43,13 @@ module Overcommit::Hook::PreCommit
41
43
  file.match %r{db/schema\.rb|db/structure.*\.sql}
42
44
  end
43
45
  end
46
+
47
+ def schema
48
+ @schema ||= schema_files.map { |file| File.read(file) }.join
49
+ end
50
+
51
+ def non_zero_schema_version?
52
+ schema =~ /\d{14}/
53
+ end
44
54
  end
45
55
  end
@@ -0,0 +1,16 @@
1
+ module Overcommit::Hook::PreCommit
2
+ # Runs `YAMLLint` against any modified YAML files.
3
+ #
4
+ # @see https://github.com/adrienverge/yamllint
5
+ class YamlLint < Base
6
+ def run
7
+ result = execute(command, args: applicable_files)
8
+
9
+ if result.success?
10
+ :pass
11
+ else
12
+ return [:warn, result.stdout]
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Defines the gem version.
4
4
  module Overcommit
5
- VERSION = '0.36.0'.freeze
5
+ VERSION = '0.37.0'.freeze
6
6
  end
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.36.0
4
+ version: 0.37.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brigade Engineering
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-08-31 00:00:00.000000000 Z
12
+ date: 2016-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: childprocess
@@ -117,6 +117,8 @@ files:
117
117
  - lib/overcommit/hook/pre_commit/es_lint.rb
118
118
  - lib/overcommit/hook/pre_commit/execute_permissions.rb
119
119
  - lib/overcommit/hook/pre_commit/fasterer.rb
120
+ - lib/overcommit/hook/pre_commit/fix_me.rb
121
+ - lib/overcommit/hook/pre_commit/foodcritic.rb
120
122
  - lib/overcommit/hook/pre_commit/forbidden_branches.rb
121
123
  - lib/overcommit/hook/pre_commit/go_lint.rb
122
124
  - lib/overcommit/hook/pre_commit/go_vet.rb
@@ -132,6 +134,8 @@ files:
132
134
  - lib/overcommit/hook/pre_commit/jscs.rb
133
135
  - lib/overcommit/hook/pre_commit/jsl.rb
134
136
  - lib/overcommit/hook/pre_commit/json_syntax.rb
137
+ - lib/overcommit/hook/pre_commit/license_header.rb
138
+ - lib/overcommit/hook/pre_commit/line_endings.rb
135
139
  - lib/overcommit/hook/pre_commit/local_paths_in_gemfile.rb
136
140
  - lib/overcommit/hook/pre_commit/mdl.rb
137
141
  - lib/overcommit/hook/pre_commit/merge_conflicts.rb
@@ -163,6 +167,7 @@ files:
163
167
  - lib/overcommit/hook/pre_commit/w3c_html.rb
164
168
  - lib/overcommit/hook/pre_commit/xml_lint.rb
165
169
  - lib/overcommit/hook/pre_commit/xml_syntax.rb
170
+ - lib/overcommit/hook/pre_commit/yaml_lint.rb
166
171
  - lib/overcommit/hook/pre_commit/yaml_syntax.rb
167
172
  - lib/overcommit/hook/pre_push/base.rb
168
173
  - lib/overcommit/hook/pre_push/brakeman.rb
@@ -240,4 +245,3 @@ signing_key:
240
245
  specification_version: 4
241
246
  summary: Git hook manager
242
247
  test_files: []
243
- has_rdoc: