kettle-family 1.2.61 → 1.2.62

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: fbffd07749dbf6833f322d540408a7d0390c3f4dea85b46c779d63efd5908a09
4
- data.tar.gz: 336f72600d1916d3ae0614f34e685f68dd908613dbe74440e99a65ade5125897
3
+ metadata.gz: 04321f7c14998edb27e9dd4f88d54e999bed1bdf8397678f3b3fa6d883b4c17c
4
+ data.tar.gz: 13af696225888e53942d50400bf35f68244591a24033d7e1398339f7e0e878a6
5
5
  SHA512:
6
- metadata.gz: 6f63a9f141f1d8cd600fdee06fc5a19fde59a9bdf539f3c407145bb1a5e31fb2b22892899e34bded713dac4a706a6253f06ef6bd101844b276ff615ddb6cb23d
7
- data.tar.gz: c9960c504314fb1a01685b6712051f4ab54e9263aebc9dbe7c6f072f3779d054aa972ef7c0a06962671765af4e7de5274f235895528cb67a31e1fa38ed1d1080
6
+ metadata.gz: bcf9301368288f9914849fb8cad0f5963b6d9ef984be6cca2b0e169fc2e66655ba6ffc70c5970f88a2e800fbcbcc5f46df812e150cf0b0e4a86454f013489353
7
+ data.tar.gz: 76cd17c2e40a09672ec728c103c3e6ee8273a97073ac85fb64f5d38cd1a9576309d41036d260e77a5eb4454435bfda99093f76f94aa9caa8f5a27d4f16bda299
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.62] - 2026-08-26
34
+
35
+ - TAG: [v1.2.62][1.2.62t]
36
+ - COVERAGE: 93.36% -- 5318/5696 lines in 33 files
37
+ - BRANCH COVERAGE: 76.20% -- 2142/2811 branches in 33 files
38
+ - 29.78% documented
39
+
40
+ ### Added
41
+
42
+ - Add --no-cleanup to preserve failed template output and autostashes for debugging while keeping cleanup enabled by default.
43
+
33
44
  ## [1.2.61] - 2026-08-26
34
45
 
35
46
  - TAG: [v1.2.61][1.2.61t]
@@ -2196,7 +2207,9 @@ Please file a bug if you notice a violation of semantic versioning.
2196
2207
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2197
2208
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2198
2209
 
