milestoner 10.0.2 → 11.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,20 +3,9 @@
3
3
  module Milestoner
4
4
  # Gem identity information.
5
5
  module Identity
6
- def self.name
7
- "milestoner"
8
- end
9
-
10
- def self.label
11
- "Milestoner"
12
- end
13
-
14
- def self.version
15
- "10.0.2"
16
- end
17
-
18
- def self.version_label
19
- "#{label} #{version}"
20
- end
6
+ NAME = "milestoner"
7
+ LABEL = "Milestoner"
8
+ VERSION = "11.0.0"
9
+ VERSION_LABEL = "#{LABEL} #{VERSION}"
21
10
  end
22
11
  end
@@ -3,26 +3,32 @@
3
3
  module Milestoner
4
4
  # Handles publishing of Git tags to remote repository.
5
5
  class Pusher
6
- def initialize git: Git::Kit.new
7
- @git = git
6
+ def initialize repository: GitPlus::Repository.new
7
+ @repository = repository
8
8
  end
9
9
 
10
10
  def push version
11
11
  version = Versionaire::Version version
12
12
 
13
- fail Errors::Git, "Remote repository not configured." unless git.remote?
13
+ fail Errors::Git, "Remote repository not configured." unless repository.config_remote?
14
14
  fail Errors::Git, "Remote tag exists: #{version}." if tag_exists? version
15
- return if git.push_tags.empty?
15
+ return if push_tags
16
16
 
17
17
  fail Errors::Git, "Tags could not be pushed to remote repository."
18
18
  end
19
19
 
20
20
  private
21
21
 
22
- attr_reader :git, :version
22
+ attr_reader :repository, :version
23
23
 
24
24
  def tag_exists? version
25
- git.tag_remote? version
25
+ repository.tag_remote? version
26
+ end
27
+
28
+ def push_tags
29
+ repository.tag_push.then do |_stdout, stderr, status|
30
+ status.success? && stderr.match?(/[new tag]/)
31
+ end
26
32
  end
27
33
  end
28
34
  end
@@ -1,115 +1,88 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "open3"
4
3
  require "thor"
5
4
  require "versionaire"
6
- require "tempfile"
7
5
 
8
6
  module Milestoner
9
7
  # Handles the tagging of a project repository.
10
- # :reek:TooManyMethods
11
- # :reek:InstanceVariableAssumption
8
+ # :reek:TooManyInstanceVariables
12
9
  class Tagger
13
- attr_reader :version, :commit_prefixes
10
+ attr_reader :commit_prefixes
14
11
 
15
- def initialize commit_prefixes: [], git: Git::Kit.new
12
+ def initialize commit_prefixes: [], repository: GitPlus::Repository.new, presenter: Commit
16
13
  @commit_prefixes = commit_prefixes
17
- @git = git
14
+ @repository = repository
15
+ @presenter = presenter
18
16
  @shell = Thor::Shell::Color.new
19
17
  end
20
18
 
21
19
  def commit_prefix_regex
22
- return Regexp.new "" if commit_prefixes.empty?
23
-
24
- Regexp.union commit_prefixes
20
+ commit_prefixes.empty? ? Regexp.new("") : Regexp.union(commit_prefixes)
25
21
  end
26
22
 
27
23
  def commits
28
24
  groups = build_commit_prefix_groups
29
25
  group_by_commit_prefix groups
30
- groups.each_value(&:sort!)
31
- groups.values.flatten.uniq
26
+ groups.each_value { |commits| commits.sort_by!(&:subject) }
27
+ groups.values.flatten.uniq(&:subject)
32
28
  end
33
29
 
34
30
  def commit_list
35
- commits.map { |commit| "- #{commit}" }
31
+ commits.map { |source| presenter.new source }
32
+ .map { |commit| "- #{commit.subject_author}" }
36
33
  end
37
34
 
38
35
  # :reek:BooleanParameter
36
+ # :reek:ControlParameter
37
+ # :reek:TooManyStatements
39
38
  def create version, sign: false
40
- @version = Versionaire::Version version
41
- fail Errors::Git, "Unable to tag without commits." unless git.commits?
42
- return if existing_tag?
39
+ version = Versionaire::Version version
40
+ fail Errors::Git, "Unable to tag without commits." if repository.commits.empty?
41
+ return if exists? version
43
42
 
