rabbitt-githooks 1.5.1 → 1.5.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9be7b07bbebbb66c3fc6cbc08f76c2759f4f24bc
4
- data.tar.gz: 6521197f0aa99b077a74a4b7362541de2ee8f635
3
+ metadata.gz: cc92115463443ffe80792a5f569a4242e905d21b
4
+ data.tar.gz: 466abff7748a7204939a894cc8adfda9ec927b50
5
5
  SHA512:
6
- metadata.gz: 6b6da3d8b71bff3f1bb1b3a705183aa67c06ba73cf210046d5cade7d2dcca6b277438b0b0a5902a0b22b67ade84a6a8b38c38902a70bcf0921d6b56c7a8a21f3
7
- data.tar.gz: 680979f0543e112cf61a1ef9ecad384691c646659e7d5f47f674fc7122390680b477ed0e6c7fd669a8e3f3351490d64628add6015e288fd436caf1a9b6df2525
6
+ metadata.gz: 9390cef0e16c4574f9908f47ca1de0e4ceb842fa0dafaeed923e57568be96b09e73db566ed292df66a439b057a9ad5107ad3ccb5d4b8e86c342679262bfa6d62
7
+ data.tar.gz: 601aa784254ca0c9b1c3831c724ef90cfaa9a000e80fdc022d76c16e157aefe58d08323c97fbfdd84304dcf60e9d369914f8223be40ae5360dbdba27d8ae2d4b
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rabbitt-githooks (1.5.1)
4
+ rabbitt-githooks (1.5.2)
5
5
  rainbow (~> 2.0.0)
6
6
  thor (~> 0.18)
7
7
 
@@ -60,6 +60,3 @@ DEPENDENCIES
60
60
  ruby-lint (~> 2.0)
61
61
  simplecov (~> 0.9)
62
62
  yard (~> 0.7)
63
-
64
- BUNDLED WITH
65
- 1.10.6
data/lib/githooks.rb CHANGED
@@ -76,7 +76,8 @@ module GitHooks
76
76
  SUCCESS_SYMBOL = '✓'.color_success! unless defined? SUCCESS_SYMBOL
77
77
  FAILURE_SYMBOL = 'X'.color_failure! unless defined? FAILURE_SYMBOL
78
78
  UNKNOWN_SYMBOL = '?'.color_unknown! unless defined? UNKNOWN_SYMBOL
79
- WARNING_SYMBOL = '!'.color_warning! unless defined? WARNING_SYMBOL
79
+ WARNING_SYMBOL = 'W'.color_warning! unless defined? WARNING_SYMBOL
80
+ SKIPPED_SYMBOL = 'S'.color_skipped! unless defined? SKIPPED_SYMBOL
80
81
 
81
82
  LIB_PATH = Pathname.new(__FILE__).dirname.realpath unless defined? LIB_PATH
82
83
  GEM_PATH = LIB_PATH.parent unless defined? GEM_PATH
@@ -22,7 +22,7 @@ require 'stringio'
22
22
  require_relative 'repository'
23
23
 
24
24
  module GitHooks
25
- class Action # rubocop:disable Metrics/ClassLength
25
+ class Action
26
26
  attr_reader :title, :section, :on, :limiters
27
27
  attr_reader :success, :errors, :warnings, :benchmark
28
28
  private :section, :on
@@ -50,26 +50,30 @@ module GitHooks
50
50
  end
51
51
 
52
52
  def colored_title
53
+ return title.color_skipped! if skipped?
53
54
  return title.color_unknown! unless finished?
54
55
  success? ? title.color_success! : title.color_failure!
55
56
  end
56
57
 
57
58
  def status_symbol
59
+ return GitHooks::SKIPPED_SYMBOL if skipped?
58
60
  return GitHooks::UNKNOWN_SYMBOL unless finished?
59
61
  success? ? GitHooks::SUCCESS_SYMBOL : GitHooks::FAILURE_SYMBOL
60
62
  end
61
63
 
62
- %w(finished running waiting).each do |method|
64
+ %w[finished running waiting skipped].each do |method|
63
65
  define_method(:"#{method}?") { @status == method.to_sym }
64
66
  define_method(:"#{method}!") { @status = method.to_sym }
65
67
  end
66
68
 
67
- def run # rubocop:disable MethodLength, AbcSize
69
+ def run # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
68
70
  running!
69
71
  with_benchmark do
