milestoner 10.2.0 → 11.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 230253de2d1891b5f81d32c0d3650c2978e442be5d7941f7a72a241eacb3a3de
4
- data.tar.gz: bb892f84520d3fd92a22bbf1a55e2b485597859e92bf28ef2afc99baee20e640
3
+ metadata.gz: 0d13ba3b26332960cca2e9eecec51fa1f6e0b1a976310eeedfa710e705a2281f
4
+ data.tar.gz: 434f1ed0c6521fd8bcd2611326a2245377f8dd6d448feb8863b57e9c29f4806a
5
5
  SHA512:
6
- metadata.gz: 3892074d05c2e52320196c16d546d58d99694d916fb38bb79c5ce687bc70cc3ba0d06d2745566b18284ff255c6a351137f44ba6961b716d1090e010ea9496f02
7
- data.tar.gz: 6b00430b9c0a686dfc402c60de01283b74d369b7e199db4ce9eb7f578c07c9acfd5296496a6c9864ad865027c87c0df086b955b5f3815afb0df7771a72c4f563
6
+ metadata.gz: 134d13f84802ba1a167e5d1d5a540c56cadd9ebdcbaf2e63cbad6723b75ef2504b94b26311f0e4d75fa6456a09e33a9e34bb39cdf1930f01861dd38ea9f71d4a
7
+ data.tar.gz: 7512c0210dac0bdd1d6c6fd87817a11f6d9638ee4b648a731fb6a99a8351ab17f087f8b4c8091b88b2cfb15ca02edd0a8b84bcc1ff0cf4f219a4b004c4c49f43
@@ -1,2 +1 @@
1
- ���"��莆�����锄�,��p_p��~��J��v_�&,&u��|�3<YSL���c�����S<G=��$�Dw�����x0ϵF�#Wᘁs05���AӲHT>�$q���5���刬p�
2
- ��5Z�C���;�;�x`��� n���|x�@�P{u=_* ��H�Z��MnI���𗽕��̫F �)�ɰ�2�6��k�,���Ƕ5���[�G�?�)��&�=(:�b�"3���*w��lʳRYSm
1
+ 3���QD&I'�Oյ~$b�]�@n��"'�>�qr�A=OsQ}=9G&\|�ʻS��@
data.tar.gz.sig CHANGED
Binary file
@@ -150,7 +150,7 @@ additional liability.
150
150
 
151
151
  END OF TERMS AND CONDITIONS
152
152
 
153
- Copyright link:https://www.alchemists.io[Alchemists].
153
+ Copyright 2015 link:https://www.alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].
154
154
 
155
155
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
156
156
  compliance with the License. You may obtain a link:https://www.apache.org/licenses/LICENSE-2.0[copy]
@@ -6,6 +6,8 @@
6
6
 
7
7
  [link=http://badge.fury.io/rb/milestoner]
8
8
  image::https://badge.fury.io/rb/milestoner.svg[Gem Version]
9
+ [link=https://www.alchemists.io/projects/code_quality]
10
+ image::https://img.shields.io/badge/code_style-alchemists-brightgreen.svg[Alchemists Style Guide]
9
11
  [link=https://circleci.com/gh/bkuhlmann/milestoner]
10
12
  image::https://circleci.com/gh/bkuhlmann/milestoner.svg?style=svg[Circle CI Status]
11
13
 
@@ -28,11 +30,8 @@ toc::[]
28
30
  ** Updated
29
31
  ** Removed
30
32
  ** Refactored
31
- * Ensures Git commit merge messages are excluded.
32
33
  * Ensures Git commit messages are alphabetically sorted.
33
34
  * Ensures duplicate Git commit messages are removed (if any).
34
- * Ensures Git commit messages are sanitized by removing extra spaces and `+[ci skip]+` text within
35
- each Git tag message.
36
35
  * Provides optional security for signing Git tags with https://www.gnupg.org[GnuPG] signing key.
37
36
 
38
37
  == Screencasts
@@ -48,8 +47,6 @@ image::https://www.alchemists.io/images/screencasts/milestoner/cover.svg[Screenc
48
47
 
49
48
  == Setup
50
49
 
51
- === Production
52
-
53
50
  To install, run:
54
51
 
55
52
  [source,bash]
@@ -57,24 +54,6 @@ To install, run:
57
54
  gem install milestoner
58
55
  ----
59
56
 
60
- === Development
61
-
62
- To contribute, run:
63
-
64
- [source,bash]
65
- ----
66
- git clone https://github.com/bkuhlmann/milestoner.git
67
- cd milestoner
68
- bin/setup
69
- ----
70
-
71
- You can also use the IRB console for direct access to all objects:
72
-
73
- [source,bash]
74
- ----
75
- bin/console
76
- ----
77
-
78
57
  == Usage
79
58
 
80
59
  === Command Line Interface (CLI)
@@ -189,13 +168,32 @@ Now, when publishing a new milestone (i.e. `+milestoner --publish <version> --s
189
168
  your Git tag will happen automatically. You will be prompted for the GPG Passphrase each time but
