kettle-family 1.3.25 → 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: 5fd8e91edaffccff9ac6016c1dbf3ce50eb1c1453c344f1568d111797a2e838c
4
- data.tar.gz: 1f25730d8c419d87600e48dc06793cb7aff484369e2ba05643d1ce6faa3a596e
3
+ metadata.gz: 6cd05963542f86f54bc825842b8f73649a7520e61ddc695c505a6d19b3897581
4
+ data.tar.gz: c4fc9a81de19c42aa0265fa04d255dc4f40ddcd5485aff3eec57b44647a26ddd
5
5
  SHA512:
6
- metadata.gz: 408834a4d45b2e802c857459f2c48930f25d2750928412770e81852eb063d8712896b13154f0953ac9034eef1d41cf72c4587b6456a512b15dfb14ada10b53b8
7
- data.tar.gz: e3218229fdd996dc95bb2e1f9a5036d3e0366625e9b960593897f2b088cfc525f890c21b544d691eead4ceccda14fe9aeadb97fdaca631dd73e5074bd6364149
6
+ metadata.gz: 97f87951b90ef59a674a55678be2af49d853f874d221297f3dd8661311400997f5430b9dd9b9e4ce88b32c543baf0d60977b975602a2d01c54f3c0217442c495
7
+ data.tar.gz: d25120f0322dc957334262f218c07ad8be84669d3632ddcc33aecc7e4f9217407246489b3bcca24aae5e26a43618bc8be888fbba0a3278b8920f6985468be242
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,17 @@ 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
+
33
44
  ## [1.3.25] - 2026-10-20
34
45
 
35
46
  - TAG: [v1.3.25][1.3.25t]
@@ -3154,7 +3165,9 @@ Please file a bug if you notice a violation of semantic versioning.
3154
3165
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
3155
3166
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
3156
3167
 
3157
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.3.25...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
3158
3171
  [1.3.25]: https://github.com/kettle-dev/kettle-family/compare/v1.3.24...v1.3.25
3159
3172
  [1.3.25t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.3.25
3160
3173
  [1.3.24]: https://github.com/kettle-dev/kettle-family/compare/v1.3.23...v1.3.24
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.935-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
@@ -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.25"
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
  )
@@ -1486,15 +1511,10 @@ module Kettle
1486
1511
  )
1487
1512
  end
1488
1513
 
1489
- 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)
1490
1515
  progress_key ||= member.name
1491
1516
  progress_label ||= member.name
1492
- progress&.start_member(
1493
- member,
1494
- total: template_phase_total(member),
1495
- status: template_initial_status(member),
1496
- **template_progress_identity_options(member, progress_key, progress_label)
1497
- )
1517
+ start_template_member_progress(progress, member, progress_key: progress_key, progress_label: progress_label) unless progress_started
1498
1518
  runner = CommandRunner.new(execute: execute, accept: accept)
1499
1519
  [].tap do |memo|
1500
1520
  if config.normalize_lockfiles?
@@ -1769,9 +1789,26 @@ module Kettle
1769
1789
  Array.new(wave_jobs) do
1770
1790
  Thread.new do # rubocop:disable ThreadSafety/NewThread -- independent branch worktrees are safe to template concurrently.
1771
1791
  loop do
1772
- break if mutex.synchronize { stop }
1773
- index, entry = queue.pop(true)
1774
- 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)
1775
1812
  mutex.synchronize do
1776
1813
  ordered_results[index] = branch_results
1777
1814
  stop = true unless branch_results.all?(&:ok?)
@@ -1784,7 +1821,7 @@ module Kettle
1784
1821
  results + ordered_results.compact.flatten
1785
1822
  end
1786
1823
 
1787
- 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)
1788
1825
  member = entry.fetch(:member)
1789
1826
  branch = entry.fetch(:branch)
1790
1827
  # Bootstrap and upstream synchronization are deliberately performed
@@ -1795,6 +1832,7 @@ module Kettle
1795
1832
  progress: progress,
1796
1833
  progress_key: template_branch_progress_key(entry),
1797
1834
  progress_label: template_branch_progress_label(entry),
1835
+ progress_started: progress_started,
1798
1836
  wave_jobs: wave_jobs
1799
1837
  )
1800
1838
  tag_branch_results(results, branch)
@@ -4822,6 +4860,15 @@ module Kettle
4822
4860
  progress
4823
4861
  end
4824
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
+
4825
4872
  def start_release_progress(release_members)
4826
4873
  wave_numbers = release_waves(release_members).each_with_index.flat_map do |wave, index|
4827
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.25
4
+ version: 1.3.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -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.25
571
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.3.25/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.25
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