kettle-family 1.2.53 → 1.2.54

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: 142cc12e09a0cef0f2a8c41fa8344118ac2b7b364e276b737dbef3af2c1e9610
4
- data.tar.gz: e2ef27781a88460028c6b726718c1e28820122573a81cbff719db1d1c4b7eb1f
3
+ metadata.gz: c0f5a2c157047beb738100cc8d76c0df51c1664ebd6156fe4b8df9d6a2f80c1a
4
+ data.tar.gz: 930877d4514aa57efadabc0a22a39cbae5fcb3610ef07019c5fce3b050b4bcb2
5
5
  SHA512:
6
- metadata.gz: 729b27a105e4311d47dcf413c21d4aa728fca9153d9a2f3a29acec90e63aaef1b75374cdadb5c785dd370abb147f7e40c8ae4e761758cb49e4489676017a423b
7
- data.tar.gz: 210f2898d436674e9ba408f592bf1fd6c85dd56d186c85e3b50b21c08f8fdfc93d04c2b615c01ffed68824ba75ab52290a5622b169913a9d1e4b72e40539467c
6
+ metadata.gz: 5c4811b61a654bb5e496c3f0069f56b788d0262b3b6276a02e926b68dfb8a7c985a251af93b45fe3d6824586ee49b2c7e331124b911f88a4b63853e504f55aa5
7
+ data.tar.gz: 42b4aef5d2795e99cb011ef56f8607fb5a24ff9a338230959cf72f2e9ef6474ca2c2b75fa8adb12daed8fce22b654094eaaf35183150d367c0d7154c10c4dd95
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.2.54] - 2026-08-12
34
+
35
+ - TAG: [v1.2.54][1.2.54t]
36
+ - COVERAGE: 93.57% -- 5270/5632 lines in 33 files
37
+ - BRANCH COVERAGE: 76.23% -- 2120/2781 branches in 33 files
38
+ - 29.86% documented
39
+
40
+ ### Fixed
41
+
42
+ - Family releases now reconcile already-published sibling dependency floors and remote lockfiles before resuming a selected release set.
43
+
33
44
  ## [1.2.53] - 2026-08-12
34
45
 
35
46
  - TAG: [v1.2.53][1.2.53t]
@@ -2098,7 +2109,9 @@ Please file a bug if you notice a violation of semantic versioning.
2098
2109
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2099
2110
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2100
2111
 
