overcommit 0.5.0 → 0.6.0

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/bin/overcommit +3 -4
  3. data/config/default.yml +139 -0
  4. data/lib/overcommit.rb +7 -5
  5. data/lib/overcommit/cli.rb +59 -64
  6. data/lib/overcommit/configuration.rb +108 -34
  7. data/lib/overcommit/configuration_loader.rb +47 -0
  8. data/lib/overcommit/constants.rb +7 -0
  9. data/lib/overcommit/exceptions.rb +16 -0
  10. data/lib/overcommit/hook/base.rb +91 -0
  11. data/lib/overcommit/hook/commit_msg/base.rb +11 -0
  12. data/lib/overcommit/hook/commit_msg/gerrit_change_id.rb +18 -0
  13. data/lib/overcommit/{plugins → hook}/commit_msg/hard_tabs.rb +5 -6
  14. data/lib/overcommit/hook/commit_msg/russian_novel.rb +14 -0
  15. data/lib/overcommit/hook/commit_msg/single_line_subject.rb +12 -0
  16. data/lib/overcommit/hook/commit_msg/text_width.rb +20 -0
  17. data/lib/overcommit/hook/commit_msg/trailing_period.rb +12 -0
  18. data/lib/overcommit/hook/post_checkout/base.rb +11 -0
  19. data/lib/overcommit/hook/post_checkout/bundle_check.rb +29 -0
  20. data/lib/overcommit/hook/post_checkout/index_tags.rb +24 -0
  21. data/lib/overcommit/hook/pre_commit/author_email.rb +17 -0
  22. data/lib/overcommit/hook/pre_commit/author_name.rb +17 -0
  23. data/lib/overcommit/hook/pre_commit/base.rb +10 -0
  24. data/lib/overcommit/hook/pre_commit/bundle_check.rb +30 -0
  25. data/lib/overcommit/hook/pre_commit/coffee_lint.rb +14 -0
  26. data/lib/overcommit/hook/pre_commit/css_lint.rb +16 -0
  27. data/lib/overcommit/hook/pre_commit/haml_lint.rb +26 -0
  28. data/lib/overcommit/hook/pre_commit/hard_tabs.rb +16 -0
  29. data/lib/overcommit/hook/pre_commit/image_optim.rb +41 -0
  30. data/lib/overcommit/hook/pre_commit/js_hint.rb +15 -0
  31. data/lib/overcommit/hook/pre_commit/jscs.rb +31 -0
  32. data/lib/overcommit/hook/pre_commit/python_flake8.rb +14 -0
  33. data/lib/overcommit/hook/pre_commit/rubocop.rb +26 -0
  34. data/lib/overcommit/hook/pre_commit/scss_lint.rb +26 -0
  35. data/lib/overcommit/hook/pre_commit/trailing_whitespace.rb +15 -0
  36. data/lib/overcommit/hook/pre_commit/yaml_syntax.rb +22 -0
  37. data/lib/overcommit/hook_context.rb +16 -0
  38. data/lib/overcommit/hook_context/base.rb +68 -0
  39. data/lib/overcommit/hook_context/commit_msg.rb +32 -0
  40. data/lib/overcommit/hook_context/post_checkout.rb +24 -0
  41. data/lib/overcommit/hook_context/pre_commit.rb +96 -0
  42. data/lib/overcommit/hook_runner.rb +150 -0
  43. data/lib/overcommit/installer.rb +61 -68
  44. data/lib/overcommit/logger.rb +16 -13
  45. data/lib/overcommit/utils.rb +63 -38
  46. data/lib/overcommit/version.rb +1 -1
  47. data/{bin/scripts → libexec}/gerrit-change-id +0 -0
  48. data/{bin/scripts → libexec}/index-tags +1 -3
  49. data/template-dir/hooks/commit-msg +83 -0
  50. data/template-dir/hooks/overcommit-hook +83 -0
  51. data/template-dir/hooks/post-checkout +83 -0
  52. data/template-dir/hooks/pre-commit +83 -0
  53. metadata +76 -57
  54. data/bin/hooks/commit-msg +0 -8
  55. data/bin/hooks/post-checkout +0 -9
  56. data/bin/hooks/post-merge +0 -23
  57. data/bin/hooks/pre-commit +0 -8
  58. data/bin/hooks/prepare-commit-msg +0 -159
  59. data/bin/run-hook +0 -8
  60. data/bin/scripts/check-gemfile +0 -9
  61. data/bin/scripts/csslint-rhino.js +0 -9080
  62. data/bin/scripts/jshint.js +0 -5921
  63. data/bin/scripts/jshint_runner.js +0 -42
  64. data/lib/overcommit/errors.rb +0 -3
  65. data/lib/overcommit/git_hook.rb +0 -89
  66. data/lib/overcommit/hook_specific_check.rb +0 -110
  67. data/lib/overcommit/hooks/commit_msg.rb +0 -7
  68. data/lib/overcommit/hooks/pre_commit.rb +0 -9
  69. data/lib/overcommit/plugins/commit_msg/change_id.rb +0 -15
  70. data/lib/overcommit/plugins/commit_msg/release_note.rb +0 -25
  71. data/lib/overcommit/plugins/commit_msg/russian_novel.rb +0 -16
  72. data/lib/overcommit/plugins/commit_msg/single_line_subject.rb +0 -13
  73. data/lib/overcommit/plugins/commit_msg/text_width.rb +0 -20
  74. data/lib/overcommit/plugins/commit_msg/trailing_period.rb +0 -13
  75. data/lib/overcommit/plugins/pre_commit/author_name.rb +0 -16
  76. data/lib/overcommit/plugins/pre_commit/causes_email.rb +0 -15
  77. data/lib/overcommit/plugins/pre_commit/coffee_lint.rb +0 -16
  78. data/lib/overcommit/plugins/pre_commit/css_linter.rb +0 -17
  79. data/lib/overcommit/plugins/pre_commit/haml_style.rb +0 -34
  80. data/lib/overcommit/plugins/pre_commit/haml_syntax.rb +0 -24
  81. data/lib/overcommit/plugins/pre_commit/image_optimization.rb +0 -50
  82. data/lib/overcommit/plugins/pre_commit/js_console_log.rb +0 -16
  83. data/lib/overcommit/plugins/pre_commit/js_syntax.rb +0 -30
  84. data/lib/overcommit/plugins/pre_commit/python_flake8.rb +0 -15
  85. data/lib/overcommit/plugins/pre_commit/ruby_style.rb +0 -67
  86. data/lib/overcommit/plugins/pre_commit/ruby_syntax.rb +0 -19
  87. data/lib/overcommit/plugins/pre_commit/scss_lint.rb +0 -66
  88. data/lib/overcommit/plugins/pre_commit/test_history.rb +0 -58
  89. data/lib/overcommit/plugins/pre_commit/whitespace.rb +0 -21
  90. data/lib/overcommit/plugins/pre_commit/yaml_syntax.rb +0 -22
  91. data/lib/overcommit/reporter.rb +0 -90
  92. data/lib/overcommit/staged_file.rb +0 -86
