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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +14 -1
- data/README.md +8 -1
- data/lib/kettle/family/cli.rb +11 -0
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +52 -11
- data.tar.gz.sig +0 -0
- metadata +4 -4
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 04321f7c14998edb27e9dd4f88d54e999bed1bdf8397678f3b3fa6d883b4c17c
|
|
4
|
+
data.tar.gz: 13af696225888e53942d50400bf35f68244591a24033d7e1398339f7e0e878a6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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.
|
|
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
|
data/lib/kettle/family/cli.rb
CHANGED
|
@@ -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.
|
|
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(
|
|
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
|
-
|
|
232
|
-
|
|
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:
|
|
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?(
|
|
301
|
+
if template_generated_lockfile_restore_refusal?(member, restore)
|
|
281
302
|
next runner.call(
|
|
282
|
-
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?(
|
|
309
|
+
next restore if !template_generated_lockfile_only_conflict?(member)
|
|
289
310
|
|
|
290
311
|
runner.call(
|
|
291
|
-
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.
|
|
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.
|
|
445
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.
|
|
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.
|
|
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
|