kettle-family 1.2.39 → 1.2.41

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: 7c2b4b67196f2ac81a18e5f751d117a014f936fc4e10dc360e03aa2a18140791
4
- data.tar.gz: 9bf86a36a7765c523491102ed4107cc1b573a0af75b94ba346ca1339dd4bf37a
3
+ metadata.gz: 06e650b41451e42fa21f02b33415452f6150a28f23a7201476d7b53898985836
4
+ data.tar.gz: 78d0efc3990b00ae0f89e9fb0e4ea1f187248cdfb23280492495cd119e4b5e42
5
5
  SHA512:
6
- metadata.gz: 8b380f9db11078f743de7208e7135afcf033340cf0af93b54446791e56a18386a8ea205162a2afe08fac63cf2a3b96cd0cc6fdfc33b1976cbae5c1f021e735ba
7
- data.tar.gz: b8e43f90700061a3a0c023f7f5eab0b6739104325a715296e761bdc18d7158b86eff1917ed5885e5b9b0ace35ed5a39f8f3e8f6ff036571d0ad641e87dcf02bb
6
+ metadata.gz: 73a92a80cfa7c1774bdf4af3cdd36f5e9d56eaab91a350b3ef9ac2478d3c142f8843c732b2d7a5c5690dfb317a0fad2d855bead22054e5044cd08504d978e87d
7
+ data.tar.gz: 3266c134547b5a0001c1979d706b2d68bee48deea4b4f4fa787a833e8a47379c5d94e4b121885f5f99a9f81c0b1fedcd1099babbce9807c91ee269a9c5c403d9
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,34 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.41] - 2026-08-07
34
+
35
+ - TAG: [v1.2.41][1.2.41t]
36
+ - COVERAGE: 93.55% -- 5020/5366 lines in 32 files
37
+ - BRANCH COVERAGE: 76.05% -- 2010/2643 branches in 32 files
38
+ - 29.81% documented
39
+
40
+ ### Fixed
41
+
42
+ - Propagate shared-version bump state across all family members.
43
+
44
+ - Align incomplete shared-version bumps to one family target version.
45
+
46
+ - Distinguish partial shared-version bumps from aligned family bumps.
47
+
48
+ ## [1.2.40] - 2026-08-07
49
+
50
+ - TAG: [v1.2.40][1.2.40t]
51
+ - COVERAGE: 93.62% -- 5007/5348 lines in 32 files
52
+ - BRANCH COVERAGE: 76.09% -- 2002/2631 branches in 32 files
53
+ - 29.81% documented
54
+
55
+ ### Fixed
56
+
57
+ - Compute bump release state for shared-changelog members.
58
+
59
+ - Select the complete shared-version family when any member requires a version bump.
60
+
33
61
  ## [1.2.39] - 2026-08-07
34
62
 
35
63
  - TAG: [v1.2.39][1.2.39t]
@@ -1896,7 +1924,11 @@ Please file a bug if you notice a violation of semantic versioning.
1896
1924
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
1897
1925
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
1898
1926
 
