overcommit-jeygeethanmedia 0.53.1

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.
Files changed (226) hide show
  1. checksums.yaml +7 -0
  2. data/bin/overcommit +50 -0
  3. data/config/default.yml +1356 -0
  4. data/config/starter.yml +33 -0
  5. data/lib/overcommit.rb +26 -0
  6. data/lib/overcommit/cli.rb +223 -0
  7. data/lib/overcommit/command_splitter.rb +146 -0
  8. data/lib/overcommit/configuration.rb +350 -0
  9. data/lib/overcommit/configuration_loader.rb +96 -0
  10. data/lib/overcommit/configuration_validator.rb +186 -0
  11. data/lib/overcommit/constants.rb +12 -0
  12. data/lib/overcommit/exceptions.rb +52 -0
  13. data/lib/overcommit/git_config.rb +22 -0
  14. data/lib/overcommit/git_repo.rb +286 -0
  15. data/lib/overcommit/git_version.rb +17 -0
  16. data/lib/overcommit/hook/base.rb +294 -0
  17. data/lib/overcommit/hook/commit_msg/base.rb +14 -0
  18. data/lib/overcommit/hook/commit_msg/capitalized_subject.rb +25 -0
  19. data/lib/overcommit/hook/commit_msg/empty_message.rb +12 -0
  20. data/lib/overcommit/hook/commit_msg/gerrit_change_id.rb +22 -0
  21. data/lib/overcommit/hook/commit_msg/hard_tabs.rb +17 -0
  22. data/lib/overcommit/hook/commit_msg/message_format.rb +31 -0
  23. data/lib/overcommit/hook/commit_msg/russian_novel.rb +16 -0
  24. data/lib/overcommit/hook/commit_msg/single_line_subject.rb +16 -0
  25. data/lib/overcommit/hook/commit_msg/spell_check.rb +45 -0
  26. data/lib/overcommit/hook/commit_msg/text_width.rb +56 -0
  27. data/lib/overcommit/hook/commit_msg/trailing_period.rb +16 -0
  28. data/lib/overcommit/hook/post_checkout/base.rb +22 -0
  29. data/lib/overcommit/hook/post_checkout/bower_install.rb +13 -0
  30. data/lib/overcommit/hook/post_checkout/bundle_install.rb +13 -0
  31. data/lib/overcommit/hook/post_checkout/composer_install.rb +13 -0
  32. data/lib/overcommit/hook/post_checkout/index_tags.rb +12 -0
  33. data/lib/overcommit/hook/post_checkout/npm_install.rb +13 -0
  34. data/lib/overcommit/hook/post_checkout/submodule_status.rb +12 -0
  35. data/lib/overcommit/hook/post_checkout/yarn_install.rb +13 -0
  36. data/lib/overcommit/hook/post_commit/base.rb +12 -0
  37. data/lib/overcommit/hook/post_commit/bower_install.rb +13 -0
  38. data/lib/overcommit/hook/post_commit/bundle_install.rb +13 -0
  39. data/lib/overcommit/hook/post_commit/commitplease.rb +16 -0
  40. data/lib/overcommit/hook/post_commit/composer_install.rb +13 -0
  41. data/lib/overcommit/hook/post_commit/git_guilt.rb +43 -0
  42. data/lib/overcommit/hook/post_commit/index_tags.rb +12 -0
  43. data/lib/overcommit/hook/post_commit/npm_install.rb +13 -0
  44. data/lib/overcommit/hook/post_commit/submodule_status.rb +12 -0
  45. data/lib/overcommit/hook/post_commit/yarn_install.rb +13 -0
  46. data/lib/overcommit/hook/post_merge/base.rb +12 -0
  47. data/lib/overcommit/hook/post_merge/bower_install.rb +13 -0
  48. data/lib/overcommit/hook/post_merge/bundle_install.rb +13 -0
  49. data/lib/overcommit/hook/post_merge/composer_install.rb +13 -0
  50. data/lib/overcommit/hook/post_merge/index_tags.rb +12 -0
  51. data/lib/overcommit/hook/post_merge/npm_install.rb +13 -0
  52. data/lib/overcommit/hook/post_merge/submodule_status.rb +12 -0
  53. data/lib/overcommit/hook/post_merge/yarn_install.rb +13 -0
  54. data/lib/overcommit/hook/post_rewrite/base.rb +12 -0
  55. data/lib/overcommit/hook/post_rewrite/bower_install.rb +13 -0
  56. data/lib/overcommit/hook/post_rewrite/bundle_install.rb +13 -0
  57. data/lib/overcommit/hook/post_rewrite/composer_install.rb +13 -0
  58. data/lib/overcommit/hook/post_rewrite/index_tags.rb +19 -0
  59. data/lib/overcommit/hook/post_rewrite/npm_install.rb +13 -0
  60. data/lib/overcommit/hook/post_rewrite/submodule_status.rb +12 -0
  61. data/lib/overcommit/hook/post_rewrite/yarn_install.rb +13 -0
  62. data/lib/overcommit/hook/pre_commit/author_email.rb +26 -0
  63. data/lib/overcommit/hook/pre_commit/author_name.rb +25 -0
  64. data/lib/overcommit/hook/pre_commit/base.rb +19 -0
  65. data/lib/overcommit/hook/pre_commit/berksfile_check.rb +24 -0
  66. data/lib/overcommit/hook/pre_commit/broken_symlinks.rb +17 -0
  67. data/lib/overcommit/hook/pre_commit/bundle_audit.rb +24 -0
  68. data/lib/overcommit/hook/pre_commit/bundle_check.rb +32 -0
  69. data/lib/overcommit/hook/pre_commit/bundle_outdated.rb +25 -0
  70. data/lib/overcommit/hook/pre_commit/case_conflicts.rb +27 -0
  71. data/lib/overcommit/hook/pre_commit/chamber_compare.rb +43 -0
  72. data/lib/overcommit/hook/pre_commit/chamber_security.rb +15 -0
  73. data/lib/overcommit/hook/pre_commit/chamber_verification.rb +36 -0
  74. data/lib/overcommit/hook/pre_commit/code_spell_check.rb +36 -0
  75. data/lib/overcommit/hook/pre_commit/coffee_lint.rb +35 -0
  76. data/lib/overcommit/hook/pre_commit/cook_style.rb +35 -0
  77. data/lib/overcommit/hook/pre_commit/credo.rb +27 -0
  78. data/lib/overcommit/hook/pre_commit/css_lint.rb +26 -0
  79. data/lib/overcommit/hook/pre_commit/dogma.rb +33 -0
  80. data/lib/overcommit/hook/pre_commit/es_lint.rb +38 -0
  81. data/lib/overcommit/hook/pre_commit/execute_permissions.rb +76 -0
  82. data/lib/overcommit/hook/pre_commit/fasterer.rb +25 -0
  83. data/lib/overcommit/hook/pre_commit/file_size.rb +47 -0
  84. data/lib/overcommit/hook/pre_commit/fix_me.rb +17 -0
  85. data/lib/overcommit/hook/pre_commit/flay.rb +38 -0
  86. data/lib/overcommit/hook/pre_commit/foodcritic.rb +149 -0
  87. data/lib/overcommit/hook/pre_commit/forbidden_branches.rb +26 -0
  88. data/lib/overcommit/hook/pre_commit/ginkgo_focus.rb +23 -0
  89. data/lib/overcommit/hook/pre_commit/go_fmt.rb +17 -0
  90. data/lib/overcommit/hook/pre_commit/go_lint.rb +29 -0
  91. data/lib/overcommit/hook/pre_commit/go_vet.rb +24 -0
  92. data/lib/overcommit/hook/pre_commit/golangci_lint.rb +21 -0
  93. data/lib/overcommit/hook/pre_commit/hadolint.rb +27 -0
  94. data/lib/overcommit/hook/pre_commit/haml_lint.rb +23 -0
  95. data/lib/overcommit/hook/pre_commit/hard_tabs.rb +15 -0
  96. data/lib/overcommit/hook/pre_commit/hlint.rb +34 -0
  97. data/lib/overcommit/hook/pre_commit/html_hint.rb +23 -0
  98. data/lib/overcommit/hook/pre_commit/html_tidy.rb +30 -0
  99. data/lib/overcommit/hook/pre_commit/image_optim.rb +28 -0
  100. data/lib/overcommit/hook/pre_commit/java_checkstyle.rb +27 -0
  101. data/lib/overcommit/hook/pre_commit/js_hint.rb +23 -0
  102. data/lib/overcommit/hook/pre_commit/js_lint.rb +22 -0
  103. data/lib/overcommit/hook/pre_commit/jscs.rb +27 -0
  104. data/lib/overcommit/hook/pre_commit/jsl.rb +28 -0
  105. data/lib/overcommit/hook/pre_commit/json_syntax.rb +21 -0
  106. data/lib/overcommit/hook/pre_commit/kt_lint.rb +19 -0
  107. data/lib/overcommit/hook/pre_commit/license_finder.rb +14 -0
  108. data/lib/overcommit/hook/pre_commit/license_header.rb +48 -0
  109. data/lib/overcommit/hook/pre_commit/line_endings.rb +77 -0
  110. data/lib/overcommit/hook/pre_commit/local_paths_in_gemfile.rb +16 -0
  111. data/lib/overcommit/hook/pre_commit/mdl.rb +29 -0
  112. data/lib/overcommit/hook/pre_commit/merge_conflicts.rb +16 -0
  113. data/lib/overcommit/hook/pre_commit/nginx_test.rb +26 -0
  114. data/lib/overcommit/hook/pre_commit/pep257.rb +23 -0
  115. data/lib/overcommit/hook/pre_commit/pep8.rb +23 -0
  116. data/lib/overcommit/hook/pre_commit/php_cs.rb +43 -0
  117. data/lib/overcommit/hook/pre_commit/php_cs_fixer.rb +57 -0
  118. data/lib/overcommit/hook/pre_commit/php_lint.rb +44 -0
  119. data/lib/overcommit/hook/pre_commit/php_stan.rb +30 -0
  120. data/lib/overcommit/hook/pre_commit/pronto.rb +12 -0
  121. data/lib/overcommit/hook/pre_commit/puppet_lint.rb +26 -0
  122. data/lib/overcommit/hook/pre_commit/puppet_metadata_json_lint.rb +29 -0
  123. data/lib/overcommit/hook/pre_commit/pycodestyle.rb +23 -0
  124. data/lib/overcommit/hook/pre_commit/pydocstyle.rb +23 -0
  125. data/lib/overcommit/hook/pre_commit/pyflakes.rb +32 -0
  126. data/lib/overcommit/hook/pre_commit/pylint.rb +32 -0
  127. data/lib/overcommit/hook/pre_commit/python_flake8.rb +32 -0
  128. data/lib/overcommit/hook/pre_commit/rails_best_practices.rb +34 -0
  129. data/lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb +58 -0
  130. data/lib/overcommit/hook/pre_commit/rake_target.rb +12 -0
  131. data/lib/overcommit/hook/pre_commit/reek.rb +26 -0
  132. data/lib/overcommit/hook/pre_commit/rst_lint.rb +27 -0
  133. data/lib/overcommit/hook/pre_commit/rubo_cop.rb +35 -0
  134. data/lib/overcommit/hook/pre_commit/ruby_lint.rb +23 -0
  135. data/lib/overcommit/hook/pre_commit/ruby_syntax.rb +27 -0
  136. data/lib/overcommit/hook/pre_commit/scalariform.rb +22 -0
  137. data/lib/overcommit/hook/pre_commit/scalastyle.rb +31 -0
  138. data/lib/overcommit/hook/pre_commit/scss_lint.rb +43 -0
  139. data/lib/overcommit/hook/pre_commit/semi_standard.rb +23 -0
  140. data/lib/overcommit/hook/pre_commit/shell_check.rb +23 -0
  141. data/lib/overcommit/hook/pre_commit/slim_lint.rb +23 -0
  142. data/lib/overcommit/hook/pre_commit/sqlint.rb +26 -0
  143. data/lib/overcommit/hook/pre_commit/standard.rb +23 -0
  144. data/lib/overcommit/hook/pre_commit/stylelint.rb +23 -0
  145. data/lib/overcommit/hook/pre_commit/swift_lint.rb +19 -0
  146. data/lib/overcommit/hook/pre_commit/terraform_format.rb +19 -0
  147. data/lib/overcommit/hook/pre_commit/trailing_whitespace.rb +15 -0
  148. data/lib/overcommit/hook/pre_commit/travis_lint.rb +15 -0
  149. data/lib/overcommit/hook/pre_commit/ts_lint.rb +28 -0
  150. data/lib/overcommit/hook/pre_commit/vint.rb +22 -0
  151. data/lib/overcommit/hook/pre_commit/w3c_css.rb +67 -0
  152. data/lib/overcommit/hook/pre_commit/w3c_html.rb +64 -0
  153. data/lib/overcommit/hook/pre_commit/xml_lint.rb +24 -0
  154. data/lib/overcommit/hook/pre_commit/xml_syntax.rb +21 -0
  155. data/lib/overcommit/hook/pre_commit/yaml_lint.rb +18 -0
  156. data/lib/overcommit/hook/pre_commit/yaml_syntax.rb +20 -0
  157. data/lib/overcommit/hook/pre_commit/yard_coverage.rb +90 -0
  158. data/lib/overcommit/hook/pre_commit/yarn_check.rb +37 -0
  159. data/lib/overcommit/hook/pre_push/base.rb +33 -0
  160. data/lib/overcommit/hook/pre_push/brakeman.rb +15 -0
  161. data/lib/overcommit/hook/pre_push/cargo_test.rb +12 -0
  162. data/lib/overcommit/hook/pre_push/go_test.rb +14 -0
  163. data/lib/overcommit/hook/pre_push/golangci_lint.rb +16 -0
  164. data/lib/overcommit/hook/pre_push/minitest.rb +20 -0
  165. data/lib/overcommit/hook/pre_push/php_unit.rb +16 -0
  166. data/lib/overcommit/hook/pre_push/pronto.rb +12 -0
  167. data/lib/overcommit/hook/pre_push/protected_branches.rb +74 -0
  168. data/lib/overcommit/hook/pre_push/pytest.rb +16 -0
  169. data/lib/overcommit/hook/pre_push/python_nose.rb +16 -0
  170. data/lib/overcommit/hook/pre_push/r_spec.rb +16 -0
  171. data/lib/overcommit/hook/pre_push/rake_target.rb +12 -0
  172. data/lib/overcommit/hook/pre_push/test_unit.rb +16 -0
  173. data/lib/overcommit/hook/pre_rebase/base.rb +14 -0
  174. data/lib/overcommit/hook/pre_rebase/merged_commits.rb +31 -0
  175. data/lib/overcommit/hook/prepare_commit_msg/base.rb +25 -0
  176. data/lib/overcommit/hook/prepare_commit_msg/replace_branch.rb +57 -0
  177. data/lib/overcommit/hook/shared/bower_install.rb +15 -0
  178. data/lib/overcommit/hook/shared/bundle_install.rb +15 -0
  179. data/lib/overcommit/hook/shared/composer_install.rb +15 -0
  180. data/lib/overcommit/hook/shared/index_tags.rb +14 -0
  181. data/lib/overcommit/hook/shared/npm_install.rb +15 -0
  182. data/lib/overcommit/hook/shared/pronto.rb +21 -0
  183. data/lib/overcommit/hook/shared/rake_target.rb +26 -0
  184. data/lib/overcommit/hook/shared/submodule_status.rb +32 -0
  185. data/lib/overcommit/hook/shared/yarn_install.rb +15 -0
  186. data/lib/overcommit/hook_context.rb +19 -0
  187. data/lib/overcommit/hook_context/base.rb +139 -0
  188. data/lib/overcommit/hook_context/commit_msg.rb +48 -0
  189. data/lib/overcommit/hook_context/post_checkout.rb +36 -0
  190. data/lib/overcommit/hook_context/post_commit.rb +33 -0
  191. data/lib/overcommit/hook_context/post_merge.rb +37 -0
  192. data/lib/overcommit/hook_context/post_rewrite.rb +49 -0
  193. data/lib/overcommit/hook_context/pre_commit.rb +212 -0
  194. data/lib/overcommit/hook_context/pre_push.rb +89 -0
  195. data/lib/overcommit/hook_context/pre_rebase.rb +38 -0
  196. data/lib/overcommit/hook_context/prepare_commit_msg.rb +34 -0
  197. data/lib/overcommit/hook_context/run_all.rb +48 -0
  198. data/lib/overcommit/hook_loader/base.rb +48 -0
  199. data/lib/overcommit/hook_loader/built_in_hook_loader.rb +14 -0
  200. data/lib/overcommit/hook_loader/plugin_hook_loader.rb +102 -0
  201. data/lib/overcommit/hook_runner.rb +219 -0
  202. data/lib/overcommit/hook_signer.rb +123 -0
  203. data/lib/overcommit/installer.rb +193 -0
  204. data/lib/overcommit/interrupt_handler.rb +91 -0
  205. data/lib/overcommit/logger.rb +92 -0
  206. data/lib/overcommit/message_processor.rb +148 -0
  207. data/lib/overcommit/os.rb +38 -0
  208. data/lib/overcommit/printer.rb +145 -0
  209. data/lib/overcommit/subprocess.rb +98 -0
  210. data/lib/overcommit/utils.rb +309 -0
  211. data/lib/overcommit/utils/file_utils.rb +71 -0
  212. data/lib/overcommit/utils/messages_utils.rb +77 -0
  213. data/lib/overcommit/version.rb +6 -0
  214. data/libexec/gerrit-change-id +174 -0
  215. data/libexec/index-tags +17 -0
  216. data/template-dir/hooks/commit-msg +116 -0
  217. data/template-dir/hooks/overcommit-hook +116 -0
  218. data/template-dir/hooks/post-checkout +116 -0
  219. data/template-dir/hooks/post-commit +116 -0
  220. data/template-dir/hooks/post-merge +116 -0
  221. data/template-dir/hooks/post-rewrite +116 -0
  222. data/template-dir/hooks/pre-commit +116 -0
  223. data/template-dir/hooks/pre-push +116 -0
  224. data/template-dir/hooks/pre-rebase +116 -0
  225. data/template-dir/hooks/prepare-commit-msg +116 -0
  226. metadata +303 -0
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `chamber compare` against a configurable set of namespaces.
5
+ #
6
+ # @see https://github.com/thekompanee/chamber/wiki/Git-Commit-Hooks#chamber-compare-pre-commit-hook
7
+ # rubocop:disable Metrics/MethodLength
8
+ class ChamberCompare < Base
9
+ def run
10
+ config['namespaces'].each_index do |index|
11
+ first = config['namespaces'][index]
12
+ second = config['namespaces'][index + 1]
13
+
14
+ next unless second
15
+
16
+ result = execute(
17
+ command,
18
+ args: [
19
+ "--first=#{first.join(' ')}",
20
+ "--second=#{second.join(' ')}",
21
+ ],
22
+ )
23
+
24
+ unless result.stdout.empty?
25
+ trimmed_result = result.stdout.split("\n")
26
+ 5.times { trimmed_result.shift }
27
+ trimmed_result = trimmed_result.join("\n")
28
+
29
+ return [
30
+ :warn,
31
+ "It appears your namespace settings between #{first} and " \
32
+ "#{second} are not in sync:\n\n#{trimmed_result}\n\n" \
33
+ "Run: chamber compare --first=#{first.join(' ')} " \
34
+ "--second=#{second.join(' ')}",
35
+ ]
36
+ end
37
+ end
38
+
39
+ :pass
40
+ end
41
+ end
42
+ # rubocop:enable Metrics/MethodLength
43
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `chamber secure` against any modified Chamber settings files.
5
+ #
6
+ # @see https://github.com/thekompanee/chamber
7
+ class ChamberSecurity < Base
8
+ def run
9
+ result = execute(command, args: applicable_files)
10
+
11
+ return :pass if result.stdout.empty?
12
+ [:fail, "These settings appear to need to be secured but were not: #{result.stdout}"]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `chamber sign --verify`.
5
+ #
6
+ # @see https://github.com/thekompanee/chamber/wiki/Git-Commit-Hooks#chamber-verification-pre-commit-hook
7
+ # rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
8
+ class ChamberVerification < Base
9
+ def run
10
+ approver_name = config.fetch('approver_name') { 'your approver' }
11
+ approver_email = config['approver_email'] ? " (#{config['approver_email']})" : nil
12
+
13
+ result = execute(command)
14
+
15
+ return :pass if result.stdout.empty? && result.stderr.empty?
16
+ return :pass if result.stderr =~ /no signature key was found/
17
+
18
+ output = [
19
+ result.stdout.empty? ? nil : result.stdout,
20
+ result.stderr.empty? ? nil : result.stderr,
21
+ ].
22
+ compact.
23
+ join("\n\n")
24
+
25
+ output = "\n\n#{output}" unless output.empty?
26
+
27
+ [
28
+ :warn,
29
+ "One or more of your settings files does not match the signature.\n" \
30
+ "Talk to #{approver_name}#{approver_email} about getting them " \
31
+ "approved.#{output}",
32
+ ]
33
+ end
34
+ end
35
+ # rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
36
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `alfonsox` spell-checking tool against any modified code file.
5
+ #
6
+ # @see https://github.com/diegojromerolopez/alfonsox
7
+ class CodeSpellCheck < Base
8
+ def run
9
+ # Create default file config if it does not exist
10
+
11
+ # Run spell-check
12
+ result = execute(command, args: applicable_files)
13
+ return :pass if result.success?
14
+
15
+ spellchecking_errors = result.stderr.split("\n")
16
+ spellchecking_errors.pop
17
+
18
+ error_messages(spellchecking_errors)
19
+ end
20
+
21
+ private
22
+
23
+ # Create the error messages
24
+ def error_messages(spellchecking_errors)
25
+ messages = []
26
+ spellchecking_errors.each do |spellchecking_error_i|
27
+ error_location, word = spellchecking_error_i.split(' ')
28
+ error_file_path, line = error_location.split(':')
29
+ messages << Overcommit::Hook::Message.new(
30
+ :error, error_file_path, line, "#{error_location}: #{word}"
31
+ )
32
+ end
33
+ messages
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `coffeelint` against any modified CoffeeScript files.
5
+ #
6
+ # @see http://www.coffeelint.org/
7
+ class CoffeeLint < Base
8
+ MESSAGE_REGEX = /
9
+ ^(?<file>.+)
10
+ ,(?<line>\d*),\d*
11
+ ,(?<type>\w+)
12
+ ,(?<msg>.+)$
13
+ /x
14
+
15
+ MESSAGE_TYPE_CATEGORIZER = lambda do |type|
16
+ type.include?('w') ? :warning : :error
17
+ end
18
+
19
+ def run
20
+ result = execute(command, args: applicable_files)
21
+ parse_messages(result.stdout)
22
+ end
23
+
24
+ private
25
+
26
+ def parse_messages(output)
27
+ output.scan(MESSAGE_REGEX).map do |file, line, type, msg|
28
+ line = line.to_i
29
+ type = MESSAGE_TYPE_CATEGORIZER.call(type)
30
+ text = "#{file}:#{line}:#{type} #{msg}"
31
+ Overcommit::Hook::Message.new(type, file, line, text)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `cookstyle` against any modified Chef Ruby files.
5
+ #
6
+ # @see https://docs.chef.io/cookstyle.html
7
+ class CookStyle < Base
8
+ GENERIC_MESSAGE_TYPE_CATEGORIZER = lambda do |type|
9
+ type.match?(/^warn/) ? :warning : :error
10
+ end
11
+
12
+ COP_MESSAGE_TYPE_CATEGORIZER = lambda do |type|
13
+ type.include?('W') ? :warning : :error
14
+ end
15
+
16
+ def run
17
+ result = execute(command, args: applicable_files)
18
+ return :pass if result.success?
19
+
20
+ generic_messages = extract_messages(
21
+ result.stderr.split("\n"),
22
+ /^(?<type>[a-z]+)/i,
23
+ GENERIC_MESSAGE_TYPE_CATEGORIZER,
24
+ )
25
+
26
+ cop_messages = extract_messages(
27
+ result.stdout.split("\n"),
28
+ /^(?<file>(?:\w:)?[^:]+):(?<line>\d+):[^ ]+ (?<type>[^ ]+)/,
29
+ COP_MESSAGE_TYPE_CATEGORIZER,
30
+ )
31
+
32
+ generic_messages + cop_messages
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `credo` against any modified ex files.
5
+ #
6
+ # @see https://github.com/rrrene/credo
7
+ class Credo < Base
8
+ # example message:
9
+ # lib/file1.ex:1:11: R: Modules should have a @moduledoc tag.
10
+ # lib/file2.ex:12:81: R: Line is too long (max is 80, was 81).
11
+
12
+ def run
13
+ result = execute(command, args: applicable_files)
14
+ return :pass if result.success?
15
+
16
+ result.stdout.split("\n").map(&:strip).reject(&:empty?).
17
+ map { |error| message(error) }
18
+ end
19
+
20
+ private
21
+
22
+ def message(error)
23
+ file, line = error.split(':')
24
+ Overcommit::Hook::Message.new(:error, file, Integer(line), error)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `csslint` against any modified CSS files.
5
+ #
6
+ # @see https://github.com/CSSLint/csslint
7
+ class CssLint < Base
8
+ MESSAGE_REGEX = /
9
+ ^(?<file>(?:\w:)?[^:]+):\s
10
+ (?:line\s(?<line>\d+)[^EW]+)?
11
+ (?<type>Error|Warning)
12
+ /x
13
+
14
+ def run
15
+ result = execute(command, args: applicable_files)
16
+ output = result.stdout.chomp
17
+ return :pass if result.success? && output.empty?
18
+
19
+ extract_messages(
20
+ output.split("\n").reject(&:empty?),
21
+ MESSAGE_REGEX,
22
+ lambda { |type| type.downcase.to_sym }
23
+ )
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `dogma` against any modified ex files.
5
+ #
6
+ # @see https://github.com/lpil/dogma
7
+ class Dogma < Base
8
+ def run
9
+ result = execute command
10
+ return :pass if result.success?
11
+
12
+ messages = []
13
+ # example message:
14
+ # == web/channels/user_socket.ex ==
15
+ # 26: LineLength: Line length should not exceed 80 chars (was 83).
16
+ # 1: ModuleDoc: Module Sample.UserSocket is missing a @moduledoc.
17
+ output = result.stdout.chomp.match(/(==.+)/m)
18
+
19
+ if output
20
+ output.captures.first.split(/\n\n/).each do |error_group|
21
+ errors = error_group.split /\n/
22
+ file = errors.shift.gsub /[ =]/, ''
23
+ errors.each do |error|
24
+ line = error.split(': ').first
25
+ messages << Overcommit::Hook::Message.new(:error, file, line, "#{file}: #{error}")
26
+ end
27
+ end
28
+ end
29
+
30
+ messages
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `eslint` against any modified JavaScript files.
5
+ #
6
+ # Protip: if you have an npm script set up to run eslint, you can configure
7
+ # this hook to run eslint via your npm script by using the `command` option in
8
+ # your .overcommit.yml file. This can be useful if you have some eslint
9
+ # configuration built into your npm script that you don't want to repeat
10
+ # somewhere else. Example:
11
+ #
12
+ # EsLint:
13
+ # required_executable: 'npm'
14
+ # enabled: true
15
+ # command: ['npm', 'run', 'lint', '--', '-f', 'compact']
16
+ #
17
+ # Note: This hook supports only compact format.
18
+ #
19
+ # @see http://eslint.org/
20
+ class EsLint < Base
21
+ def run
22
+ result = execute(command, args: applicable_files)
23
+ output = result.stdout.chomp
24
+ messages = output.split("\n").grep(/Warning|Error/)
25
+
26
+ return [:fail, result.stderr] if messages.empty? && !result.success?
27
+ return :pass if result.success? && output.empty?
28
+
29
+ # example message:
30
+ # path/to/file.js: line 1, col 0, Error - Error message (ruleName)
31
+ extract_messages(
32
+ messages,
33
+ /^(?<file>(?:\w:)?[^:]+):[^\d]+(?<line>\d+).*?(?<type>Error|Warning)/,
34
+ lambda { |type| type.downcase.to_sym }
35
+ )
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Checks for files with execute permissions, which are usually not necessary
5
+ # in source code files (and are typically caused by a misconfigured editor
6
+ # assigning incorrect default permissions).
7
+ #
8
+ # Protip: if you have some files that you want to allow execute permissions
9
+ # on, you can disable this hook for those files by using the `exclude` option
10
+ # on your .overcommit.yml file. Example:
11
+ #
12
+ # ExecutePermissions:
13
+ # enabled: true
14
+ # exclude:
15
+ # - 'path/to/my/file/that/should/have/execute/permissions.sh'
16
+ # - 'directory/that/should/have/execute/permissions/**/*'
17
+ class ExecutePermissions < Base
18
+ def run
19
+ file_modes = {}
20
+
21
+ # We have to look in two places to determine the execute permissions of a
22
+ # file. The first is the Git tree for currently known file modes of all
23
+ # files, the second is the index for any staged changes to file modes.
24
+ # Staged changes take priority if they exist.
25
+ #
26
+ # This complexity is necessary because this hook can be run in the RunAll
27
+ # context, where there may be no staged changes but we stil want to check
28
+ # the permissions.
29
+ extract_from_git_tree(file_modes) unless initial_commit?
30
+ extract_from_git_index(file_modes)
31
+
32
+ file_modes.map do |file, mode|
33
+ next unless execute_permissions?(mode)
34
+
35
+ Overcommit::Hook::Message.new(
36
+ :error,
37
+ file,
38
+ nil,
39
+ "File #{file} has unnecessary execute permissions",
40
+ )
41
+ end.compact
42
+ end
43
+
44
+ private
45
+
46
+ def extract_from_git_tree(file_modes)
47
+ result = execute(%w[git ls-tree HEAD --], args: applicable_files)
48
+ raise 'Unable to access git tree' unless result.success?
49
+
50
+ result.stdout.split("\n").each do |line|
51
+ mode, _type, _hash, file = line.split(/\s+/, 4)
52
+ file_modes[file] = mode
53
+ end
54
+ end
55
+
56
+ def extract_from_git_index(file_modes)
57
+ result = execute(%w[git diff --raw --cached --no-color --], args: applicable_files)
58
+ raise 'Unable to access git index' unless result.success?
59
+
60
+ result.stdout.split("\n").each do |line|
61
+ _old_mode, new_mode, _old_hash, _new_hash, _status, file = line.split(/\s+/, 6)
62
+ file_modes[file] = new_mode
63
+ end
64
+ end
65
+
66
+ # Check if the 1st bit is toggled, indicating execute permissions.
67
+ #
68
+ # Git tracks only execute permissions, not individual read/write/execute
69
+ # permissions for user, group, and other, since that concept does not exist
70
+ # on all operating systems. If any of the user/group/other permissions
71
+ # have the executable bit set, they all will. Thus we check the first bit.
72
+ def execute_permissions?(mode)
73
+ (mode.to_i(8) & 1) == 1
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `fasterer` against any modified Ruby files.
5
+ #
6
+ # @see https://github.com/DamirSvrtan/fasterer
7
+ class Fasterer < Base
8
+ def run
9
+ result = execute(command, args: applicable_files)
10
+ output = result.stdout
11
+
12
+ if extract_offense_num(output) == 0
13
+ :pass
14
+ else
15
+ return [:warn, output]
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def extract_offense_num(raw_output)
22
+ raw_output.scan(/(\d+) offense detected/).flatten.map(&:to_i).inject(0, :+)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Checks for oversized files before committing.
5
+ class FileSize < Base
6
+ def run
7
+ return :pass if oversized_files.empty?
8
+
9
+ oversized_files.map do |file|
10
+ error_message_for(file)
11
+ end
12
+ end
13
+
14
+ def description
15
+ "Check for files over #{size_limit_bytes} bytes"
16
+ end
17
+
18
+ private
19
+
20
+ def oversized_files
21
+ @oversized_files ||= build_oversized_file_list
22
+ end
23
+
24
+ def build_oversized_file_list
25
+ applicable_files.select do |file|
26
+ File.exist?(file) && file_size(file) > size_limit_bytes
27
+ end
28
+ end
29
+
30
+ def size_limit_bytes
31
+ config.fetch('size_limit_bytes')
32
+ end
33
+
34
+ def error_message_for(file)
35
+ Overcommit::Hook::Message.new(
36
+ :error,
37
+ file,
38
+ nil,
39
+ "#{file} is #{file_size(file)} bytes"
40
+ )
41
+ end
42
+
43
+ def file_size(file)
44
+ File.size(file)
45
+ end
46
+ end
47
+ end