overcommit 0.23.0 → 0.24.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.
- checksums.yaml +4 -4
- data/bin/overcommit +1 -1
- data/config/default.yml +154 -18
- data/config/starter.yml +3 -3
- data/lib/overcommit.rb +2 -1
- data/lib/overcommit/cli.rb +11 -8
- data/lib/overcommit/configuration.rb +18 -4
- data/lib/overcommit/configuration_loader.rb +45 -28
- data/lib/overcommit/configuration_validator.rb +33 -1
- data/lib/overcommit/constants.rb +5 -3
- data/lib/overcommit/exceptions.rb +3 -0
- data/lib/overcommit/git_repo.rb +116 -0
- data/lib/overcommit/git_version.rb +15 -0
- data/lib/overcommit/hook/base.rb +42 -5
- data/lib/overcommit/hook/commit_msg/capitalized_subject.rb +13 -0
- data/lib/overcommit/hook/commit_msg/spell_check.rb +41 -0
- data/lib/overcommit/hook/post_checkout/submodule_status.rb +30 -0
- data/lib/overcommit/hook/post_commit/submodule_status.rb +30 -0
- data/lib/overcommit/hook/post_merge/submodule_status.rb +30 -0
- data/lib/overcommit/hook/post_rewrite/submodule_status.rb +30 -0
- data/lib/overcommit/hook/pre_commit/base.rb +2 -2
- data/lib/overcommit/hook/pre_commit/bundle_check.rb +1 -1
- data/lib/overcommit/hook/pre_commit/case_conflicts.rb +20 -0
- data/lib/overcommit/hook/pre_commit/coffee_lint.rb +29 -2
- data/lib/overcommit/hook/pre_commit/css_lint.rb +1 -8
- data/lib/overcommit/hook/pre_commit/go_lint.rb +8 -2
- data/lib/overcommit/hook/pre_commit/go_vet.rb +20 -0
- data/lib/overcommit/hook/pre_commit/html_tidy.rb +1 -10
- data/lib/overcommit/hook/pre_commit/image_optim.rb +11 -28
- data/lib/overcommit/hook/pre_commit/js_lint.rb +18 -0
- data/lib/overcommit/hook/pre_commit/jsl.rb +24 -0
- data/lib/overcommit/hook/pre_commit/json_syntax.rb +4 -7
- data/lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb +1 -1
- data/lib/overcommit/hook/pre_commit/ruby_lint.rb +19 -0
- data/lib/overcommit/hook/pre_commit/scss_lint.rb +8 -1
- data/lib/overcommit/hook/pre_commit/w3c_css.rb +4 -18
- data/lib/overcommit/hook/pre_commit/w3c_html.rb +4 -18
- data/lib/overcommit/hook/pre_commit/xml_syntax.rb +19 -0
- data/lib/overcommit/hook/pre_commit/yaml_syntax.rb +4 -8
- data/lib/overcommit/hook/pre_push/base.rb +10 -0
- data/lib/overcommit/hook/pre_push/protected_branches.rb +27 -0
- data/lib/overcommit/hook/pre_push/r_spec.rb +12 -0
- data/lib/overcommit/hook/pre_rebase/base.rb +11 -0
- data/lib/overcommit/hook_context.rb +2 -2
- data/lib/overcommit/hook_context/base.rb +5 -7
- data/lib/overcommit/hook_context/pre_commit.rb +66 -16
- data/lib/overcommit/hook_context/pre_push.rb +44 -0
- data/lib/overcommit/hook_context/pre_rebase.rb +36 -0
- data/lib/overcommit/hook_runner.rb +27 -7
- data/lib/overcommit/installer.rb +46 -7
- data/lib/overcommit/message_processor.rb +3 -0
- data/lib/overcommit/printer.rb +8 -12
- data/lib/overcommit/subprocess.rb +11 -0
- data/lib/overcommit/utils.rb +28 -6
- data/lib/overcommit/version.rb +1 -1
- data/template-dir/hooks/commit-msg +2 -2
- data/template-dir/hooks/overcommit-hook +2 -2
- data/template-dir/hooks/post-checkout +2 -2
- data/template-dir/hooks/post-commit +2 -2
- data/template-dir/hooks/post-merge +2 -2
- data/template-dir/hooks/post-rewrite +2 -2
- data/template-dir/hooks/pre-commit +2 -2
- data/template-dir/hooks/pre-push +81 -0
- data/template-dir/hooks/pre-rebase +81 -0
- metadata +33 -13
- data/lib/overcommit/hook/pre_commit/pry_binding.rb +0 -14
@@ -0,0 +1,44 @@
|
|
1
|
+
module Overcommit::HookContext
|
2
|
+
# Contains helpers related to contextual information used by pre-push hooks.
|
3
|
+
class PrePush < Base
|
4
|
+
attr_accessor :args
|
5
|
+
|
6
|
+
def remote_name
|
7
|
+
@args[0]
|
8
|
+
end
|
9
|
+
|
10
|
+
def remote_url
|
11
|
+
@args[1]
|
12
|
+
end
|
13
|
+
|
14
|
+
def pushed_refs
|
15
|
+
input_lines.map do |line|
|
16
|
+
PushedRef.new(*line.split(' '))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
PushedRef = Struct.new(:local_ref, :local_sha1, :remote_ref, :remote_sha1) do
|
21
|
+
def forced?
|
22
|
+
!(created? || deleted? || overwritten_commits.empty?)
|
23
|
+
end
|
24
|
+
|
25
|
+
def created?
|
26
|
+
remote_sha1 == '0' * 40
|
27
|
+
end
|
28
|
+
|
29
|
+
def deleted?
|
30
|
+
local_sha1 == '0' * 40
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_s
|
34
|
+
"#{local_ref} #{local_sha1} #{remote_ref} #{remote_sha1}"
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def overwritten_commits
|
40
|
+
`git rev-list #{remote_sha1} ^#{local_sha1}`.split("\n")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Overcommit::HookContext
|
2
|
+
# Contains helpers related to contextual information used by pre-rebase
|
3
|
+
# hooks.
|
4
|
+
class PreRebase < Base
|
5
|
+
# Returns the name of the branch we are rebasing onto.
|
6
|
+
def upstream_branch
|
7
|
+
@args[0]
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns the name of the branch being rebased. Empty if rebasing a
|
11
|
+
# detached HEAD.
|
12
|
+
def rebased_branch
|
13
|
+
@rebased_branch ||=
|
14
|
+
@args[1] || `git symbolic-ref --short --quiet HEAD`.chomp
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns whether we are rebasing a detached HEAD rather than a branch
|
18
|
+
def detached_head?
|
19
|
+
rebased_branch.empty?
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns whether this rebase is a fast-forward
|
23
|
+
def fast_forward?
|
24
|
+
rebased_commits.empty?
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns the SHA1-sums of the series of commits to be rebased
|
28
|
+
# in reverse topological order.
|
29
|
+
def rebased_commits
|
30
|
+
rebased_ref = detached_head? ? 'HEAD' : rebased_branch
|
31
|
+
@rebased_commits ||=
|
32
|
+
`git rev-list --topo-order --reverse #{upstream_branch}..#{rebased_ref}`.
|
33
|
+
split("\n")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -22,11 +22,24 @@ module Overcommit
|
|
22
22
|
# these calls to allow some sort of "are you sure?" double-interrupt
|
23
23
|
# functionality, but until that's deemed necessary let's keep it simple.
|
24
24
|
InterruptHandler.isolate_from_interrupts do
|
25
|
-
|
25
|
+
# Load hooks before setting up the environment so that the repository
|
26
|
+
# has not been touched yet. This way any load errors at this point don't
|
27
|
+
# result in Overcommit leaving the repository in a bad state.
|
26
28
|
load_hooks
|
27
|
-
|
28
|
-
|
29
|
-
|
29
|
+
|
30
|
+
# Setup the environment without automatically calling
|
31
|
+
# `cleanup_environment` on an error. This is because it's possible that
|
32
|
+
# the `setup_environment` code did not fully complete, so there's no
|
33
|
+
# guarantee that `cleanup_environment` will be able to accomplish
|
34
|
+
# anything of value. The safest thing to do is therefore nothing in the
|
35
|
+
# unlikely case of failure.
|
36
|
+
@context.setup_environment
|
37
|
+
|
38
|
+
begin
|
39
|
+
run_hooks
|
40
|
+
ensure
|
41
|
+
@context.cleanup_environment
|
42
|
+
end
|
30
43
|
end
|
31
44
|
end
|
32
45
|
|
@@ -40,11 +53,13 @@ module Overcommit
|
|
40
53
|
|
41
54
|
interrupted = false
|
42
55
|
run_failed = false
|
56
|
+
run_warned = false
|
43
57
|
|
44
58
|
@hooks.each do |hook|
|
45
59
|
hook_status = run_hook(hook)
|
46
60
|
|
47
|
-
run_failed = true if
|
61
|
+
run_failed = true if hook_status == :fail
|
62
|
+
run_warned = true if hook_status == :warn
|
48
63
|
|
49
64
|
if hook_status == :interrupt
|
50
65
|
# Stop running any more hooks and assume a bad result
|
@@ -53,7 +68,7 @@ module Overcommit
|
|
53
68
|
end
|
54
69
|
end
|
55
70
|
|
56
|
-
print_results(run_failed, interrupted)
|
71
|
+
print_results(run_failed, run_warned, interrupted)
|
57
72
|
|
58
73
|
!(run_failed || interrupted)
|
59
74
|
else
|
@@ -62,11 +77,16 @@ module Overcommit
|
|
62
77
|
end
|
63
78
|
end
|
64
79
|
|
65
|
-
|
80
|
+
# @param failed [Boolean]
|
81
|
+
# @param warned [Boolean]
|
82
|
+
# @param interrupted [Boolean]
|
83
|
+
def print_results(failed, warned, interrupted)
|
66
84
|
if interrupted
|
67
85
|
@printer.run_interrupted
|
68
86
|
elsif failed
|
69
87
|
@printer.run_failed
|
88
|
+
elsif warned
|
89
|
+
@printer.run_warned
|
70
90
|
else
|
71
91
|
@printer.run_succeeded
|
72
92
|
end
|
data/lib/overcommit/installer.rb
CHANGED
@@ -3,7 +3,7 @@ require 'fileutils'
|
|
3
3
|
module Overcommit
|
4
4
|
# Manages the installation of Overcommit hooks in a git repository.
|
5
5
|
class Installer # rubocop:disable ClassLength
|
6
|
-
TEMPLATE_DIRECTORY = File.join(
|
6
|
+
TEMPLATE_DIRECTORY = File.join(Overcommit::HOME, 'template-dir')
|
7
7
|
MASTER_HOOK = File.join(TEMPLATE_DIRECTORY, 'hooks', 'overcommit-hook')
|
8
8
|
|
9
9
|
def initialize(logger)
|
@@ -30,7 +30,8 @@ module Overcommit
|
|
30
30
|
def install
|
31
31
|
log.log "Installing hooks into #{@target}"
|
32
32
|
|
33
|
-
|
33
|
+
ensure_directory(hooks_path)
|
34
|
+
preserve_old_hooks
|
34
35
|
install_master_hook
|
35
36
|
install_hook_symlinks
|
36
37
|
install_starter_config
|
@@ -41,8 +42,9 @@ module Overcommit
|
|
41
42
|
def uninstall
|
42
43
|
log.log "Removing hooks from #{@target}"
|
43
44
|
|
44
|
-
uninstall_master_hook
|
45
45
|
uninstall_hook_symlinks
|
46
|
+
uninstall_master_hook
|
47
|
+
restore_old_hooks
|
46
48
|
|
47
49
|
log.success "Successfully removed hooks from #{@target}"
|
48
50
|
end
|
@@ -50,6 +52,7 @@ module Overcommit
|
|
50
52
|
# @return [true,false] whether the hooks were updated
|
51
53
|
def update
|
52
54
|
unless FileUtils.compare_file(MASTER_HOOK, master_hook_install_path)
|
55
|
+
preserve_old_hooks
|
53
56
|
install_master_hook
|
54
57
|
install_hook_symlinks
|
55
58
|
|
@@ -63,12 +66,16 @@ module Overcommit
|
|
63
66
|
File.join(Overcommit::Utils.git_dir(absolute_target), 'hooks')
|
64
67
|
end
|
65
68
|
|
69
|
+
def old_hooks_path
|
70
|
+
File.join(hooks_path, 'old-hooks')
|
71
|
+
end
|
72
|
+
|
66
73
|
def master_hook_install_path
|
67
74
|
File.join(hooks_path, 'overcommit-hook')
|
68
75
|
end
|
69
76
|
|
70
|
-
def
|
71
|
-
FileUtils.mkdir_p(
|
77
|
+
def ensure_directory(path)
|
78
|
+
FileUtils.mkdir_p(path)
|
72
79
|
end
|
73
80
|
|
74
81
|
def validate_target
|
@@ -118,6 +125,38 @@ module Overcommit
|
|
118
125
|
overcommit_hook?(file)
|
119
126
|
end
|
120
127
|
|
128
|
+
def preserve_old_hooks
|
129
|
+
return unless File.directory?(hooks_path)
|
130
|
+
|
131
|
+
ensure_directory(old_hooks_path)
|
132
|
+
Overcommit::Utils.supported_hook_types.each do |hook_type|
|
133
|
+
hook_file = File.join(hooks_path, hook_type)
|
134
|
+
unless can_replace_file?(hook_file)
|
135
|
+
log.warning "Hook '#{File.expand_path(hook_type)}' already exists and " \
|
136
|
+
"was not installed by Overcommit. Moving to '#{old_hooks_path}'"
|
137
|
+
FileUtils.mv(hook_file, old_hooks_path)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
# Remove old-hooks directory if empty
|
141
|
+
FileUtils.rmdir(old_hooks_path)
|
142
|
+
end
|
143
|
+
|
144
|
+
def restore_old_hooks
|
145
|
+
return unless File.directory?(old_hooks_path)
|
146
|
+
|
147
|
+
log.log "Restoring old hooks from #{old_hooks_path}"
|
148
|
+
|
149
|
+
Dir.chdir(old_hooks_path) do
|
150
|
+
Overcommit::Utils.supported_hook_types.each do |hook_type|
|
151
|
+
FileUtils.mv(hook_type, hooks_path) if File.exist?(hook_type)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
# Remove old-hooks directory if empty
|
155
|
+
FileUtils.rmdir(old_hooks_path)
|
156
|
+
|
157
|
+
log.success "Successfully restored old hooks from #{old_hooks_path}"
|
158
|
+
end
|
159
|
+
|
121
160
|
def uninstall_hook_symlinks
|
122
161
|
return unless File.directory?(hooks_path)
|
123
162
|
|
@@ -129,10 +168,10 @@ module Overcommit
|
|
129
168
|
end
|
130
169
|
|
131
170
|
def install_starter_config
|
132
|
-
repo_config_file = File.join(@target,
|
171
|
+
repo_config_file = File.join(@target, Overcommit::CONFIG_FILE_NAME)
|
133
172
|
|
134
173
|
return if File.exist?(repo_config_file)
|
135
|
-
FileUtils.cp(File.join(
|
174
|
+
FileUtils.cp(File.join(Overcommit::HOME, 'config', 'starter.yml'), repo_config_file)
|
136
175
|
end
|
137
176
|
|
138
177
|
def overcommit_hook?(file)
|
@@ -126,6 +126,9 @@ module Overcommit
|
|
126
126
|
end
|
127
127
|
|
128
128
|
def message_on_modified_line?(message)
|
129
|
+
# Message without line number assumed to apply to entire file
|
130
|
+
return true unless message.line
|
131
|
+
|
129
132
|
@hook.modified_lines_in_file(message.file).include?(message.line)
|
130
133
|
end
|
131
134
|
end
|
data/lib/overcommit/printer.rb
CHANGED
@@ -39,7 +39,7 @@ module Overcommit
|
|
39
39
|
def end_hook(hook, status, output)
|
40
40
|
# Want to print the header for quiet hooks only if the result wasn't good
|
41
41
|
# so that the user knows what failed
|
42
|
-
print_header(hook) if hook.quiet? &&
|
42
|
+
print_header(hook) if hook.quiet? && status != :pass
|
43
43
|
|
44
44
|
print_result(hook, status, output)
|
45
45
|
end
|
@@ -58,6 +58,13 @@ module Overcommit
|
|
58
58
|
log.newline
|
59
59
|
end
|
60
60
|
|
61
|
+
# Executed when no hooks failed by the end of the run, but some warned.
|
62
|
+
def run_warned
|
63
|
+
log.newline
|
64
|
+
log.warning "⚠ All #{hook_script_name} hooks passed, but with warnings"
|
65
|
+
log.newline
|
66
|
+
end
|
67
|
+
|
61
68
|
# Executed when no hooks failed by the end of the run.
|
62
69
|
def run_succeeded
|
63
70
|
log.newline
|
@@ -78,20 +85,9 @@ module Overcommit
|
|
78
85
|
case status
|
79
86
|
when :pass
|
80
87
|
log.success 'OK' unless hook.quiet?
|
81
|
-
when :good
|
82
|
-
log.success 'OK'
|
83
|
-
log.bold_error 'Hook returned a status of `:good`. This is deprecated ' \
|
84
|
-
'in favor of `:pass` and will be removed in a future ' \
|
85
|
-
'version of Overcommit'
|
86
88
|
when :warn
|
87
89
|
log.warning 'WARNING'
|
88
90
|
print_report(output, :bold_warning)
|
89
|
-
when :bad
|
90
|
-
log.error 'FAILED'
|
91
|
-
log.bold_error 'Hook returned a status of `:bad`. This is deprecated ' \
|
92
|
-
'in favor of `:fail` and will be removed in a future ' \
|
93
|
-
'version of Overcommit'
|
94
|
-
print_report(output, :bold_error)
|
95
91
|
when :fail
|
96
92
|
log.error 'FAILED'
|
97
93
|
print_report(output, :bold_error)
|
@@ -29,6 +29,17 @@ module Overcommit
|
|
29
29
|
Result.new(process.exit_code, out.read, err.read)
|
30
30
|
end
|
31
31
|
|
32
|
+
# Spawns a new process in the background using the given array of
|
33
|
+
# arguments (the first element is the command).
|
34
|
+
def spawn_detached(args)
|
35
|
+
process = ChildProcess.build(*args)
|
36
|
+
process.detach = true
|
37
|
+
|
38
|
+
assign_output_streams(process)
|
39
|
+
|
40
|
+
process.start
|
41
|
+
end
|
42
|
+
|
32
43
|
private
|
33
44
|
|
34
45
|
# @param process [ChildProcess]
|
data/lib/overcommit/utils.rb
CHANGED
@@ -4,9 +4,27 @@ require 'overcommit/subprocess'
|
|
4
4
|
module Overcommit
|
5
5
|
# Utility functions for general use.
|
6
6
|
module Utils
|
7
|
+
# Helper class for doing quick constraint validations on version numbers.
|
8
|
+
#
|
9
|
+
# This allows us to execute code based on the git version.
|
10
|
+
class Version < Gem::Version
|
11
|
+
# Overload comparison operators so we can conveniently compare this
|
12
|
+
# version directly to a string in code.
|
13
|
+
%w[< <= > >= == !=].each do |operator|
|
14
|
+
define_method operator do |version|
|
15
|
+
case version
|
16
|
+
when String
|
17
|
+
super(Gem::Version.new(version))
|
18
|
+
else
|
19
|
+
super(version)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
7
25
|
class << self
|
8
26
|
def script_path(script)
|
9
|
-
File.join(
|
27
|
+
File.join(Overcommit::HOME, 'libexec', script)
|
10
28
|
end
|
11
29
|
|
12
30
|
# Returns an absolute path to the root of the repository.
|
@@ -71,9 +89,9 @@ module Overcommit
|
|
71
89
|
|
72
90
|
# Returns a list of supported hook types (pre-commit, commit-msg, etc.)
|
73
91
|
def supported_hook_types
|
74
|
-
Dir[File.join(
|
92
|
+
Dir[File.join(HOOK_DIRECTORY, '*')].
|
75
93
|
select { |file| File.directory?(file) }.
|
76
|
-
map { |file| File.basename(file
|
94
|
+
map { |file| File.basename(file).gsub('_', '-') }
|
77
95
|
end
|
78
96
|
|
79
97
|
# Returns a list of supported hook classes (PreCommit, CommitMsg, etc.)
|
@@ -101,6 +119,11 @@ module Overcommit
|
|
101
119
|
false
|
102
120
|
end
|
103
121
|
|
122
|
+
# Return the parent command that triggered this hook run
|
123
|
+
def parent_command
|
124
|
+
`ps -ocommand= -p #{Process.ppid}`.chomp
|
125
|
+
end
|
126
|
+
|
104
127
|
# Execute a command in a subprocess, capturing exit status and output from
|
105
128
|
# both standard and error streams.
|
106
129
|
#
|
@@ -124,15 +147,14 @@ module Overcommit
|
|
124
147
|
# which we do not need to know the result.
|
125
148
|
#
|
126
149
|
# @param args [Array<String>]
|
127
|
-
# @return [
|
150
|
+
# @return [ChildProcess] detached process spawned in the background
|
128
151
|
def execute_in_background(args)
|
129
152
|
if args.include?('|')
|
130
153
|
raise Overcommit::Exceptions::InvalidCommandArgs,
|
131
154
|
'Cannot pipe commands with the `execute_in_background` helper'
|
132
155
|
end
|
133
156
|
|
134
|
-
|
135
|
-
Process.detach(Process.spawn({}, *args, [:in, :out, :err] => '/dev/null'))
|
157
|
+
Subprocess.spawn_detached(args)
|
136
158
|
end
|
137
159
|
|
138
160
|
# Calls a block of code with a modified set of environment variables,
|
data/lib/overcommit/version.rb
CHANGED
@@ -43,9 +43,9 @@ begin
|
|
43
43
|
exec($0, *ARGV) # Execute the updated hook with all original arguments
|
44
44
|
end
|
45
45
|
|
46
|
-
config = Overcommit::ConfigurationLoader.load_repo_config
|
46
|
+
config = Overcommit::ConfigurationLoader.new(logger).load_repo_config
|
47
47
|
|
48
|
-
context = Overcommit::HookContext.create(hook_type, config, ARGV)
|
48
|
+
context = Overcommit::HookContext.create(hook_type, config, ARGV, STDIN)
|
49
49
|
config.apply_environment!(context, ENV)
|
50
50
|
|
51
51
|
printer = Overcommit::Printer.new(logger, context)
|
@@ -43,9 +43,9 @@ begin
|
|
43
43
|
exec($0, *ARGV) # Execute the updated hook with all original arguments
|
44
44
|
end
|
45
45
|
|
46
|
-
config = Overcommit::ConfigurationLoader.load_repo_config
|
46
|
+
config = Overcommit::ConfigurationLoader.new(logger).load_repo_config
|
47
47
|
|
48
|
-
context = Overcommit::HookContext.create(hook_type, config, ARGV)
|
48
|
+
context = Overcommit::HookContext.create(hook_type, config, ARGV, STDIN)
|
49
49
|
config.apply_environment!(context, ENV)
|
50
50
|
|
51
51
|
printer = Overcommit::Printer.new(logger, context)
|
@@ -43,9 +43,9 @@ begin
|
|
43
43
|
exec($0, *ARGV) # Execute the updated hook with all original arguments
|
44
44
|
end
|
45
45
|
|
46
|
-
config = Overcommit::ConfigurationLoader.load_repo_config
|
46
|
+
config = Overcommit::ConfigurationLoader.new(logger).load_repo_config
|
47
47
|
|
48
|
-
context = Overcommit::HookContext.create(hook_type, config, ARGV)
|
48
|
+
context = Overcommit::HookContext.create(hook_type, config, ARGV, STDIN)
|
49
49
|
config.apply_environment!(context, ENV)
|
50
50
|
|
51
51
|
printer = Overcommit::Printer.new(logger, context)
|