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.
- checksums.yaml +7 -0
- data/bin/overcommit +50 -0
- data/config/default.yml +1356 -0
- data/config/starter.yml +33 -0
- data/lib/overcommit.rb +26 -0
- data/lib/overcommit/cli.rb +223 -0
- data/lib/overcommit/command_splitter.rb +146 -0
- data/lib/overcommit/configuration.rb +350 -0
- data/lib/overcommit/configuration_loader.rb +96 -0
- data/lib/overcommit/configuration_validator.rb +186 -0
- data/lib/overcommit/constants.rb +12 -0
- data/lib/overcommit/exceptions.rb +52 -0
- data/lib/overcommit/git_config.rb +22 -0
- data/lib/overcommit/git_repo.rb +286 -0
- data/lib/overcommit/git_version.rb +17 -0
- data/lib/overcommit/hook/base.rb +294 -0
- data/lib/overcommit/hook/commit_msg/base.rb +14 -0
- data/lib/overcommit/hook/commit_msg/capitalized_subject.rb +25 -0
- data/lib/overcommit/hook/commit_msg/empty_message.rb +12 -0
- data/lib/overcommit/hook/commit_msg/gerrit_change_id.rb +22 -0
- data/lib/overcommit/hook/commit_msg/hard_tabs.rb +17 -0
- data/lib/overcommit/hook/commit_msg/message_format.rb +31 -0
- data/lib/overcommit/hook/commit_msg/russian_novel.rb +16 -0
- data/lib/overcommit/hook/commit_msg/single_line_subject.rb +16 -0
- data/lib/overcommit/hook/commit_msg/spell_check.rb +45 -0
- data/lib/overcommit/hook/commit_msg/text_width.rb +56 -0
- data/lib/overcommit/hook/commit_msg/trailing_period.rb +16 -0
- data/lib/overcommit/hook/post_checkout/base.rb +22 -0
- data/lib/overcommit/hook/post_checkout/bower_install.rb +13 -0
- data/lib/overcommit/hook/post_checkout/bundle_install.rb +13 -0
- data/lib/overcommit/hook/post_checkout/composer_install.rb +13 -0
- data/lib/overcommit/hook/post_checkout/index_tags.rb +12 -0
- data/lib/overcommit/hook/post_checkout/npm_install.rb +13 -0
- data/lib/overcommit/hook/post_checkout/submodule_status.rb +12 -0
- data/lib/overcommit/hook/post_checkout/yarn_install.rb +13 -0
- data/lib/overcommit/hook/post_commit/base.rb +12 -0
- data/lib/overcommit/hook/post_commit/bower_install.rb +13 -0
- data/lib/overcommit/hook/post_commit/bundle_install.rb +13 -0
- data/lib/overcommit/hook/post_commit/commitplease.rb +16 -0
- data/lib/overcommit/hook/post_commit/composer_install.rb +13 -0
- data/lib/overcommit/hook/post_commit/git_guilt.rb +43 -0
- data/lib/overcommit/hook/post_commit/index_tags.rb +12 -0
- data/lib/overcommit/hook/post_commit/npm_install.rb +13 -0
- data/lib/overcommit/hook/post_commit/submodule_status.rb +12 -0
- data/lib/overcommit/hook/post_commit/yarn_install.rb +13 -0
- data/lib/overcommit/hook/post_merge/base.rb +12 -0
- data/lib/overcommit/hook/post_merge/bower_install.rb +13 -0
- data/lib/overcommit/hook/post_merge/bundle_install.rb +13 -0
- data/lib/overcommit/hook/post_merge/composer_install.rb +13 -0
- data/lib/overcommit/hook/post_merge/index_tags.rb +12 -0
- data/lib/overcommit/hook/post_merge/npm_install.rb +13 -0
- data/lib/overcommit/hook/post_merge/submodule_status.rb +12 -0
- data/lib/overcommit/hook/post_merge/yarn_install.rb +13 -0
- data/lib/overcommit/hook/post_rewrite/base.rb +12 -0
- data/lib/overcommit/hook/post_rewrite/bower_install.rb +13 -0
- data/lib/overcommit/hook/post_rewrite/bundle_install.rb +13 -0
- data/lib/overcommit/hook/post_rewrite/composer_install.rb +13 -0
- data/lib/overcommit/hook/post_rewrite/index_tags.rb +19 -0
- data/lib/overcommit/hook/post_rewrite/npm_install.rb +13 -0
- data/lib/overcommit/hook/post_rewrite/submodule_status.rb +12 -0
- data/lib/overcommit/hook/post_rewrite/yarn_install.rb +13 -0
- data/lib/overcommit/hook/pre_commit/author_email.rb +26 -0
- data/lib/overcommit/hook/pre_commit/author_name.rb +25 -0
- data/lib/overcommit/hook/pre_commit/base.rb +19 -0
- data/lib/overcommit/hook/pre_commit/berksfile_check.rb +24 -0
- data/lib/overcommit/hook/pre_commit/broken_symlinks.rb +17 -0
- data/lib/overcommit/hook/pre_commit/bundle_audit.rb +24 -0
- data/lib/overcommit/hook/pre_commit/bundle_check.rb +32 -0
- data/lib/overcommit/hook/pre_commit/bundle_outdated.rb +25 -0
- data/lib/overcommit/hook/pre_commit/case_conflicts.rb +27 -0
- data/lib/overcommit/hook/pre_commit/chamber_compare.rb +43 -0
- data/lib/overcommit/hook/pre_commit/chamber_security.rb +15 -0
- data/lib/overcommit/hook/pre_commit/chamber_verification.rb +36 -0
- data/lib/overcommit/hook/pre_commit/code_spell_check.rb +36 -0
- data/lib/overcommit/hook/pre_commit/coffee_lint.rb +35 -0
- data/lib/overcommit/hook/pre_commit/cook_style.rb +35 -0
- data/lib/overcommit/hook/pre_commit/credo.rb +27 -0
- data/lib/overcommit/hook/pre_commit/css_lint.rb +26 -0
- data/lib/overcommit/hook/pre_commit/dogma.rb +33 -0
- data/lib/overcommit/hook/pre_commit/es_lint.rb +38 -0
- data/lib/overcommit/hook/pre_commit/execute_permissions.rb +76 -0
- data/lib/overcommit/hook/pre_commit/fasterer.rb +25 -0
- data/lib/overcommit/hook/pre_commit/file_size.rb +47 -0
- data/lib/overcommit/hook/pre_commit/fix_me.rb +17 -0
- data/lib/overcommit/hook/pre_commit/flay.rb +38 -0
- data/lib/overcommit/hook/pre_commit/foodcritic.rb +149 -0
- data/lib/overcommit/hook/pre_commit/forbidden_branches.rb +26 -0
- data/lib/overcommit/hook/pre_commit/ginkgo_focus.rb +23 -0
- data/lib/overcommit/hook/pre_commit/go_fmt.rb +17 -0
- data/lib/overcommit/hook/pre_commit/go_lint.rb +29 -0
- data/lib/overcommit/hook/pre_commit/go_vet.rb +24 -0
- data/lib/overcommit/hook/pre_commit/golangci_lint.rb +21 -0
- data/lib/overcommit/hook/pre_commit/hadolint.rb +27 -0
- data/lib/overcommit/hook/pre_commit/haml_lint.rb +23 -0
- data/lib/overcommit/hook/pre_commit/hard_tabs.rb +15 -0
- data/lib/overcommit/hook/pre_commit/hlint.rb +34 -0
- data/lib/overcommit/hook/pre_commit/html_hint.rb +23 -0
- data/lib/overcommit/hook/pre_commit/html_tidy.rb +30 -0
- data/lib/overcommit/hook/pre_commit/image_optim.rb +28 -0
- data/lib/overcommit/hook/pre_commit/java_checkstyle.rb +27 -0
- data/lib/overcommit/hook/pre_commit/js_hint.rb +23 -0
- data/lib/overcommit/hook/pre_commit/js_lint.rb +22 -0
- data/lib/overcommit/hook/pre_commit/jscs.rb +27 -0
- data/lib/overcommit/hook/pre_commit/jsl.rb +28 -0
- data/lib/overcommit/hook/pre_commit/json_syntax.rb +21 -0
- data/lib/overcommit/hook/pre_commit/kt_lint.rb +19 -0
- data/lib/overcommit/hook/pre_commit/license_finder.rb +14 -0
- data/lib/overcommit/hook/pre_commit/license_header.rb +48 -0
- data/lib/overcommit/hook/pre_commit/line_endings.rb +77 -0
- data/lib/overcommit/hook/pre_commit/local_paths_in_gemfile.rb +16 -0
- data/lib/overcommit/hook/pre_commit/mdl.rb +29 -0
- data/lib/overcommit/hook/pre_commit/merge_conflicts.rb +16 -0
- data/lib/overcommit/hook/pre_commit/nginx_test.rb +26 -0
- data/lib/overcommit/hook/pre_commit/pep257.rb +23 -0
- data/lib/overcommit/hook/pre_commit/pep8.rb +23 -0
- data/lib/overcommit/hook/pre_commit/php_cs.rb +43 -0
- data/lib/overcommit/hook/pre_commit/php_cs_fixer.rb +57 -0
- data/lib/overcommit/hook/pre_commit/php_lint.rb +44 -0
- data/lib/overcommit/hook/pre_commit/php_stan.rb +30 -0
- data/lib/overcommit/hook/pre_commit/pronto.rb +12 -0
- data/lib/overcommit/hook/pre_commit/puppet_lint.rb +26 -0
- data/lib/overcommit/hook/pre_commit/puppet_metadata_json_lint.rb +29 -0
- data/lib/overcommit/hook/pre_commit/pycodestyle.rb +23 -0
- data/lib/overcommit/hook/pre_commit/pydocstyle.rb +23 -0
- data/lib/overcommit/hook/pre_commit/pyflakes.rb +32 -0
- data/lib/overcommit/hook/pre_commit/pylint.rb +32 -0
- data/lib/overcommit/hook/pre_commit/python_flake8.rb +32 -0
- data/lib/overcommit/hook/pre_commit/rails_best_practices.rb +34 -0
- data/lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb +58 -0
- data/lib/overcommit/hook/pre_commit/rake_target.rb +12 -0
- data/lib/overcommit/hook/pre_commit/reek.rb +26 -0
- data/lib/overcommit/hook/pre_commit/rst_lint.rb +27 -0
- data/lib/overcommit/hook/pre_commit/rubo_cop.rb +35 -0
- data/lib/overcommit/hook/pre_commit/ruby_lint.rb +23 -0
- data/lib/overcommit/hook/pre_commit/ruby_syntax.rb +27 -0
- data/lib/overcommit/hook/pre_commit/scalariform.rb +22 -0
- data/lib/overcommit/hook/pre_commit/scalastyle.rb +31 -0
- data/lib/overcommit/hook/pre_commit/scss_lint.rb +43 -0
- data/lib/overcommit/hook/pre_commit/semi_standard.rb +23 -0
- data/lib/overcommit/hook/pre_commit/shell_check.rb +23 -0
- data/lib/overcommit/hook/pre_commit/slim_lint.rb +23 -0
- data/lib/overcommit/hook/pre_commit/sqlint.rb +26 -0
- data/lib/overcommit/hook/pre_commit/standard.rb +23 -0
- data/lib/overcommit/hook/pre_commit/stylelint.rb +23 -0
- data/lib/overcommit/hook/pre_commit/swift_lint.rb +19 -0
- data/lib/overcommit/hook/pre_commit/terraform_format.rb +19 -0
- data/lib/overcommit/hook/pre_commit/trailing_whitespace.rb +15 -0
- data/lib/overcommit/hook/pre_commit/travis_lint.rb +15 -0
- data/lib/overcommit/hook/pre_commit/ts_lint.rb +28 -0
- data/lib/overcommit/hook/pre_commit/vint.rb +22 -0
- data/lib/overcommit/hook/pre_commit/w3c_css.rb +67 -0
- data/lib/overcommit/hook/pre_commit/w3c_html.rb +64 -0
- data/lib/overcommit/hook/pre_commit/xml_lint.rb +24 -0
- data/lib/overcommit/hook/pre_commit/xml_syntax.rb +21 -0
- data/lib/overcommit/hook/pre_commit/yaml_lint.rb +18 -0
- data/lib/overcommit/hook/pre_commit/yaml_syntax.rb +20 -0
- data/lib/overcommit/hook/pre_commit/yard_coverage.rb +90 -0
- data/lib/overcommit/hook/pre_commit/yarn_check.rb +37 -0
- data/lib/overcommit/hook/pre_push/base.rb +33 -0
- data/lib/overcommit/hook/pre_push/brakeman.rb +15 -0
- data/lib/overcommit/hook/pre_push/cargo_test.rb +12 -0
- data/lib/overcommit/hook/pre_push/go_test.rb +14 -0
- data/lib/overcommit/hook/pre_push/golangci_lint.rb +16 -0
- data/lib/overcommit/hook/pre_push/minitest.rb +20 -0
- data/lib/overcommit/hook/pre_push/php_unit.rb +16 -0
- data/lib/overcommit/hook/pre_push/pronto.rb +12 -0
- data/lib/overcommit/hook/pre_push/protected_branches.rb +74 -0
- data/lib/overcommit/hook/pre_push/pytest.rb +16 -0
- data/lib/overcommit/hook/pre_push/python_nose.rb +16 -0
- data/lib/overcommit/hook/pre_push/r_spec.rb +16 -0
- data/lib/overcommit/hook/pre_push/rake_target.rb +12 -0
- data/lib/overcommit/hook/pre_push/test_unit.rb +16 -0
- data/lib/overcommit/hook/pre_rebase/base.rb +14 -0
- data/lib/overcommit/hook/pre_rebase/merged_commits.rb +31 -0
- data/lib/overcommit/hook/prepare_commit_msg/base.rb +25 -0
- data/lib/overcommit/hook/prepare_commit_msg/replace_branch.rb +57 -0
- data/lib/overcommit/hook/shared/bower_install.rb +15 -0
- data/lib/overcommit/hook/shared/bundle_install.rb +15 -0
- data/lib/overcommit/hook/shared/composer_install.rb +15 -0
- data/lib/overcommit/hook/shared/index_tags.rb +14 -0
- data/lib/overcommit/hook/shared/npm_install.rb +15 -0
- data/lib/overcommit/hook/shared/pronto.rb +21 -0
- data/lib/overcommit/hook/shared/rake_target.rb +26 -0
- data/lib/overcommit/hook/shared/submodule_status.rb +32 -0
- data/lib/overcommit/hook/shared/yarn_install.rb +15 -0
- data/lib/overcommit/hook_context.rb +19 -0
- data/lib/overcommit/hook_context/base.rb +139 -0
- data/lib/overcommit/hook_context/commit_msg.rb +48 -0
- data/lib/overcommit/hook_context/post_checkout.rb +36 -0
- data/lib/overcommit/hook_context/post_commit.rb +33 -0
- data/lib/overcommit/hook_context/post_merge.rb +37 -0
- data/lib/overcommit/hook_context/post_rewrite.rb +49 -0
- data/lib/overcommit/hook_context/pre_commit.rb +212 -0
- data/lib/overcommit/hook_context/pre_push.rb +89 -0
- data/lib/overcommit/hook_context/pre_rebase.rb +38 -0
- data/lib/overcommit/hook_context/prepare_commit_msg.rb +34 -0
- data/lib/overcommit/hook_context/run_all.rb +48 -0
- data/lib/overcommit/hook_loader/base.rb +48 -0
- data/lib/overcommit/hook_loader/built_in_hook_loader.rb +14 -0
- data/lib/overcommit/hook_loader/plugin_hook_loader.rb +102 -0
- data/lib/overcommit/hook_runner.rb +219 -0
- data/lib/overcommit/hook_signer.rb +123 -0
- data/lib/overcommit/installer.rb +193 -0
- data/lib/overcommit/interrupt_handler.rb +91 -0
- data/lib/overcommit/logger.rb +92 -0
- data/lib/overcommit/message_processor.rb +148 -0
- data/lib/overcommit/os.rb +38 -0
- data/lib/overcommit/printer.rb +145 -0
- data/lib/overcommit/subprocess.rb +98 -0
- data/lib/overcommit/utils.rb +309 -0
- data/lib/overcommit/utils/file_utils.rb +71 -0
- data/lib/overcommit/utils/messages_utils.rb +77 -0
- data/lib/overcommit/version.rb +6 -0
- data/libexec/gerrit-change-id +174 -0
- data/libexec/index-tags +17 -0
- data/template-dir/hooks/commit-msg +116 -0
- data/template-dir/hooks/overcommit-hook +116 -0
- data/template-dir/hooks/post-checkout +116 -0
- data/template-dir/hooks/post-commit +116 -0
- data/template-dir/hooks/post-merge +116 -0
- data/template-dir/hooks/post-rewrite +116 -0
- data/template-dir/hooks/pre-commit +116 -0
- data/template-dir/hooks/pre-push +116 -0
- data/template-dir/hooks/pre-rebase +116 -0
- data/template-dir/hooks/prepare-commit-msg +116 -0
- 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
|