1899
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.39...HEAD
1927
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.41...HEAD
1928
+ [1.2.41]: https://github.com/kettle-dev/kettle-family/compare/v1.2.40...v1.2.41
1929
+ [1.2.41t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.41
1930
+ [1.2.40]: https://github.com/kettle-dev/kettle-family/compare/v1.2.39...v1.2.40
1931
+ [1.2.40t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.40
1900
1932
  [1.2.39]: https://github.com/kettle-dev/kettle-family/compare/v1.2.38...v1.2.39
1901
1933
  [1.2.39t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.39
1902
1934
  [1.2.38]: https://github.com/kettle-dev/kettle-family/compare/v1.2.37...v1.2.38
data/README.md CHANGED
@@ -837,7 +837,7 @@ Thanks for RTFM. ☺️
837
837
  [📌gitmoji]: https://gitmoji.dev
838
838
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
839
839
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
840
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.344-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
840
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.366-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
841
841
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
842
842
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
843
843
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -655,7 +655,11 @@ module Kettle
655
655
  end
656
656
  state_event_tape = release_state_event_tape(command: command, config: config, options: options)
657
657
  release_state_results = release_state_results_for_selection(config: config, members: ordered, only: effective_only, jobs: options[:jobs])
658
- selected = Selection.new(members: ordered, release_state_results: release_state_results).apply(only: effective_only, exclude: options[:exclude], start_at: start_at.member)
658
+ selected = Selection.new(
659
+ members: ordered,
660
+ release_state_results: release_state_results,
661
+ shared_version: config.shared_changelog?
662
+ ).apply(only: effective_only, exclude: options[:exclude], start_at: start_at.member)
659
663
  result_members = selected
660
664
  display_members = display_members_for(command: command, config: config, members: ordered, selected_members: selected)
661
665
  display_selected_members = display_members_for(command: command, config: config, members: selected, selected_members: selected)
@@ -746,7 +750,7 @@ module Kettle
746
750
 
747
751
  def command_results_for_current_branch(command:, config:, members:, options:, start_at: StartAt.new(nil, nil), state_event_handler: nil)
748
752
  return mise_trust_results(config: config, members: members) if command == "mise-trust"
749
- return bump_version_results(members: members, options: options, phase: command) if %w[bump bump-version].include?(command)
753
+ return bump_version_results(config: config, members: members, options: options, phase: command) if %w[bump bump-version].include?(command)
750
754
  return add_changelog_results(members: members, options: options) if command == "add-changelog"
751
755
  return clean_unreleased_results(config: config, members: members, options: options) if command == "clean-unreleased"
752
756
  return reconcile_release_results(config: config, members: members, options: options) if command == "reconcile-releases"
@@ -999,12 +1003,13 @@ module Kettle
999
1003
  StartAt.new(member, branch)
1000
1004
  end
1001
1005
 
1002
- def bump_version_results(members:, options:, phase:)
1006
+ def bump_version_results(config:, members:, options:, phase:)
1003
1007
  require_relative "version_bump"
1004
1008
  require_relative "release_waves"
1005
1009
 
1006
1010
  results = []
1007
1011
  completed_target_versions = {}
1012
+ shared_target_version = shared_bump_target_version(config: config, members: members, options: options)
1008
1013
  ReleaseWaves.new(members: members).waves.each do |wave|
1009
1014
  bump = VersionBump.new(
1010
1015
  members: wave,
@@ -1012,6 +1017,7 @@ module Kettle
1012
1017
  from_version: options[:from_version],
1013
1018
  mode: bump_version_mode(options),
1014
1019
  phase: phase,
1020
+ shared_target_version: shared_target_version,
1015
1021
  dependency_target_versions: completed_target_versions
1016
1022
  )
1017
1023
  wave_results = bump.results
@@ -1038,6 +1044,17 @@ module Kettle
1038
1044
  end
1039
1045
  end
1040
1046
 
1047
+ def shared_bump_target_version(config:, members:, options:)
1048
+ return unless config.shared_changelog?
1049
+ return unless Kettle::Dev::VersionBump::BUMP_TYPES.include?(options[:target_version].to_s)
1050
+
1051
+ versions = members.map { |member| Gem::Version.new(member.version.to_s) }.uniq
1052
+ current = versions.max
1053
+ return current.to_s if versions.length > 1
1054
+
1055
+ Kettle::Dev::VersionBump.resolve_target_version(options[:target_version].to_s, current.to_s)
1056
+ end
1057
+
1041
1058
  def add_changelog_results(members:, options:)
1042
1059
  section = options[:changelog_section].to_s
1043
1060
  entry = options[:changelog_entry].to_s
@@ -35,7 +35,10 @@ module Kettle
35
35
 
36
36
  def results(event_handler: nil)
37
37
  return branch_results(event_handler: event_handler) unless release_target_branches.empty?
38
- return parallel_map(members) { |member| check_shared_changelog_member_or_local(member, event_handler: event_handler) } if shared_changelog?
38
+ if shared_changelog?
39
+ results = parallel_map(members) { |member| check_shared_changelog_member_or_local(member, event_handler: event_handler) }
40
+ return normalize_shared_version_bump(results)
41
+ end
39
42
 
40
43
  member_results = parallel_map(members) do |member|
41
44
  member_branch_results = member_local_branch_results(member, event_handler: event_handler)
@@ -55,7 +58,8 @@ module Kettle
55
58
  with_branch_worktree(root: root, branch: branch) do |worktree_root|
56
59
  branch_members = discover_branch_members(worktree_root: worktree_root, selected_names: selected_names)
57
60
  if shared_changelog?
58
- memo.concat(parallel_map(branch_members) { |member| check_shared_changelog_member_or_local(member, branch: branch, event_handler: event_handler) })
61
+ results = parallel_map(branch_members) { |member| check_shared_changelog_member_or_local(member, branch: branch, event_handler: event_handler) }
62
+ memo.concat(normalize_shared_version_bump(results))
59
63
  next
60
64
  end
61
65
 
@@ -118,6 +122,7 @@ module Kettle
118
122
  success = status.success?
119
123
  emit_event(event_handler, member: member, branch: branch, action: "changelog_command", status: success ? "ok" : "failed", elapsed_seconds: elapsed, status_code: status.exitstatus)
120
124
  state = success ? JSON.parse(stdout) : {}
125
+ state = state_with_computed_booleans(state) if success
121
126
  state = branch_filtered_state(member, state, branch) if success && branch
122
127
  emit_event(event_handler, member: member, branch: branch, action: "git_state", status: "running") if success
123
128
  state = enrich_git_state(member.root, state, branch: branch) if success
@@ -735,6 +740,28 @@ module Kettle
735
740
  config&.shared_changelog?
736
741
  end
737
742
 
743
+ def normalize_shared_version_bump(results)
744
+ return results unless results.any? { |result| result.ok? && result.state["bump_release_pending"] == true }
745
+
746
+ results.map do |result|
747
+ next result unless result.ok?
748
+
749
+ result.class.new(
750
+ member_name: result.member_name,
751
+ command: result.command,
752
+ workdir: result.workdir,
753
+ status: result.status,
754
+ success: result.success,
755
+ stdout: result.stdout,
756
+ stderr: result.stderr,
757
+ elapsed_seconds: result.elapsed_seconds,
758
+ state: result.state.merge("bump_release_pending" => true),
759
+ reason: result.reason,
760
+ branch: result.branch
761
+ )
762
+ end
763
+ end
764
+
738
765
  def git_root
739
766
  stdout, stderr, status = Open3.capture3("git", "rev-parse", "--show-toplevel", chdir: config.root)
740
767
  raise Error, "could not determine git root for #{config.root}: #{stderr}" unless status.success?
@@ -21,9 +21,10 @@ module Kettle
21
21
  STATUS_TOKEN_KEYS.key?(value.to_s)
22
22
  end
23
23
 
24
- def initialize(members:, release_state_results: nil)
24
+ def initialize(members:, release_state_results: nil, shared_version: false)
25
25
  @members = members
26
26
  @release_state_results = release_state_results
27
+ @shared_version = shared_version
27
28
  end
28
29
 
29
30
  def apply(only: nil, exclude: nil, start_at: nil)
@@ -38,7 +39,7 @@ module Kettle
38
39
 
39
40
  private
40
41
 
41
- attr_reader :members, :release_state_results
42
+ attr_reader :members, :release_state_results, :shared_version
42
43
 
43
44
  def select_only(selected, only)
44
45
  names = only.split(",").map(&:strip).reject(&:empty?)
@@ -80,6 +81,10 @@ module Kettle
80
81
  failed = results_by_member.values.select { |result| !result.ok? }
81
82
  raise Error, "release-state check failed for: #{failed.map(&:member_name).join(", ")}" unless failed.empty?
82
83
 
84
+ if shared_version && status_tokens.include?("bump")
85
+ return selected if selected.any? { |candidate| truthy_state?(results_by_member[candidate.name]&.state&.fetch("bump_release_pending", nil)) }
86
+ end
87
+
83
88
  selected.select do |candidate|
84
89
  result = results_by_member[candidate.name]
85
90
  result && status_tokens.all? { |token| truthy_state?(result.state[STATUS_TOKEN_KEYS.fetch(token)]) }
@@ -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.2.39"
8
+ VERSION = "1.2.41"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -7,13 +7,14 @@ module Kettle
7
7
  class VersionBump
8
8
  DEPENDENCY_METHODS = %i[add_dependency add_runtime_dependency add_development_dependency].freeze
9
9
 
10
- def initialize(members:, target_version:, from_version: nil, mode: :dry_run, phase: "bump-version", dependency_target_versions: nil)
10
+ def initialize(members:, target_version:, from_version: nil, mode: :dry_run, phase: "bump-version", dependency_target_versions: nil, shared_target_version: nil)
11
11
  @members = members
12
12
  @target_version = target_version.to_s
13
13
  @explicit_target_version = validate_version(target_version) unless Kettle::Dev::VersionBump::BUMP_TYPES.include?(@target_version)
14
14
  @from_version = validate_version(from_version) if from_version
15
15
  @mode = mode
16
16
  @phase = phase
17
+ @shared_target_version = shared_target_version && validate_version(shared_target_version)
17
18
  @member_names = members.map(&:name)
18
19
  @member_target_versions = members.each_with_object({}) do |member, memo|
19
20
  memo[member.name] = resolve_target_version(member)
@@ -32,7 +33,7 @@ module Kettle
32
33
 
33
34
  private
34
35
 
35
- attr_reader :members, :target_version, :explicit_target_version, :from_version, :mode, :phase, :member_target_versions, :dependency_target_versions, :dependency_member_names
36
+ attr_reader :members, :target_version, :explicit_target_version, :from_version, :mode, :phase, :member_target_versions, :dependency_target_versions, :dependency_member_names, :shared_target_version
36
37
 
37
38
  def validate_version(version)
38
39
  with_dev_errors { Kettle::Dev::VersionBump.validate_version(version) }
@@ -147,6 +148,7 @@ module Kettle
147
148
 
148
149
  def resolve_target_version(member)
149
150
  return explicit_target_version unless Kettle::Dev::VersionBump::BUMP_TYPES.include?(target_version)
151
+ return shared_target_version if shared_target_version
150
152
 
151
153
  with_dev_errors { Kettle::Dev::VersionBump.resolve_target_version(target_version, member.version) }
152
154
  end
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.2.39
4
+ version: 1.2.41
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -360,10 +360,10 @@ licenses:
360
360
  - AGPL-3.0-only
361
361
  metadata:
362
362
  homepage_uri: https://kettle-family.galtzo.com
363
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.39
364
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.39/CHANGELOG.md
363
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.41
364
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.41/CHANGELOG.md
365
365
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
366
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.39
366
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.41
367
367
  funding_uri: https://github.com/sponsors/pboling
368
368
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
369
369
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file