190
169
  that is to be expected.
191
170
 
171
+ == Development
172
+
173
+ To contribute, run:
174
+
175
+ [source,bash]
176
+ ----
177
+ git clone https://github.com/bkuhlmann/milestoner.git
178
+ cd milestoner
179
+ bin/setup
180
+ ----
181
+
182
+ You can also use the IRB console for direct access to all objects:
183
+
184
+ [source,bash]
185
+ ----
186
+ bin/console
187
+ ----
188
+
192
189
  == Tests
193
190
 
194
191
  To test, run:
195
192
 
196
- ....
193
+ [source,bash]
194
+ ----
197
195
  bundle exec spec
198
- ....
196
+ ----
199
197
 
200
198
  == Versioning
201
199
 
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "git_plus"
3
4
  require "milestoner/identity"
4
5
  require "milestoner/errors/base"
5
6
  require "milestoner/errors/duplicate_tag"
6
7
  require "milestoner/errors/git"
7
- require "milestoner/git/config"
8
- require "milestoner/git/kit"
8
+ require "milestoner/commit"
9
9
  require "milestoner/tagger"
10
10
  require "milestoner/pusher"
11
11
  require "milestoner/publisher"
@@ -46,7 +46,7 @@ module Milestoner
46
46
  default: false
47
47
  def tag version
48
48
  tagger.create version, sign: sign_tag?(options[:sign])
49
- say "Repository tagged: #{tagger.version}."
49
+ say "Repository tagged: #{version}."
50
50
  rescue StandardError => error
51
51
  say_status :error, error.message, :red
52
52
  end
@@ -69,7 +69,7 @@ module Milestoner
69
69
  default: false
70
70
  def publish version
71
71
  publisher.publish version, sign: sign_tag?(options[:sign])
72
- say_status :info, "Repository tagged and pushed: #{tagger.version}.", :green
72
+ say_status :info, "Repository tagged and pushed: #{version}.", :green
73
73
  say_status :info, "Milestone published!", :green
74
74
  rescue StandardError => error
75
75
  say_status :error, error.message, :red
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "forwardable"
4
+
5
+ module Milestoner
6
+ # Wraps the Git Kit Commit for presentation purposes.
7
+ class Commit
8
+ extend Forwardable
9
+
10
+ delegate [*GitPlus::Commit.members, :fixup?, :squash?] => :source
11
+
12
+ def initialize source
13
+ @source = source
14
+ end
15
+
16
+ def subject_author delimiter: " - "
17
+ "#{subject}#{delimiter}#{author_name}"
18
+ end
19
+
20
+ private
21
+
22
+ attr_reader :source
23
+ end
24
+ end
@@ -5,7 +5,7 @@ module Milestoner
5
5
  module Identity
6
6
  NAME = "milestoner"
7
7
  LABEL = "Milestoner"
8
- VERSION = "10.2.0"
8
+ VERSION = "11.1.1"
9
9
  VERSION_LABEL = "#{LABEL} #{VERSION}"
