kettle-family 1.3.24 → 1.3.26
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 +27 -1
- data/README.md +1 -1
- data/lib/kettle/family/nomono_bootstrap.rb +6 -0
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +85 -18
- data.tar.gz.sig +0 -0
- metadata +6 -6
- 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: 6cd05963542f86f54bc825842b8f73649a7520e61ddc695c505a6d19b3897581
|
|
4
|
+
data.tar.gz: c4fc9a81de19c42aa0265fa04d255dc4f40ddcd5485aff3eec57b44647a26ddd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 97f87951b90ef59a674a55678be2af49d853f874d221297f3dd8661311400997f5430b9dd9b9e4ce88b32c543baf0d60977b975602a2d01c54f3c0217442c495
|
|
7
|
+
data.tar.gz: d25120f0322dc957334262f218c07ad8be84669d3632ddcc33aecc7e4f9217407246489b3bcca24aae5e26a43618bc8be888fbba0a3278b8920f6985468be242
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,28 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [1.3.26] - 2026-10-20
|
|
34
|
+
|
|
35
|
+
- TAG: [v1.3.26][1.3.26t]
|
|
36
|
+
- COVERAGE: 93.00% -- 7399/7956 lines in 44 files
|
|
37
|
+
- BRANCH COVERAGE: 77.40% -- 2962/3827 branches in 44 files
|
|
38
|
+
- 37.68% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Register template progress starts atomically with queue dispatch, and render progress rows in dependency-queue order.
|
|
43
|
+
|
|
44
|
+
## [1.3.25] - 2026-10-20
|
|
45
|
+
|
|
46
|
+
- TAG: [v1.3.25][1.3.25t]
|
|
47
|
+
- COVERAGE: 93.02% -- 7381/7935 lines in 44 files
|
|
48
|
+
- BRANCH COVERAGE: 77.32% -- 2953/3819 branches in 44 files
|
|
49
|
+
- 37.68% documented
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- [kc] bup-nomono-bootstrap: Reconcile stale nomono floors and lockfiles before member bup; commit each bootstrap
|
|
54
|
+
|
|
33
55
|
## [1.3.24] - 2026-10-19
|
|
34
56
|
|
|
35
57
|
- TAG: [v1.3.24][1.3.24t]
|
|
@@ -3143,7 +3165,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
3143
3165
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
3144
3166
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
3145
3167
|
|
|
3146
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.3.
|
|
3168
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.3.26...HEAD
|
|
3169
|
+
[1.3.26]: https://github.com/kettle-dev/kettle-family/compare/v1.3.25...v1.3.26
|
|
3170
|
+
[1.3.26t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.3.26
|
|
3171
|
+
[1.3.25]: https://github.com/kettle-dev/kettle-family/compare/v1.3.24...v1.3.25
|
|
3172
|
+
[1.3.25t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.3.25
|
|
3147
3173
|
[1.3.24]: https://github.com/kettle-dev/kettle-family/compare/v1.3.23...v1.3.24
|
|
3148
3174
|
[1.3.24t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.3.24
|
|
3149
3175
|
[1.3.23]: https://github.com/kettle-dev/kettle-family/compare/v1.3.22...v1.3.23
|
data/README.md
CHANGED
|
@@ -1225,7 +1225,7 @@ Thanks for RTFM. ☺️
|
|
|
1225
1225
|
[📌gitmoji]: https://gitmoji.dev
|
|
1226
1226
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
1227
1227
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
1228
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-7.
|
|
1228
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-7.956-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
1229
1229
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
1230
1230
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
1231
1231
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -22,6 +22,12 @@ module Kettle
|
|
|
22
22
|
!!(gemfile_floor_outdated?(member) || lockfile_version_outdated?(member))
|
|
23
23
|
end
|
|
24
24
|
|
|
25
|
+
# Return the project-relative Gemfile paths whose Nomono floor this
|
|
26
|
+
# bootstrap will raise. Capture before bootstrap_member writes them.
|
|
27
|
+
def paths_to_update(member)
|
|
28
|
+
gemfile_edits(member).map { |edit| Paths.relative(edit.fetch(:path), member.root) }.compact.uniq
|
|
29
|
+
end
|
|
30
|
+
|
|
25
31
|
def bootstrap_member(member)
|
|
26
32
|
edits = gemfile_edits(member)
|
|
27
33
|
write_edits(edits)
|
|
@@ -5,7 +5,7 @@ module Kettle
|
|
|
5
5
|
# Version namespace for this gem.
|
|
6
6
|
module Version
|
|
7
7
|
# Current gem version.
|
|
8
|
-
VERSION = "1.3.
|
|
8
|
+
VERSION = "1.3.26"
|
|
9
9
|
end
|
|
10
10
|
# Current gem version exposed at the traditional constant location.
|
|
11
11
|
VERSION = Version::VERSION # Traditional Constant Location
|
|
@@ -943,8 +943,9 @@ module Kettle
|
|
|
943
943
|
bootstrap_results = template_member_bootstrap_results(workflow_members)
|
|
944
944
|
return bootstrap_results unless bootstrap_results.all?(&:ok?)
|
|
945
945
|
|
|
946
|
-
|
|
947
|
-
|
|
946
|
+
template_waves = template_dependency_waves(workflow_members)
|
|
947
|
+
template_progress = start_template_progress(template_waves.flatten)
|
|
948
|
+
results = template_waves.each_with_object([]) do |wave, memo|
|
|
948
949
|
wave_results = template_results_for_wave(wave, progress: template_progress)
|
|
949
950
|
memo.concat(wave_results)
|
|
950
951
|
break memo unless wave_results.all?(&:ok?)
|
|
@@ -998,9 +999,21 @@ module Kettle
|
|
|
998
999
|
Array.new(wave_jobs) do
|
|
999
1000
|
Thread.new do # rubocop:disable ThreadSafety/NewThread -- family templating intentionally runs independent members concurrently.
|
|
1000
1001
|
loop do
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1002
|
+
assignment = mutex.synchronize do
|
|
1003
|
+
next if stop
|
|
1004
|
+
|
|
1005
|
+
begin
|
|
1006
|
+
index, member = queue.pop(true)
|
|
1007
|
+
start_template_member_progress(progress, member)
|
|
1008
|
+
[index, member]
|
|
1009
|
+
rescue ThreadError
|
|
1010
|
+
nil
|
|
1011
|
+
end
|
|
1012
|
+
end
|
|
1013
|
+
break unless assignment
|
|
1014
|
+
|
|
1015
|
+
index, member = assignment
|
|
1016
|
+
member_results = template_results_for_member(member, progress: progress, progress_started: true, wave_jobs: wave_jobs)
|
|
1004
1017
|
mutex.synchronize do
|
|
1005
1018
|
ordered_results[index] = member_results
|
|
1006
1019
|
stop = true unless member_results.all?(&:ok?)
|
|
@@ -1130,12 +1143,24 @@ module Kettle
|
|
|
1130
1143
|
Array.new(wave_jobs) do
|
|
1131
1144
|
Thread.new do # rubocop:disable ThreadSafety/NewThread -- detached worktrees isolate concurrent monorepo template members.
|
|
1132
1145
|
loop do
|
|
1133
|
-
|
|
1146
|
+
assignment = mutex.synchronize do
|
|
1147
|
+
next if stop
|
|
1148
|
+
|
|
1149
|
+
begin
|
|
1150
|
+
index, entry = queue.pop(true)
|
|
1151
|
+
start_template_member_progress(progress, entry.fetch(:member))
|
|
1152
|
+
[index, entry]
|
|
1153
|
+
rescue ThreadError
|
|
1154
|
+
nil
|
|
1155
|
+
end
|
|
1156
|
+
end
|
|
1157
|
+
break unless assignment
|
|
1134
1158
|
|
|
1135
|
-
index, entry =
|
|
1159
|
+
index, entry = assignment
|
|
1136
1160
|
member_results = template_results_for_member(
|
|
1137
1161
|
entry.fetch(:member),
|
|
1138
1162
|
progress: progress,
|
|
1163
|
+
progress_started: true,
|
|
1139
1164
|
commit_changes: false,
|
|
1140
1165
|
wave_jobs: wave_jobs
|
|
1141
1166
|
)
|
|
@@ -1347,6 +1372,7 @@ module Kettle
|
|
|
1347
1372
|
candidate_members.each_with_object([]) do |member, results|
|
|
1348
1373
|
next unless bootstrap.member_needs_bootstrap?(member)
|
|
1349
1374
|
|
|
1375
|
+
floor_paths = bootstrap.paths_to_update(member)
|
|
1350
1376
|
floor_result = bootstrap.bootstrap_member(member)
|
|
1351
1377
|
results << floor_result
|
|
1352
1378
|
break results unless results.last.ok?
|
|
@@ -1358,11 +1384,30 @@ module Kettle
|
|
|
1358
1384
|
env: bup_bootstrap_dependency_env(member)
|
|
1359
1385
|
)
|
|
1360
1386
|
break results unless results.last.ok?
|
|
1387
|
+
|
|
1388
|
+
results << commit_bup_bootstrap(member: member, paths: floor_paths, runner: runner) if commit
|
|
1389
|
+
break results unless results.last.ok? || !commit
|
|
1361
1390
|
end
|
|
1362
1391
|
rescue => error
|
|
1363
1392
|
[template_bootstrap_failure_result(workflow_members.first, error.message)]
|
|
1364
1393
|
end
|
|
1365
1394
|
|
|
1395
|
+
def commit_bup_bootstrap(member:, paths:, runner:)
|
|
1396
|
+
paths = (Array(paths) + ["Gemfile.lock"]).uniq
|
|
1397
|
+
pathspecs = paths.map { |path| Shellwords.escape(path) }.join(" ")
|
|
1398
|
+
runner.call(
|
|
1399
|
+
member: member,
|
|
1400
|
+
phase: "commit_bup_bootstrap",
|
|
1401
|
+
command: [
|
|
1402
|
+
"sh",
|
|
1403
|
+
"-lc",
|
|
1404
|
+
"git add -- #{pathspecs} && " \
|
|
1405
|
+
"if git diff --cached --quiet -- #{pathspecs}; then exit 0; fi; " \
|
|
1406
|
+
"git commit --only -m '🔒️ Update nomono bootstrap' -- #{pathspecs}"
|
|
1407
|
+
]
|
|
1408
|
+
)
|
|
1409
|
+
end
|
|
1410
|
+
|
|
1366
1411
|
def bup_bootstrap_dependency_env(member)
|
|
1367
1412
|
bundle_update_env.merge(
|
|
1368
1413
|
# A standalone update re-resolves against the member's own bundle. The
|
|
@@ -1466,15 +1511,10 @@ module Kettle
|
|
|
1466
1511
|
)
|
|
1467
1512
|
end
|
|
1468
1513
|
|
|
1469
|
-
def template_results_for_member(member, progress: nil, progress_key: nil, progress_label: nil, commit_changes: true, wave_jobs: 1)
|
|
1514
|
+
def template_results_for_member(member, progress: nil, progress_key: nil, progress_label: nil, progress_started: false, commit_changes: true, wave_jobs: 1)
|
|
1470
1515
|
progress_key ||= member.name
|
|
1471
1516
|
progress_label ||= member.name
|
|
1472
|
-
progress
|
|
1473
|
-
member,
|
|
1474
|
-
total: template_phase_total(member),
|
|
1475
|
-
status: template_initial_status(member),
|
|
1476
|
-
**template_progress_identity_options(member, progress_key, progress_label)
|
|
1477
|
-
)
|
|
1517
|
+
start_template_member_progress(progress, member, progress_key: progress_key, progress_label: progress_label) unless progress_started
|
|
1478
1518
|
runner = CommandRunner.new(execute: execute, accept: accept)
|
|
1479
1519
|
[].tap do |memo|
|
|
1480
1520
|
if config.normalize_lockfiles?
|
|
@@ -1749,9 +1789,26 @@ module Kettle
|
|
|
1749
1789
|
Array.new(wave_jobs) do
|
|
1750
1790
|
Thread.new do # rubocop:disable ThreadSafety/NewThread -- independent branch worktrees are safe to template concurrently.
|
|
1751
1791
|
loop do
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
|
|
1792
|
+
assignment = mutex.synchronize do
|
|
1793
|
+
next if stop
|
|
1794
|
+
|
|
1795
|
+
begin
|
|
1796
|
+
index, entry = queue.pop(true)
|
|
1797
|
+
start_template_member_progress(
|
|
1798
|
+
progress,
|
|
1799
|
+
entry.fetch(:member),
|
|
1800
|
+
progress_key: template_branch_progress_key(entry),
|
|
1801
|
+
progress_label: template_branch_progress_label(entry)
|
|
1802
|
+
)
|
|
1803
|
+
[index, entry]
|
|
1804
|
+
rescue ThreadError
|
|
1805
|
+
nil
|
|
1806
|
+
end
|
|
1807
|
+
end
|
|
1808
|
+
break unless assignment
|
|
1809
|
+
|
|
1810
|
+
index, entry = assignment
|
|
1811
|
+
branch_results = template_branch_worktree_entry_results(entry, progress: progress, progress_started: true, wave_jobs: wave_jobs)
|
|
1755
1812
|
mutex.synchronize do
|
|
1756
1813
|
ordered_results[index] = branch_results
|
|
1757
1814
|
stop = true unless branch_results.all?(&:ok?)
|
|
@@ -1764,7 +1821,7 @@ module Kettle
|
|
|
1764
1821
|
results + ordered_results.compact.flatten
|
|
1765
1822
|
end
|
|
1766
1823
|
|
|
1767
|
-
def template_branch_worktree_entry_results(entry, progress: nil, wave_jobs: 1)
|
|
1824
|
+
def template_branch_worktree_entry_results(entry, progress: nil, progress_started: false, wave_jobs: 1)
|
|
1768
1825
|
member = entry.fetch(:member)
|
|
1769
1826
|
branch = entry.fetch(:branch)
|
|
1770
1827
|
# Bootstrap and upstream synchronization are deliberately performed
|
|
@@ -1775,6 +1832,7 @@ module Kettle
|
|
|
1775
1832
|
progress: progress,
|
|
1776
1833
|
progress_key: template_branch_progress_key(entry),
|
|
1777
1834
|
progress_label: template_branch_progress_label(entry),
|
|
1835
|
+
progress_started: progress_started,
|
|
1778
1836
|
wave_jobs: wave_jobs
|
|
1779
1837
|
)
|
|
1780
1838
|
tag_branch_results(results, branch)
|
|
@@ -4802,6 +4860,15 @@ module Kettle
|
|
|
4802
4860
|
progress
|
|
4803
4861
|
end
|
|
4804
4862
|
|
|
4863
|
+
def start_template_member_progress(progress, member, progress_key: member.name, progress_label: member.name)
|
|
4864
|
+
progress&.start_member(
|
|
4865
|
+
member,
|
|
4866
|
+
total: template_phase_total(member),
|
|
4867
|
+
status: template_initial_status(member),
|
|
4868
|
+
**template_progress_identity_options(member, progress_key, progress_label)
|
|
4869
|
+
)
|
|
4870
|
+
end
|
|
4871
|
+
|
|
4805
4872
|
def start_release_progress(release_members)
|
|
4806
4873
|
wave_numbers = release_waves(release_members).each_with_index.flat_map do |wave, index|
|
|
4807
4874
|
wave.map { |member| [member.name, index + 1] }
|
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: 1.3.
|
|
4
|
+
version: 1.3.26
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -134,7 +134,7 @@ dependencies:
|
|
|
134
134
|
version: '3.1'
|
|
135
135
|
- - ">="
|
|
136
136
|
- !ruby/object:Gem::Version
|
|
137
|
-
version: 3.1.
|
|
137
|
+
version: 3.1.19
|
|
138
138
|
type: :runtime
|
|
139
139
|
prerelease: false
|
|
140
140
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -144,7 +144,7 @@ dependencies:
|
|
|
144
144
|
version: '3.1'
|
|
145
145
|
- - ">="
|
|
146
146
|
- !ruby/object:Gem::Version
|
|
147
|
-
version: 3.1.
|
|
147
|
+
version: 3.1.19
|
|
148
148
|
- !ruby/object:Gem::Dependency
|
|
149
149
|
name: kettle-gha-pins
|
|
150
150
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -567,10 +567,10 @@ licenses:
|
|
|
567
567
|
- AGPL-3.0-only
|
|
568
568
|
metadata:
|
|
569
569
|
homepage_uri: https://kettle-family.galtzo.com
|
|
570
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.3.
|
|
571
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.3.
|
|
570
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.3.26
|
|
571
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.3.26/CHANGELOG.md
|
|
572
572
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
573
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.3.
|
|
573
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.3.26
|
|
574
574
|
funding_uri: https://github.com/sponsors/pboling
|
|
575
575
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
576
576
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|