70
72
  with_captured_output {
71
73
  begin
72
- @success &= @on.call
74
+ was_skipped = catch(:skip) do
75
+ @success &= @on.call
76
+ end
73
77
  rescue StandardError => e
74
78
  $stderr.puts "Exception thrown during action call: #{e.class.name}: #{e.message}"
75
79
  if GitHooks.debug?
@@ -81,7 +85,7 @@ module GitHooks
81
85
  end
82
86
  @success = false
83
87
  ensure
84
- finished!
88
+ was_skipped ? skipped! : finished!
85
89
  end
86
90
  }
87
91
  end
@@ -124,6 +128,10 @@ module GitHooks
124
128
 
125
129
  # DSL Methods
126
130
 
131
+ def skip!
132
+ throw :skip, true
133
+ end
134
+
127
135
  def config_path
128
136
  GitHooks.hooks_root.join('configs')
129
137
  end
@@ -34,6 +34,10 @@ module Rainbow
34
34
  color(:yellow).bright
35
35
  end
36
36
  alias_method :color_warning!, :color_unknown!
37
+
38
+ def color_skipped!
39
+ color(:cyan)
40
+ end
37
41
  end
38
42
  end
39
43
  end
@@ -7,5 +7,9 @@ module GitHooks
7
7
  class AlreadyAttached < GitHooks::Error; end
8
8
  class NotAttached < GitHooks::Error; end
9
9
  class InvalidPhase < GitHooks::Error; end
10
+
11
+ class RemoteNotSet < GitHooks::Error
12
+ attr_accessor :branch
13
+ end
10
14
  end
11
15
  end
data/lib/githooks/hook.rb CHANGED
@@ -108,7 +108,7 @@ module GitHooks
108
108
  private :setup_command
109
109
 
110
110
  def find_command(name)
111
- @commands.select { |command| command.name == name.to_s }.first
111
+ @commands.find { |command| command.name == name.to_s }
112
112
  end
113
113
 
114
114
  def sections
@@ -169,22 +169,32 @@ module GitHooks
169
169
  @hook = hook
170
170
  end
171
171
 
172
- def repo
172
+ def repository
173
173
  @hook.repository
174
174
  end
175
175
 
176
- def manifest
177
- @files ||= repo.manifest(
178
- staged: hook.staged,
179
- tracked: hook.tracked,
180
- untracked: hook.untracked
181
- )
176
+ def files
177
+ @files ||= begin
178
+ options = {
179
+ staged: hook.staged,
180
+ tracked: hook.tracked,
181
+ untracked: hook.untracked
182
+ }
183
+
184
+ if %w[ commit-msg pre-push ].include? hook.phase
185
+ if (parent_sha = repository.last_unpushed_commit_parent)
186
+ options.merge!(ref: parent_sha)
187
+ end
188
+ end
189
+
190
+ repository.manifest(options)
191
+ end
182
192
  end
183
193
 
184
194
  def filter(limiters)
185
- manifest.dup.tap do |files|
195
+ files.dup.tap do |files|
186
196
  limiters.each do |type, limiter|
187
- puts "Limiter [#{type}] -> (#{limiter.only.inspect}) match against: " if GitHooks.debug?
197
+ STDERR.puts "Limiter [#{type}] -> (#{limiter.only.inspect}) match against: " if GitHooks.debug?
188
198
  limiter.limit(files)
189
199
  end
190
200
  end
@@ -21,7 +21,7 @@ require 'set'
21
21
  require 'singleton'
22
22
 
23
23
  module GitHooks
24
- class Repository # rubocop:disable ClassLength
24
+ class Repository
25
25
  extend SystemUtils
26
26
 
27
27
  command :git
@@ -75,23 +75,20 @@ module GitHooks
75
75
  git(*%w(stash pop -q)).status.success?
76
76
  end
77
77
 
78
- def manifest(options = {}) # rubocop:disable AbcSize
78
+ def manifest(options = {})
79
79
  ref = options.delete(:ref)
80
+
80
81
  return staged_manifest(ref: ref) if options.delete(:staged)
81
82
 
82
83
  manifest_list = unstaged_manifest(ref: ref)
83
84
 
84
- if options.delete(:tracked)
85
- tracked_manifest(ref: ref).each_with_object(manifest_list) do |file, list|
86
- list << file
87
- end
88
- end
85
+ tracked_manifest(ref: ref).each_with_object(manifest_list) do |file, list|
86
+ list << file
87
+ end if options.delete(:tracked)
89
88
 
