rake-gem-maintenance 0.1.3 → 0.1.5
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/CLAUDE.md +24 -2
- data/Gemfile +1 -0
- data/Gemfile.lock +24 -6
- data/lib/rake/gem/maintenance/gem_publisher.rb +106 -0
- data/lib/rake/gem/maintenance/repos.rb +55 -0
- data/lib/rake/gem/maintenance/upgrade_task.rb +183 -9
- data/lib/rake/gem/maintenance/version.rb +1 -1
- data/lib/rake/gem/maintenance.rb +2 -0
- data/rake-gem-maintenance.gemspec +2 -2
- metadata +10 -8
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 4047b2b201af066a228e897999e10c6a4e09120f339d927850b73c6139d74cfc
|
|
4
|
+
data.tar.gz: 736acd4fa8374821c1fc2cdc457cebd5b3da05c3dd6663a8a216187be6817069
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 0a708f6a6ac58894aae62e941a45294dfc6dbb76f71d3d88af6e8d1e254602f5b9848411bf3cc6686271b71357854f00a8644785776f28da668a3e8cf29df7ad
|
|
7
|
+
data.tar.gz: ca9cf67f6d8cb9622c218eaf338e7f6e0c9c439c9934f199c1c45de0496e60c747289a11b2b96b35060c40bab167763062c61af2fa5d326b7bdfcff06af46641
|
data/CLAUDE.md
CHANGED
|
@@ -25,12 +25,34 @@ rake rubocop
|
|
|
25
25
|
### Core Classes (lib/rake/gem_maintenance/)
|
|
26
26
|
|
|
27
27
|
- **UpgradeTask** — Rake::TaskLib subclass defining upgrade:* tasks (branch, gems, commit, push, auto)
|
|
28
|
+
- Default repositories: rubygems.org
|
|
29
|
+
- **InternalUpgradeTask** — Rake::TaskLib subclass for internal gems only
|
|
30
|
+
- Default repositories: gems.cbp-org.internal
|
|
31
|
+
- **DualUpgradeTask** — Rake::TaskLib subclass for gems published to both rubygems.org and cbp-org
|
|
32
|
+
- Default repositories: both rubygems.org and cbp-org.internal
|
|
28
33
|
- **VersionBumpTask** — Rake::TaskLib subclass defining version:bump[type] and bump[type] tasks
|
|
34
|
+
- **GemPublisher** — Handles publishing gems to multiple repositories, collecting warnings for failed pushes
|
|
35
|
+
- **Repos** — Pre-configured repository sets (internal, all, rubygems, default)
|
|
29
36
|
|
|
30
37
|
### Entry Points
|
|
31
38
|
|
|
32
|
-
- `rake/gem_maintenance.rb` — requires
|
|
33
|
-
- `rake/gem_maintenance/install_tasks.rb` — auto-instantiates
|
|
39
|
+
- `rake/gem_maintenance.rb` — requires all task classes
|
|
40
|
+
- `rake/gem_maintenance/install_tasks.rb` — auto-instantiates UpgradeTask and VersionBumpTask with defaults
|
|
41
|
+
|
|
42
|
+
### Quick Usage
|
|
43
|
+
|
|
44
|
+
```ruby
|
|
45
|
+
# Internal gems only (cbp-org.internal)
|
|
46
|
+
Rake::GemMaintenance::InternalUpgradeTask.new
|
|
47
|
+
|
|
48
|
+
# Both repositories
|
|
49
|
+
Rake::GemMaintenance::DualUpgradeTask.new
|
|
50
|
+
|
|
51
|
+
# Default (rubygems.org) - can also use Repos module
|
|
52
|
+
Rake::GemMaintenance::UpgradeTask.new do |t|
|
|
53
|
+
t.gem_repositories = Rake::GemMaintenance::Repos.internal # or Repos.all
|
|
54
|
+
end
|
|
55
|
+
```
|
|
34
56
|
|
|
35
57
|
## Commit Conventions
|
|
36
58
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
rake-gem-maintenance (0.1.
|
|
4
|
+
rake-gem-maintenance (0.1.5)
|
|
5
5
|
bundler-audit
|
|
6
|
-
gem-release
|
|
7
|
-
rake
|
|
6
|
+
gem-release
|
|
7
|
+
rake
|
|
8
8
|
|
|
9
9
|
GEM
|
|
10
10
|
remote: https://rubygems.org/
|
|
@@ -49,7 +49,9 @@ GEM
|
|
|
49
49
|
cucumber-messages (> 23, < 33)
|
|
50
50
|
cucumber-messages (32.3.1)
|
|
51
51
|
cucumber-tag-expressions (8.1.0)
|
|
52
|
+
date (3.5.1)
|
|
52
53
|
diff-lcs (1.6.2)
|
|
54
|
+
erb (6.0.4)
|
|
53
55
|
ffi (1.17.4-x64-mingw-ucrt)
|
|
54
56
|
ffi (1.17.4-x86_64-linux-gnu)
|
|
55
57
|
formatador (1.2.3)
|
|
@@ -99,7 +101,7 @@ GEM
|
|
|
99
101
|
nenv (~> 0.1)
|
|
100
102
|
shellany (~> 0.0)
|
|
101
103
|
ostruct (0.6.3)
|
|
102
|
-
parallel (2.0
|
|
104
|
+
parallel (2.1.0)
|
|
103
105
|
parser (3.3.11.1)
|
|
104
106
|
ast (~> 2.4.1)
|
|
105
107
|
racc
|
|
@@ -108,12 +110,19 @@ GEM
|
|
|
108
110
|
coderay (~> 1.1)
|
|
109
111
|
method_source (~> 1.0)
|
|
110
112
|
reline (>= 0.6.0)
|
|
113
|
+
psych (5.3.1)
|
|
114
|
+
date
|
|
115
|
+
stringio
|
|
111
116
|
racc (1.8.1)
|
|
112
117
|
rainbow (3.1.1)
|
|
113
118
|
rake (13.4.2)
|
|
114
119
|
rb-fsevent (0.11.2)
|
|
115
120
|
rb-inotify (0.11.1)
|
|
116
121
|
ffi (~> 1.0)
|
|
122
|
+
rdoc (7.2.0)
|
|
123
|
+
erb
|
|
124
|
+
psych (>= 4.0.0)
|
|
125
|
+
tsort
|
|
117
126
|
regexp_parser (2.12.0)
|
|
118
127
|
reline (0.6.3)
|
|
119
128
|
io-console (~> 0.5)
|
|
@@ -152,6 +161,7 @@ GEM
|
|
|
152
161
|
rubocop (~> 1.81)
|
|
153
162
|
ruby-progressbar (1.13.0)
|
|
154
163
|
shellany (0.0.1)
|
|
164
|
+
stringio (3.2.0)
|
|
155
165
|
sys-uname (1.5.1)
|
|
156
166
|
ffi (~> 1.1)
|
|
157
167
|
memoist3 (~> 1.0.0)
|
|
@@ -160,6 +170,7 @@ GEM
|
|
|
160
170
|
memoist3 (~> 1.0.0)
|
|
161
171
|
win32ole
|
|
162
172
|
thor (1.5.0)
|
|
173
|
+
tsort (0.2.0)
|
|
163
174
|
unicode-display_width (3.2.0)
|
|
164
175
|
unicode-emoji (~> 4.1)
|
|
165
176
|
unicode-emoji (4.2.0)
|
|
@@ -179,6 +190,7 @@ DEPENDENCIES
|
|
|
179
190
|
guard-rubocop
|
|
180
191
|
ostruct
|
|
181
192
|
rake-gem-maintenance!
|
|
193
|
+
rdoc
|
|
182
194
|
rspec
|
|
183
195
|
rubocop
|
|
184
196
|
rubocop-rake
|
|
@@ -201,7 +213,9 @@ CHECKSUMS
|
|
|
201
213
|
cucumber-html-formatter (22.3.0) sha256=f9768ed05588dbd73a5f3824c2cc648bd86b00206e6972d743af8051281d0729
|
|
202
214
|
cucumber-messages (32.3.1) sha256=ddc88e4c1cf7afb96c06005b92a4a6f221a2fa435a8b4ca04677d215fd82771c
|
|
203
215
|
cucumber-tag-expressions (8.1.0) sha256=9bd8c4b6654f8e5bf2a9c99329b6f32136a75e50cd39d4cfb3927d0fa9f52e21
|
|
216
|
+
date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0
|
|
204
217
|
diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
|
|
218
|
+
erb (6.0.4) sha256=38e3803694be357fe2bfe312487c74beaf9fb4e5beb3e22498952fe1645b95d9
|
|
205
219
|
ffi (1.17.4-x64-mingw-ucrt) sha256=f6ff9618cfccc494138bddade27aa06c74c6c7bc367a1ea1103d80c2fcb9ed35
|
|
206
220
|
ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d
|
|
207
221
|
formatador (1.2.3) sha256=19fa898133c2c26cdbb5d09f6998c1e137ad9427a046663e55adfe18b950d894
|
|
@@ -226,16 +240,18 @@ CHECKSUMS
|
|
|
226
240
|
nenv (0.3.0) sha256=d9de6d8fb7072228463bf61843159419c969edb34b3cef51832b516ae7972765
|
|
227
241
|
notiffany (0.1.3) sha256=d37669605b7f8dcb04e004e6373e2a780b98c776f8eb503ac9578557d7808738
|
|
228
242
|
ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912
|
|
229
|
-
parallel (2.0
|
|
243
|
+
parallel (2.1.0) sha256=b35258865c2e31134c5ecb708beaaf6772adf9d5efae28e93e99260877b09356
|
|
230
244
|
parser (3.3.11.1) sha256=d17ace7aabe3e72c3cc94043714be27cc6f852f104d81aa284c2281aecc65d54
|
|
231
245
|
prism (1.9.0) sha256=7b530c6a9f92c24300014919c9dcbc055bf4cdf51ec30aed099b06cd6674ef85
|
|
232
246
|
pry (0.16.0) sha256=d76c69065698ed1f85e717bd33d7942c38a50868f6b0673c636192b3d1b6054e
|
|
247
|
+
psych (5.3.1) sha256=eb7a57cef10c9d70173ff74e739d843ac3b2c019a003de48447b2963d81b1974
|
|
233
248
|
racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f
|
|
234
249
|
rainbow (3.1.1) sha256=039491aa3a89f42efa1d6dec2fc4e62ede96eb6acd95e52f1ad581182b79bc6a
|
|
235
250
|
rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701
|
|
236
|
-
rake-gem-maintenance (0.1.
|
|
251
|
+
rake-gem-maintenance (0.1.5)
|
|
237
252
|
rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe
|
|
238
253
|
rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e
|
|
254
|
+
rdoc (7.2.0) sha256=8650f76cd4009c3b54955eb5d7e3a075c60a57276766ebf36f9085e8c9f23192
|
|
239
255
|
regexp_parser (2.12.0) sha256=35a916a1d63190ab5c9009457136ae5f3c0c7512d60291d0d1378ba18ce08ebb
|
|
240
256
|
reline (0.6.3) sha256=1198b04973565b36ec0f11542ab3f5cfeeec34823f4e54cebde90968092b1835
|
|
241
257
|
rspec (3.13.2) sha256=206284a08ad798e61f86d7ca3e376718d52c0bc944626b2349266f239f820587
|
|
@@ -249,9 +265,11 @@ CHECKSUMS
|
|
|
249
265
|
rubocop-rspec (3.9.0) sha256=8fa70a3619408237d789aeecfb9beef40576acc855173e60939d63332fdb55e2
|
|
250
266
|
ruby-progressbar (1.13.0) sha256=80fc9c47a9b640d6834e0dc7b3c94c9df37f08cb072b7761e4a71e22cff29b33
|
|
251
267
|
shellany (0.0.1) sha256=0e127a9132698766d7e752e82cdac8250b6adbd09e6c0a7fbbb6f61964fedee7
|
|
268
|
+
stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1
|
|
252
269
|
sys-uname (1.5.1) sha256=784d7e6491b0393c25cbbe5ac38324ac7be9fda083a6094832648af669386d7b
|
|
253
270
|
sys-uname (1.5.1-universal-mingw32) sha256=aceb618e3276da5eae0ce368e9f6fae8c1f3e9ef23a0595cb88db7b6ecd45f62
|
|
254
271
|
thor (1.5.0) sha256=e3a9e55fe857e44859ce104a84675ab6e8cd59c650a49106a05f55f136425e73
|
|
272
|
+
tsort (0.2.0) sha256=9650a793f6859a43b6641671278f79cfead60ac714148aabe4e3f0060480089f
|
|
255
273
|
unicode-display_width (3.2.0) sha256=0cdd96b5681a5949cdbc2c55e7b420facae74c4aaf9a9815eee1087cb1853c42
|
|
256
274
|
unicode-emoji (4.2.0) sha256=519e69150f75652e40bf736106cfbc8f0f73aa3fb6a65afe62fefa7f80b0f80f
|
|
257
275
|
win32ole (1.9.3) sha256=01f43dc5dc13806e6e58204f538b4a28f3d85968ea89074abc9a3cd118e94d96
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "json"
|
|
4
|
+
require "open-uri"
|
|
5
|
+
|
|
6
|
+
module Rake
|
|
7
|
+
module GemMaintenance
|
|
8
|
+
# Publishes gems to multiple gem repositories, with version checking and warning handling.
|
|
9
|
+
class GemPublisher
|
|
10
|
+
attr_reader :repositories, :warnings, :failed_repositories, :successful_repos
|
|
11
|
+
|
|
12
|
+
def initialize(repositories = default_repositories)
|
|
13
|
+
@repositories = repositories
|
|
14
|
+
@warnings = []
|
|
15
|
+
@failed_pushes = []
|
|
16
|
+
@failed_repositories = []
|
|
17
|
+
@published_files = []
|
|
18
|
+
@successful_repos = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def default_repositories
|
|
22
|
+
[{ name: "rubygems", url: "https://rubygems.org" }]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def publish(gem_file)
|
|
26
|
+
@failed_pushes = []
|
|
27
|
+
@published_files = []
|
|
28
|
+
build_and_push(gem_file)
|
|
29
|
+
print_warnings
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def check_all_repositories(gem_name)
|
|
33
|
+
@failed_repositories = []
|
|
34
|
+
repositories.each do |repo|
|
|
35
|
+
versions_on_repository(gem_name, repo)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def versions_on_repository(gem_name, repository)
|
|
40
|
+
url = "#{repository[:url]}/api/v1/gems/#{gem_name}.json"
|
|
41
|
+
uri = URI.parse(url)
|
|
42
|
+
response = uri.read(accept: "application/json")
|
|
43
|
+
data = JSON.parse(response)
|
|
44
|
+
data["versions"].map { |v| v["number"] }
|
|
45
|
+
rescue StandardError => e
|
|
46
|
+
@failed_repositories << repository[:name]
|
|
47
|
+
@warnings << { repository: repository[:name], error: "Cannot fetch versions: #{e.message}" }
|
|
48
|
+
[]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def next_version(gem_name, current_version)
|
|
52
|
+
return current_version unless current_version
|
|
53
|
+
|
|
54
|
+
ver = Gem::Version.new(current_version)
|
|
55
|
+
loop do
|
|
56
|
+
return ver.to_s unless version_exists_on_all_repos?(gem_name, ver)
|
|
57
|
+
|
|
58
|
+
ver = ver.bump
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def available_repositories
|
|
63
|
+
repositories.map { |r| r[:name] } - @failed_repositories
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def any_available?
|
|
67
|
+
@failed_repositories.size < repositories.size
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
private
|
|
71
|
+
|
|
72
|
+
def build_and_push(gem_file)
|
|
73
|
+
repositories.each do |repo|
|
|
74
|
+
push(gem_file, repository: repo)
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def push(gem_file, repository:)
|
|
79
|
+
cmd = "gem push #{gem_file} --host #{repository[:url]}"
|
|
80
|
+
result = system(cmd)
|
|
81
|
+
if result
|
|
82
|
+
@published_files << gem_file
|
|
83
|
+
@successful_repos << repository[:name]
|
|
84
|
+
end
|
|
85
|
+
rescue StandardError => e
|
|
86
|
+
@failed_pushes << { repository: repository[:name], error: e.message }
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def version_exists_on_all_repos?(gem_name, version)
|
|
90
|
+
repositories.all? do |repo|
|
|
91
|
+
versions_on_repository(gem_name, repo).include?(version.to_s)
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def print_warnings
|
|
96
|
+
return if @failed_pushes.empty?
|
|
97
|
+
|
|
98
|
+
puts "[WARN] The following repositories were unavailable:"
|
|
99
|
+
@failed_pushes.each do |failure|
|
|
100
|
+
puts " - #{failure[:repository]}: #{failure[:error]}"
|
|
101
|
+
end
|
|
102
|
+
puts "[WARN] Warning: Published to #{@published_files.size} of #{repositories.size} repositories"
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Rake
|
|
4
|
+
module GemMaintenance
|
|
5
|
+
# Pre-configured gem repository configurations for common setups.
|
|
6
|
+
#
|
|
7
|
+
# @example Use internal-only repos
|
|
8
|
+
# Rake::GemMaintenance::UpgradeTask.new do |t|
|
|
9
|
+
# t.gem_repositories = Rake::GemMaintenance::Repos.internal
|
|
10
|
+
# end
|
|
11
|
+
#
|
|
12
|
+
# @example Use both rubygems.org and internal repos
|
|
13
|
+
# Rake::GemMaintenance::UpgradeTask.new do |t|
|
|
14
|
+
# t.gem_repositories = Rake::GemMaintenance::Repos.all
|
|
15
|
+
# end
|
|
16
|
+
#
|
|
17
|
+
# @example Reconfigure internal URL
|
|
18
|
+
# Rake::GemMaintenance::Repos.internal_url = "https://my-internal-gem.example.com"
|
|
19
|
+
module Repos
|
|
20
|
+
@internal_url = "https://gems.cbp-org.internal"
|
|
21
|
+
@rubygems_url = "https://rubygems.org"
|
|
22
|
+
|
|
23
|
+
class << self
|
|
24
|
+
attr_accessor :internal_url, :rubygems_url
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Publish only to internal repository
|
|
28
|
+
# @return [Array<Hash>] repository configuration
|
|
29
|
+
def self.internal
|
|
30
|
+
[{ name: "cbp-org", url: internal_url }]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Publish to both rubygems.org and internal repository
|
|
34
|
+
# @return [Array<Hash>] repository configuration
|
|
35
|
+
def self.all
|
|
36
|
+
[
|
|
37
|
+
{ name: "rubygems", url: rubygems_url },
|
|
38
|
+
{ name: "cbp-org", url: internal_url }
|
|
39
|
+
]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Publish only to rubygems.org (the default)
|
|
43
|
+
# @return [Array<Hash>] repository configuration
|
|
44
|
+
def self.rubygems
|
|
45
|
+
[{ name: "rubygems", url: rubygems_url }]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Default configuration: rubygems.org only
|
|
49
|
+
# @return [Array<Hash>] repository configuration
|
|
50
|
+
def self.default
|
|
51
|
+
rubygems
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -1,22 +1,34 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "net/http"
|
|
3
4
|
require "rake"
|
|
4
5
|
require "rake/tasklib"
|
|
6
|
+
require_relative "gem_publisher"
|
|
7
|
+
require_relative "repos"
|
|
5
8
|
|
|
6
9
|
module Rake
|
|
7
10
|
module GemMaintenance
|
|
8
|
-
# Defines Rake tasks for upgrading gem dependencies.
|
|
11
|
+
# Defines Rake tasks for upgrading gem dependencies and publishing to multiple repositories.
|
|
9
12
|
#
|
|
10
|
-
# Creates: upgrade, upgrade:auto, upgrade:branch, upgrade:gems,
|
|
11
|
-
# upgrade:
|
|
13
|
+
# Creates: upgrade, upgrade:auto, upgrade:branch, upgrade:gems, upgrade:commit,
|
|
14
|
+
# upgrade:prepare_version, upgrade:push
|
|
15
|
+
# rubocop:disable Metrics/ClassLength, Metrics/MethodLength
|
|
12
16
|
class UpgradeTask < ::Rake::TaskLib
|
|
13
17
|
attr_accessor :name, :main_branch, :upgrade_branch, :commit_message,
|
|
14
18
|
:files_to_commit, :verification_task, :release_task,
|
|
15
19
|
:version_bump_task, :update_rubygems, :update_gems,
|
|
16
|
-
:run_bundle_audit, :auto_pipeline
|
|
20
|
+
:run_bundle_audit, :auto_pipeline, :gem_repositories,
|
|
21
|
+
:gem_publisher_class, :gem_name, :gem_version
|
|
17
22
|
|
|
18
|
-
def initialize(name = :upgrade)
|
|
23
|
+
def initialize(name = :upgrade)
|
|
19
24
|
super()
|
|
25
|
+
apply_default_configuration(name)
|
|
26
|
+
|
|
27
|
+
yield self if block_given?
|
|
28
|
+
define_tasks
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def apply_default_configuration(name)
|
|
20
32
|
@name = name
|
|
21
33
|
@main_branch = "main"
|
|
22
34
|
@upgrade_branch = "upgrade/gems"
|
|
@@ -29,15 +41,45 @@ module Rake
|
|
|
29
41
|
@update_gems = true
|
|
30
42
|
@run_bundle_audit = true
|
|
31
43
|
@auto_pipeline = nil
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
44
|
+
@gem_repositories = Repos.rubygems
|
|
45
|
+
@gem_publisher_class = GemPublisher
|
|
46
|
+
@gem_name = detect_gem_name
|
|
47
|
+
@gem_version = detect_gem_version
|
|
35
48
|
end
|
|
36
49
|
|
|
37
50
|
private
|
|
38
51
|
|
|
52
|
+
def detect_gem_name
|
|
53
|
+
gemspec = Dir.glob("*.gemspec").first
|
|
54
|
+
return nil unless gemspec
|
|
55
|
+
|
|
56
|
+
Gem::Specification.load(gemspec).name
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def detect_gem_version
|
|
60
|
+
gemspec = Dir.glob("*.gemspec").first
|
|
61
|
+
return nil unless gemspec
|
|
62
|
+
|
|
63
|
+
Gem::Specification.load(gemspec).version.to_s
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def repo_available?(repo)
|
|
67
|
+
url = repo[:url]
|
|
68
|
+
uri = URI.parse(url)
|
|
69
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
70
|
+
http.use_ssl = uri.scheme == "https"
|
|
71
|
+
http.open_timeout = 5
|
|
72
|
+
http.start { |h| h.head("/").code.to_i < 400 }
|
|
73
|
+
rescue StandardError
|
|
74
|
+
false
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
public
|
|
78
|
+
|
|
39
79
|
def define_tasks
|
|
40
80
|
define_top_level_task
|
|
81
|
+
define_info_tasks
|
|
82
|
+
define_prepare_version_task
|
|
41
83
|
define_auto_task
|
|
42
84
|
define_branch_task
|
|
43
85
|
define_gems_task
|
|
@@ -45,11 +87,65 @@ module Rake
|
|
|
45
87
|
define_push_task
|
|
46
88
|
end
|
|
47
89
|
|
|
90
|
+
def define_info_tasks
|
|
91
|
+
task_instance = self
|
|
92
|
+
namespace name do
|
|
93
|
+
namespace :info do
|
|
94
|
+
define_info_repos_task(task_instance)
|
|
95
|
+
define_info_version_task(task_instance)
|
|
96
|
+
define_info_name_task(task_instance)
|
|
97
|
+
desc "Show all upgrade info"
|
|
98
|
+
task all: %i[name version repos]
|
|
99
|
+
end
|
|
100
|
+
desc "Show all upgrade info"
|
|
101
|
+
task info: "#{name}:info:all"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def define_info_repos_task(task_instance)
|
|
106
|
+
desc "Show configured gem repositories"
|
|
107
|
+
task :repos do
|
|
108
|
+
puts "Gem repositories:"
|
|
109
|
+
task_instance.gem_repositories.each do |repo|
|
|
110
|
+
available = task_instance.send(:repo_available?, repo)
|
|
111
|
+
status = available ? "✓" : "✗"
|
|
112
|
+
avail_text = available ? "AVAILABLE" : "NOT AVAILABLE"
|
|
113
|
+
puts " - #{repo[:name]} (#{status}) - #{avail_text}: #{repo[:url]}"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def define_info_version_task(task_instance)
|
|
119
|
+
desc "Show current gem version"
|
|
120
|
+
task :version do
|
|
121
|
+
ver = task_instance.gem_version || "unknown"
|
|
122
|
+
puts "Current version: #{ver}"
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def define_info_name_task(task_instance)
|
|
127
|
+
desc "Show current gem name"
|
|
128
|
+
task :name do
|
|
129
|
+
name = task_instance.gem_name || "unknown"
|
|
130
|
+
puts "Gem name: #{name}"
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
48
134
|
def define_top_level_task
|
|
49
135
|
desc "Alias for #{name}:auto"
|
|
50
136
|
task name => "#{name}:auto"
|
|
51
137
|
end
|
|
52
138
|
|
|
139
|
+
def define_prepare_version_task
|
|
140
|
+
task_instance = self
|
|
141
|
+
namespace name do
|
|
142
|
+
desc "Check version on all repositories before bumping"
|
|
143
|
+
task :prepare_version do
|
|
144
|
+
task_instance.send(:check_version_on_repositories)
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
|
|
53
149
|
def define_auto_task
|
|
54
150
|
task_instance = self
|
|
55
151
|
namespace name do
|
|
@@ -93,7 +189,7 @@ module Rake
|
|
|
93
189
|
def pipeline_tasks
|
|
94
190
|
return auto_pipeline if auto_pipeline
|
|
95
191
|
|
|
96
|
-
%i[branch gems] + [verification_task, :commit, version_bump_task.to_sym, release_task, :push]
|
|
192
|
+
%i[branch gems] + [verification_task, :commit, version_bump_task.to_sym, :prepare_version, release_task, :push]
|
|
97
193
|
end
|
|
98
194
|
|
|
99
195
|
def create_upgrade_branch
|
|
@@ -119,6 +215,84 @@ module Rake
|
|
|
119
215
|
def push_branch
|
|
120
216
|
sh "git push origin #{upgrade_branch}"
|
|
121
217
|
end
|
|
218
|
+
|
|
219
|
+
# rubocop:disable Metrics/AbcSize
|
|
220
|
+
def check_version_on_repositories
|
|
221
|
+
unless gem_name && gem_version
|
|
222
|
+
puts "[ERROR] No gemspec found - cannot check version/upgrade"
|
|
223
|
+
abort
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
publisher = gem_publisher_class.new(gem_repositories)
|
|
227
|
+
gemspec_repos = gem_repositories.select { |repo| repo_available?(repo) }
|
|
228
|
+
|
|
229
|
+
if gemspec_repos.empty?
|
|
230
|
+
puts "[ERROR] No repositories available. Cannot check version."
|
|
231
|
+
abort
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
publisher.check_all_repositories(gem_name)
|
|
235
|
+
|
|
236
|
+
print_failed_repository_warnings(publisher)
|
|
237
|
+
version = gem_version
|
|
238
|
+
next_ver = publisher.next_version(gem_name, version)
|
|
239
|
+
|
|
240
|
+
if next_ver == version
|
|
241
|
+
puts "[INFO] Version #{version} not found on any repository - will publish"
|
|
242
|
+
else
|
|
243
|
+
puts "[INFO] Version #{version} already published to all repositories"
|
|
244
|
+
puts "[INFO] Next available version: #{next_ver}"
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
handle_partial_publish_warning(publisher, version)
|
|
248
|
+
end
|
|
249
|
+
# rubocop:enable Metrics/AbcSize
|
|
250
|
+
|
|
251
|
+
def handle_partial_publish_warning(publisher, version)
|
|
252
|
+
return if publisher.successful_repos.empty?
|
|
253
|
+
|
|
254
|
+
published = publisher.successful_repos
|
|
255
|
+
total = gem_repositories.size
|
|
256
|
+
return unless published.size < total
|
|
257
|
+
|
|
258
|
+
puts "[WARN] Version #{version} was only published to #{published.size} of #{total} repositories"
|
|
259
|
+
puts "[WARN] Run 'rake upgrade:prepare_version' manually to check status"
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
def repos_available?(publisher)
|
|
263
|
+
return true if publisher.any_available?
|
|
264
|
+
|
|
265
|
+
puts "[ERROR] No repositories available. Cannot check version."
|
|
266
|
+
abort
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def print_failed_repository_warnings(publisher)
|
|
270
|
+
return if publisher.failed_repositories.empty?
|
|
271
|
+
|
|
272
|
+
puts "[WARN] The following repositories were unavailable:"
|
|
273
|
+
publisher.failed_repositories.each do |repo_name|
|
|
274
|
+
puts " - #{repo_name}"
|
|
275
|
+
end
|
|
276
|
+
end
|
|
277
|
+
# rubocop:enable Metrics/ClassLength, Metrics/MethodLength
|
|
278
|
+
end
|
|
279
|
+
|
|
280
|
+
# Upgrades gems and publishes to cbp-org only (internal gems).
|
|
281
|
+
# Uses Repos.internal as default repositories.
|
|
282
|
+
class InternalUpgradeTask < UpgradeTask
|
|
283
|
+
def apply_default_configuration(name)
|
|
284
|
+
super
|
|
285
|
+
@gem_repositories = Repos.internal
|
|
286
|
+
end
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# Upgrades gems and publishes to both rubygems.org and cbp-org.
|
|
290
|
+
# Uses Repos.all as default repositories.
|
|
291
|
+
class DualUpgradeTask < UpgradeTask
|
|
292
|
+
def apply_default_configuration(name)
|
|
293
|
+
super
|
|
294
|
+
@gem_repositories = Repos.all
|
|
295
|
+
end
|
|
122
296
|
end
|
|
123
297
|
end
|
|
124
298
|
end
|
data/lib/rake/gem/maintenance.rb
CHANGED
|
@@ -27,6 +27,6 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
spec.require_paths = ["lib"]
|
|
28
28
|
|
|
29
29
|
spec.add_dependency "bundler-audit"
|
|
30
|
-
spec.add_dependency "gem-release"
|
|
31
|
-
spec.add_dependency "rake"
|
|
30
|
+
spec.add_dependency "gem-release"
|
|
31
|
+
spec.add_dependency "rake"
|
|
32
32
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rake-gem-maintenance
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Christophe Broult
|
|
@@ -27,30 +27,30 @@ dependencies:
|
|
|
27
27
|
name: gem-release
|
|
28
28
|
requirement: !ruby/object:Gem::Requirement
|
|
29
29
|
requirements:
|
|
30
|
-
- - "
|
|
30
|
+
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: '
|
|
32
|
+
version: '0'
|
|
33
33
|
type: :runtime
|
|
34
34
|
prerelease: false
|
|
35
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
36
36
|
requirements:
|
|
37
|
-
- - "
|
|
37
|
+
- - ">="
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
|
-
version: '
|
|
39
|
+
version: '0'
|
|
40
40
|
- !ruby/object:Gem::Dependency
|
|
41
41
|
name: rake
|
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
|
43
43
|
requirements:
|
|
44
44
|
- - ">="
|
|
45
45
|
- !ruby/object:Gem::Version
|
|
46
|
-
version: '
|
|
46
|
+
version: '0'
|
|
47
47
|
type: :runtime
|
|
48
48
|
prerelease: false
|
|
49
49
|
version_requirements: !ruby/object:Gem::Requirement
|
|
50
50
|
requirements:
|
|
51
51
|
- - ">="
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: '
|
|
53
|
+
version: '0'
|
|
54
54
|
description: Provides reusable Rake::TaskLib subclasses for upgrading gem dependencies
|
|
55
55
|
and bumping versions.
|
|
56
56
|
email:
|
|
@@ -71,7 +71,9 @@ files:
|
|
|
71
71
|
- TODO.md
|
|
72
72
|
- cucumber.yml
|
|
73
73
|
- lib/rake/gem/maintenance.rb
|
|
74
|
+
- lib/rake/gem/maintenance/gem_publisher.rb
|
|
74
75
|
- lib/rake/gem/maintenance/install_tasks.rb
|
|
76
|
+
- lib/rake/gem/maintenance/repos.rb
|
|
75
77
|
- lib/rake/gem/maintenance/upgrade_task.rb
|
|
76
78
|
- lib/rake/gem/maintenance/version.rb
|
|
77
79
|
- lib/rake/gem/maintenance/version_bump_task.rb
|
|
@@ -98,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
98
100
|
- !ruby/object:Gem::Version
|
|
99
101
|
version: '0'
|
|
100
102
|
requirements: []
|
|
101
|
-
rubygems_version: 4.0.
|
|
103
|
+
rubygems_version: 4.0.11
|
|
102
104
|
specification_version: 4
|
|
103
105
|
summary: 'Rake tasks for gem maintenance: dependency upgrades and version bumps.'
|
|
104
106
|
test_files: []
|