kettle-family 0.1.28 → 0.1.29
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +22 -1
- data/README.md +1 -1
- data/lib/kettle/family/cli.rb +1 -1
- data/lib/kettle/family/report.rb +19 -1
- data/lib/kettle/family/selection.rb +6 -3
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +28 -2
- data.tar.gz.sig +0 -0
- metadata +8 -8
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 8f2d2daae978ae39fac490631b4c3e50177da30f9d386eb1bc51aa6e97e00cee
|
|
4
|
+
data.tar.gz: 2f054f861e0f108fae73f251bf1b95402f9500d9aafeea012bc2b0eff116fd26
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7aeb45976878075ff4ab19b00e01bf664d105307e9494d36bcff52ef0967b989b6526689dcfbeed7492b7bbad2f639f4ef3a78fe5948937c241362e5849c57f8
|
|
7
|
+
data.tar.gz: 7f90c138396b126b1d12768a1a04cd737b8b1699584de3d79148dbee01f4cbed02bab85f503aa3772f193deff792e2be6e5029450c9827f4e2c6dc57b3bbb41b
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,25 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [0.1.29] - 2026-06-28
|
|
34
|
+
|
|
35
|
+
- TAG: [v0.1.29][0.1.29t]
|
|
36
|
+
- COVERAGE: 95.29% -- 1922/2017 lines in 21 files
|
|
37
|
+
- BRANCH COVERAGE: 75.14% -- 668/889 branches in 21 files
|
|
38
|
+
- 38.37% documented
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- `kettle-family --only` now accepts comma-separated member names for subset
|
|
43
|
+
workflows.
|
|
44
|
+
- Parallel `kettle-family release` output now includes derived release waves so
|
|
45
|
+
dependency-safe release groups are visible.
|
|
46
|
+
|
|
47
|
+
### Fixed
|
|
48
|
+
|
|
49
|
+
- Parallel `kettle-family release` waves now stop assigning queued releases as
|
|
50
|
+
soon as any member fails.
|
|
51
|
+
|
|
33
52
|
## [0.1.28] - 2026-06-28
|
|
34
53
|
|
|
35
54
|
- TAG: [v0.1.28][0.1.28t]
|
|
@@ -495,7 +514,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
495
514
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
496
515
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
497
516
|
|
|
498
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.
|
|
517
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.29...HEAD
|
|
518
|
+
[0.1.29]: https://github.com/kettle-dev/kettle-family/compare/v0.1.28...v0.1.29
|
|
519
|
+
[0.1.29t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.29
|
|
499
520
|
[0.1.28]: https://github.com/kettle-dev/kettle-family/compare/v0.1.27...v0.1.28
|
|
500
521
|
[0.1.28t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.28
|
|
501
522
|
[0.1.27]: https://github.com/kettle-dev/kettle-family/compare/v0.1.26...v0.1.27
|
data/README.md
CHANGED
|
@@ -571,7 +571,7 @@ Thanks for RTFM. ☺️
|
|
|
571
571
|
[📌gitmoji]: https://gitmoji.dev
|
|
572
572
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
573
573
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
574
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-
|
|
574
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-2.017-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
575
575
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
576
576
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
577
577
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
data/lib/kettle/family/cli.rb
CHANGED
|
@@ -80,7 +80,7 @@ module Kettle
|
|
|
80
80
|
Options:
|
|
81
81
|
--root PATH Workspace or family root (default: current directory)
|
|
82
82
|
--config PATH Family config path
|
|
83
|
-
--only
|
|
83
|
+
--only MEMBERS Select comma-separated members
|
|
84
84
|
--start-at NAME Select from member through the end of order; use MEMBER@BRANCH for branch stacks
|
|
85
85
|
--json Print JSON report to stdout
|
|
86
86
|
--report PATH Write JSON report to PATH
|
data/lib/kettle/family/report.rb
CHANGED
|
@@ -59,6 +59,7 @@ module Kettle
|
|
|
59
59
|
marker = selected_names.include?(member.name) ? "*" : "-"
|
|
60
60
|
lines << " #{marker} #{member.name} #{member.version} #{member.root}"
|
|
61
61
|
end
|
|
62
|
+
append_release_waves(lines)
|
|
62
63
|
append_results(lines)
|
|
63
64
|
lines.join("\n")
|
|
64
65
|
end
|
|
@@ -74,8 +75,11 @@ module Kettle
|
|
|
74
75
|
return if results.empty?
|
|
75
76
|
return append_release_state_results(lines) if command == "release-state"
|
|
76
77
|
|
|
78
|
+
visible_results = results.reject { |result| release_wave_result?(result) }
|
|
79
|
+
return if visible_results.empty?
|
|
80
|
+
|
|
77
81
|
lines << "results:"
|
|
78
|
-
|
|
82
|
+
visible_results.each do |result|
|
|
79
83
|
lines << " #{result_state(result)} #{result.member_name} #{result.phase} #{result.reason || ""}".rstrip
|
|
80
84
|
append_indented_output(lines, result.stdout) unless suppress_success_output?(result)
|
|
81
85
|
append_indented_output(lines, result.stderr) if !result.ok? && !result.stderr.to_s.empty?
|
|
@@ -84,6 +88,20 @@ module Kettle
|
|
|
84
88
|
append_template_summary(lines) if command == "template"
|
|
85
89
|
end
|
|
86
90
|
|
|
91
|
+
def append_release_waves(lines)
|
|
92
|
+
wave_results = results.select { |result| release_wave_result?(result) }
|
|
93
|
+
return if wave_results.empty?
|
|
94
|
+
|
|
95
|
+
lines << "release waves:"
|
|
96
|
+
wave_results.each do |result|
|
|
97
|
+
lines << " #{result.member_name}: #{result.stdout} (#{result.reason})"
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def release_wave_result?(result)
|
|
102
|
+
result.phase == "release_wave"
|
|
103
|
+
end
|
|
104
|
+
|
|
87
105
|
def append_indented_output(lines, output)
|
|
88
106
|
output.to_s.each_line(chomp: true) { |line| lines << " #{line}" }
|
|
89
107
|
end
|
|
@@ -21,10 +21,13 @@ module Kettle
|
|
|
21
21
|
attr_reader :members
|
|
22
22
|
|
|
23
23
|
def select_only(selected, only)
|
|
24
|
-
|
|
25
|
-
raise Error, "
|
|
24
|
+
names = only.split(",").map(&:strip).reject(&:empty?)
|
|
25
|
+
raise Error, "--only requires at least one member" if names.empty?
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
unknown = names - members.map(&:name)
|
|
28
|
+
raise Error, "unknown member(s): #{unknown.join(", ")}" unless unknown.empty?
|
|
29
|
+
|
|
30
|
+
selected.select { |candidate| names.include?(candidate.name) }
|
|
28
31
|
end
|
|
29
32
|
|
|
30
33
|
def select_start_at(selected, start_at)
|
|
@@ -268,7 +268,9 @@ module Kettle
|
|
|
268
268
|
|
|
269
269
|
def parallel_release_member_results(release_members, initial_results)
|
|
270
270
|
results = initial_results.dup
|
|
271
|
-
release_waves(release_members)
|
|
271
|
+
waves = release_waves(release_members)
|
|
272
|
+
waves.each_with_index do |wave, index|
|
|
273
|
+
results << release_wave_result(wave, index: index, total: waves.length)
|
|
272
274
|
wave_results = run_release_wave(wave)
|
|
273
275
|
results.concat(wave_results.flatten)
|
|
274
276
|
break unless wave_results.all? { |member_results| member_results.all?(&:ok?) }
|
|
@@ -281,13 +283,21 @@ module Kettle
|
|
|
281
283
|
wave.each_with_index { |member, index| queue << [index, member] }
|
|
282
284
|
ordered_results = Array.new(wave.length)
|
|
283
285
|
wave_jobs = release_jobs(wave)
|
|
286
|
+
mutex = Mutex.new
|
|
287
|
+
stop = false
|
|
284
288
|
release_otp_coordinator&.queue_total = wave_jobs
|
|
285
289
|
Array.new(wave_jobs) do
|
|
286
290
|
Thread.new do # rubocop:disable ThreadSafety/NewThread -- family release intentionally runs independent members concurrently.
|
|
287
291
|
runner = release_command_runner
|
|
288
292
|
loop do
|
|
293
|
+
break if mutex.synchronize { stop }
|
|
294
|
+
|
|
289
295
|
index, member = queue.pop(true)
|
|
290
|
-
|
|
296
|
+
member_results = release_results_for_member(member, runner: runner)
|
|
297
|
+
mutex.synchronize do
|
|
298
|
+
ordered_results[index] = member_results
|
|
299
|
+
stop = true unless member_results.all?(&:ok?)
|
|
300
|
+
end
|
|
291
301
|
rescue ThreadError
|
|
292
302
|
break
|
|
293
303
|
end
|
|
@@ -296,6 +306,22 @@ module Kettle
|
|
|
296
306
|
ordered_results.compact
|
|
297
307
|
end
|
|
298
308
|
|
|
309
|
+
def release_wave_result(wave, index:, total:)
|
|
310
|
+
CommandResult.new(
|
|
311
|
+
member_name: "wave #{index + 1}",
|
|
312
|
+
phase: "release_wave",
|
|
313
|
+
command: ["internal", "release-wave"],
|
|
314
|
+
workdir: config.root,
|
|
315
|
+
status: 0,
|
|
316
|
+
success: true,
|
|
317
|
+
stdout: wave.map(&:name).join(", "),
|
|
318
|
+
stderr: "",
|
|
319
|
+
elapsed_seconds: 0.0,
|
|
320
|
+
skipped: false,
|
|
321
|
+
reason: "jobs=#{release_jobs(wave)} total=#{total}"
|
|
322
|
+
)
|
|
323
|
+
end
|
|
324
|
+
|
|
299
325
|
def release_results_for_member(member, runner:)
|
|
300
326
|
[].tap do |memo|
|
|
301
327
|
if skip_already_released?(member)
|
data.tar.gz.sig
CHANGED
|
Binary file
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kettle-family
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.29
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -80,7 +80,7 @@ dependencies:
|
|
|
80
80
|
version: '2.2'
|
|
81
81
|
- - ">="
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: 2.2.
|
|
83
|
+
version: 2.2.23
|
|
84
84
|
type: :development
|
|
85
85
|
prerelease: false
|
|
86
86
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -90,7 +90,7 @@ dependencies:
|
|
|
90
90
|
version: '2.2'
|
|
91
91
|
- - ">="
|
|
92
92
|
- !ruby/object:Gem::Version
|
|
93
|
-
version: 2.2.
|
|
93
|
+
version: 2.2.23
|
|
94
94
|
- !ruby/object:Gem::Dependency
|
|
95
95
|
name: bundler-audit
|
|
96
96
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -222,7 +222,7 @@ dependencies:
|
|
|
222
222
|
version: '1.0'
|
|
223
223
|
- - ">="
|
|
224
224
|
- !ruby/object:Gem::Version
|
|
225
|
-
version: 1.0.
|
|
225
|
+
version: 1.0.4
|
|
226
226
|
type: :development
|
|
227
227
|
prerelease: false
|
|
228
228
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -232,7 +232,7 @@ dependencies:
|
|
|
232
232
|
version: '1.0'
|
|
233
233
|
- - ">="
|
|
234
234
|
- !ruby/object:Gem::Version
|
|
235
|
-
version: 1.0.
|
|
235
|
+
version: 1.0.4
|
|
236
236
|
- !ruby/object:Gem::Dependency
|
|
237
237
|
name: gitmoji-regex
|
|
238
238
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -310,10 +310,10 @@ licenses:
|
|
|
310
310
|
- AGPL-3.0-only
|
|
311
311
|
metadata:
|
|
312
312
|
homepage_uri: https://kettle-family.galtzo.com
|
|
313
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.
|
|
314
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.
|
|
313
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.29
|
|
314
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.29/CHANGELOG.md
|
|
315
315
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
316
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.
|
|
316
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.29
|
|
317
317
|
funding_uri: https://github.com/sponsors/pboling
|
|
318
318
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
319
319
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|