2199
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.61...HEAD
2210
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.62...HEAD
2211
+ [1.2.62]: https://github.com/kettle-dev/kettle-family/compare/v1.2.61...v1.2.62
2212
+ [1.2.62t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.62
2200
2213
  [1.2.61]: https://github.com/kettle-dev/kettle-family/compare/v1.2.60...v1.2.61
2201
2214
  [1.2.61t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.61
2202
2215
  [1.2.60]: https://github.com/kettle-dev/kettle-family/compare/v1.2.59...v1.2.60
data/README.md CHANGED
@@ -570,6 +570,7 @@ overridden with `--jobs`.
570
570
  kettle-family template
571
571
  kettle-family template --execute --jobs 4
572
572
  kettle-family template --execute --only kettle-family
573
+ kettle-family template --execute --no-cleanup
573
574
  ```
574
575
 
575
576
  Templating uses `kettle-jem --events` as the default child interface, so
@@ -578,6 +579,12 @@ family report. Each member line includes a scheduled family-step counter and a
578
579
  per-member elapsed timer. Child `kettle-jem` events can still add progress marks,
579
580
  but only completed family steps advance the counter. Progress marks include:
580
581
 
582
+ Executed template runs clean up failed member output and restore autostashes by
583
+ default. Use `--no-cleanup` when debugging a failed template: the failed
584
+ member's generated files and autostash are left in place for inspection, while
585
+ successful or unreached members are restored normally. A successful run always
586
+ restores its autostashes regardless of this option.
587
+
581
588
  | Mark | Meaning |
582
589
  |------|---------|
583
590
  | `>` | A phase or command step started. |
@@ -864,7 +871,7 @@ Thanks for RTFM. ☺️
864
871
  [📌gitmoji]: https://gitmoji.dev
865
872
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
866
873
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
867
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.676-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
874
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.696-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
868
875
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
869
876
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
870
877
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -177,6 +177,7 @@ module Kettle
177
177
  commit: !options.key?(:commit) || options[:commit],
178
178
  allow_dirty: truthy_option?(:allow_dirty),
179
179
  autostash: !options.key?(:autostash) || options[:autostash],
180
+ template_cleanup: true,
180
181
  target_version: nil,
181
182
  reset_target: nil,
182
183
  bup_args: [],
@@ -383,6 +384,15 @@ module Kettle
383
384
  command_name "template"
384
385
  usage "[options]"
385
386
  description "Plan or execute kettle-jem templating per member."
387
+
388
+ option :no_cleanup, long: "--no-cleanup", desc: "Preserve failed template output and autostashes for debugging" do
389
+ options[:template_cleanup] = false
390
+ end
391
+
392
+ def run(*args)
393
+ unexpected_arguments!(args)
394
+ run_family("template", template_cleanup: options.fetch(:template_cleanup, true))
395
+ end
386
396
  end
387
397
 
388
398
  class GhaShaPins < WorkflowCommand
@@ -821,6 +831,7 @@ module Kettle
821
831
  commit: options[:commit],
822
832
  allow_dirty: options[:allow_dirty],
823
833
  autostash: options[:autostash],
834
+ template_cleanup: options[:template_cleanup],
824
835
  publish: options[:publish],
825
836
  push: options[:push],
826
837
  tag: options[:tag],
@@ -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.61"
8
+ VERSION = "1.2.62"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -105,7 +105,7 @@ module Kettle
105
105
  REGISTRY_WAIT_ATTEMPTS = 15
106
106
  REGISTRY_WAIT_INTERVAL_SECONDS = 15
107
107
 
108
- 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, fast_recovery: nil, fast_recovery_members: nil, skip_ci: false, 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)
108
+ def initialize(command:, config:, members:, family_members: nil, execute: false, accept: true, commit: true, allow_dirty: false, autostash: true, template_cleanup: true, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, fast_recovery: nil, fast_recovery_members: nil, skip_ci: false, 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)
109
109
  @command = command
110
110
  @config = config
111
111
  @members = members
@@ -115,6 +115,7 @@ module Kettle
115
115
  @commit = commit
116
116
  @allow_dirty = allow_dirty
117
117
  @autostash = autostash
118
+ @template_cleanup = template_cleanup
118
119
  @publish = publish
119
120
  @push = push
120
121
  @tag = tag
@@ -202,7 +203,7 @@ module Kettle
202
203
  execute && release_command_delegates_secrets_to_kettle_release?
203
204
  end
204
205
 
205
- attr_reader :command, :config, :members, :family_members, :execute, :accept, :commit, :allow_dirty, :autostash, :publish, :push, :tag, :start_step, :skip_steps, :fast_recovery, :fast_recovery_members, :skip_ci, :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
206
+ attr_reader :command, :config, :members, :family_members, :execute, :accept, :commit, :allow_dirty, :autostash, :template_cleanup, :publish, :push, :tag, :start_step, :skip_steps, :fast_recovery, :fast_recovery_members, :skip_ci, :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
206
207
 
207
208
  def template_with_worktree_sync_results
208
209
  runner = command_runner
@@ -214,7 +215,11 @@ module Kettle
214
215
 
215
216
  sync_results, stashes = template_worktree_sync_results(runner: runner)
216
217
  unless sync_results.all?(&:ok?)
217
- return checkout_preflight + sync_results + restore_template_autostashes(stashes, runner: runner)
218
+ return checkout_preflight + sync_results + restore_template_autostashes(
219
+ stashes,
220
+ runner: runner,
221
+ preserve_members: template_cleanup ? [] : failed_template_members(sync_results)
222
+ )
218
223
  end
219
224
 
220
225
  workflow_results = branch_checkout_dirty_preflight_results
@@ -228,8 +233,18 @@ module Kettle
228
233
  end
229
234
  end
230
235
 
231
- rollback_results = rollback_failed_template_worktrees(stashes, workflow_results, runner: runner)
232
- checkout_preflight + sync_results + workflow_results + rollback_results + restore_template_autostashes(stashes, runner: runner)
236
+ failed_members = failed_template_members(workflow_results)
237
+ rollback_results = if template_cleanup
238
+ rollback_failed_template_worktrees(stashes, workflow_results, runner: runner)
239
+ else
240
+ []
241
+ end
242
+ restore_results = restore_template_autostashes(
243
+ stashes,
244
+ runner: runner,
245
+ preserve_members: template_cleanup ? [] : failed_members
246
+ )
247
+ checkout_preflight + sync_results + workflow_results + rollback_results + restore_results
233
248
  end
234
249
 
235
250
  def template_worktree_sync_results(runner:)
@@ -268,27 +283,33 @@ module Kettle
268
283
  [results, stashes]
269
284
  end
270
285
 
271
- def restore_template_autostashes(stashes, runner:)
286
+ def restore_template_autostashes(stashes, runner:, preserve_members: [])
287
+ preserve_members = Array(preserve_members).map(&:to_s)
272
288
  stashes.reverse_each.map do |stash|
289
+ member = stash.fetch(:member)
290
+ if preserve_members.include?(member.name.to_s)
291
+ next template_autostash_preserved_result(member: member, ref: stash.fetch(:ref))
292
+ end
293
+
273
294
  restore = runner.call(
274
- member: stash.fetch(:member),
295
+ member: member,
275
296
  phase: "template_autostash_restore",
276
297
  command: ["git", "stash", "pop", stash.fetch(:ref)]
277
298
  )
278
299
  next restore if restore.ok?
279
300
 
280
- if template_generated_lockfile_restore_refusal?(stash.fetch(:member), restore)
301
+ if template_generated_lockfile_restore_refusal?(member, restore)
281
302
  next runner.call(
282
- member: stash.fetch(:member),
303
+ member: member,
283
304
  phase: "template_autostash_generated_lockfile_recovery",
284
305
  command: template_generated_lockfile_restore_command(stash)
285
306
  )
286
307
  end
287
308
 
288
- next restore if !template_generated_lockfile_only_conflict?(stash.fetch(:member))
309
+ next restore if !template_generated_lockfile_only_conflict?(member)
289
310
 
290
311
  runner.call(
291
- member: stash.fetch(:member),
312
+ member: member,
292
313
  phase: "template_autostash_generated_lockfile_recovery",
293
314
  command: [
294
315
  "sh", "-lc",
@@ -308,6 +329,26 @@ module Kettle
308
329
  end
309
330
  end
310
331
 
332
+ def failed_template_members(results)
333
+ results.reject(&:ok?).filter_map(&:member_name).uniq
334
+ end
335
+
336
+ def template_autostash_preserved_result(member:, ref:)
337
+ CommandResult.new(
338
+ member.name,
339
+ "template_autostash_preserved",
340
+ ["internal", "template-autostash-preserved"],
341
+ member.root,
342
+ 0,
343
+ true,
344
+ "preserved failed template output and autostash #{ref} for debugging",
345
+ "",
346
+ 0.0,
347
+ true,
348
+ "template cleanup disabled"
349
+ )
350
+ end
351
+
311
352
  def template_generated_lockfile_restore_refusal?(member, restore)
312
353
  output = [restore.stdout, restore.stderr].compact.join("\n")
313
354
  return false unless output.include?("would be overwritten by merge")
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.61
4
+ version: 1.2.62
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -441,10 +441,10 @@ licenses:
441
441
  - AGPL-3.0-only
442
442
  metadata:
443
443
  homepage_uri: https://kettle-family.galtzo.com
444
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.61
445
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.61/CHANGELOG.md
444
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.62
445
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.62/CHANGELOG.md
446
446
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
447
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.61
447
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.62
448
448
  funding_uri: https://github.com/sponsors/pboling
449
449
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
450
450
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file