90
- if options.delete(:untracked)
91
- untracked_manifest(ref: ref).each_with_object(manifest_list) do |file, list|
92
- list << file
93
- end
94
- end
89
+ untracked_manifest(ref: ref).each_with_object(manifest_list) do |file, list|
90
+ list << file
91
+ end if options.delete(:untracked)
95
92
 
96
93
  manifest_list.sort
97
94
  end
@@ -121,6 +118,28 @@ module GitHooks
121
118
  }.compact
122
119
  end
123
120
 
121
+ def unpushed_commits
122
+ result = git('log', '--format=%H', '@{upstream}..')
123
+ if result.failure?
124
+ if result.error =~ /^fatal: no upstream configured for branch '([^']+)'/
125
+ fail Error::RemoteNotSet, "No upstream remote configured for '#{$1}'"
126
+ else
127
+ fail Error::CommandExecutionFailure, result.error
128
+ end
129
+ end
130
+ result.output.split(/\s*\n\s*/).collect(&:strip)
131
+ end
132
+
133
+ def revision_parent(revision)
134
+ return unless (result = git('rev-parse', "#{revision}~1")).status.success?
135
+ result.output.strip
136
+ end
137
+
138
+ def last_unpushed_commit_parent
139
+ oldest_sha = unpushed_commits.last
140
+ revision_parent(oldest_sha) unless oldest_sha.nil?
141
+ end
142
+
124
143
  private
125
144
 
126
145
  def diff_index(options = {}) # rubocop:disable AbcSize
@@ -44,7 +44,7 @@ module GitHooks
44
44
  match_file(file, @only).tap do |result|
45
45
  if GitHooks.debug?
46
46
  result = (result ? 'success' : 'failure')
47
- puts " #{file.path} (#{file.attribute_value(@type).inspect}) was a #{result}"
47
+ STDERR.puts " #{file.path} (#{file.attribute_value(@type).inspect}) was a #{result}"
48
48
  end
49
49
  end
50
50
  end
@@ -48,7 +48,6 @@ module GitHooks
48
48
  # overrides previous action method to only return
49
49
  # actions that have a non-empty manifest
50
50
  def actions
51
- return @actions unless @hook.phase == 'pre-commit'
52
51
  @actions.reject { |action| action.manifest.empty? }
53
52
  end
54
53
  alias_method :__getobj__, :actions
@@ -57,7 +56,7 @@ module GitHooks
57
56
  @actions << action
58
57
  end
59
58
 
60
- %w(finished running waiting).each do |method|
59
+ %w(finished running waiting skipped).each do |method|
61
60
  define_method(:"#{method}?") { @status == method.to_sym }
62
61
  define_method(:"#{method}!") { @status = method.to_sym }
63
62
  end
@@ -67,7 +66,7 @@ module GitHooks
67
66
  end
68
67
 
69
68
  def wait_count
70
- @actions.select(&:waiting?).size
69
+ @actions.count(&:waiting?)
71
70
  end
72
71
 
73
72
  def name(phase = GitHooks::HOOK_NAME)
@@ -76,6 +75,7 @@ module GitHooks
76
75
 
77
76
  def colored_name(phase = GitHooks::HOOK_NAME)
78
77
  title = name(phase)
78
+ return title.color_skipped! if @actions.all?(&:skipped?)
79
79
  return title.color_unknown! unless finished? && completed?
80
80
  success? ? title.color_success! : title.color_failure!
81
81
  end
@@ -88,7 +88,12 @@ module GitHooks
88
88
  running!
89
89
  begin
90
90
  time_start = Time.now
91
- actions.collect { |action| @success &= action.run }.all?
91
+ actions.collect { |action|
92
+ catch(:skip) do
93
+ @success &= action.run
94
+ end
95
+ @success
96
+ }.all?
92
97
  ensure
93
98
  @benchmark = Time.now - time_start
94
99
  finished!
@@ -18,5 +18,5 @@ with this program; if not, write to the Free Software Foundation, Inc.,
18
18
  =end
19
19
 
20
20
  module GitHooks
21
- VERSION = '1.5.1' unless defined? VERSION
21
+ VERSION = '1.5.2' unless defined? VERSION
22
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rabbitt-githooks
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.1
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carl P. Corliss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-21 00:00:00.000000000 Z
11
+ date: 2015-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rainbow
@@ -209,7 +209,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
209
209
  version: '0'
210
210
  requirements: []
211
211
  rubyforge_project:
212
- rubygems_version: 2.4.8
212
+ rubygems_version: 2.2.2
213
213
  signing_key:
214
214
  specification_version: 4
215
215
  summary: framework for building git hooks tests