44
- git_tag sign: sign
43
+ content = message version
44
+ sign ? repository.tag_sign(version, content) : repository.tag_unsign(version, content)
45
45
  end
46
46
 
47
47
  private
48
48
 
49
- attr_reader :git, :shell
50
-
51
- def git_log_command
52
- "git log --oneline --no-merges --format='%s'"
53
- end
49
+ attr_reader :repository, :presenter, :shell
54
50
 
55
- def git_tag_command
56
- "$(git describe --abbrev=0 --tags --always)..HEAD"
51
+ def saved_commits
52
+ repository.commits
57
53
  end
58
54
 
59
- def git_commits_command
60
- return "#{git_log_command} #{git_tag_command}" if git.tagged?
61
-
62
- git_log_command
55
+ def tagged_commits
56
+ repository.commits "#{repository.tag_last}..HEAD"
63
57
  end
64
58
 
65
- def raw_commits
66
- `#{git_commits_command}`.split "\n"
59
+ def computed_commits
60
+ (repository.tagged? ? tagged_commits : saved_commits)
67
61
  end
68
62
 
69
63
  def build_commit_prefix_groups
70
- groups = commit_prefixes.map.with_object({}) { |prefix, group| group.merge! prefix => [] }
71
- groups.merge! "Other" => []
64
+ commit_prefixes.map
65
+ .with_object({}) { |prefix, group| group.merge! prefix => [] }
66
+ .merge! "Other" => []
72
67
  end
73
68
 
74
69
  def group_by_commit_prefix groups = {}
75
- raw_commits.each do |commit|
76
- prefix = commit[commit_prefix_regex]
70
+ computed_commits.each do |commit|
71
+ prefix = commit.subject[commit_prefix_regex]
77
72
  key = groups.key?(prefix) ? prefix : "Other"
78
- groups[key] << commit.gsub(/\[ci\sskip\]/, "").squeeze(" ").strip
73
+ groups[key] << commit
79
74
  end
80
75
  end
81
76
 
