overcommit 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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