10
10
  end
11
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_origin?
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,89 @@
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
+
41
+ return if local? version
42
+ fail Errors::Git, "Unable to tag without commits." if computed_commits.empty?
43
43
 
44
- git_tag sign: sign
44
+ content = message version
45
+ sign ? repository.tag_sign(version, content) : repository.tag_unsign(version, content)
45
46
  end
46
47
 
47
48
  private
48
49
 
49
- attr_reader :git, :shell
50
+ attr_reader :repository, :presenter, :shell
50
51
 
51
- def git_log_command
52
- "git log --oneline --no-merges --format='%s'"
52
+ def saved_commits
53
+ repository.commits
53
54
  end
54
55
 
55
- def git_tag_command
56
- "$(git describe --abbrev=0 --tags --always)..HEAD"
56
+ def tagged_commits
57
+ repository.commits "#{repository.tag_last}..HEAD"
57
58
  end
58
59
 
59
- def git_commits_command
60
- return "#{git_log_command} #{git_tag_command}" if git.tagged?
61
-
62
- git_log_command
63
- end
64
-
65
- def raw_commits
66
- `#{git_commits_command}`.split "\n"
60
+ def computed_commits
61
+ (repository.tagged? ? tagged_commits : saved_commits)
67
62
  end
68
63
 
69
64
  def build_commit_prefix_groups
70
- groups = commit_prefixes.map.with_object({}) { |prefix, group| group.merge! prefix => [] }
71
- groups.merge! "Other" => []
65
+ commit_prefixes.map
66
+ .with_object({}) { |prefix, group| group.merge! prefix => [] }
67
+ .merge! "Other" => []
72
68
  end
73
69
 
74
70
  def group_by_commit_prefix groups = {}
75
- raw_commits.each do |commit|
76
- prefix = commit[commit_prefix_regex]
71
+ computed_commits.each do |commit|
72
+ prefix = commit.subject[commit_prefix_regex]
77
73
  key = groups.key?(prefix) ? prefix : "Other"
78
- groups[key] << commit.gsub(/\[ci\sskip\]/, "").squeeze(" ").strip
74
+ groups[key] << commit
79
75
  end
80
76
  end
81
77
 
