kettle-family 1.2.44 → 1.2.45

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: 58ad6d307a8fcb8dc7a2911a7b1cb1c62928e130af9df80e13466158b5dc0441
4
- data.tar.gz: 0e296343ddab05057267fc2f698cc0c9292d491bfd20c300dcc117d89b3b9346
3
+ metadata.gz: 0142ed9035a396a18beb14aeaee5371a3d64f42824d88a548cdddeebc74dc16b
4
+ data.tar.gz: 5f798e5f0ff01e273045396527200782fc54460aa3c5055bc797c144237c10c1
5
5
  SHA512:
6
- metadata.gz: 3d6ffcef4f61673a66ad8c3dc816a8fcc37c09c8b07a3ef0f2fa8b3a777517f110689922edce9c9b7f76cc5f5d9a9c64409df30e73f9c5f49df4bdd0bf10b5e0
7
- data.tar.gz: 58d68a7bc24ef399531c17f42fb3e6b6f8d3bc03db7dd5b18049721b0c9d4372c0f1ac4209d587f28d63e2665e7ee9c7a092cbfb1ae0ca7974b8146c4843ab22
6
+ metadata.gz: 2bbf9ecb021fc52055dd92992d0325972597690c1f46101d77e6d5cf1fb150b1ebb6519a76fc9aeeef72b891b7b05fad4d52698a49f85bc4933ad20a10683969
7
+ data.tar.gz: 675ddf3fb33b593341fcf5a53c7a0aff9a92d6df0449135f4541ea7a6ec39a423fe7ba945a8fd4770638aa9319bd5714c5f9d51d8d7b24f333d5f2501d9249a8
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,21 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [1.2.45] - 2026-08-09
34
+
35
+ - TAG: [v1.2.45][1.2.45t]
36
+ - COVERAGE: 93.59% -- 5109/5459 lines in 32 files
37
+ - BRANCH COVERAGE: 76.10% -- 2051/2695 branches in 32 files
38
+ - 29.64% documented
39
+
40
+ ### Fixed
41
+
42
+ - Run family release-state changelog probes outside the parent Bundler environment so --only pend can inspect all members.
43
+
44
+ - Retry the existing gem artifact with a fresh OTP when RubyGems rejects the first MFA code during a family release.
45
+
46
+ - Allow kettle-family to resolve against kettle-dev 3.x after the kettle-dev 3.0.0 executable split.
47
+
33
48
  ## [1.2.44] - 2026-08-09
34
49
 
35
50
  - TAG: [v1.2.44][1.2.44t]
@@ -1977,7 +1992,9 @@ Please file a bug if you notice a violation of semantic versioning.
1977
1992
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
1978
1993
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
1979
1994
 
