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,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Checks for unresolved merge conflicts
5
+ class MergeConflicts < Base
6
+ def run
7
+ result = execute(command, args: applicable_files)
8
+
9
+ unless result.stdout.empty?
10
+ return :fail, "Merge conflict markers detected:\n#{result.stdout}"
11
+ end
12
+
13
+ :pass
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `nginx -t` against any modified Nginx config files.
5
+ #
6
+ # @see https://www.nginx.com/resources/wiki/start/topics/tutorials/commandline/
7
+ class NginxTest < Base
8
+ MESSAGE_REGEX = /^nginx: .+ in (?<file>.+):(?<line>\d+)$/
9
+
10
+ def run
11
+ messages = []
12
+
13
+ applicable_files.each do |file|
14
+ result = execute(command + ['-c', file])
15
+ next if result.success?
16
+
17
+ messages += extract_messages(
18
+ result.stderr.split("\n").grep(MESSAGE_REGEX),
19
+ MESSAGE_REGEX
20
+ )
21
+ end
22
+
23
+ messages
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `pep257` against any modified Python files.
5
+ #
6
+ # @see https://pypi.python.org/pypi/pep257
7
+ class Pep257 < Base
8
+ def run
9
+ result = execute(command, args: applicable_files)
10
+ return :pass if result.success?
11
+
12
+ output = result.stderr.chomp
13
+
14
+ # example message:
15
+ # path/to/file.py:1 in public method `foo`:
16
+ # D102: Docstring missing
17
+ extract_messages(
18
+ output.gsub(/:\s+/, ': ').split("\n"),
19
+ /^(?<file>(?:\w:)?[^:]+):(?<line>\d+)/
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `pep8` against any modified Python files.
5
+ #
6
+ # @see https://pypi.python.org/pypi/pep8
7
+ class Pep8 < Base
8
+ def run
9
+ result = execute(command, args: applicable_files)
10
+ output = result.stdout.chomp
11
+
12
+ return :pass if result.success? && output.empty?
13
+
14
+ # example message:
15
+ # path/to/file.py:88:5: E301 expected 1 blank line, found 0
16
+ extract_messages(
17
+ output.split("\n"),
18
+ /^(?<file>(?:\w:)?[^:]+):(?<line>\d+):\d+:\s(?<type>E|W)/,
19
+ lambda { |type| type.include?('W') ? :warning : :error }
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `phpcs` against any modified PHP files.
5
+ class PhpCs < Base
6
+ # Parse `phpcs` csv mode output
7
+ MESSAGE_REGEX = /^\"(?<file>.+)\",(?<line>\d+),\d+,(?<type>.+),\"(?<msg>.+)\"/
8
+ MESSAGE_TYPE_CATEGORIZER = lambda do |type|
9
+ 'error'.include?(type) ? :error : :warning
10
+ end
11
+
12
+ def run
13
+ messages = []
14
+
15
+ result = execute(command, args: applicable_files)
16
+ if result.status
17
+ messages = result.stdout.split("\n")
18
+ # Discard the csv header
19
+ messages.shift
20
+ end
21
+
22
+ return :fail if messages.empty? && !result.success?
23
+ return :pass if messages.empty?
24
+
25
+ parse_messages(messages)
26
+ end
27
+
28
+ # Transform the CSV output into a tidy human readable message
29
+ def parse_messages(messages)
30
+ output = []
31
+
32
+ messages.map do |message|
33
+ message.scan(MESSAGE_REGEX).map do |file, line, type, msg|
34
+ type = MESSAGE_TYPE_CATEGORIZER.call(type)
35
+ text = " #{file}:#{line}\n #{msg}"
36
+ output << Overcommit::Hook::Message.new(type, file, line.to_i, text)
37
+ end
38
+ end
39
+
40
+ output
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `php-cs-fixer` against any modified PHP files.
5
+ class PhpCsFixer < Base
6
+ MESSAGE_REGEX = /\s+\d+\)\s+(?<file>.*\.php)(?<violated_rules>\s+\(\w+(?:,\s+)?\))?/
7
+
8
+ def run
9
+ messages = []
10
+ feedback = ''
11
+
12
+ # Exit status for all of the runs. Should be zero!
13
+ exit_status_sum = 0
14
+
15
+ applicable_files.each do |file|
16
+ result = execute(command, args: [file])
17
+ output = result.stdout.chomp
18
+ exit_status_sum += result.status
19
+
20
+ if result.status
21
+ messages = output.lstrip.split("\n")
22
+ end
23
+ end
24
+
25
+ unless messages.empty?
26
+ feedback = parse_messages(messages)
27
+ end
28
+
29
+ :pass if exit_status_sum == 0
30
+ :pass if feedback.empty?
31
+
32
+ feedback
33
+ end
34
+
35
+ def parse_messages(messages)
36
+ output = []
37
+
38
+ messages.map do |message|
39
+ message.scan(MESSAGE_REGEX).map do |file, violated_rules|
40
+ type = :error
41
+ unless violated_rules.nil?
42
+ type = :warning
43
+ end
44
+ text = if type == :error
45
+ "Cannot process #{file}: Syntax error"
46
+ else
47
+ "#{file} has been fixed"
48
+ end
49
+
50
+ output << Overcommit::Hook::Message.new(type, file, 0, text)
51
+ end
52
+ end
53
+
54
+ output
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `php -l` against any modified PHP files.
5
+ class PhpLint < Base
6
+ # Sample String
7
+ # rubocop:disable Metrics/LineLength
8
+ # PHP Parse error: syntax error, unexpected 'require_once' (T_REQUIRE_ONCE) in site/sumo.php on line 12
9
+ # rubocop:enable Metrics/LineLength
10
+ MESSAGE_REGEX = /^(?<type>.+)\:\s+(?<message>.+) in (?<file>.+) on line (?<line>\d+)/
11
+
12
+ def run
13
+ # A list of error messages
14
+ messages = []
15
+
16
+ # Exit status for all of the runs. Should be zero!
17
+ exit_status_sum = 0
18
+
19
+ # Run for each of our applicable files
20
+ applicable_files.each do |file|
21
+ result = execute(command, args: [file])
22
+ output = result.stdout.chomp
23
+ exit_status_sum += result.status
24
+ if result.status
25
+ # `php -l` returns with a leading newline, and we only need the first
26
+ # line, there is usually some redundancy
27
+ messages << output.lstrip.split("\n").first
28
+ end
29
+ end
30
+
31
+ # If the sum of all lint status is zero, then none had exit status
32
+ return :pass if exit_status_sum == 0
33
+
34
+ # No messages is great news for us
35
+ return :pass if messages.empty?
36
+
37
+ # Return the list of message objects
38
+ extract_messages(
39
+ messages,
40
+ MESSAGE_REGEX
41
+ )
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `phpstan` against any modified PHP files.
5
+ # For running `phpstan` with Laravel, it requires setup with `ide_helper`.
6
+ #
7
+ # References:
8
+ # https://github.com/phpstan/phpstan/issues/239
9
+ # https://gist.github.com/edmondscommerce/89695c9cd2584fefdf540fb1c528d2c2
10
+ class PhpStan < Base
11
+ MESSAGE_REGEX = /^(?<file>.+)\:(?<line>\d+)\:(?<message>.+)/
12
+
13
+ def run
14
+ messages = []
15
+
16
+ result = execute(command, args: applicable_files)
17
+
18
+ unless result.success?
19
+ messages += result.stdout.lstrip.split("\n")
20
+ end
21
+
22
+ return :pass if messages.empty?
23
+
24
+ extract_messages(
25
+ messages,
26
+ MESSAGE_REGEX
27
+ )
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'overcommit/hook/shared/pronto'
4
+
5
+ module Overcommit::Hook::PreCommit
6
+ # Runs `pronto`
7
+ #
8
+ # @see https://github.com/mmozuras/pronto
9
+ class Pronto < Base
10
+ include Overcommit::Hook::Shared::Pronto
11
+ end
12
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs 'puppet-lint' against any modified Puppet files.
5
+ #
6
+ # @see http://puppet-lint.com/
7
+ class PuppetLint < Base
8
+ MESSAGE_REGEX = /(?<file>(?:\w:)?.+):(?<line>\d+):\d+:(?<type>\w+)/
9
+
10
+ MESSAGE_TYPE_CATEGORIZER = lambda do |type|
11
+ type == 'ERROR' ? :error : :warning
12
+ end
13
+
14
+ def run
15
+ result = execute(command, args: applicable_files)
16
+ output = result.stdout.chomp.gsub(/^"|"$/, '')
17
+ return :pass if result.success? && output.empty?
18
+
19
+ extract_messages(
20
+ output.split("\n"),
21
+ MESSAGE_REGEX,
22
+ MESSAGE_TYPE_CATEGORIZER
23
+ )
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ #
5
+ # Run's the Puppet metadata linter. It has support for adding options
6
+ # in the .overcommit.yaml
7
+ #
8
+ # @see https://voxpupuli.org/blog/2014/11/06/linting-metadata-json/
9
+ #
10
+ class PuppetMetadataJsonLint < Base
11
+ MESSAGE_REGEX = /\((?<type>.*)\).*/
12
+
13
+ MESSAGE_TYPE_CATEGORIZER = lambda do |type|
14
+ type == 'WARN' ? :warning : :error
15
+ end
16
+
17
+ def run
18
+ result = execute(command, args: applicable_files)
19
+ output = result.stdout.chomp.gsub(/^"|"$/, '')
20
+ return :pass if result.success? && output.empty?
21
+
22
+ extract_messages(
23
+ output.split("\n"),
24
+ MESSAGE_REGEX,
25
+ MESSAGE_TYPE_CATEGORIZER
26
+ )
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `pycodestyle` against any modified Python files.
5
+ #
6
+ # @see https://pypi.python.org/pypi/pycodestyle
7
+ class Pycodestyle < Base
8
+ def run
9
+ result = execute(command, args: applicable_files)
10
+ output = result.stdout.chomp
11
+
12
+ return :pass if result.success? && output.empty?
13
+
14
+ # example message:
15
+ # path/to/file.py:88:5: E301 expected 1 blank line, found 0
16
+ extract_messages(
17
+ output.split("\n"),
18
+ /^(?<file>(?:\w:)?[^:]+):(?<line>\d+):\d+:\s(?<type>E|W)/,
19
+ lambda { |type| type.include?('W') ? :warning : :error }
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `pydocstyle` against any modified Python files.
5
+ #
6
+ # @see https://pypi.python.org/pypi/pydocstyle
7
+ class Pydocstyle < Base
8
+ def run
9
+ result = execute(command, args: applicable_files)
10
+ return :pass if result.success?
11
+
12
+ output = result.stderr.chomp
13
+
14
+ # example message:
15
+ # path/to/file.py:1 in public method `foo`:
16
+ # D102: Docstring missing
17
+ extract_messages(
18
+ output.gsub(/:\s+/, ': ').split("\n"),
19
+ /^(?<file>(?:\w:)?[^:]+):(?<line>\d+)/
20
+ )
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `pyflakes` against any modified Python files.
5
+ #
6
+ # @see https://pypi.python.org/pypi/pyflakes
7
+ class Pyflakes < Base
8
+ MESSAGE_REGEX = /^(?<file>(?:\w:)?[^:]+):(?<line>\d+):/
9
+
10
+ def run
11
+ result = execute(command, args: applicable_files)
12
+ return :pass if result.success?
13
+
14
+ errors = get_messages(result.stderr, :error)
15
+ warnings = get_messages(result.stdout, :warning)
16
+
17
+ errors + warnings
18
+ end
19
+
20
+ private
21
+
22
+ def get_messages(output, type)
23
+ # example message:
24
+ # path/to/file.py:57: local variable 'x' is assigned to but never used
25
+ extract_messages(
26
+ output.split("\n").grep(MESSAGE_REGEX),
27
+ MESSAGE_REGEX,
28
+ proc { type }
29
+ )
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Overcommit::Hook::PreCommit
4
+ # Runs `pylint` against any modified Python files.
5
+ #
6
+ # @see http://www.pylint.org/
7
+ class Pylint < Base
8
+ MESSAGE_REGEX = /^(?<file>(?:\w:)?.+):(?<line>\d+):(?<type>[CEFRW])/
9
+
10
+ # Classify 'E' and 'F' message codes as errors,
11
+ # everything else as warnings.
12
+ # http://pylint.readthedocs.org/en/latest/tutorial.html#getting-started
13
+ MESSAGE_TYPE_CATEGORIZER = lambda do |type|
14
+ 'EF'.include?(type) ? :error : :warning
15
+ end
16
+
17
+ def run
18
+ result = execute(command, args: applicable_files)
19
+ return :pass if result.success?
20
+
21
+ output = result.stdout.chomp
22
+
23
+ # example message:
24
+ # path/to/file.py:64:C: Missing function docstring (missing-docstring)
25
+ extract_messages(
26
+ output.split("\n").grep(MESSAGE_REGEX),
27
+ MESSAGE_REGEX,
28
+ MESSAGE_TYPE_CATEGORIZER
29
+ )
30
+ end
31
+ end
32
+ end