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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb4b30fa1f9686486190145163ab60e6cefb229baa32a20c998d68ba922839a6
4
- data.tar.gz: 3907e7ac24a0b8e2292aac9bcf994a4af8dc26ed65815de6a938b2ebc595c8f7
3
+ metadata.gz: 6cd05963542f86f54bc825842b8f73649a7520e61ddc695c505a6d19b3897581
4
+ data.tar.gz: c4fc9a81de19c42aa0265fa04d255dc4f40ddcd5485aff3eec57b44647a26ddd
5
5
  SHA512:
6
- metadata.gz: e5453963f37698bc584bcd170b5856f1080fa37b5a85a3635806809a785bb3da15efbe11e5020933a27e8ae9a769cb7b40db6a109606cece50c0f012fb37d857
7
- data.tar.gz: f0a93ff85d5881c187eae578b26e87e083424bf3e5646e4573b80ca0c1468d70a176fc2b365da1da538fb82a48fa2c198a5e38fbfa194fb45fb51a8d040bae0a
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.24...HEAD
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.926-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
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.24"
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
- template_progress = start_template_progress(workflow_members)
947
- results = template_dependency_waves(workflow_members).each_with_object([]) do |wave, memo|
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
- break if mutex.synchronize { stop }
1002
- index, member = queue.pop(true)
1003
- member_results = template_results_for_member(member, progress: progress, wave_jobs: wave_jobs)
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
- break if mutex.synchronize { stop }
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 = queue.pop(true)
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&.start_member(
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
- break if mutex.synchronize { stop }
1753
- index, entry = queue.pop(true)
1754
- branch_results = template_branch_worktree_entry_results(entry, progress: progress, wave_jobs: wave_jobs)
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.24
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.18
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.18
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.24
571
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.3.24/CHANGELOG.md
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.24
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