@@ -1,42 +0,0 @@
1
- /**
2
- * @author kamil@causes.com
3
- *
4
- * This is a script to run jshint against files passed in via
5
- * command line arguments
6
- **/
7
-
8
- if (typeof JSHINT === "undefined") {
9
- print("jshint not available. Make sure it was included properly.");
10
- quit();
11
- }
12
-
13
- // Options:
14
- // https://gist.github.com/1489652
15
-
16
- var i, j, file, source, result, error,
17
- options = {
18
- boss: true,
19
- curly: true,
20
- eqeqeq: true,
21
- forin: true,
22
- newcap: true
23
- };
24
-
25
- for (i = 0; i < arguments.length; i++) {
26
-
27
- file = arguments[i];
28
- source = readFile(file);
29
- result = JSHINT(source, options);
30
-
31
- if (!result) {
32
- for (j = 0; j < JSHINT.errors.length; j++) {
33
- error = JSHINT.errors[j];
34
-
35
- print(file + ": line " + error.line + ", col " + error.character + ", " +
36
- error.reason);
37
- print("\t" + error.evidence);
38
- }
39
- }
40
- }
41
-
42
-
@@ -1,3 +0,0 @@
1
- class NotAGitRepoError < StandardError
2
- # Nothing to see here
3
- end
@@ -1,89 +0,0 @@
1
- module Overcommit
2
- module GitHook
3
- class BaseHook
4
- def initialize
5
- Overcommit.config.desired_plugins.each do |plugin|
6
- require plugin
7
- end
8
- rescue LoadError, NameError => ex
9
- log.error "Couldn't load plugin: #{ex}"
10
- exit 0
11
- end
12
-
13
- def run(*args)
14
- # Support 'bare' installation where we don't have any hooks yet.
15
- # Silently pass.
16
- exit unless (checks = registered_checks) && checks.any?
17
-
18
- exit if requires_modified_files? && Utils.modified_files.empty?
19
-
20
- reporter = Reporter.new(Overcommit::Utils.hook_name, checks)
21
-
22
- reporter.print_header
23
-
24
- checks.each do |check_class|
25
- check = check_class.new(*args)
26
- next if check.skip?
27
-
28
- # Ignore a check if it only applies to a specific file type and there
29
- # are no staged files of that type in the tree
30
- next if check_class.filetypes && check.staged.empty?
31
-
32
- reporter.with_status(check) do
33
- run_and_filter_check(check)
34
- end
35
- end
36
-
37
- reporter.print_result
38
- end
39
-
40
- def skip_checks
41
- @skip_checks ||= ENV.fetch('SKIP_CHECKS', '').split(/[:, ]/)
42
- end
43
-
44
- private
45
-
46
- def log
47
- Logger.instance
48
- end
49
-
50
- # Return all loaded plugins, skipping those that are skippable and have
51
- # been asked to be skipped by the environment variable SKIP_CHECKS.
52
- #
53
- # Note that required checks are not skipped even if
54
- # `ENV['SKIP_CHECKS'] == 'all'`
55
- def registered_checks
56
- @registered_checks ||= begin
57
- skip_all = skip_checks.include? 'all'
58
- HookRegistry.checks.reject do |check|
59
- hook_name = Utils.underscorize(check.name).split('/').last
60
-
61
- check.skippable? && (skip_all || skip_checks.include?(hook_name))
62
- end.sort_by(&:name)
63
- end
64
- end
65
-
66
- # If true, only run this check when there are modified files.
67
- def requires_modified_files?
68
- false
69
- end
70
-
71
- # Filters temporary staged file names from the output of the check and
72
- # replaces them with their original filenames.
73
- def run_and_filter_check(check)
74
- status, output = check.run_check
75
-
76
- # Some checks output a list of lines. Join those lines together with newlines.
77
- output = Array[output].flatten.join("\n")
78
-
79
- unless output.empty?
80
- check.staged.each do |staged_file|
81
- output = staged_file.filter_string(output)
82
- end
83
- end
84
-
85
- [status, output]
86
- end
87
- end
88
- end
89
- end
@@ -1,110 +0,0 @@
1
- module Overcommit
2
- module GitHook
3
- module HookRegistry
4
- @checks = []
5
- class << self
6
- attr_reader :checks
7
-
8
- def included(base)
9
- @checks << base
10
- end
11
- end
12
- end
13
-
14
- class HookSpecificCheck
15
- class << self
16
- attr_accessor :filetypes, :stealth, :required
17
-
18
- def stealth!
19
- self.stealth = true
20
- end
21
-
22
- def required!
23
- self.required = true
24
- end
25
-
26
- # Can the check be skipped by environment variables? This can always be
27
- # overriden with `--no-verify`.
28
- def skippable?
29
- !required
30
- end
31
-
32
- def friendly_name
33
- Overcommit::Utils.underscorize name.to_s.split('::').last
34
- end
35
- end
36
-
37
- def initialize(*args)
38
- @arguments = args
39
- end
40
-
41
- def name
42
- self.class.friendly_name
43
- end
44
-
45
- def skip?
46
- false
47
- end
48
-
49
- def stealth?
50
- self.class.stealth
51
- end
52
-
53
- def staged
54
- @staged ||= modified_files.map do |filename|
55
- filetypes = Array(self.class.filetypes).map { |type| ".#{type}" }
56
- if filetypes.empty? || filename.end_with?(*filetypes)
57
- StagedFile.new(filename)
58
- end
59
- end.compact
60
- end
61
-
62
- def run_check
63
- [:bad, 'No checks defined!']
64
- end
65
-
66
- private
67
-
68
- def modified_files
69
- Overcommit::Utils.modified_files
70
- end
71
-
72
- def in_path?(cmd)
73
- exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
74
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
75
- exts.each do |ext|
76
- exe = File.join(path, "#{cmd}#{ext}")
77
- return true if File.executable? exe
78
- end
79
- end
80
- false
81
- end
82
-
83
- def commit_message_file
84
- unless @arguments[0] && ::File.exist?(@arguments[0])
85
- fail 'Not running in the context of a commit message'
86
- end
87
-
88
- @arguments[0]
89
- end
90
-
91
- def raw_commit_message
92
- @raw_commit_message ||= ::IO.readlines(commit_message_file)
93
- end
94
-
95
- # Strip comments and diff (from git-commit --verbose)
96
- def commit_message
97
- @commit_message ||= raw_commit_message.
98
- reject { |line| line =~ /^#/ }.
99
- take_while { |line| !line.start_with?('diff --git') }
100
- end
101
-
102
- class << self
103
- def file_type(*types)
104
- self.filetypes = types
105
- end
106
- alias file_types file_type
107
- end
108
- end
109
- end
110
- end
@@ -1,7 +0,0 @@
1
- module Overcommit
2
- class CommitMessageHook < GitHook::BaseHook
3
- # No special behavior
4
- end
5
-
6
- Utils.register_hook(CommitMessageHook)
7
- end
@@ -1,9 +0,0 @@
1
- module Overcommit
2
- class PreCommitHook < GitHook::BaseHook
3
- def requires_modified_files?
4
- true
5
- end
6
- end
7
-
8
- Utils.register_hook(PreCommitHook)
9
- end
@@ -1,15 +0,0 @@
1
- module Overcommit::GitHook
2
- class ChangeID < HookSpecificCheck
3
- include HookRegistry
4
-
5
- stealth! # Not really a 'check', but we need it to run
6
- required! # Not skipped when ENV['SKIP_CHECKS'] == 'all'
7
-
8
- SCRIPT_LOCATION = Overcommit::Utils.script_path 'gerrit-change-id'
9
-
10
- def run_check
11
- system `#{SCRIPT_LOCATION} #{@arguments.join(' ')}`
12
- :good
13
- end
14
- end
15
- end
@@ -1,25 +0,0 @@
1
- module Overcommit::GitHook
2
- class ReleaseNote < HookSpecificCheck
3
- include HookRegistry
4
-
5
- EMPTY_RELEASE_NOTE = /^release notes?\s*[:.]?\n{2,}/im
6
- def run_check
7
- if commit_message.join =~ EMPTY_RELEASE_NOTE
8
- strip_release_note
9
- return :warn, 'Empty release note found, automatically removed'
10
- end
11
-
12
- :good
13
- end
14
-
15
- private
16
-
17
- def strip_release_note
18
- stripped_message = commit_message.join.sub(EMPTY_RELEASE_NOTE, '')
19
-
20
- ::File.open(commit_message_file, 'w') do |file|
21
- file.write(stripped_message)
22
- end
23
- end
24
- end
25
- end
@@ -1,16 +0,0 @@
1
- module Overcommit::GitHook
2
- class RussianNovel < HookSpecificCheck
3
- include HookRegistry
4
-
5
- stealth!
6
-
7
- RUSSIAN_NOVEL_LENGTH = 30
8
- def run_check
9
- if commit_message.length > RUSSIAN_NOVEL_LENGTH
10
- return :warn, 'You seem to have authored a Russian novel; congratulations!'
11
- end
12
-
13
- :good
14
- end
15
- end
16
- end
@@ -1,13 +0,0 @@
1
- module Overcommit::GitHook
2
- class SingleLineSubject < HookSpecificCheck
3
- include HookRegistry
4
-
5
- def run_check
6
- unless commit_message[1].to_s.strip.empty?
7
- return :warn, 'Subject should be a single line'
8
- end
9
-
10
- :good
11
- end
12
- end
13
- end
@@ -1,20 +0,0 @@
1
- module Overcommit::GitHook
2
- class TextWidth < HookSpecificCheck
3
- include HookRegistry
4
-
5
- def run_check
6
- if commit_message.first.size > 60
7
- return :warn, 'Please keep the subject < ~60 characters'
8
- end
9
-
10
- commit_message.each do |line|
11
- chomped = line.chomp
12
- if chomped.size > 72
13
- return :warn, "> 72 characters, please hard wrap: '#{chomped}'"
14
- end
15
- end
16
-
17
- :good
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- module Overcommit::GitHook
2
- class TrailingPeriod < HookSpecificCheck
3
- include HookRegistry
4
-
5
- def run_check
6
- if commit_message[0].rstrip.end_with?('.')
7
- return :warn, 'Please omit trailing period from commit message subject'
8
- end
9
-
10
- :good
11
- end
12
- end
13
- end
@@ -1,16 +0,0 @@
1
- module Overcommit::GitHook
2
- class AuthorName < HookSpecificCheck
3
- include HookRegistry
4
-
5
- def run_check
6
- name = `git config --get user.name`.chomp
7
- unless name.split(' ').count >= 2
8
- return :bad, "Author must have at least first and last name; " <<
9
- "was: '#{name}'.\n Set your name with " <<
10
- "`git config --global user.name 'Your Name'`"
11
- end
12
-
13
- :good
14
- end
15
- end
16
- end
@@ -1,15 +0,0 @@
1
- module Overcommit::GitHook
2
- class CausesEmail < HookSpecificCheck
3
- include HookRegistry
4
-
5
- def run_check
6
- email = `git config --get user.email`.chomp
7
- unless email =~ /@causes\.com$/
8
- return :bad, "Author must use a causes.com address; was '#{email}'.\n" <<
9
- "Set user with `git config --global user.email YOUR_EMAIL@causes.com`"
10
- end
11
-
12
- :good
13
- end
14
- end
15
- end
@@ -1,16 +0,0 @@
1
- module Overcommit::GitHook
2
- class CoffeeLint < HookSpecificCheck
3
- include HookRegistry
4
- file_type :coffee
5
-
6
- def run_check
7
- unless in_path? 'coffeelint'
8
- return :warn, 'Run `npm install -g coffeelint`'
9
- end
10
-
11
- paths = staged.collect(&:path).join(' ')
12
- output = `coffeelint --quiet #{paths}`.split("\n")
13
- return ($?.success? ? :good : :bad), output
14
- end
15
- end
16
- end
@@ -1,17 +0,0 @@
1
- module Overcommit::GitHook
2
- class CssLinter < HookSpecificCheck
3
- include HookRegistry
4
- file_type :css
5
-
6
- CSS_LINTER_PATH = Overcommit::Utils.script_path 'csslint-rhino.js'
7
-
8
- def run_check
9
- return :warn, "Rhino is not installed" unless in_path? 'rhino'
10
-
11
- paths = staged.collect(&:path).join(' ')
12
-
13
- output = `rhino #{CSS_LINTER_PATH} --quiet --format=compact #{paths} | grep 'Error - '`
14
- return (output !~ /Error - (?!Unknown @ rule)/ ? :good : :bad), output
15
- end
16
- end
17
- end