kettle-family 1.2.96 → 1.2.98
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 +29 -1
- data/README.md +10 -1
- data/lib/kettle/family/execution_profile.rb +12 -0
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +42 -12
- 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: a170049375aa0330277e878596e92a61b58655a29ca9aeba1e9ab0006fa46c04
|
|
4
|
+
data.tar.gz: 5bfcd0c99c774fad470b8510188e6eaad700c2ca3157f64eb1a9b52ac320d6c6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: c527202894d4bca3ada36684b9a7f3700052ebd53967ebb7ea7a65cc0db5cc20a5bf04eec6730f380a444fd69ed6828428fc29e16a1718371eab48eea0647601
|
|
7
|
+
data.tar.gz: b147945409bca869bf23ea6ab8773b7fc8fc6c7677ef877367d2970b3c73edb1efe628606c267de48f58af8cb4db761d527ce8df457b1fe6d4f729ae8c662229
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,30 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [1.2.98] - 2026-09-09
|
|
34
|
+
|
|
35
|
+
- TAG: [v1.2.98][1.2.98t]
|
|
36
|
+
- COVERAGE: 93.50% -- 6245/6679 lines in 35 files
|
|
37
|
+
- BRANCH COVERAGE: 78.08% -- 2529/3239 branches in 35 files
|
|
38
|
+
- 32.75% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Commit the final normalized Gemfile.lock after sibling and branch-worktree template runs.
|
|
43
|
+
|
|
44
|
+
- Bootstrap member releases from the family tool bundle before registry lockfile normalization.
|
|
45
|
+
|
|
46
|
+
## [1.2.97] - 2026-09-08
|
|
47
|
+
|
|
48
|
+
- TAG: [v1.2.97][1.2.97t]
|
|
49
|
+
- COVERAGE: 93.49% -- 6236/6670 lines in 35 files
|
|
50
|
+
- BRANCH COVERAGE: 77.99% -- 2523/3235 branches in 35 files
|
|
51
|
+
- 32.75% documented
|
|
52
|
+
|
|
53
|
+
### Fixed
|
|
54
|
+
|
|
55
|
+
- Attribute release-preflight failures to the selected member so retry hints do not target an unselected family sibling.
|
|
56
|
+
|
|
33
57
|
## [1.2.96] - 2026-09-08
|
|
34
58
|
|
|
35
59
|
- TAG: [v1.2.96][1.2.96t]
|
|
@@ -2668,7 +2692,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
2668
2692
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
2669
2693
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
2670
2694
|
|
|
2671
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.
|
|
2695
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.98...HEAD
|
|
2696
|
+
[1.2.98]: https://github.com/kettle-dev/kettle-family/compare/v1.2.97...v1.2.98
|
|
2697
|
+
[1.2.98t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.98
|
|
2698
|
+
[1.2.97]: https://github.com/kettle-dev/kettle-family/compare/v1.2.96...v1.2.97
|
|
2699
|
+
[1.2.97t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.97
|
|
2672
2700
|
[1.2.96]: https://github.com/kettle-dev/kettle-family/compare/v1.2.95...v1.2.96
|
|
2673
2701
|
[1.2.96t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.96
|
|
2674
2702
|
[1.2.95]: https://github.com/kettle-dev/kettle-family/compare/v1.2.94...v1.2.95
|
data/README.md
CHANGED
|
@@ -662,6 +662,15 @@ and leaves RubyGems MFA prompts interactive by default:
|
|
|
662
662
|
kettle-family release --publish --execute
|
|
663
663
|
```
|
|
664
664
|
|
|
665
|
+
Release uses two explicitly separate execution contexts. `release_bootstrap`
|
|
666
|
+
starts `kettle-release` from the family-root tool bundle, so a family can retain
|
|
667
|
+
its configured local sibling graph while it prepares a release wave. It never
|
|
668
|
+
uses a member's development Gemfile to boot the release tool. `release_registry`
|
|
669
|
+
then resets each tracked release lockfile against registry dependencies and is
|
|
670
|
+
also used by every project release child command. Local sibling paths therefore
|
|
671
|
+
remain available only before that transition; they cannot enter the canonical
|
|
672
|
+
lockfile, the release-preparation commit, or CI-facing project commands.
|
|
673
|
+
|
|
665
674
|
Use named recovery modes when a publish wave has already prepared a member:
|
|
666
675
|
|
|
667
676
|
```console
|
|
@@ -1171,7 +1180,7 @@ Thanks for RTFM. ☺️
|
|
|
1171
1180
|
[📌gitmoji]: https://gitmoji.dev
|
|
1172
1181
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
1173
1182
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
1174
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-6.
|
|
1183
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-6.679-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
1175
1184
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
1176
1185
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
1177
1186
|
[📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
|
|
@@ -40,6 +40,18 @@ module Kettle
|
|
|
40
40
|
host_platform_policy: :active_platform_must_resolve,
|
|
41
41
|
allowed_mutations: %i[template development_lockfiles generated]
|
|
42
42
|
),
|
|
43
|
+
# This profile only starts the release implementation from the family
|
|
44
|
+
# tool bundle. It is intentionally distinct from release_registry:
|
|
45
|
+
# canonical lockfile reset and all project release children use that
|
|
46
|
+
# registry-only profile after the tool has booted.
|
|
47
|
+
release_bootstrap: Definition.new(
|
|
48
|
+
name: :release_bootstrap,
|
|
49
|
+
path_gem_policy: :configured_siblings,
|
|
50
|
+
lockfile_role: :tool,
|
|
51
|
+
install_location: :family,
|
|
52
|
+
host_platform_policy: :active_platform_must_resolve,
|
|
53
|
+
allowed_mutations: %i[release_tool_bootstrap]
|
|
54
|
+
),
|
|
43
55
|
release_registry: Definition.new(
|
|
44
56
|
name: :release_registry,
|
|
45
57
|
path_gem_policy: :registry_only,
|
|
@@ -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.98"
|
|
9
9
|
end
|
|
10
10
|
# Current gem version exposed at the traditional constant location.
|
|
11
11
|
VERSION = Version::VERSION # Traditional Constant Location
|
|
@@ -1451,6 +1451,7 @@ module Kettle
|
|
|
1451
1451
|
normalize_lockfiles(member: member, runner: runner, memo: memo, phase: "normalize_lockfiles", commit_changes: commit_changes)
|
|
1452
1452
|
emit_member_result_progress(member, memo.last, progress: progress, progress_key: progress_key, progress_label: progress_label)
|
|
1453
1453
|
commit_template_changes(member: member, runner: runner, memo: memo) if commit_changes
|
|
1454
|
+
commit_template_normalized_gemfile_lock(member: member, runner: runner, memo: memo, commit_changes: commit_changes)
|
|
1454
1455
|
emit_member_result_progress(member, memo.last, progress: progress, progress_key: progress_key, progress_label: progress_label) if memo.last&.phase == "commit_template"
|
|
1455
1456
|
ensure
|
|
1456
1457
|
template_result = memo.find { |result| result.phase == "template" } || memo.last
|
|
@@ -1944,11 +1945,15 @@ module Kettle
|
|
|
1944
1945
|
end
|
|
1945
1946
|
|
|
1946
1947
|
def release_preflight_error_result(phase, message)
|
|
1948
|
+
# A preflight failure blocks the selected release invocation. Attribute
|
|
1949
|
+
# it to that invocation's first member so generated resume commands do
|
|
1950
|
+
# not target the synthetic family name or an unselected sibling.
|
|
1951
|
+
member = members.first || family_member
|
|
1947
1952
|
CommandResult.new(
|
|
1948
|
-
member_name:
|
|
1953
|
+
member_name: member.name,
|
|
1949
1954
|
phase: phase,
|
|
1950
1955
|
command: ["internal", phase],
|
|
1951
|
-
workdir:
|
|
1956
|
+
workdir: member.root,
|
|
1952
1957
|
status: 1,
|
|
1953
1958
|
success: false,
|
|
1954
1959
|
stdout: "",
|
|
@@ -3633,7 +3638,7 @@ module Kettle
|
|
|
3633
3638
|
# changelog may live at the family root. Pass the shared paths to the
|
|
3634
3639
|
# member release phase as well as to the separate family phase.
|
|
3635
3640
|
def release_env_for_member(member, family_root: config.root, wave_jobs: 1)
|
|
3636
|
-
env = release_env
|
|
3641
|
+
env = execution_profile(release_bootstrap_execution_profile, release_env)
|
|
3637
3642
|
env.merge!(release_wave_local_path_env_for(member, family_root: family_root))
|
|
3638
3643
|
env.merge!(release_local_path_policy_env(family_root: family_root))
|
|
3639
3644
|
# Family release performs one live pin review before member releases.
|
|
@@ -3699,15 +3704,15 @@ module Kettle
|
|
|
3699
3704
|
candidates.find { |path| File.file?(path) }
|
|
3700
3705
|
end
|
|
3701
3706
|
|
|
3702
|
-
# A member's development
|
|
3703
|
-
#
|
|
3704
|
-
#
|
|
3705
|
-
#
|
|
3706
|
-
#
|
|
3707
|
+
# A member's development Gemfile can contain a deliberately local family
|
|
3708
|
+
# graph that is not independently bootable after an earlier release wave
|
|
3709
|
+
# changes a sibling's dependency floor. Launch kettle-release from the
|
|
3710
|
+
# family tool bundle instead. The release tool still runs project commands
|
|
3711
|
+
# from the member checkout, where it first normalizes canonical lockfiles
|
|
3712
|
+
# with local paths disabled.
|
|
3707
3713
|
def release_tool_gemfile_path(local_kettle_dev)
|
|
3708
3714
|
local_kettle_dev_gemfile = local_kettle_dev_gemfile_path(local_kettle_dev)
|
|
3709
3715
|
return local_kettle_dev_gemfile if local_kettle_dev_gemfile
|
|
3710
|
-
return unless config.configured_monorepo_release?
|
|
3711
3716
|
|
|
3712
3717
|
family_gemfile = File.join(config.root, "Gemfile")
|
|
3713
3718
|
family_gemfile if File.file?(family_gemfile)
|
|
@@ -5315,6 +5320,23 @@ module Kettle
|
|
|
5315
5320
|
end
|
|
5316
5321
|
end
|
|
5317
5322
|
|
|
5323
|
+
# Kettle Jem commits its own changes for sibling repositories. The final
|
|
5324
|
+
# lockfile normalization therefore happens after that commit and needs a
|
|
5325
|
+
# separate, deliberately narrow cleanup commit. Monorepos defer the
|
|
5326
|
+
# template commit, which already includes the normalized lockfile.
|
|
5327
|
+
def commit_template_normalized_gemfile_lock(member:, runner:, memo:, commit_changes:)
|
|
5328
|
+
return unless execute && commit_changes && memo.all?
|
|
5329
|
+
return if deferred_monorepo_template_commit?(member)
|
|
5330
|
+
|
|
5331
|
+
commit_normalized_lockfiles(
|
|
5332
|
+
branch_members: [member],
|
|
5333
|
+
runner: runner,
|
|
5334
|
+
memo: memo,
|
|
5335
|
+
reason: "template",
|
|
5336
|
+
paths: ["Gemfile.lock"]
|
|
5337
|
+
)
|
|
5338
|
+
end
|
|
5339
|
+
|
|
5318
5340
|
def template_commit_message(member)
|
|
5319
5341
|
"🎨 Template #{member.name} by kettle-family"
|
|
5320
5342
|
end
|
|
@@ -5353,6 +5375,10 @@ module Kettle
|
|
|
5353
5375
|
ExecutionProfile.fetch(:template_local)
|
|
5354
5376
|
end
|
|
5355
5377
|
|
|
5378
|
+
def release_bootstrap_execution_profile
|
|
5379
|
+
ExecutionProfile.fetch(:release_bootstrap)
|
|
5380
|
+
end
|
|
5381
|
+
|
|
5356
5382
|
def release_lockfile_execution_profile
|
|
5357
5383
|
return ExecutionProfile.fetch(:release_recovery) if release_recovery?
|
|
5358
5384
|
return ExecutionProfile.fetch(:release_monorepo) if preserve_monorepo_template_context?
|
|
@@ -5371,7 +5397,7 @@ module Kettle
|
|
|
5371
5397
|
when :template_local
|
|
5372
5398
|
env["K_JEM_TEMPLATING"] = "true"
|
|
5373
5399
|
env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
|
|
5374
|
-
when :release_registry, :release_monorepo, :release_recovery
|
|
5400
|
+
when :release_bootstrap, :release_registry, :release_monorepo, :release_recovery
|
|
5375
5401
|
# Release profiles deliberately leave Bundler mutation decisions to
|
|
5376
5402
|
# kettle-dev. The profile selection controls which local-path
|
|
5377
5403
|
# overrides this workflow contributes below.
|
|
@@ -5584,10 +5610,14 @@ module Kettle
|
|
|
5584
5610
|
text.include?(File::SEPARATOR)
|
|
5585
5611
|
end
|
|
5586
5612
|
|
|
5587
|
-
def commit_normalized_lockfiles(branch_members:, runner:, memo:, reason: command, force: false)
|
|
5613
|
+
def commit_normalized_lockfiles(branch_members:, runner:, memo:, reason: command, force: false, paths: nil)
|
|
5588
5614
|
return unless commit
|
|
5589
5615
|
return unless force || commit_normalized_lockfiles?(reason)
|
|
5590
5616
|
|
|
5617
|
+
pathspecs = Array(paths).map { |path| Shellwords.escape(path) }
|
|
5618
|
+
pathspecs = ["Gemfile.lock", "'*.lock'", "'**/*.lock'"] if pathspecs.empty?
|
|
5619
|
+
pathspec = pathspecs.join(" ")
|
|
5620
|
+
|
|
5591
5621
|
branch_members.each do |member|
|
|
5592
5622
|
result = runner.call(
|
|
5593
5623
|
member: member,
|
|
@@ -5595,7 +5625,7 @@ module Kettle
|
|
|
5595
5625
|
command: [
|
|
5596
5626
|
"sh",
|
|
5597
5627
|
"-lc",
|
|
5598
|
-
"files=$(git ls-files --modified --others --exclude-standard --
|
|
5628
|
+
"files=$(git ls-files --modified --others --exclude-standard -- #{pathspec}); " \
|
|
5599
5629
|
"if [ -n \"$files\" ]; then printf '%s\\n' \"$files\" | xargs git add -- && git commit -m " \
|
|
5600
5630
|
"#{Shellwords.escape(normalized_lockfiles_commit_message(reason))}; fi"
|
|
5601
5631
|
]
|
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.98
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -443,10 +443,10 @@ licenses:
|
|
|
443
443
|
- AGPL-3.0-only
|
|
444
444
|
metadata:
|
|
445
445
|
homepage_uri: https://kettle-family.galtzo.com
|
|
446
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.
|
|
447
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.
|
|
446
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.98
|
|
447
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.98/CHANGELOG.md
|
|
448
448
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
449
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.
|
|
449
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.98
|
|
450
450
|
funding_uri: https://github.com/sponsors/pboling
|
|
451
451
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
452
452
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|