1980
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.44...HEAD
1995
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.45...HEAD
1996
+ [1.2.45]: https://github.com/kettle-dev/kettle-family/compare/v1.2.44...v1.2.45
1997
+ [1.2.45t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.45
1981
1998
  [1.2.44]: https://github.com/kettle-dev/kettle-family/compare/v1.2.43...v1.2.44
1982
1999
  [1.2.44t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.44
1983
2000
  [1.2.43]: https://github.com/kettle-dev/kettle-family/compare/v1.2.42...v1.2.43
data/README.md CHANGED
@@ -850,7 +850,7 @@ Thanks for RTFM. ☺️
850
850
  [📌gitmoji]: https://gitmoji.dev
851
851
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
852
852
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
853
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.441-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
853
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.459-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
854
854
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
855
855
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
856
856
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -75,7 +75,11 @@ module Kettle
75
75
  command = release_state_command
76
76
  emit_event(event_handler, member: member, branch: branch, action: "member_start", status: "running", command: command)
77
77
  emit_event(event_handler, member: member, branch: branch, action: "changelog_command", status: "running", command: command)
78
- stdout, stderr, status = Open3.capture3(release_state_env(member), *command, chdir: release_state_workdir(member))
78
+ stdout, stderr, status = capture_release_state(
79
+ env: release_state_env(member),
80
+ command: command,
81
+ workdir: release_state_workdir(member)
82
+ )
79
83
  elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
80
84
  success = status.success?
81
85
  emit_event(event_handler, member: member, branch: branch, action: "changelog_command", status: success ? "ok" : "failed", elapsed_seconds: elapsed, status_code: status.exitstatus)
@@ -106,6 +110,15 @@ module Kettle
106
110
  [RbConfig.ruby, "-S", "kettle-changelog", "--release-state", "--json"]
107
111
  end
108
112
 
113
+ def capture_release_state(env:, command:, workdir:)
114
+ capture = -> { Open3.capture3(env, *command, chdir: workdir) }
115
+ # kettle-family can run as a standalone executable, but an active
116
+ # Bundler context must not leak into the standalone changelog probe.
117
+ return capture.call unless defined?(::Bundler)
118
+
119
+ ::Bundler.with_unbundled_env(&capture)
120
+ end
121
+
109
122
  def check_shared_changelog_member_or_local(member, branch: nil, event_handler: nil)
110
123
  return check_member(member, branch: branch, event_handler: event_handler) if member_local_changelog?(member)
111
124
 
@@ -117,7 +130,11 @@ module Kettle
117
130
  command = release_state_command
118
131
  emit_event(event_handler, member: member, branch: branch, action: "member_start", status: "running", command: command)
119
132
  emit_event(event_handler, member: member, branch: branch, action: "changelog_command", status: "running", command: command)
120
- stdout, stderr, status = Open3.capture3(shared_changelog_env(member), *command, chdir: config.root)
133
+ stdout, stderr, status = capture_release_state(
134
+ env: shared_changelog_env(member),
135
+ command: command,
136
+ workdir: config.root
137
+ )
121
138
  elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started
122
139
  success = status.success?
123
140
  emit_event(event_handler, member: member, branch: branch, action: "changelog_command", status: success ? "ok" : "failed", elapsed_seconds: elapsed, status_code: status.exitstatus)
@@ -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.44"
8
+ VERSION = "1.2.45"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -17,6 +17,7 @@ module Kettle
17
17
  module Family
18
18
  class Workflow
19
19
  PreflightProgressMember = Struct.new(:name)
20
+ RUBYGEMS_INVALID_OTP = /Your OTP code is incorrect\. Please check it and retry\./
20
21
 
21
22
  DEFAULT_COMMANDS = {
22
23
  "template" => "bundle exec kettle-jem install",
@@ -1216,7 +1217,7 @@ module Kettle
1216
1217
  memo.last(2).each { |result| emit_member_result_progress(member, result, progress: progress) }
1217
1218
  return memo unless memo.last(2).all?(&:ok?)
1218
1219
 
1219
- memo << runner.call(
1220
+ release_result = runner.call(
1220
1221
  member: member,
1221
1222
  phase: release_phase,
1222
1223
  command: release_command,
@@ -1226,6 +1227,8 @@ module Kettle
1226
1227
  log_path: release_command_log_path(member, release_phase),
1227
1228
  passthrough_output: release_command_passthrough_output?
1228
1229
  )
1230
+ release_result = retry_release_gem_push_after_invalid_otp(member: member, failed_result: release_result, runner: runner)
1231
+ memo << release_result
1229
1232
  emit_member_result_progress(member, memo.last, progress: progress)
1230
1233
  return memo unless memo.last.ok?
1231
1234
 
@@ -1924,6 +1927,38 @@ module Kettle
1924
1927
  verbose || debug
1925
1928
  end
1926
1929
 
1930
+ # kettle-family normally owns the RubyGems OTP prompt so one code can be
1931
+ # coordinated across concurrent member releases. If RubyGems rejects
1932
+ # that code, the member's release command has already tagged and pushed
1933
+ # the repository before attempting the gem upload. Retry only the
1934
+ # existing artifact; rerunning the full release command would repeat git
1935
+ # tagging and CI work and can fail for an unrelated reason.
1936
+ def retry_release_gem_push_after_invalid_otp(member:, failed_result:, runner:)
1937
+ return failed_result unless release_phase == "release_publish"
1938
+ return failed_result if failed_result.ok?
1939
+ return failed_result unless [failed_result.stdout, failed_result.stderr].any? { |output| output.to_s.match?(RUBYGEMS_INVALID_OTP) }
1940
+
1941
+ gem_path = release_gem_path(member)
1942
+ return failed_result unless gem_path
1943
+
1944
+ puts "RubyGems rejected the first OTP; retrying the existing gem artifact with a fresh OTP..."
1945
+ runner.call(
1946
+ member: member,
1947
+ phase: release_phase,
1948
+ command: ["gem", "push", gem_path],
1949
+ env: release_env_for_member(member),
1950
+ interactive: true,
1951
+ stdout_line_handler: release_event_line_handler(member, progress: @release_progress),
1952
+ log_path: release_command_log_path(member, "release_publish_otp_retry"),
1953
+ passthrough_output: release_command_passthrough_output?
1954
+ )
1955
+ end
1956
+
1957
+ def release_gem_path(member)
1958
+ suffix = "-#{member.version}.gem"
1959
+ Dir.glob(File.join(member.root, "pkg", "*.gem")).find { |path| File.basename(path).end_with?(suffix) }
1960
+ end
1961
+
1927
1962
  def kettle_release_command?(command)
1928
1963
  case command
1929
1964
  when Array
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.44
4
+ version: 1.2.45
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -69,22 +69,22 @@ dependencies:
69
69
  name: kettle-dev
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - "~>"
73
- - !ruby/object:Gem::Version
74
- version: '2.3'
75
72
  - - ">="
76
73
  - !ruby/object:Gem::Version
77
74
  version: 2.5.26
75
+ - - "<"
76
+ - !ruby/object:Gem::Version
77
+ version: 4.0.0
78
78
  type: :runtime
79
79
  prerelease: false
80
80
  version_requirements: !ruby/object:Gem::Requirement
81
81
  requirements:
82
- - - "~>"
83
- - !ruby/object:Gem::Version
84
- version: '2.3'
85
82
  - - ">="
86
83
  - !ruby/object:Gem::Version
87
84
  version: 2.5.26
85
+ - - "<"
86
+ - !ruby/object:Gem::Version
87
+ version: 4.0.0
88
88
  - !ruby/object:Gem::Dependency
89
89
  name: kettle-test
90
90
  requirement: !ruby/object:Gem::Requirement
@@ -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.44
364
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.44/CHANGELOG.md
363
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.45
364
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.45/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.44
366
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.45
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