jawshooah-overcommit 0.22.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 +7 -0
- data/bin/overcommit +8 -0
- data/config/default.yml +275 -0
- data/config/starter.yml +31 -0
- data/lib/overcommit.rb +20 -0
- data/lib/overcommit/cli.rb +205 -0
- data/lib/overcommit/configuration.rb +183 -0
- data/lib/overcommit/configuration_loader.rb +49 -0
- data/lib/overcommit/configuration_validator.rb +40 -0
- data/lib/overcommit/constants.rb +8 -0
- data/lib/overcommit/exceptions.rb +35 -0
- data/lib/overcommit/git_repo.rb +147 -0
- data/lib/overcommit/hook/base.rb +174 -0
- data/lib/overcommit/hook/commit_msg/base.rb +11 -0
- data/lib/overcommit/hook/commit_msg/gerrit_change_id.rb +18 -0
- data/lib/overcommit/hook/commit_msg/hard_tabs.rb +13 -0
- data/lib/overcommit/hook/commit_msg/russian_novel.rb +14 -0
- data/lib/overcommit/hook/commit_msg/single_line_subject.rb +12 -0
- data/lib/overcommit/hook/commit_msg/text_width.rb +38 -0
- data/lib/overcommit/hook/commit_msg/trailing_period.rb +12 -0
- data/lib/overcommit/hook/post_checkout/base.rb +11 -0
- data/lib/overcommit/hook/post_checkout/index_tags.rb +26 -0
- data/lib/overcommit/hook/post_commit/base.rb +11 -0
- data/lib/overcommit/hook/post_commit/git_guilt.rb +9 -0
- data/lib/overcommit/hook/pre_commit/author_email.rb +18 -0
- data/lib/overcommit/hook/pre_commit/author_name.rb +17 -0
- data/lib/overcommit/hook/pre_commit/base.rb +70 -0
- data/lib/overcommit/hook/pre_commit/berksfile_check.rb +20 -0
- data/lib/overcommit/hook/pre_commit/brakeman.rb +12 -0
- data/lib/overcommit/hook/pre_commit/broken_symlinks.rb +15 -0
- data/lib/overcommit/hook/pre_commit/bundle_check.rb +25 -0
- data/lib/overcommit/hook/pre_commit/chamber_security.rb +11 -0
- data/lib/overcommit/hook/pre_commit/coffee_lint.rb +11 -0
- data/lib/overcommit/hook/pre_commit/css_lint.rb +11 -0
- data/lib/overcommit/hook/pre_commit/go_lint.rb +12 -0
- data/lib/overcommit/hook/pre_commit/haml_lint.rb +19 -0
- data/lib/overcommit/hook/pre_commit/hard_tabs.rb +14 -0
- data/lib/overcommit/hook/pre_commit/image_optim.rb +41 -0
- data/lib/overcommit/hook/pre_commit/js_hint.rb +13 -0
- data/lib/overcommit/hook/pre_commit/jscs.rb +22 -0
- data/lib/overcommit/hook/pre_commit/json_syntax.rb +22 -0
- data/lib/overcommit/hook/pre_commit/jsx_hint.rb +13 -0
- data/lib/overcommit/hook/pre_commit/jsxcs.rb +20 -0
- data/lib/overcommit/hook/pre_commit/local_paths_in_gemfile.rb +14 -0
- data/lib/overcommit/hook/pre_commit/merge_conflicts.rb +14 -0
- data/lib/overcommit/hook/pre_commit/pry_binding.rb +14 -0
- data/lib/overcommit/hook/pre_commit/python_flake8.rb +11 -0
- data/lib/overcommit/hook/pre_commit/rails_schema_up_to_date.rb +45 -0
- data/lib/overcommit/hook/pre_commit/reek.rb +22 -0
- data/lib/overcommit/hook/pre_commit/rubocop.rb +19 -0
- data/lib/overcommit/hook/pre_commit/scss_lint.rb +19 -0
- data/lib/overcommit/hook/pre_commit/shell_check.rb +19 -0
- data/lib/overcommit/hook/pre_commit/trailing_whitespace.rb +13 -0
- data/lib/overcommit/hook/pre_commit/travis_lint.rb +11 -0
- data/lib/overcommit/hook/pre_commit/yaml_syntax.rb +22 -0
- data/lib/overcommit/hook_context.rb +17 -0
- data/lib/overcommit/hook_context/base.rb +69 -0
- data/lib/overcommit/hook_context/commit_msg.rb +32 -0
- data/lib/overcommit/hook_context/post_checkout.rb +26 -0
- data/lib/overcommit/hook_context/post_commit.rb +19 -0
- data/lib/overcommit/hook_context/pre_commit.rb +148 -0
- data/lib/overcommit/hook_context/run_all.rb +39 -0
- data/lib/overcommit/hook_loader/base.rb +36 -0
- data/lib/overcommit/hook_loader/built_in_hook_loader.rb +12 -0
- data/lib/overcommit/hook_loader/plugin_hook_loader.rb +61 -0
- data/lib/overcommit/hook_runner.rb +129 -0
- data/lib/overcommit/hook_signer.rb +79 -0
- data/lib/overcommit/installer.rb +148 -0
- data/lib/overcommit/interrupt_handler.rb +87 -0
- data/lib/overcommit/logger.rb +79 -0
- data/lib/overcommit/message_processor.rb +132 -0
- data/lib/overcommit/printer.rb +116 -0
- data/lib/overcommit/subprocess.rb +46 -0
- data/lib/overcommit/utils.rb +163 -0
- data/lib/overcommit/version.rb +4 -0
- data/libexec/gerrit-change-id +174 -0
- data/libexec/index-tags +17 -0
- data/template-dir/hooks/commit-msg +81 -0
- data/template-dir/hooks/overcommit-hook +81 -0
- data/template-dir/hooks/post-checkout +81 -0
- data/template-dir/hooks/pre-commit +81 -0
- metadata +184 -0
@@ -0,0 +1,163 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'overcommit/subprocess'
|
3
|
+
|
4
|
+
module Overcommit
|
5
|
+
# Utility functions for general use.
|
6
|
+
module Utils
|
7
|
+
class << self
|
8
|
+
def script_path(script)
|
9
|
+
File.join(OVERCOMMIT_HOME, 'libexec', script)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Returns an absolute path to the root of the repository.
|
13
|
+
#
|
14
|
+
# We do this ourselves rather than call `git rev-parse --show-toplevel` to
|
15
|
+
# solve an issue where the .git directory might not actually be valid in
|
16
|
+
# tests.
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
def repo_root
|
20
|
+
@repo_root ||=
|
21
|
+
begin
|
22
|
+
git_dir = Pathname.new(File.expand_path('.')).enum_for(:ascend).find do |path|
|
23
|
+
File.exist?(File.join(path, '.git'))
|
24
|
+
end
|
25
|
+
|
26
|
+
unless git_dir
|
27
|
+
raise Overcommit::Exceptions::InvalidGitRepo, 'no .git directory found'
|
28
|
+
end
|
29
|
+
|
30
|
+
git_dir.to_s
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Returns an absolute path to the .git directory for a repo.
|
35
|
+
#
|
36
|
+
# @param repo_dir [String] root directory of git repo
|
37
|
+
# @return [String]
|
38
|
+
def git_dir(repo_dir = repo_root)
|
39
|
+
@git_dir ||=
|
40
|
+
begin
|
41
|
+
git_dir = File.expand_path('.git', repo_dir)
|
42
|
+
|
43
|
+
# .git could also be a file that contains the location of the git directory
|
44
|
+
unless File.directory?(git_dir)
|
45
|
+
git_dir = File.read(git_dir)[/^gitdir: (.*)$/, 1]
|
46
|
+
|
47
|
+
# Resolve relative paths
|
48
|
+
unless git_dir.start_with?('/')
|
49
|
+
git_dir = File.expand_path(git_dir, repo_dir)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
git_dir
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Shamelessly stolen from:
|
58
|
+
# stackoverflow.com/questions/1509915/converting-camel-case-to-underscore-case-in-ruby
|
59
|
+
def snake_case(str)
|
60
|
+
str.gsub(/::/, '/').
|
61
|
+
gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
|
62
|
+
gsub(/([a-z\d])([A-Z])/, '\1_\2').
|
63
|
+
tr('-', '_').
|
64
|
+
downcase
|
65
|
+
end
|
66
|
+
|
67
|
+
# Converts a string containing underscores/hyphens/spaces into CamelCase.
|
68
|
+
def camel_case(str)
|
69
|
+
str.split(/_|-| /).map { |part| part.sub(/^\w/) { |c| c.upcase } }.join
|
70
|
+
end
|
71
|
+
|
72
|
+
# Returns a list of supported hook types (pre-commit, commit-msg, etc.)
|
73
|
+
def supported_hook_types
|
74
|
+
Dir[File.join(OVERCOMMIT_HOME, 'lib', 'overcommit', 'hook', '*')].
|
75
|
+
select { |file| File.directory?(file) }.
|
76
|
+
map { |file| File.basename(file, '.rb').gsub('_', '-') }
|
77
|
+
end
|
78
|
+
|
79
|
+
# Returns a list of supported hook classes (PreCommit, CommitMsg, etc.)
|
80
|
+
def supported_hook_type_classes
|
81
|
+
supported_hook_types.map do |file|
|
82
|
+
file.split('-').map(&:capitalize).join
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# @param cmd [String]
|
87
|
+
# @return [true,false] whether a command can be found given the current
|
88
|
+
# environment path.
|
89
|
+
def in_path?(cmd)
|
90
|
+
# ENV['PATH'] doesn't include the repo root, but that is a valid
|
91
|
+
# location for executables, so we want to add it to the list of places
|
92
|
+
# we are checking for the executable.
|
93
|
+
paths = [repo_root] + ENV['PATH'].split(File::PATH_SEPARATOR)
|
94
|
+
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
95
|
+
paths.each do |path|
|
96
|
+
exts.each do |ext|
|
97
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
98
|
+
return true if File.executable?(exe)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
false
|
102
|
+
end
|
103
|
+
|
104
|
+
# Wrap external subshell calls. This is necessary in order to allow
|
105
|
+
# Overcommit to call other Ruby executables without requiring that they be
|
106
|
+
# specified in Overcommit's Gemfile--a nasty consequence of using
|
107
|
+
# `bundle exec overcommit` while developing locally.
|
108
|
+
def execute(args)
|
109
|
+
if args.include?('|')
|
110
|
+
raise Overcommit::Exceptions::InvalidCommandArgs,
|
111
|
+
'Cannot pipe commands with the `execute` helper'
|
112
|
+
end
|
113
|
+
|
114
|
+
with_environment 'RUBYOPT' => nil do
|
115
|
+
Subprocess.spawn(args)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
# Calls a block of code with a modified set of environment variables,
|
120
|
+
# restoring them once the code has executed.
|
121
|
+
def with_environment(env)
|
122
|
+
old_env = {}
|
123
|
+
env.each do |var, value|
|
124
|
+
old_env[var] = ENV[var.to_s]
|
125
|
+
ENV[var.to_s] = value
|
126
|
+
end
|
127
|
+
|
128
|
+
yield
|
129
|
+
ensure
|
130
|
+
old_env.each { |var, value| ENV[var.to_s] = value }
|
131
|
+
end
|
132
|
+
|
133
|
+
# Returns whether a file is a broken symlink.
|
134
|
+
#
|
135
|
+
# @return [true,false]
|
136
|
+
def broken_symlink?(file)
|
137
|
+
# JRuby's implementation of File.exist? returns true for broken
|
138
|
+
# symlinks, so we need use File.size?
|
139
|
+
File.symlink?(file) && File.size?(file).nil?
|
140
|
+
end
|
141
|
+
|
142
|
+
# Convert a glob pattern to an absolute path glob pattern rooted from the
|
143
|
+
# repository root directory.
|
144
|
+
#
|
145
|
+
# @param glob [String]
|
146
|
+
# @return [String]
|
147
|
+
def convert_glob_to_absolute(glob)
|
148
|
+
File.join(repo_root, glob)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Return whether a pattern matches the given path.
|
152
|
+
#
|
153
|
+
# @param pattern [String]
|
154
|
+
# @param path [String]
|
155
|
+
def matches_path?(pattern, path)
|
156
|
+
File.fnmatch?(pattern, path,
|
157
|
+
File::FNM_PATHNAME | # Wildcard doesn't match separator
|
158
|
+
File::FNM_DOTMATCH # Wildcards match dotfiles
|
159
|
+
)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,174 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# From Gerrit Code Review 2.5.1
|
3
|
+
#
|
4
|
+
# Part of Gerrit Code Review (http://code.google.com/p/gerrit/)
|
5
|
+
#
|
6
|
+
# Copyright (C) 2009 The Android Open Source Project
|
7
|
+
#
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
9
|
+
# you may not use this file except in compliance with the License.
|
10
|
+
# You may obtain a copy of the License at
|
11
|
+
#
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
13
|
+
#
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
17
|
+
# See the License for the specific language governing permissions and
|
18
|
+
# limitations under the License.
|
19
|
+
#
|
20
|
+
|
21
|
+
CHANGE_ID_AFTER="Bug|Issue|Story"
|
22
|
+
MSG="$1"
|
23
|
+
|
24
|
+
# Check for, and add if missing, a unique Change-Id
|
25
|
+
#
|
26
|
+
add_ChangeId() {
|
27
|
+
clean_message=`sed -e '
|
28
|
+
/^diff --git a\/.*/{
|
29
|
+
s///
|
30
|
+
q
|
31
|
+
}
|
32
|
+
/^Signed-off-by:/d
|
33
|
+
/^#/d
|
34
|
+
' "$MSG" | git stripspace`
|
35
|
+
if test -z "$clean_message"
|
36
|
+
then
|
37
|
+
return
|
38
|
+
fi
|
39
|
+
|
40
|
+
# Does Change-Id: already exist? if so, exit (no change).
|
41
|
+
if grep -i '^Change-Id:' "$MSG" >/dev/null
|
42
|
+
then
|
43
|
+
return
|
44
|
+
fi
|
45
|
+
|
46
|
+
id=`_gen_ChangeId`
|
47
|
+
T="$MSG.tmp.$$"
|
48
|
+
AWK=awk
|
49
|
+
if [ -x /usr/xpg4/bin/awk ]; then
|
50
|
+
# Solaris AWK is just too broken
|
51
|
+
AWK=/usr/xpg4/bin/awk
|
52
|
+
fi
|
53
|
+
|
54
|
+
# How this works:
|
55
|
+
# - parse the commit message as (textLine+ blankLine*)*
|
56
|
+
# - assume textLine+ to be a footer until proven otherwise
|
57
|
+
# - exception: the first block is not footer (as it is the title)
|
58
|
+
# - read textLine+ into a variable
|
59
|
+
# - then count blankLines
|
60
|
+
# - once the next textLine appears, print textLine+ blankLine* as these
|
61
|
+
# aren't footer
|
62
|
+
# - in END, the last textLine+ block is available for footer parsing
|
63
|
+
$AWK '
|
64
|
+
BEGIN {
|
65
|
+
# while we start with the assumption that textLine+
|
66
|
+
# is a footer, the first block is not.
|
67
|
+
isFooter = 0
|
68
|
+
footerComment = 0
|
69
|
+
blankLines = 0
|
70
|
+
}
|
71
|
+
|
72
|
+
# Skip lines starting with "#" without any spaces before it.
|
73
|
+
/^#/ { next }
|
74
|
+
|
75
|
+
# Skip the line starting with the diff command and everything after it,
|
76
|
+
# up to the end of the file, assuming it is only patch data.
|
77
|
+
# If more than one line before the diff was empty, strip all but one.
|
78
|
+
/^diff --git a/ {
|
79
|
+
blankLines = 0
|
80
|
+
while (getline) { }
|
81
|
+
next
|
82
|
+
}
|
83
|
+
|
84
|
+
# Count blank lines outside footer comments
|
85
|
+
/^$/ && (footerComment == 0) {
|
86
|
+
blankLines++
|
87
|
+
next
|
88
|
+
}
|
89
|
+
|
90
|
+
# Catch footer comment
|
91
|
+
/^\[[a-zA-Z0-9-]+:/ && (isFooter == 1) {
|
92
|
+
footerComment = 1
|
93
|
+
}
|
94
|
+
|
95
|
+
/]$/ && (footerComment == 1) {
|
96
|
+
footerComment = 2
|
97
|
+
}
|
98
|
+
|
99
|
+
# We have a non-blank line after blank lines. Handle this.
|
100
|
+
(blankLines > 0) {
|
101
|
+
print lines
|
102
|
+
for (i = 0; i < blankLines; i++) {
|
103
|
+
print ""
|
104
|
+
}
|
105
|
+
|
106
|
+
lines = ""
|
107
|
+
blankLines = 0
|
108
|
+
isFooter = 1
|
109
|
+
footerComment = 0
|
110
|
+
}
|
111
|
+
|
112
|
+
# Detect that the current block is not the footer
|
113
|
+
(footerComment == 0) && (!/^\[?[a-zA-Z0-9-]+:/ || /^[a-zA-Z0-9-]+:\/\//) {
|
114
|
+
isFooter = 0
|
115
|
+
}
|
116
|
+
|
117
|
+
{
|
118
|
+
# We need this information about the current last comment line
|
119
|
+
if (footerComment == 2) {
|
120
|
+
footerComment = 0
|
121
|
+
}
|
122
|
+
if (lines != "") {
|
123
|
+
lines = lines "\n";
|
124
|
+
}
|
125
|
+
lines = lines $0
|
126
|
+
}
|
127
|
+
|
128
|
+
# Footer handling:
|
129
|
+
# If the last block is considered a footer, splice in the Change-Id at the
|
130
|
+
# right place.
|
131
|
+
# Look for the right place to inject Change-Id by considering
|
132
|
+
# CHANGE_ID_AFTER. Keys listed in it (case insensitive) come first,
|
133
|
+
# then Change-Id, then everything else (eg. Signed-off-by:).
|
134
|
+
#
|
135
|
+
# Otherwise just print the last block, a new line and the Change-Id as a
|
136
|
+
# block of its own.
|
137
|
+
END {
|
138
|
+
unprinted = 1
|
139
|
+
if (isFooter == 0) {
|
140
|
+
print lines "\n"
|
141
|
+
lines = ""
|
142
|
+
}
|
143
|
+
changeIdAfter = "^(" tolower("'"$CHANGE_ID_AFTER"'") "):"
|
144
|
+
numlines = split(lines, footer, "\n")
|
145
|
+
for (line = 1; line <= numlines; line++) {
|
146
|
+
if (unprinted && match(tolower(footer[line]), changeIdAfter) != 1) {
|
147
|
+
unprinted = 0
|
148
|
+
print "Change-Id: I'"$id"'"
|
149
|
+
}
|
150
|
+
print footer[line]
|
151
|
+
}
|
152
|
+
if (unprinted) {
|
153
|
+
print "Change-Id: I'"$id"'"
|
154
|
+
}
|
155
|
+
}' "$MSG" > $T && mv $T "$MSG" || rm -f $T
|
156
|
+
}
|
157
|
+
_gen_ChangeIdInput() {
|
158
|
+
echo "tree `git write-tree`"
|
159
|
+
if parent=`git rev-parse "HEAD^0" 2>/dev/null`
|
160
|
+
then
|
161
|
+
echo "parent $parent"
|
162
|
+
fi
|
163
|
+
echo "author `git var GIT_AUTHOR_IDENT`"
|
164
|
+
echo "committer `git var GIT_COMMITTER_IDENT`"
|
165
|
+
echo
|
166
|
+
printf '%s' "$clean_message"
|
167
|
+
}
|
168
|
+
_gen_ChangeId() {
|
169
|
+
_gen_ChangeIdInput |
|
170
|
+
git hash-object -t commit --stdin
|
171
|
+
}
|
172
|
+
|
173
|
+
|
174
|
+
add_ChangeId
|
data/libexec/index-tags
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
# Indexes all tags for this repository for easy navigation with Vim, storing the
|
3
|
+
# file in <repo>/.git/tags. If you're using Fugitive.vim, you'll automatically
|
4
|
+
# have access to the tags file; otherwise you'll have to modify your `tags`
|
5
|
+
# option in your vimrc to search the generated file.
|
6
|
+
|
7
|
+
set -e
|
8
|
+
|
9
|
+
trap "rm -f $GIT_DIR/tags.$$" EXIT
|
10
|
+
err_file=$GIT_DIR/ctags.err
|
11
|
+
if ctags --tag-relative -Rf$GIT_DIR/tags.$$ --exclude=.git "$@" 2>${err_file}; then
|
12
|
+
mv $GIT_DIR/tags.$$ $GIT_DIR/tags
|
13
|
+
[ -e ${err_file} ] && rm -f ${err_file}
|
14
|
+
else
|
15
|
+
# Ignore STDERR unless `ctags` returned a non-zero exit code
|
16
|
+
cat ${err_file}
|
17
|
+
fi
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Entrypoint for Overcommit hook integration. Installing Overcommit will result
|
4
|
+
# in all of your git hooks being symlinked to this file, allowing the framework
|
5
|
+
# to manage your hooks for you.
|
6
|
+
|
7
|
+
# Prevent a Ruby stack trace from appearing when we interrupt the hook.
|
8
|
+
# Note that this will be overridden when Overcommit is loaded, since the
|
9
|
+
# InterruptHandler will redefine the trap at that time.
|
10
|
+
Signal.trap('INT') do
|
11
|
+
puts 'Hook run interrupted'
|
12
|
+
exit 130
|
13
|
+
end
|
14
|
+
|
15
|
+
# Allow hooks to be disabled via environment variable so git commands can be run
|
16
|
+
# in scripts without Overcommit running hooks
|
17
|
+
if ENV['OVERCOMMIT_DISABLE'].to_i != 0 || ENV['OVERCOMMIT_DISABLED'].to_i != 0
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
|
21
|
+
hook_type = File.basename($0)
|
22
|
+
if hook_type == 'overcommit-hook'
|
23
|
+
puts "Don't run `overcommit-hook` directly; it is intended to be symlinked " \
|
24
|
+
"by each hook in a repository's .git/hooks directory."
|
25
|
+
exit 64 # EX_USAGE
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'overcommit'
|
30
|
+
rescue LoadError
|
31
|
+
puts 'This repository contains hooks installed by Overcommit, but the ' \
|
32
|
+
"overcommit gem is not installed.\n" \
|
33
|
+
'Install it with `gem install overcommit`.'
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
|
37
|
+
begin
|
38
|
+
logger = Overcommit::Logger.new(STDOUT)
|
39
|
+
|
40
|
+
# Ensure master hook is up-to-date
|
41
|
+
installer = Overcommit::Installer.new(logger)
|
42
|
+
if installer.run(Overcommit::Utils.repo_root, action: :update)
|
43
|
+
exec($0, *ARGV) # Execute the updated hook with all original arguments
|
44
|
+
end
|
45
|
+
|
46
|
+
config = Overcommit::ConfigurationLoader.load_repo_config
|
47
|
+
|
48
|
+
context = Overcommit::HookContext.create(hook_type, config, ARGV)
|
49
|
+
config.apply_environment!(context, ENV)
|
50
|
+
|
51
|
+
printer = Overcommit::Printer.new(logger, context)
|
52
|
+
runner = Overcommit::HookRunner.new(config, logger, context, printer)
|
53
|
+
|
54
|
+
status = runner.run
|
55
|
+
|
56
|
+
exit(status ? 0 : 65) # 65 = EX_DATAERR
|
57
|
+
rescue Overcommit::Exceptions::ConfigurationError => error
|
58
|
+
puts error
|
59
|
+
exit 78 # EX_CONFIG
|
60
|
+
rescue Overcommit::Exceptions::HookContextLoadError => error
|
61
|
+
puts error
|
62
|
+
puts 'Are you running an old version of Overcommit?'
|
63
|
+
exit 69 # EX_UNAVAILABLE
|
64
|
+
rescue Overcommit::Exceptions::HookSetupFailed,
|
65
|
+
Overcommit::Exceptions::HookCleanupFailed => error
|
66
|
+
puts error.message
|
67
|
+
exit 74 # EX_IOERR
|
68
|
+
rescue Overcommit::Exceptions::HookCancelled
|
69
|
+
puts 'You cancelled the hook run'
|
70
|
+
exit 130 # Ctrl-C cancel
|
71
|
+
rescue Overcommit::Exceptions::InvalidGitRepo => error
|
72
|
+
puts error
|
73
|
+
exit 64 # EX_USAGE
|
74
|
+
rescue Overcommit::Exceptions::InvalidHookSignature
|
75
|
+
exit 1
|
76
|
+
rescue => error
|
77
|
+
puts error.message
|
78
|
+
puts error.backtrace
|
79
|
+
puts "Report this bug at #{Overcommit::BUG_REPORT_URL}"
|
80
|
+
exit 70 # EX_SOFTWARE
|
81
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# Entrypoint for Overcommit hook integration. Installing Overcommit will result
|
4
|
+
# in all of your git hooks being symlinked to this file, allowing the framework
|
5
|
+
# to manage your hooks for you.
|
6
|
+
|
7
|
+
# Prevent a Ruby stack trace from appearing when we interrupt the hook.
|
8
|
+
# Note that this will be overridden when Overcommit is loaded, since the
|
9
|
+
# InterruptHandler will redefine the trap at that time.
|
10
|
+
Signal.trap('INT') do
|
11
|
+
puts 'Hook run interrupted'
|
12
|
+
exit 130
|
13
|
+
end
|
14
|
+
|
15
|
+
# Allow hooks to be disabled via environment variable so git commands can be run
|
16
|
+
# in scripts without Overcommit running hooks
|
17
|
+
if ENV['OVERCOMMIT_DISABLE'].to_i != 0 || ENV['OVERCOMMIT_DISABLED'].to_i != 0
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
|
21
|
+
hook_type = File.basename($0)
|
22
|
+
if hook_type == 'overcommit-hook'
|
23
|
+
puts "Don't run `overcommit-hook` directly; it is intended to be symlinked " \
|
24
|
+
"by each hook in a repository's .git/hooks directory."
|
25
|
+
exit 64 # EX_USAGE
|
26
|
+
end
|
27
|
+
|
28
|
+
begin
|
29
|
+
require 'overcommit'
|
30
|
+
rescue LoadError
|
31
|
+
puts 'This repository contains hooks installed by Overcommit, but the ' \
|
32
|
+
"overcommit gem is not installed.\n" \
|
33
|
+
'Install it with `gem install overcommit`.'
|
34
|
+
exit
|
35
|
+
end
|
36
|
+
|
37
|
+
begin
|
38
|
+
logger = Overcommit::Logger.new(STDOUT)
|
39
|
+
|
40
|
+
# Ensure master hook is up-to-date
|
41
|
+
installer = Overcommit::Installer.new(logger)
|
42
|
+
if installer.run(Overcommit::Utils.repo_root, action: :update)
|
43
|
+
exec($0, *ARGV) # Execute the updated hook with all original arguments
|
44
|
+
end
|
45
|
+
|
46
|
+
config = Overcommit::ConfigurationLoader.load_repo_config
|
47
|
+
|
48
|
+
context = Overcommit::HookContext.create(hook_type, config, ARGV)
|
49
|
+
config.apply_environment!(context, ENV)
|
50
|
+
|
51
|
+
printer = Overcommit::Printer.new(logger, context)
|
52
|
+
runner = Overcommit::HookRunner.new(config, logger, context, printer)
|
53
|
+
|
54
|
+
status = runner.run
|
55
|
+
|
56
|
+
exit(status ? 0 : 65) # 65 = EX_DATAERR
|
57
|
+
rescue Overcommit::Exceptions::ConfigurationError => error
|
58
|
+
puts error
|
59
|
+
exit 78 # EX_CONFIG
|
60
|
+
rescue Overcommit::Exceptions::HookContextLoadError => error
|
61
|
+
puts error
|
62
|
+
puts 'Are you running an old version of Overcommit?'
|
63
|
+
exit 69 # EX_UNAVAILABLE
|
64
|
+
rescue Overcommit::Exceptions::HookSetupFailed,
|
65
|
+
Overcommit::Exceptions::HookCleanupFailed => error
|
66
|
+
puts error.message
|
67
|
+
exit 74 # EX_IOERR
|
68
|
+
rescue Overcommit::Exceptions::HookCancelled
|
69
|
+
puts 'You cancelled the hook run'
|
70
|
+
exit 130 # Ctrl-C cancel
|
71
|
+
rescue Overcommit::Exceptions::InvalidGitRepo => error
|
72
|
+
puts error
|
73
|
+
exit 64 # EX_USAGE
|
74
|
+
rescue Overcommit::Exceptions::InvalidHookSignature
|
75
|
+
exit 1
|
76
|
+
rescue => error
|
77
|
+
puts error.message
|
78
|
+
puts error.backtrace
|
79
|
+
puts "Report this bug at #{Overcommit::BUG_REPORT_URL}"
|
80
|
+
exit 70 # EX_SOFTWARE
|
81
|
+
end
|