82
- def git_message
83
- %(Version #{@version}\n\n#{commit_list.join "\n"}\n\n)
77
+ def message version
78
+ %(Version #{version}\n\n#{commit_list.join "\n"}\n\n)
84
79
  end
85
80
 
86
- # :reek:BooleanParameter
87
- # :reek:ControlParameter
88
- def git_options message_file, sign: false
89
- options = %(--sign --annotate "#{@version}" ) +
90
- %(--cleanup verbatim --file "#{message_file.path}")
91
- return options.gsub "--sign ", "" unless sign
81
+ def exists? version
82
+ return false unless repository.tag_local? version
92
83
 
93
- options
94
- end
95
-
96
- def existing_tag?
97
- return false unless git.tag_local? @version
98
-
99
- shell.say_status :warn, "Local tag exists: #{@version}. Skipped.", :yellow
84
+ shell.say_status :warn, "Local tag exists: #{version}. Skipped.", :yellow
100
85
  true
101
86
  end
102
-
103
- # :reek:BooleanParameter
104
- # :reek:TooManyStatements
105
- def git_tag sign: false
106
- message_file = Tempfile.new Identity.name
107
- File.open(message_file, "w") { |file| file.write git_message }
108
- status = system "git tag #{git_options message_file, sign: sign}"
109
- fail Errors::Git, "Unable to create tag: #{@version}." unless status
110
- ensure
111
- message_file.close
112
- message_file.unlink
113
- end
114
87
  end
115
88
  end
metadata CHANGED
@@ -1,18 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: milestoner
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.0.2
4
+ version: 11.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIC/jCCAeagAwIBAgIBAjANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
- a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0xOTAyMTcxNjAxMTFaFw0yMDAyMTcx
15
- NjAxMTFaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
13
+ MIIC/jCCAeagAwIBAgIBAzANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpicm9v
14
+ a2UvREM9YWxjaGVtaXN0cy9EQz1pbzAeFw0yMDAzMTUxNDQ1MzJaFw0yMTAzMTUx
15
+ NDQ1MzJaMCUxIzAhBgNVBAMMGmJyb29rZS9EQz1hbGNoZW1pc3RzL0RDPWlvMIIB
16
16
  IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6l1qpXTiomH1RfMRloyw7MiE
17
17
  xyVx/x8Yc3EupdH7uhNaTXQGyORN6aOY//1QXXMHIZ9tW74nZLhesWMSUMYy0XhB
18
18
  brs+KkurHnc9FnEJAbG7ebGvl/ncqZt72nQvaxpDxvuCBHgJAz+8i5wl6FhLw+oT
@@ -20,46 +20,32 @@ cert_chain:
20
20
  D5vkU0YlAm1r98BymuJlcQ1qdkVEI1d48ph4kcS0S0nv1RiuyVb6TCAR3Nu3VaVq
21
21
  3fPzZKJLZBx67UvXdbdicWPiUR75elI4PXpLIic3xytaF52ZJYyKZCNZJhNwfQID
22
22
  AQABozkwNzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU0nzow9vc
23
- 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBANgfX7kPZkJvsbdWMvbe
24
- DUUYxRTqTUzCDpLd2p3sQvgLMKjTNSKt6CFq/kh+98b6RCgO6DqiVfxvOEq02dvf
25
- ebMN/ylQqan2FgiAs1rpP0/D4C0MlBjoDktsT+2IyLol1KmkDB20ExJ4Sf1GRNdA
26
- hpWOtcgqHtmrc7xzgB6BuyoYufrKKUlCO3ewTM4C375D2qO7hIdKuMOO3CdPMtSk
27
- OrWpbzCL+nbbXqeoqiHgZaUvcyyQrGj5sQRxMTzuMXzzQxtHnuTuKrcz16HMTX/O
28
- dKvURM+1PwDCzC5tvRwjhUJIizau6+MtkFCvJHmaAj1aZL3odcPejHj5Hxt/0CUW
29
- y84=
23
+ 2CdikiiE3fJhP/gY4ggwDQYJKoZIhvcNAQELBQADggEBAIHhAlD3po4sTYqacXaQ
24
+ XI9jIhrfMy//2PgbHWcETtlJPBeNUbbSNBABcllUHKqYsVDlSvSmss034KSWNR8F
25
+ bF1GcloicyvcCC4y6IoW4it0COAcdeaaxkxiBSgKdQFpff9REnDlIKK4uQ9lLxIo
26
+ Y2G5xubiziKZkyfWFuSr67PIjW3Bu673D1JVBArhA1qbgQmYQcy1CkGOjo+iO8Nf
27
+ 7u/QSfBHb+r/bXhKscDgPpnKwbUmvgO2+94zJG9KsrmIydlzYfsD09aXKx0t6Xy4
28
+ 2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
29
+ QWc=
30
30
  -----END CERTIFICATE-----
31
- date: 2020-02-01 00:00:00.000000000 Z
31
+ date: 2020-12-30 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
- name: runcom
34
+ name: git_plus
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: '6.0'
40
- type: :runtime
41
- prerelease: false
42
- version_requirements: !ruby/object:Gem::Requirement
43
- requirements:
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '6.0'
47
- - !ruby/object:Gem::Dependency
48
- name: thor
49
- requirement: !ruby/object:Gem::Requirement
50
- requirements:
51
- - - "~>"
52
- - !ruby/object:Gem::Version
53
- version: '0.20'
39
+ version: '0.1'
54
40
  type: :runtime
55
41
  prerelease: false
56
42
  version_requirements: !ruby/object:Gem::Requirement
57
43
  requirements:
58
44
  - - "~>"
59
45
  - !ruby/object:Gem::Version
60
- version: '0.20'
46
+ version: '0.1'
61
47
  - !ruby/object:Gem::Dependency
62
- name: versionaire
48
+ name: refinements
63
49
  requirement: !ruby/object:Gem::Requirement
64
50
  requirements:
65
51
  - - "~>"
@@ -73,247 +59,79 @@ dependencies:
73
59
  - !ruby/object:Gem::Version
74
60
  version: '8.0'
75
61
  - !ruby/object:Gem::Dependency
76
- name: bundler-audit
77
- requirement: !ruby/object:Gem::Requirement
78
- requirements:
79
- - - "~>"
80
- - !ruby/object:Gem::Version
81
- version: '0.6'
82
- type: :development
83
- prerelease: false
84
- version_requirements: !ruby/object:Gem::Requirement
85
- requirements:
86
- - - "~>"
87
- - !ruby/object:Gem::Version
88
- version: '0.6'
89
- - !ruby/object:Gem::Dependency
90
- name: climate_control
91
- requirement: !ruby/object:Gem::Requirement
92
- requirements:
93
- - - "~>"
94
- - !ruby/object:Gem::Version
95
- version: '0.1'
96
- type: :development
97
- prerelease: false
98
- version_requirements: !ruby/object:Gem::Requirement
99
- requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '0.1'
103
- - !ruby/object:Gem::Dependency
104
- name: gemsmith
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - "~>"
108
- - !ruby/object:Gem::Version
109
- version: '14.0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '14.0'
117
- - !ruby/object:Gem::Dependency
118
- name: git-cop
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '4.0'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '4.0'
131
- - !ruby/object:Gem::Dependency
132
- name: guard-rspec
133
- requirement: !ruby/object:Gem::Requirement
134
- requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '4.7'
138
- type: :development
139
- prerelease: false
140
- version_requirements: !ruby/object:Gem::Requirement
141
- requirements:
142
- - - "~>"
143
- - !ruby/object:Gem::Version
144
- version: '4.7'
145
- - !ruby/object:Gem::Dependency
146
- name: pry
147
- requirement: !ruby/object:Gem::Requirement
148
- requirements:
149
- - - "~>"
150
- - !ruby/object:Gem::Version
151
- version: '0.12'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '0.12'
159
- - !ruby/object:Gem::Dependency
160
- name: pry-byebug
161
- requirement: !ruby/object:Gem::Requirement
162
- requirements:
163
- - - "~>"
164
- - !ruby/object:Gem::Version
165
- version: '3.7'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '3.7'
173
- - !ruby/object:Gem::Dependency
174
- name: rake
175
- requirement: !ruby/object:Gem::Requirement
176
- requirements:
177
- - - "~>"
178
- - !ruby/object:Gem::Version
179
- version: '13.0'
180
- type: :development
181
- prerelease: false
182
- version_requirements: !ruby/object:Gem::Requirement
183
- requirements:
184
- - - "~>"
185
- - !ruby/object:Gem::Version
186
- version: '13.0'
187
- - !ruby/object:Gem::Dependency
188
- name: reek
189
- requirement: !ruby/object:Gem::Requirement
190
- requirements:
191
- - - "~>"
192
- - !ruby/object:Gem::Version
193
- version: '5.6'
194
- type: :development
195
- prerelease: false
196
- version_requirements: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - "~>"
199
- - !ruby/object:Gem::Version
200
- version: '5.6'
201
- - !ruby/object:Gem::Dependency
202
- name: rspec
203
- requirement: !ruby/object:Gem::Requirement
204
- requirements:
205
- - - "~>"
206
- - !ruby/object:Gem::Version
207
- version: '3.9'
208
- type: :development
209
- prerelease: false
210
- version_requirements: !ruby/object:Gem::Requirement
211
- requirements:
212
- - - "~>"
213
- - !ruby/object:Gem::Version
214
- version: '3.9'
215
- - !ruby/object:Gem::Dependency
216
- name: rubocop
217
- requirement: !ruby/object:Gem::Requirement
218
- requirements:
219
- - - "~>"
220
- - !ruby/object:Gem::Version
221
- version: '0.79'
222
- type: :development
223
- prerelease: false
224
- version_requirements: !ruby/object:Gem::Requirement
225
- requirements:
226
- - - "~>"
227
- - !ruby/object:Gem::Version
228
- version: '0.79'
229
- - !ruby/object:Gem::Dependency
230
- name: rubocop-performance
231
- requirement: !ruby/object:Gem::Requirement
232
- requirements:
233
- - - "~>"
234
- - !ruby/object:Gem::Version
235
- version: '1.5'
236
- type: :development
237
- prerelease: false
238
- version_requirements: !ruby/object:Gem::Requirement
239
- requirements:
240
- - - "~>"
241
- - !ruby/object:Gem::Version
242
- version: '1.5'
243
- - !ruby/object:Gem::Dependency
244
- name: rubocop-rake
62
+ name: runcom
245
63
  requirement: !ruby/object:Gem::Requirement
246
64
  requirements:
247
65
  - - "~>"
248
66
  - !ruby/object:Gem::Version
249
- version: '0.5'
250
- type: :development
67
+ version: '7.0'
68
+ type: :runtime
251
69
  prerelease: false
252
70
  version_requirements: !ruby/object:Gem::Requirement
253
71
  requirements:
254
72
  - - "~>"
255
73
  - !ruby/object:Gem::Version
256
- version: '0.5'
74
+ version: '7.0'
257
75
  - !ruby/object:Gem::Dependency
258
- name: rubocop-rspec
76
+ name: thor
259
77
  requirement: !ruby/object:Gem::Requirement
260
78
  requirements:
261
79
  - - "~>"
262
80
  - !ruby/object:Gem::Version
263
- version: '1.37'
264
- type: :development
81
+ version: '0.20'
82
+ type: :runtime
265
83
  prerelease: false
266
84
  version_requirements: !ruby/object:Gem::Requirement
267
85
  requirements:
268
86
  - - "~>"
269
87
  - !ruby/object:Gem::Version
270
- version: '1.37'
88
+ version: '0.20'
271
89
  - !ruby/object:Gem::Dependency
272
- name: simplecov
90
+ name: versionaire
273
91
  requirement: !ruby/object:Gem::Requirement
274
92
  requirements:
275
93
  - - "~>"
276
94
  - !ruby/object:Gem::Version
277
- version: '0.18'
278
- type: :development
95
+ version: '9.0'
96
+ type: :runtime
279
97
  prerelease: false
280
98
  version_requirements: !ruby/object:Gem::Requirement
281
99
  requirements:
282
100
  - - "~>"
283
101
  - !ruby/object:Gem::Version
284
- version: '0.18'
285
- description:
102
+ version: '9.0'
103
+ description:
286
104
  email:
287
105
  - brooke@alchemists.io
288
106
  executables:
289
107
  - milestoner
290
108
  extensions: []
291
109
  extra_rdoc_files:
292
- - README.md
293
- - LICENSE.md
110
+ - README.adoc
111
+ - LICENSE.adoc
294
112
  files:
295
- - LICENSE.md
296
- - README.md
113
+ - LICENSE.adoc
114
+ - README.adoc
297
115
  - bin/milestoner
298
116
  - lib/milestoner.rb
299
117
  - lib/milestoner/cli.rb
118
+ - lib/milestoner/commit.rb
300
119
  - lib/milestoner/errors/base.rb
301
120
  - lib/milestoner/errors/duplicate_tag.rb
302
121
  - lib/milestoner/errors/git.rb
303
- - lib/milestoner/git/config.rb
304
- - lib/milestoner/git/kit.rb
305
122
  - lib/milestoner/identity.rb
306
123
  - lib/milestoner/publisher.rb
307
124
  - lib/milestoner/pusher.rb
308
125
  - lib/milestoner/tagger.rb
309
- homepage: https://github.com/bkuhlmann/milestoner
126
+ homepage: https://www.alchemists.io/projects/milestoner
310
127
  licenses:
311
128
  - Apache-2.0
312
129
  metadata:
313
- source_code_uri: https://github.com/bkuhlmann/milestoner
314
- changelog_uri: https://github.com/bkuhlmann/milestoner/blob/master/CHANGES.md
315
130
  bug_tracker_uri: https://github.com/bkuhlmann/milestoner/issues
316
- post_install_message:
131
+ changelog_uri: https://www.alchemists.io/projects/milestoner/changes.html
132
+ documentation_uri: https://www.alchemists.io/projects/milestoner
133
+ source_code_uri: https://github.com/bkuhlmann/milestoner
134
+ post_install_message:
317
135
  rdoc_options: []
318
136
  require_paths:
319
137
  - lib
@@ -321,15 +139,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
321
139
  requirements:
322
140
  - - "~>"
323
141
  - !ruby/object:Gem::Version
324
- version: '2.7'
142
+ version: '3.0'
325
143
  required_rubygems_version: !ruby/object:Gem::Requirement
326
144
  requirements:
327
145
  - - ">="
328
146
  - !ruby/object:Gem::Version
329
147
  version: '0'
330
148
  requirements: []
331
- rubygems_version: 3.1.2
332
- signing_key:
149
+ rubygems_version: 3.2.3
150
+ signing_key:
333
151
  specification_version: 4
334
152
  summary: A command line interface for crafting Git repository milestones.
335
153
  test_files: []