82
- def git_message
83
- %(Version #{@version}\n\n#{commit_list.join "\n"}\n\n)
84
- end
85
-
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
92
-
93
- options
78
+ def message version
79
+ %(Version #{version}\n\n#{commit_list.join "\n"}\n\n)
94
80
  end
95
81
 
96
- def existing_tag?
97
- return false unless git.tag_local? @version
82
+ def local? version
83
+ return false unless repository.tag_local? version
98
84
 
99
- shell.say_status :warn, "Local tag exists: #{@version}. Skipped.", :yellow
85
+ shell.say_status :warn, "Local tag exists: #{version}. Skipped.", :yellow
100
86
  true
101
87
  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
88
  end
115
89
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: milestoner
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.2.0
4
+ version: 11.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brooke Kuhlmann
@@ -28,38 +28,24 @@ cert_chain:
28
28
  2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
29
29
  QWc=
30
30
  -----END CERTIFICATE-----
31
- date: 2020-07-23 00:00:00.000000000 Z
31
+ date: 2021-01-05 00:00:00.000000000 Z
32
32
  dependencies:
33
33
  - !ruby/object:Gem::Dependency
34
- name: runcom
35
- requirement: !ruby/object:Gem::Requirement
36
- requirements:
37
- - - "~>"
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
34
+ name: git_plus
49
35
  requirement: !ruby/object:Gem::Requirement
50
36
  requirements:
51
37
  - - "~>"
52
38
  - !ruby/object:Gem::Version
53
- version: '0.20'
39
+ version: '0.2'
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.2'
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,215 +59,47 @@ 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.2'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - "~>"
115
- - !ruby/object:Gem::Version
116
- version: '14.2'
117
- - !ruby/object:Gem::Dependency
118
- name: git-lint
119
- requirement: !ruby/object:Gem::Requirement
120
- requirements:
121
- - - "~>"
122
- - !ruby/object:Gem::Version
123
- version: '1.0'
124
- type: :development
125
- prerelease: false
126
- version_requirements: !ruby/object:Gem::Requirement
127
- requirements:
128
- - - "~>"
129
- - !ruby/object:Gem::Version
130
- version: '1.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.13'
152
- type: :development
153
- prerelease: false
154
- version_requirements: !ruby/object:Gem::Requirement
155
- requirements:
156
- - - "~>"
157
- - !ruby/object:Gem::Version
158
- version: '0.13'
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.9'
166
- type: :development
167
- prerelease: false
168
- version_requirements: !ruby/object:Gem::Requirement
169
- requirements:
170
- - - "~>"
171
- - !ruby/object:Gem::Version
172
- version: '3.9'
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: '6.0'
194
- type: :development
195
- prerelease: false
196
- version_requirements: !ruby/object:Gem::Requirement
197
- requirements:
198
- - - "~>"
199
- - !ruby/object:Gem::Version
200
- version: '6.0'
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.83'
222
- type: :development
223
- prerelease: false
224
- version_requirements: !ruby/object:Gem::Requirement
225
- requirements:
226
- - - "~>"
227
- - !ruby/object:Gem::Version
228
- version: '0.83'
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.39'
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.39'
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'
102
+ version: '9.0'
285
103
  description:
286
104
  email:
287
105
  - brooke@alchemists.io
@@ -297,11 +115,10 @@ files:
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
@@ -322,14 +139,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
322
139
  requirements:
323
140
  - - "~>"
324
141
  - !ruby/object:Gem::Version
325
- version: '2.7'
142
+ version: '3.0'
326
143
  required_rubygems_version: !ruby/object:Gem::Requirement
327
144
  requirements:
328
145
  - - ">="
329
146
  - !ruby/object:Gem::Version
330
147
  version: '0'
331
148
  requirements: []
332
- rubygems_version: 3.1.4
149
+ rubygems_version: 3.2.4
333
150
  signing_key:
334
151
  specification_version: 4
335
152
  summary: A command line interface for crafting Git repository milestones.
metadata.gz.sig CHANGED
Binary file
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "open3"
4
-
5
- module Milestoner
6
- module Git
7
- # A lightweight Git Config wrapper.
8
- class Config
9
- def initialize shell: Open3
10
- @shell = shell
11
- end
12
-
13
- def get key
14
- shell.capture3 "git config --get #{key}"
15
- end
16
-
17
- def set key, value
18
- shell.capture3 %(git config --add #{key} "#{value}")
19
- end
20
-
21
- def value key
22
- get(key).first.chomp
23
- end
24
-
25
- private
26
-
27
- attr_reader :shell
28
- end
29
- end
30
- end
@@ -1,48 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Milestoner
4
- module Git
5
- # A lightweight Git wrapper.
6
- class Kit
7
- def initialize
8
- @git_dir = File.join Dir.pwd, ".git"
9
- end
10
-
11
- def supported?
12
- File.exist? git_dir
13
- end
14
-
15
- def commits?
16
- !shell("git log").empty?
17
- end
18
-
19
- def push_tags
20
- shell "git push --tags"
21
- end
22
-
23
- def tagged?
24
- !shell("git tag").empty?
25
- end
26
-
27
- def tag_local? tag
28
- shell("git tag --list #{tag}").match?(/\A#{tag}\Z/)
29
- end
30
-
31
- def tag_remote? tag
32
- shell("git ls-remote --tags origin #{tag}").match?(%r(.+tags/#{tag}\Z))
33
- end
34
-
35
- def remote?
36
- !shell("git config remote.origin.url").empty?
37
- end
38
-
39
- private
40
-
41
- attr_reader :git_dir
42
-
43
- def shell command
44
- String `#{command}`
45
- end
46
- end
47
- end
48
- end