2101
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.53...HEAD
2112
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.54...HEAD
2113
+ [1.2.54]: https://github.com/kettle-dev/kettle-family/compare/v1.2.53...v1.2.54
2114
+ [1.2.54t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.54
2102
2115
  [1.2.53]: https://github.com/kettle-dev/kettle-family/compare/v1.2.52...v1.2.53
2103
2116
  [1.2.53t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.53
2104
2117
  [1.2.52]: https://github.com/kettle-dev/kettle-family/compare/v1.2.51...v1.2.52
data/README.md CHANGED
@@ -836,7 +836,7 @@ Thanks for RTFM. ☺️
836
836
  [📌gitmoji]: https://gitmoji.dev
837
837
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
838
838
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
839
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.613-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
839
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.632-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
840
840
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
841
841
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
842
842
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -652,7 +652,10 @@ module Kettle
652
652
  effective_only = default_only_filter(command: command, only: options[:only])
653
653
  discovery = Discovery.new(
654
654
  config: config,
655
- release_dependency_member_names: direct_member_only_names(effective_only)
655
+ # Release reconciliation needs the complete family graph: a
656
+ # dependency that published in an earlier invocation is not part of
657
+ # a subsequent --only pend selection.
658
+ release_dependency_member_names: (command == "release") ? nil : direct_member_only_names(effective_only)
656
659
  )
657
660
  members = discovery.members
658
661
  ordered = if command == "install"
@@ -685,6 +688,7 @@ module Kettle
685
688
  command: command,
686
689
  config: config,
687
690
  members: result_members,
691
+ family_members: ordered,
688
692
  options: options,
689
693
  start_at: start_at,
690
694
  state_event_handler: state_event_handler
@@ -712,11 +716,11 @@ module Kettle
712
716
 
713
717
  StartAt = Struct.new(:member, :branch)
714
718
 
715
- def command_results(command:, config:, members:, options:, start_at:, state_event_handler: nil)
716
- return branch_target_command_results(command: command, config: config, members: members, options: options, start_at: start_at) if branch_target_command?(command, config)
717
- return member_local_branch_target_command_results(command: command, config: config, members: members, options: options, start_at: start_at) if member_local_branch_target_command?(command, config, members)
719
+ def command_results(command:, config:, members:, family_members:, options:, start_at:, state_event_handler: nil)
720
+ return branch_target_command_results(command: command, config: config, members: members, family_members: family_members, options: options, start_at: start_at) if branch_target_command?(command, config)
721
+ return member_local_branch_target_command_results(command: command, config: config, members: members, family_members: family_members, options: options, start_at: start_at) if member_local_branch_target_command?(command, config, members)
718
722
 
719
- command_results_for_current_branch(command: command, config: config, members: members, options: options, start_at: start_at, state_event_handler: state_event_handler)
723
+ command_results_for_current_branch(command: command, config: config, members: members, family_members: family_members, options: options, start_at: start_at, state_event_handler: state_event_handler)
720
724
  end
721
725
 
722
726
  def release_state_results_for_selection(config:, members:, only:, jobs: nil)
@@ -757,7 +761,7 @@ module Kettle
757
761
  members
758
762
  end
759
763
 
760
- def command_results_for_current_branch(command:, config:, members:, options:, start_at: StartAt.new(nil, nil), state_event_handler: nil)
764
+ def command_results_for_current_branch(command:, config:, members:, options:, family_members: members, start_at: StartAt.new(nil, nil), state_event_handler: nil)
761
765
  return mise_trust_results(config: config, members: members) if command == "mise-trust"
762
766
  return bump_version_results(config: config, members: members, options: options, phase: command) if %w[bump bump-version].include?(command)
763
767
  return add_changelog_results(members: members, options: options) if command == "add-changelog"
@@ -772,6 +776,7 @@ module Kettle
772
776
  command: command,
773
777
  config: config,
774
778
  members: members,
779
+ family_members: family_members,
775
780
  execute: options[:execute],
776
781
  accept: options[:accept],
777
782
  commit: options[:commit],
@@ -931,7 +936,7 @@ module Kettle
931
936
  members.any? { |member| member_release_config(member: member, config: config) }
932
937
  end
933
938
 
934
- def branch_target_command_results(command:, config:, members:, options:, start_at:)
939
+ def branch_target_command_results(command:, config:, members:, family_members:, options:, start_at:)
935
940
  runner = CommandRunner.new(execute: options[:execute])
936
941
  selected_names = members.map(&:name)
937
942
  release_target_branches(command: command, config: config, start_at: start_at).each_with_object([]) do |branch, memo|
@@ -945,7 +950,7 @@ module Kettle
945
950
 
946
951
  branch_members = rediscovered_selected_members(config: config, selected_names: selected_names, command: command)
947
952
  branch_members = members if branch_members.empty?
948
- branch_results = command_results_for_current_branch(command: command, config: config, members: branch_members, options: options)
953
+ branch_results = command_results_for_current_branch(command: command, config: config, members: branch_members, family_members: family_members, options: options)
949
954
  branch_results.each { |result| result.branch = branch if result.respond_to?(:branch=) }
950
955
  memo.concat(branch_results)
951
956
  break memo unless memo.last&.ok?
@@ -955,12 +960,12 @@ module Kettle
955
960
  end
956
961
  end
957
962
 
958
- def member_local_branch_target_command_results(command:, config:, members:, options:, start_at:)
963
+ def member_local_branch_target_command_results(command:, config:, members:, family_members:, options:, start_at:)
959
964
  runner = CommandRunner.new(execute: options[:execute])
960
965
  members.each_with_object([]) do |member, memo|
961
966
  member_config = member_release_config(member: member, config: config)
962
967
  unless member_config
963
- memo.concat(command_results_for_current_branch(command: command, config: config, members: [member], options: options))
968
+ memo.concat(command_results_for_current_branch(command: command, config: config, members: [member], family_members: family_members, options: options))
964
969
  break memo unless memo.last&.ok?
965
970
  next
966
971
  end
@@ -976,7 +981,7 @@ module Kettle
976
981
 
977
982
  branch_members = rediscovered_selected_members(config: member_config, selected_names: [member.name], command: command)
978
983
  branch_members = [member] if branch_members.empty?
979
- branch_results = command_results_for_current_branch(command: command, config: member_config, members: branch_members, options: options)
984
+ branch_results = command_results_for_current_branch(command: command, config: member_config, members: branch_members, family_members: family_members, options: options)
980
985
  branch_results.each { |result| result.branch = branch if result.respond_to?(:branch=) }
981
986
  memo.concat(branch_results)
982
987
  break unless memo.last&.ok?
@@ -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.53"
8
+ VERSION = "1.2.54"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -102,10 +102,11 @@ module Kettle
102
102
  REGISTRY_WAIT_ATTEMPTS = 15
103
103
  REGISTRY_WAIT_INTERVAL_SECONDS = 15
104
104
 
105
- def initialize(command:, config:, members:, execute: false, accept: true, commit: true, allow_dirty: false, autostash: true, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, skip_changelog: false, local_ci: false, continue_ci_failures: false, ci_workflows: nil, skip_bundle_audit: false, skip_remotes: nil, required_remotes: nil, auto_dependency_floors: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, gha_sha_pins_ttl_days: nil, env_overrides: {}, debug: false, verbose: false, gem_signing_password: nil, secrets_provider: nil, jobs: nil, progress_io: nil, reset_target: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil, **options)
105
+ def initialize(command:, config:, members:, family_members: nil, execute: false, accept: true, commit: true, allow_dirty: false, autostash: true, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, skip_changelog: false, local_ci: false, continue_ci_failures: false, ci_workflows: nil, skip_bundle_audit: false, skip_remotes: nil, required_remotes: nil, auto_dependency_floors: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, gha_sha_pins_ttl_days: nil, env_overrides: {}, debug: false, verbose: false, gem_signing_password: nil, secrets_provider: nil, jobs: nil, progress_io: nil, reset_target: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil, **options)
106
106
  @command = command
107
107
  @config = config
108
108
  @members = members
109
+ @family_members = family_members || members
109
110
  @execute = execute
110
111
  @accept = accept
111
112
  @commit = commit
@@ -185,7 +186,7 @@ module Kettle
185
186
  execute && release_command_delegates_secrets_to_kettle_release?
186
187
  end
187
188
 
188
- attr_reader :command, :config, :members, :execute, :accept, :commit, :allow_dirty, :autostash, :publish, :push, :tag, :start_step, :skip_steps, :skip_changelog, :local_ci, :continue_ci_failures, :ci_workflows, :skip_bundle_audit, :skip_remotes, :required_remotes, :auto_dependency_floors, :gha_sha_pins_upgrade, :gha_sha_pins_check, :gha_sha_pins_ttl_days, :env_overrides, :debug, :verbose, :jobs, :progress_io, :reset_target, :bup_args, :bex_args, :start_member, :start_branch
189
+ attr_reader :command, :config, :members, :family_members, :execute, :accept, :commit, :allow_dirty, :autostash, :publish, :push, :tag, :start_step, :skip_steps, :skip_changelog, :local_ci, :continue_ci_failures, :ci_workflows, :skip_bundle_audit, :skip_remotes, :required_remotes, :auto_dependency_floors, :gha_sha_pins_upgrade, :gha_sha_pins_check, :gha_sha_pins_ttl_days, :env_overrides, :debug, :verbose, :jobs, :progress_io, :reset_target, :bup_args, :bex_args, :start_member, :start_branch
189
190
 
190
191
  def template_with_worktree_sync_results
191
192
  runner = command_runner
@@ -421,7 +422,10 @@ module Kettle
421
422
  return check_results(workflow_members) if command == "check"
422
423
  return reset_member_results(workflow_members) if command == "reset"
423
424
  if command == "release"
424
- results = release_member_results(workflow_members, include_family_changelog: !skip_changelog)
425
+ results = release_dependency_floor_reconciliation_results(workflow_members)
426
+ return results unless results.all?(&:ok?)
427
+
428
+ results.concat(release_member_results(workflow_members, include_family_changelog: !skip_changelog))
425
429
  return results unless explicit_monorepo_mode? && results.all?(&:ok?)
426
430
 
427
431
  results << aggregate_monorepo_github_release(workflow_members)
@@ -1082,6 +1086,7 @@ module Kettle
1082
1086
  command: command,
1083
1087
  config: member_config,
1084
1088
  members: [member],
1089
+ family_members: family_members,
1085
1090
  execute: execute,
1086
1091
  accept: accept,
1087
1092
  commit: commit,
@@ -1358,6 +1363,38 @@ module Kettle
1358
1363
  ReleaseWaves.new(members: release_members, configured_waves: config.release_waves, strict_cycles: true).waves
1359
1364
  end
1360
1365
 
1366
+ def release_dependency_floor_reconciliation_results(release_members)
1367
+ return [] unless execute && auto_dependency_floors
1368
+
1369
+ published_members = published_family_dependencies_for(release_members)
1370
+ return [] if published_members.empty?
1371
+
1372
+ results = []
1373
+ append_dependency_floor_results(
1374
+ released_members: published_members,
1375
+ dependent_members: release_members,
1376
+ runner: release_command_runner,
1377
+ memo: results
1378
+ )
1379
+ results
1380
+ end
1381
+
1382
+ # A resumed --only pend release no longer includes members that finished
1383
+ # in an earlier invocation. Reconcile against the registry before the
1384
+ # next release wave so those already-published versions still update
1385
+ # sibling floors and lockfiles.
1386
+ def published_family_dependencies_for(release_members)
1387
+ dependency_names = release_members.flat_map { |member| release_dependency_names(member) }.uniq
1388
+ family_members_by_name = family_members.to_h { |member| [member.name, member] }
1389
+ dependency_names.filter_map do |dependency_name|
1390
+ member = family_members_by_name[dependency_name]
1391
+ next unless member
1392
+ next unless released_version?(member.name, member.version)
1393
+
1394
+ member
1395
+ end
1396
+ end
1397
+
1361
1398
  def append_dependency_floor_results(released_members:, dependent_members:, runner:, memo:)
1362
1399
  return unless auto_dependency_floors
1363
1400
  return if dependent_members.empty?
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.53
4
+ version: 1.2.54
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -361,10 +361,10 @@ licenses:
361
361
  - AGPL-3.0-only
362
362
  metadata:
363
363
  homepage_uri: https://kettle-family.galtzo.com
364
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.53
365
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.53/CHANGELOG.md
364
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.54
365
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.54/CHANGELOG.md
366
366
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
367
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.53
367
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.54
368
368
  funding_uri: https://github.com/sponsors/pboling
369
369
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
370
370
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file