kettle-family 0.2.3 → 0.2.5
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 +45 -1
- data/README.md +12 -1
- data/lib/kettle/family/cli.rb +11 -0
- data/lib/kettle/family/config.rb +30 -1
- data/lib/kettle/family/dependency_floor.rb +113 -0
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/version_gem.rb +8 -0
- data/lib/kettle/family/workflow.rb +57 -5
- data/lib/kettle/family.rb +0 -1
- data.tar.gz.sig +0 -0
- metadata +33 -31
- 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: 2bc8f54983986ae1576f3f766324a35d5bc87b2776086a07eb3258d43bba386d
|
|
4
|
+
data.tar.gz: edc612181ca90bd0ebdfdc196d88810d82c99cdb54b752c66b3173d85fa896a2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b3f19512bb9a8b3e66ba7037a44877afc0d76eebccd50b2ea9ff233ed2a3eb74e4e0e4cc14cb2125d059c66b59ecf9f9a238b60e77cc85a81a6ab6c5dfd13749
|
|
7
|
+
data.tar.gz: 2abdfc91601545b26d5a3a392f833cb439901a4b2d33b64a1574cbb6a57ae8f71bbbfbd8610d18af80a919bdea1e776063319e6b8670cd3b678950cd4e3964d7
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,46 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [0.2.5] - 2026-07-11
|
|
34
|
+
|
|
35
|
+
- TAG: [v0.2.5][0.2.5t]
|
|
36
|
+
- COVERAGE: 95.22% -- 2309/2425 lines in 23 files
|
|
37
|
+
- BRANCH COVERAGE: 76.75% -- 766/998 branches in 23 files
|
|
38
|
+
- 29.54% documented
|
|
39
|
+
|
|
40
|
+
### Added
|
|
41
|
+
|
|
42
|
+
- Family workflows now inject a derived local family path environment variable
|
|
43
|
+
by default, such as `RUBY_OAUTH_DEV=/path/to/ruby-oauth`, so in-flight family
|
|
44
|
+
members can resolve unreleased sibling gems during orchestration.
|
|
45
|
+
- Family configs now expose `pre_release.image_url_skip_patterns` and pass the
|
|
46
|
+
active config path to release commands so `kettle-pre-release` can skip
|
|
47
|
+
project-specific volatile image URLs.
|
|
48
|
+
- `kettle-family release --skip-bundle-audit` now forwards
|
|
49
|
+
`--skip-bundle-audit` and `KETTLE_DEV_SKIP_BUNDLE_AUDIT=true` to downstream
|
|
50
|
+
`kettle-release` commands.
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
- `require "kettle/family"` no longer loads `version_gem` by default; require
|
|
55
|
+
`kettle/family/version_gem` for the optional `VersionGem::Basic` extension.
|
|
56
|
+
- Release lockfile normalization now forces configured local path environment
|
|
57
|
+
variables off after caller overrides so release locks are cleaned
|
|
58
|
+
deterministically.
|
|
59
|
+
|
|
60
|
+
## [0.2.4] - 2026-07-04
|
|
61
|
+
|
|
62
|
+
- TAG: [v0.2.4][0.2.4t]
|
|
63
|
+
- COVERAGE: 95.33% -- 2288/2400 lines in 22 files
|
|
64
|
+
- BRANCH COVERAGE: 76.42% -- 752/984 branches in 22 files
|
|
65
|
+
- 30.04% documented
|
|
66
|
+
|
|
67
|
+
### Added
|
|
68
|
+
|
|
69
|
+
- Family releases now raise downstream family dependency floors after each
|
|
70
|
+
member release by default, with `--no-auto-floors` and
|
|
71
|
+
`release.auto_dependency_floors: false` opt-outs.
|
|
72
|
+
|
|
33
73
|
## [0.2.3] - 2026-07-03
|
|
34
74
|
|
|
35
75
|
- TAG: [v0.2.3][0.2.3t]
|
|
@@ -630,7 +670,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
630
670
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
631
671
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
632
672
|
|
|
633
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.2.
|
|
673
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.2.5...HEAD
|
|
674
|
+
[0.2.5]: https://github.com/kettle-dev/kettle-family/compare/v0.2.4...v0.2.5
|
|
675
|
+
[0.2.5t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.2.5
|
|
676
|
+
[0.2.4]: https://github.com/kettle-dev/kettle-family/compare/v0.2.3...v0.2.4
|
|
677
|
+
[0.2.4t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.2.4
|
|
634
678
|
[0.2.3]: https://github.com/kettle-dev/kettle-family/compare/v0.2.2...v0.2.3
|
|
635
679
|
[0.2.3t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.2.3
|
|
636
680
|
[0.2.2]: https://github.com/kettle-dev/kettle-family/compare/v0.2.1...v0.2.2
|
data/README.md
CHANGED
|
@@ -158,6 +158,17 @@ members:
|
|
|
158
158
|
- "**/vendor/**"
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
+
Pre-release checks can skip project-specific volatile image URLs with
|
|
162
|
+
shell-style URL patterns. Family release commands pass the active config path
|
|
163
|
+
to member release commands so this setting works when releases run from member
|
|
164
|
+
directories.
|
|
165
|
+
|
|
166
|
+
```yaml
|
|
167
|
+
pre_release:
|
|
168
|
+
image_url_skip_patterns:
|
|
169
|
+
- https://assets.example.com/generated/*
|
|
170
|
+
```
|
|
171
|
+
|
|
161
172
|
Member branch-stack releases can be configured in the member repository itself:
|
|
162
173
|
|
|
163
174
|
```yaml
|
|
@@ -592,7 +603,7 @@ Thanks for RTFM. ☺️
|
|
|
592
603
|
[📌gitmoji]: https://gitmoji.dev
|
|
593
604
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
594
605
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
595
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-2.
|
|
606
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-2.425-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
596
607
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
597
608
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
598
609
|
[📄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
|
@@ -146,6 +146,7 @@ module Kettle
|
|
|
146
146
|
release_skip_steps: nil,
|
|
147
147
|
release_local_ci: false,
|
|
148
148
|
release_continue_ci_failures: false,
|
|
149
|
+
release_skip_bundle_audit: false,
|
|
149
150
|
accept: true,
|
|
150
151
|
tag: false,
|
|
151
152
|
push: false,
|
|
@@ -403,6 +404,10 @@ module Kettle
|
|
|
403
404
|
option :skip_steps, long: "--skip-steps", value: {type: String, usage: "LIST"}, desc: "Pass skip_steps=LIST through to kettle-release commands"
|
|
404
405
|
option :local_ci, long: "--local-ci", desc: "Pass --local-ci through to kettle-release commands"
|
|
405
406
|
option :continue_ci_failures, long: "--continue-ci-failures", desc: "Set K_RELEASE_CI_CONTINUE=true for release commands"
|
|
407
|
+
option :skip_bundle_audit, long: "--skip-bundle-audit", desc: "Skip bundle:audit/update during release rake checks"
|
|
408
|
+
option :no_auto_floors, long: "--no-auto-floors", desc: "Do not raise family dependency floors between member releases" do
|
|
409
|
+
options[:no_auto_floors] = true
|
|
410
|
+
end
|
|
406
411
|
option :accept, desc: "Answer yes to confirmation prompts in interactive commands"
|
|
407
412
|
option :no_accept, long: "--no-accept", desc: "Wait for user input at confirmation prompts" do
|
|
408
413
|
options[:accept] = false
|
|
@@ -419,6 +424,8 @@ module Kettle
|
|
|
419
424
|
release_skip_steps: options[:skip_steps],
|
|
420
425
|
release_local_ci: truthy_option?(:local_ci),
|
|
421
426
|
release_continue_ci_failures: truthy_option?(:continue_ci_failures),
|
|
427
|
+
release_skip_bundle_audit: truthy_option?(:skip_bundle_audit),
|
|
428
|
+
release_auto_dependency_floors: !truthy_option?(:no_auto_floors),
|
|
422
429
|
accept: !options.key?(:accept) || options[:accept],
|
|
423
430
|
tag: truthy_option?(:tag),
|
|
424
431
|
push: truthy_option?(:push)
|
|
@@ -555,6 +562,8 @@ module Kettle
|
|
|
555
562
|
skip_steps: options[:release_skip_steps],
|
|
556
563
|
local_ci: options[:release_local_ci],
|
|
557
564
|
continue_ci_failures: options[:release_continue_ci_failures],
|
|
565
|
+
skip_bundle_audit: options[:release_skip_bundle_audit],
|
|
566
|
+
auto_dependency_floors: options[:release_auto_dependency_floors],
|
|
558
567
|
gha_sha_pins_upgrade: options[:gha_sha_pins_upgrade],
|
|
559
568
|
gha_sha_pins_check: options[:check],
|
|
560
569
|
env_overrides: options[:workflow_env],
|
|
@@ -674,6 +683,8 @@ module Kettle
|
|
|
674
683
|
end
|
|
675
684
|
|
|
676
685
|
def bump_version_results(members:, options:)
|
|
686
|
+
require_relative "version_bump"
|
|
687
|
+
|
|
677
688
|
results = VersionBump.new(
|
|
678
689
|
members: members,
|
|
679
690
|
target_version: options[:target_version],
|
data/lib/kettle/family/config.rb
CHANGED
|
@@ -40,6 +40,26 @@ module Kettle
|
|
|
40
40
|
fetch_path("family", "name") || File.basename(root)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
def family_local_path_env_name
|
|
44
|
+
configured = fetch_path("family", "local_path_env")
|
|
45
|
+
return nil if configured == false
|
|
46
|
+
return configured.to_s unless configured.to_s.empty?
|
|
47
|
+
|
|
48
|
+
"#{family_name.gsub(/[^A-Za-z0-9]+/, "_").upcase}_DEV"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def family_local_path_root
|
|
52
|
+
configured = fetch_path("family", "local_path_root")
|
|
53
|
+
configured ? expand_config_relative_path(configured) : root
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def family_local_path_env
|
|
57
|
+
name = family_local_path_env_name
|
|
58
|
+
return {} unless name
|
|
59
|
+
|
|
60
|
+
{name => family_local_path_root}
|
|
61
|
+
end
|
|
62
|
+
|
|
43
63
|
def family_mode
|
|
44
64
|
fetch_path("family", "mode") || "monorepo"
|
|
45
65
|
end
|
|
@@ -118,6 +138,10 @@ module Kettle
|
|
|
118
138
|
fetch_path("check", "readme_links") || {}
|
|
119
139
|
end
|
|
120
140
|
|
|
141
|
+
def pre_release_image_url_skip_patterns
|
|
142
|
+
Array(fetch_path("pre_release", "image_url_skip_patterns")).map(&:to_s)
|
|
143
|
+
end
|
|
144
|
+
|
|
121
145
|
def changelog_mode
|
|
122
146
|
fetch_path("changelog", "mode") || "member"
|
|
123
147
|
end
|
|
@@ -212,6 +236,10 @@ module Kettle
|
|
|
212
236
|
fetch_path("release", "jobs")
|
|
213
237
|
end
|
|
214
238
|
|
|
239
|
+
def release_auto_dependency_floors?
|
|
240
|
+
fetch_path("release", "auto_dependency_floors") != false
|
|
241
|
+
end
|
|
242
|
+
|
|
215
243
|
def release_family_changelog?
|
|
216
244
|
fetch_path("release", "family_changelog", "enabled") == true
|
|
217
245
|
end
|
|
@@ -246,7 +274,7 @@ module Kettle
|
|
|
246
274
|
private
|
|
247
275
|
|
|
248
276
|
def default_release_disable_local_path_env
|
|
249
|
-
%w[
|
|
277
|
+
local_envs = %w[
|
|
250
278
|
K_JEM_TEMPLATING
|
|
251
279
|
SMORG_RB_DEV
|
|
252
280
|
TSLP_DEV
|
|
@@ -256,6 +284,7 @@ module Kettle
|
|
|
256
284
|
GALTZO_FLOSS_DEV
|
|
257
285
|
UR_BRAIN_DEV
|
|
258
286
|
]
|
|
287
|
+
[family_local_path_env_name, *local_envs].compact
|
|
259
288
|
end
|
|
260
289
|
|
|
261
290
|
def expand_config_relative_path(value)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "kettle/dev"
|
|
4
|
+
|
|
5
|
+
module Kettle
|
|
6
|
+
module Family
|
|
7
|
+
class DependencyFloor
|
|
8
|
+
DEPENDENCY_METHODS = %i[add_dependency add_runtime_dependency].freeze
|
|
9
|
+
|
|
10
|
+
def initialize(released_members:, dependent_members:, mode: :dry_run)
|
|
11
|
+
@released_members = released_members
|
|
12
|
+
@dependent_members = dependent_members
|
|
13
|
+
@mode = mode
|
|
14
|
+
@released_versions = released_members.to_h { |member| [member.name, Gem::Version.new(member.version.to_s)] }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def results
|
|
18
|
+
dependent_members.filter_map { |member| result_for(member) }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
attr_reader :released_members, :dependent_members, :mode, :released_versions
|
|
24
|
+
|
|
25
|
+
def result_for(member)
|
|
26
|
+
edits = collect_edits(member)
|
|
27
|
+
return if edits.empty?
|
|
28
|
+
|
|
29
|
+
write_edits(edits) if mode == :execute
|
|
30
|
+
CommandResult.new(
|
|
31
|
+
member_name: member.name,
|
|
32
|
+
phase: "dependency_floor",
|
|
33
|
+
command: ["internal", "dependency-floor", released_versions.keys.join(",")],
|
|
34
|
+
workdir: member.root,
|
|
35
|
+
status: 0,
|
|
36
|
+
success: true,
|
|
37
|
+
stdout: edit_summary(member: member, edits: edits),
|
|
38
|
+
stderr: "",
|
|
39
|
+
elapsed_seconds: 0.0,
|
|
40
|
+
skipped: mode != :execute,
|
|
41
|
+
reason: (mode == :execute) ? nil : "dry-run; pass --execute to write"
|
|
42
|
+
)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def collect_edits(member)
|
|
46
|
+
return [] unless member.gemspec_path && File.file?(member.gemspec_path)
|
|
47
|
+
|
|
48
|
+
source = File.read(member.gemspec_path)
|
|
49
|
+
parse_result = with_dev_errors { Kettle::Dev::VersionBump.parse_source(source, member.gemspec_path) }
|
|
50
|
+
Kettle::Dev::VersionBump.each_node(parse_result.value).filter_map do |node|
|
|
51
|
+
dependency_edit_for(member.gemspec_path, source, node)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def dependency_edit_for(path, source, node)
|
|
56
|
+
return unless node.is_a?(Prism::CallNode) && DEPENDENCY_METHODS.include?(node.name)
|
|
57
|
+
|
|
58
|
+
args = node.arguments&.arguments || []
|
|
59
|
+
name_node = args.first
|
|
60
|
+
return unless name_node.is_a?(Prism::StringNode)
|
|
61
|
+
|
|
62
|
+
dependency_name = name_node.unescaped
|
|
63
|
+
released_version = released_versions[dependency_name]
|
|
64
|
+
return unless released_version
|
|
65
|
+
|
|
66
|
+
floor_node = requirement_nodes(args.drop(1)).find do |requirement_node|
|
|
67
|
+
requirement_node.unescaped.start_with?(">= ")
|
|
68
|
+
end
|
|
69
|
+
return unless floor_node
|
|
70
|
+
|
|
71
|
+
current_floor = floor_node.unescaped.delete_prefix(">= ").strip
|
|
72
|
+
return unless floor_lower_than?(current_floor, released_version)
|
|
73
|
+
|
|
74
|
+
replacement = Kettle::Dev::VersionBump.quote_like(floor_node.location.slice, ">= #{released_version}")
|
|
75
|
+
Kettle::Dev::VersionBump.file_edit(path, source, floor_node.location.start_offset, floor_node.location.end_offset, replacement)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def requirement_nodes(nodes)
|
|
79
|
+
nodes.flat_map do |node|
|
|
80
|
+
case node
|
|
81
|
+
when Prism::StringNode
|
|
82
|
+
[node]
|
|
83
|
+
when Prism::ArrayNode
|
|
84
|
+
requirement_nodes(node.elements)
|
|
85
|
+
else
|
|
86
|
+
[]
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def floor_lower_than?(current_floor, released_version)
|
|
92
|
+
Gem::Version.new(current_floor) < released_version
|
|
93
|
+
rescue ArgumentError
|
|
94
|
+
false
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def write_edits(edits)
|
|
98
|
+
Kettle::Dev::VersionBump.write_edits(edits)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def edit_summary(member:, edits:)
|
|
102
|
+
verb = (mode == :execute) ? "updated" : "would update"
|
|
103
|
+
["#{verb} #{edits.length} family dependency floor(s) for #{member.name}", *edits.map { |edit| "#{verb} #{edit.fetch(:path)}" }.uniq].join("\n")
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def with_dev_errors
|
|
107
|
+
yield
|
|
108
|
+
rescue Kettle::Dev::Error => error
|
|
109
|
+
raise Error, error.message
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
@@ -44,7 +44,7 @@ module Kettle
|
|
|
44
44
|
"BUNDLE_SUPPRESS_INSTALL_USING_MESSAGES" => "true"
|
|
45
45
|
}.freeze
|
|
46
46
|
|
|
47
|
-
def initialize(command:, config:, members:, execute: false, accept: true, commit: true, allow_dirty: false, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, local_ci: false, continue_ci_failures: false, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, env_overrides: {}, debug: false, gem_signing_password: nil, jobs: nil, progress_io: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil)
|
|
47
|
+
def initialize(command:, config:, members:, execute: false, accept: true, commit: true, allow_dirty: false, publish: false, push: false, tag: false, start_step: nil, skip_steps: nil, local_ci: false, continue_ci_failures: false, skip_bundle_audit: false, auto_dependency_floors: nil, gha_sha_pins_upgrade: "patch", gha_sha_pins_check: false, env_overrides: {}, debug: false, gem_signing_password: nil, jobs: nil, progress_io: nil, bup_args: [], bex_args: [], start_member: nil, start_branch: nil)
|
|
48
48
|
@command = command
|
|
49
49
|
@config = config
|
|
50
50
|
@members = members
|
|
@@ -59,6 +59,8 @@ module Kettle
|
|
|
59
59
|
@skip_steps = skip_steps
|
|
60
60
|
@local_ci = local_ci
|
|
61
61
|
@continue_ci_failures = continue_ci_failures
|
|
62
|
+
@skip_bundle_audit = skip_bundle_audit
|
|
63
|
+
@auto_dependency_floors = auto_dependency_floors.nil? ? config.release_auto_dependency_floors? : auto_dependency_floors
|
|
62
64
|
@gha_sha_pins_upgrade = gha_sha_pins_upgrade
|
|
63
65
|
@gha_sha_pins_check = gha_sha_pins_check
|
|
64
66
|
@env_overrides = env_overrides
|
|
@@ -85,7 +87,7 @@ module Kettle
|
|
|
85
87
|
|
|
86
88
|
private
|
|
87
89
|
|
|
88
|
-
attr_reader :command, :config, :members, :execute, :accept, :commit, :allow_dirty, :publish, :push, :tag, :start_step, :skip_steps, :local_ci, :continue_ci_failures, :gha_sha_pins_upgrade, :gha_sha_pins_check, :env_overrides, :debug, :jobs, :progress_io, :bup_args, :bex_args, :start_member, :start_branch
|
|
90
|
+
attr_reader :command, :config, :members, :execute, :accept, :commit, :allow_dirty, :publish, :push, :tag, :start_step, :skip_steps, :local_ci, :continue_ci_failures, :skip_bundle_audit, :auto_dependency_floors, :gha_sha_pins_upgrade, :gha_sha_pins_check, :env_overrides, :debug, :jobs, :progress_io, :bup_args, :bex_args, :start_member, :start_branch
|
|
89
91
|
|
|
90
92
|
def current_branch_results(workflow_members)
|
|
91
93
|
return check_results(workflow_members) if command == "check"
|
|
@@ -286,6 +288,8 @@ module Kettle
|
|
|
286
288
|
skip_steps: skip_steps,
|
|
287
289
|
local_ci: local_ci,
|
|
288
290
|
continue_ci_failures: continue_ci_failures,
|
|
291
|
+
skip_bundle_audit: skip_bundle_audit,
|
|
292
|
+
auto_dependency_floors: auto_dependency_floors,
|
|
289
293
|
gha_sha_pins_upgrade: gha_sha_pins_upgrade,
|
|
290
294
|
gha_sha_pins_check: gha_sha_pins_check,
|
|
291
295
|
env_overrides: env_overrides,
|
|
@@ -315,17 +319,27 @@ module Kettle
|
|
|
315
319
|
release_members.each_with_object(results) do |member, memo|
|
|
316
320
|
memo.concat(release_results_for_member(member, runner: runner))
|
|
317
321
|
break memo unless memo.last.ok?
|
|
322
|
+
|
|
323
|
+
remaining_members = release_members.drop(release_members.index(member) + 1)
|
|
324
|
+
append_dependency_floor_results(released_members: [member], dependent_members: remaining_members, runner: runner, memo: memo)
|
|
325
|
+
break memo unless memo.last&.ok?
|
|
318
326
|
end
|
|
319
327
|
end
|
|
320
328
|
|
|
321
329
|
def parallel_release_member_results(release_members, initial_results)
|
|
322
330
|
results = initial_results.dup
|
|
323
331
|
waves = release_waves(release_members)
|
|
332
|
+
completed_members = []
|
|
324
333
|
waves.each_with_index do |wave, index|
|
|
325
334
|
results << release_wave_result(wave, index: index, total: waves.length)
|
|
326
335
|
wave_results = run_release_wave(wave)
|
|
327
336
|
results.concat(wave_results.flatten)
|
|
328
337
|
break unless wave_results.all? { |member_results| member_results.all?(&:ok?) }
|
|
338
|
+
|
|
339
|
+
completed_members.concat(wave)
|
|
340
|
+
remaining_members = release_members - completed_members
|
|
341
|
+
append_dependency_floor_results(released_members: wave, dependent_members: remaining_members, runner: release_command_runner, memo: results)
|
|
342
|
+
break unless results.last&.ok?
|
|
329
343
|
end
|
|
330
344
|
results
|
|
331
345
|
end
|
|
@@ -477,6 +491,40 @@ module Kettle
|
|
|
477
491
|
Array(member.dependencies).map(&:to_s).select { |dependency| by_name.key?(dependency) }
|
|
478
492
|
end
|
|
479
493
|
|
|
494
|
+
def append_dependency_floor_results(released_members:, dependent_members:, runner:, memo:)
|
|
495
|
+
return unless auto_dependency_floors
|
|
496
|
+
return if dependent_members.empty?
|
|
497
|
+
|
|
498
|
+
require_relative "dependency_floor"
|
|
499
|
+
|
|
500
|
+
floor_results = DependencyFloor.new(
|
|
501
|
+
released_members: released_members,
|
|
502
|
+
dependent_members: dependent_members,
|
|
503
|
+
mode: execute ? :execute : :dry_run
|
|
504
|
+
).results
|
|
505
|
+
memo.concat(floor_results)
|
|
506
|
+
return unless floor_results.any? && floor_results.all?(&:ok?)
|
|
507
|
+
|
|
508
|
+
commit_dependency_floor_changes(dependent_members: floor_results.map(&:member_name), runner: runner, memo: memo) if execute && commit
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
def commit_dependency_floor_changes(dependent_members:, runner:, memo:)
|
|
512
|
+
by_name = members.to_h { |member| [member.name, member] }
|
|
513
|
+
dependent_members.each do |member_name|
|
|
514
|
+
member = by_name.fetch(member_name)
|
|
515
|
+
memo << runner.call(
|
|
516
|
+
member: member,
|
|
517
|
+
phase: "commit_dependency_floor",
|
|
518
|
+
command: [
|
|
519
|
+
"sh",
|
|
520
|
+
"-lc",
|
|
521
|
+
"if ! git diff --quiet -- '*.gemspec'; then git add -- '*.gemspec' && git commit -m '⬆️ Raise family dependency floors'; fi"
|
|
522
|
+
]
|
|
523
|
+
)
|
|
524
|
+
break unless memo.last.ok?
|
|
525
|
+
end
|
|
526
|
+
end
|
|
527
|
+
|
|
480
528
|
def distinct_git_roots?(release_members)
|
|
481
529
|
roots = release_members.map { |member| git_root_for(member) }
|
|
482
530
|
roots.uniq.length == roots.length
|
|
@@ -574,6 +622,7 @@ module Kettle
|
|
|
574
622
|
args << "start_step=#{start_step}" if start_step
|
|
575
623
|
args << "skip_steps=#{skip_steps}" if skip_steps && !skip_steps.to_s.empty?
|
|
576
624
|
args << "--local-ci" if local_ci
|
|
625
|
+
args << "--skip-bundle-audit" if skip_bundle_audit
|
|
577
626
|
return command if args.empty?
|
|
578
627
|
|
|
579
628
|
command.is_a?(Array) ? [*command, *args] : "#{command} #{args.join(" ")}"
|
|
@@ -586,9 +635,11 @@ module Kettle
|
|
|
586
635
|
end
|
|
587
636
|
|
|
588
637
|
def base_release_env
|
|
589
|
-
env = config.release_env
|
|
638
|
+
env = config.family_local_path_env.merge(config.release_env)
|
|
639
|
+
env["KETTLE_FAMILY_CONFIG"] = config.path if config.path
|
|
590
640
|
env.merge!(TEMPLATE_QUIET_ENV) unless debug
|
|
591
641
|
env["K_RELEASE_CI_CONTINUE"] = "true" if continue_ci_failures
|
|
642
|
+
env["KETTLE_DEV_SKIP_BUNDLE_AUDIT"] = "true" if skip_bundle_audit
|
|
592
643
|
env
|
|
593
644
|
end
|
|
594
645
|
|
|
@@ -781,6 +832,7 @@ module Kettle
|
|
|
781
832
|
|
|
782
833
|
def workflow_env
|
|
783
834
|
{}.tap do |env|
|
|
835
|
+
env.merge!(config.family_local_path_env)
|
|
784
836
|
if command == "template"
|
|
785
837
|
env["KETTLE_JEM_TEMPLATE_PROFILE"] = config.template_profile if config.template_profile
|
|
786
838
|
env["KJ_REPOSITORY_TOPOLOGY"] = config.template_repository_topology if config.template_repository_topology
|
|
@@ -860,12 +912,12 @@ module Kettle
|
|
|
860
912
|
|
|
861
913
|
def release_lockfile_env
|
|
862
914
|
base_release_env
|
|
863
|
-
.merge(config.release_disable_local_path_env.to_h { |key| [key, "false"] })
|
|
864
915
|
.merge(env_overrides)
|
|
916
|
+
.merge(config.release_disable_local_path_env.to_h { |key| [key, "false"] })
|
|
865
917
|
end
|
|
866
918
|
|
|
867
919
|
def release_allowed_local_path_roots
|
|
868
|
-
env_overrides.filter_map do |key, value|
|
|
920
|
+
config.family_local_path_env.merge(env_overrides).filter_map do |key, value|
|
|
869
921
|
next unless key.end_with?("_LOCAL", "_DEV")
|
|
870
922
|
next if value.to_s.empty? || value.to_s.casecmp("false").zero?
|
|
871
923
|
|
data/lib/kettle/family.rb
CHANGED
|
@@ -10,7 +10,6 @@ require_relative "family/command_runner"
|
|
|
10
10
|
require_relative "family/readiness_check"
|
|
11
11
|
require_relative "family/changelog_check"
|
|
12
12
|
require_relative "family/git_status"
|
|
13
|
-
require_relative "family/version_bump"
|
|
14
13
|
require_relative "family/branch_lane_audit"
|
|
15
14
|
require_relative "family/config"
|
|
16
15
|
require_relative "family/branch_target_config"
|
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: 0.2.
|
|
4
|
+
version: 0.2.5
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -66,59 +66,59 @@ dependencies:
|
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
67
|
version: '0.1'
|
|
68
68
|
- !ruby/object:Gem::Dependency
|
|
69
|
-
name:
|
|
69
|
+
name: kettle-dev
|
|
70
70
|
requirement: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: '
|
|
74
|
+
version: '2.3'
|
|
75
|
+
- - ">="
|
|
76
|
+
- !ruby/object:Gem::Version
|
|
77
|
+
version: 2.3.0
|
|
75
78
|
type: :runtime
|
|
76
79
|
prerelease: false
|
|
77
80
|
version_requirements: !ruby/object:Gem::Requirement
|
|
78
81
|
requirements:
|
|
79
82
|
- - "~>"
|
|
80
83
|
- !ruby/object:Gem::Version
|
|
81
|
-
version: '
|
|
84
|
+
version: '2.3'
|
|
85
|
+
- - ">="
|
|
86
|
+
- !ruby/object:Gem::Version
|
|
87
|
+
version: 2.3.0
|
|
82
88
|
- !ruby/object:Gem::Dependency
|
|
83
|
-
name:
|
|
89
|
+
name: tsort
|
|
84
90
|
requirement: !ruby/object:Gem::Requirement
|
|
85
91
|
requirements:
|
|
86
92
|
- - "~>"
|
|
87
93
|
- !ruby/object:Gem::Version
|
|
88
|
-
version: '
|
|
89
|
-
- - ">="
|
|
90
|
-
- !ruby/object:Gem::Version
|
|
91
|
-
version: 1.1.13
|
|
94
|
+
version: '0.2'
|
|
92
95
|
type: :runtime
|
|
93
96
|
prerelease: false
|
|
94
97
|
version_requirements: !ruby/object:Gem::Requirement
|
|
95
98
|
requirements:
|
|
96
99
|
- - "~>"
|
|
97
100
|
- !ruby/object:Gem::Version
|
|
98
|
-
version: '
|
|
99
|
-
- - ">="
|
|
100
|
-
- !ruby/object:Gem::Version
|
|
101
|
-
version: 1.1.13
|
|
101
|
+
version: '0.2'
|
|
102
102
|
- !ruby/object:Gem::Dependency
|
|
103
|
-
name:
|
|
103
|
+
name: version_gem
|
|
104
104
|
requirement: !ruby/object:Gem::Requirement
|
|
105
105
|
requirements:
|
|
106
106
|
- - "~>"
|
|
107
107
|
- !ruby/object:Gem::Version
|
|
108
|
-
version: '
|
|
108
|
+
version: '1.1'
|
|
109
109
|
- - ">="
|
|
110
110
|
- !ruby/object:Gem::Version
|
|
111
|
-
version:
|
|
111
|
+
version: 1.1.13
|
|
112
112
|
type: :runtime
|
|
113
113
|
prerelease: false
|
|
114
114
|
version_requirements: !ruby/object:Gem::Requirement
|
|
115
115
|
requirements:
|
|
116
116
|
- - "~>"
|
|
117
117
|
- !ruby/object:Gem::Version
|
|
118
|
-
version: '
|
|
118
|
+
version: '1.1'
|
|
119
119
|
- - ">="
|
|
120
120
|
- !ruby/object:Gem::Version
|
|
121
|
-
version:
|
|
121
|
+
version: 1.1.13
|
|
122
122
|
- !ruby/object:Gem::Dependency
|
|
123
123
|
name: bundler-audit
|
|
124
124
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -176,7 +176,7 @@ dependencies:
|
|
|
176
176
|
version: '3.1'
|
|
177
177
|
- - ">="
|
|
178
178
|
- !ruby/object:Gem::Version
|
|
179
|
-
version: 3.1.
|
|
179
|
+
version: 3.1.4
|
|
180
180
|
type: :development
|
|
181
181
|
prerelease: false
|
|
182
182
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -186,7 +186,7 @@ dependencies:
|
|
|
186
186
|
version: '3.1'
|
|
187
187
|
- - ">="
|
|
188
188
|
- !ruby/object:Gem::Version
|
|
189
|
-
version: 3.1.
|
|
189
|
+
version: 3.1.4
|
|
190
190
|
- !ruby/object:Gem::Dependency
|
|
191
191
|
name: kettle-test
|
|
192
192
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -196,7 +196,7 @@ dependencies:
|
|
|
196
196
|
version: '2.0'
|
|
197
197
|
- - ">="
|
|
198
198
|
- !ruby/object:Gem::Version
|
|
199
|
-
version: 2.0.
|
|
199
|
+
version: 2.0.10
|
|
200
200
|
type: :development
|
|
201
201
|
prerelease: false
|
|
202
202
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -206,7 +206,7 @@ dependencies:
|
|
|
206
206
|
version: '2.0'
|
|
207
207
|
- - ">="
|
|
208
208
|
- !ruby/object:Gem::Version
|
|
209
|
-
version: 2.0.
|
|
209
|
+
version: 2.0.10
|
|
210
210
|
- !ruby/object:Gem::Dependency
|
|
211
211
|
name: turbo_tests2
|
|
212
212
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -216,7 +216,7 @@ dependencies:
|
|
|
216
216
|
version: '3.1'
|
|
217
217
|
- - ">="
|
|
218
218
|
- !ruby/object:Gem::Version
|
|
219
|
-
version: 3.1.
|
|
219
|
+
version: 3.1.6
|
|
220
220
|
type: :development
|
|
221
221
|
prerelease: false
|
|
222
222
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -226,7 +226,7 @@ dependencies:
|
|
|
226
226
|
version: '3.1'
|
|
227
227
|
- - ">="
|
|
228
228
|
- !ruby/object:Gem::Version
|
|
229
|
-
version: 3.1.
|
|
229
|
+
version: 3.1.6
|
|
230
230
|
- !ruby/object:Gem::Dependency
|
|
231
231
|
name: ruby-progressbar
|
|
232
232
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -250,7 +250,7 @@ dependencies:
|
|
|
250
250
|
version: '1.0'
|
|
251
251
|
- - ">="
|
|
252
252
|
- !ruby/object:Gem::Version
|
|
253
|
-
version: 1.0.
|
|
253
|
+
version: 1.0.5
|
|
254
254
|
type: :development
|
|
255
255
|
prerelease: false
|
|
256
256
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -260,7 +260,7 @@ dependencies:
|
|
|
260
260
|
version: '1.0'
|
|
261
261
|
- - ">="
|
|
262
262
|
- !ruby/object:Gem::Version
|
|
263
|
-
version: 1.0.
|
|
263
|
+
version: 1.0.5
|
|
264
264
|
- !ruby/object:Gem::Dependency
|
|
265
265
|
name: gitmoji-regex
|
|
266
266
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -270,7 +270,7 @@ dependencies:
|
|
|
270
270
|
version: '2.0'
|
|
271
271
|
- - ">="
|
|
272
272
|
- !ruby/object:Gem::Version
|
|
273
|
-
version: 2.0.
|
|
273
|
+
version: 2.0.4
|
|
274
274
|
type: :development
|
|
275
275
|
prerelease: false
|
|
276
276
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -280,7 +280,7 @@ dependencies:
|
|
|
280
280
|
version: '2.0'
|
|
281
281
|
- - ">="
|
|
282
282
|
- !ruby/object:Gem::Version
|
|
283
|
-
version: 2.0.
|
|
283
|
+
version: 2.0.4
|
|
284
284
|
description: "\U0001F469\U0001F469\U0001F467\U0001F467 Kettle::Family provides
|
|
285
285
|
scripts and conventions for coordinating related Ruby gems as one family."
|
|
286
286
|
email:
|
|
@@ -319,6 +319,7 @@ files:
|
|
|
319
319
|
- lib/kettle/family/command_result.rb
|
|
320
320
|
- lib/kettle/family/command_runner.rb
|
|
321
321
|
- lib/kettle/family/config.rb
|
|
322
|
+
- lib/kettle/family/dependency_floor.rb
|
|
322
323
|
- lib/kettle/family/discovery.rb
|
|
323
324
|
- lib/kettle/family/git_status.rb
|
|
324
325
|
- lib/kettle/family/local_install.rb
|
|
@@ -331,6 +332,7 @@ files:
|
|
|
331
332
|
- lib/kettle/family/selection.rb
|
|
332
333
|
- lib/kettle/family/version.rb
|
|
333
334
|
- lib/kettle/family/version_bump.rb
|
|
335
|
+
- lib/kettle/family/version_gem.rb
|
|
334
336
|
- lib/kettle/family/workflow.rb
|
|
335
337
|
- sig/kettle/family.rbs
|
|
336
338
|
- sig/kettle/family/version.rbs
|
|
@@ -339,10 +341,10 @@ licenses:
|
|
|
339
341
|
- AGPL-3.0-only
|
|
340
342
|
metadata:
|
|
341
343
|
homepage_uri: https://kettle-family.galtzo.com
|
|
342
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.2.
|
|
343
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.2.
|
|
344
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.2.5
|
|
345
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.2.5/CHANGELOG.md
|
|
344
346
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
345
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.2.
|
|
347
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.2.5
|
|
346
348
|
funding_uri: https://github.com/sponsors/pboling
|
|
347
349
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
348
350
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|