kettle-family 0.1.9 → 0.1.10

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: 0b9a58c41513f35bf917d7606794fc658fbe9cfb30b9671815fe752873274b25
4
- data.tar.gz: 71f68f7daec511c0791fde6539c992b5c33802e855be8bd60423d1cfbf4ace64
3
+ metadata.gz: 703c624ada4b7494a0a038c8a1e909c45a09b3172b581a81863f12eec6f747ce
4
+ data.tar.gz: 7a71da9d94bd1945ccb091d16b6b0f6b537ff33ad00f6b42805e82cbf443a25e
5
5
  SHA512:
6
- metadata.gz: 9b2dff908f9b33966d1c49c135d33f0ea57883dc8be00860ca30a4281875da684dae572a6cb09e19fdadeb64225b549d799880e6fc00ebee894dbc4f6fa3ed16
7
- data.tar.gz: e617ad2fd0b41e3cfb4ab5e798b7edce9d51f0f5372279ca94b43662d1d508fb860774ee64ea5803b1be7ea03a8849703b5d0561be16e827ac452e90bf042d08
6
+ metadata.gz: 2eceaf1a932d83e3d2ca0c4f6498fed8232735702d6454043521df1e9df48d18d92495adb3827b1fa2e5632126a64dfaabb4bcad9a01922d0eb226d8cb845161
7
+ data.tar.gz: a7f8a0e30d55c3d7b75dfaed30e03ec0ba30fbc74ea6f09d321a7355ac998a4fcaa9947d4a66028ab59a06ed8a348d468ec835cb71f18ba2652c09d4f4b31b87
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -30,6 +30,19 @@ Please file a bug if you notice a violation of semantic versioning.
30
30
 
31
31
  ### Security
32
32
 
33
+ ## [0.1.10] - 2026-06-23
34
+
35
+ - TAG: [v0.1.10][0.1.10t]
36
+ - COVERAGE: 94.34% -- 1300/1378 lines in 20 files
37
+ - BRANCH COVERAGE: 75.92% -- 432/569 branches in 20 files
38
+ - 40.14% documented
39
+
40
+ ### Fixed
41
+
42
+ - Workflow commands now honor member-local `.kettle-family.yml` release target
43
+ branches when the active family root has no branch stack, and reports list
44
+ those member-local branch targets.
45
+
33
46
  ## [0.1.9] - 2026-06-23
34
47
 
35
48
  - TAG: [v0.1.9][0.1.9t]
@@ -240,7 +253,9 @@ Please file a bug if you notice a violation of semantic versioning.
240
253
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
241
254
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
242
255
 
243
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.9...HEAD
256
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v0.1.10...HEAD
257
+ [0.1.10]: https://github.com/kettle-dev/kettle-family/compare/v0.1.9...v0.1.10
258
+ [0.1.10t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.10
244
259
  [0.1.9]: https://github.com/kettle-dev/kettle-family/compare/v0.1.8...v0.1.9
245
260
  [0.1.9t]: https://github.com/kettle-dev/kettle-family/releases/tag/v0.1.9
246
261
  [0.1.8]: https://github.com/kettle-dev/kettle-family/compare/v0.1.7...v0.1.8
data/README.md CHANGED
@@ -562,7 +562,7 @@ Thanks for RTFM. ☺️
562
562
  [📌gitmoji]: https://gitmoji.dev
563
563
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
564
564
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
565
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.329-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
565
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-1.378-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
566
566
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
567
567
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
568
568
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -176,6 +176,7 @@ module Kettle
176
176
  config_path: config.path,
177
177
  branch_lanes: config.branch_lanes,
178
178
  release_target_branches: config.release_target_branches,
179
+ member_release_target_branches: member_release_target_branches(members: selected, config: config),
179
180
  command: command,
180
181
  results: results
181
182
  )
@@ -331,6 +332,24 @@ module Kettle
331
332
  ReleaseStateCheck.new(config: config, members: members).results
332
333
  end
333
334
 
335
+ def member_release_target_branches(members:, config:)
336
+ members.each_with_object({}) do |member, memo|
337
+ member_config = member_local_release_config(member: member, config: config)
338
+ memo[member.name] = member_config.release_target_branches if member_config
339
+ end
340
+ end
341
+
342
+ def member_local_release_config(member:, config:)
343
+ member_config = Config.load(root: member.root)
344
+ return unless member_config.path
345
+ return if config.path && File.realpath(member_config.path) == File.realpath(config.path)
346
+ return if member_config.release_target_branches.empty?
347
+
348
+ member_config
349
+ rescue Errno::ENOENT
350
+ nil
351
+ end
352
+
334
353
  def install_order(members, config)
335
354
  by_name = members.to_h { |member| [member.name, member] }
336
355
  hinted = config.order_hints.filter_map { |name| by_name[name] }
@@ -5,9 +5,9 @@ require "json"
5
5
  module Kettle
6
6
  module Family
7
7
  class Report
8
- attr_reader :family_name, :family_mode, :order_mode, :members, :selected_members, :config_path, :command, :results, :branch_lanes, :release_target_branches
8
+ attr_reader :family_name, :family_mode, :order_mode, :members, :selected_members, :config_path, :command, :results, :branch_lanes, :release_target_branches, :member_release_target_branches
9
9
 
10
- def initialize(family_name:, order_mode:, members:, selected_members:, config_path:, family_mode: nil, branch_lanes: {}, release_target_branches: [], command: nil, results: [])
10
+ def initialize(family_name:, order_mode:, members:, selected_members:, config_path:, family_mode: nil, branch_lanes: {}, release_target_branches: [], member_release_target_branches: {}, command: nil, results: [])
11
11
  @family_name = family_name
12
12
  @family_mode = family_mode
13
13
  @order_mode = order_mode
@@ -18,6 +18,7 @@ module Kettle
18
18
  @results = results
19
19
  @branch_lanes = branch_lanes
20
20
  @release_target_branches = release_target_branches
21
+ @member_release_target_branches = member_release_target_branches
21
22
  end
22
23
 
23
24
  def to_h
@@ -30,6 +31,7 @@ module Kettle
30
31
  "selected_members" => selected_members.map(&:name),
31
32
  "branch_lanes" => branch_lanes,
32
33
  "release_target_branches" => release_target_branches,
34
+ "member_release_target_branches" => member_release_target_branches,
33
35
  "command" => command,
34
36
  "results" => results.map(&:to_h),
35
37
  "resume_hint" => resume_hint
@@ -47,6 +49,7 @@ module Kettle
47
49
  lines << "order: #{order_mode}"
48
50
  lines << "command: #{command}" if command
49
51
  lines << "release targets: #{release_target_branches.join(", ")}" unless release_target_branches.empty?
52
+ append_member_release_targets(lines)
50
53
  lines << "members:"
51
54
  selected_names = selected_members.map(&:name)
52
55
  members.each do |member|
@@ -77,6 +80,15 @@ module Kettle
77
80
  end
78
81
  end
79
82
 
83
+ def append_member_release_targets(lines)
84
+ return if member_release_target_branches.empty?
85
+
86
+ lines << "member release targets:"
87
+ member_release_target_branches.each do |member_name, branches|
88
+ lines << " #{member_name}: #{branches.join(", ")}"
89
+ end
90
+ end
91
+
80
92
  def result_state(result)
81
93
  return "skipped" if result.skipped
82
94
  return "ok" if result.success
@@ -3,7 +3,7 @@
3
3
  module Kettle
4
4
  module Family
5
5
  module Version
6
- VERSION = "0.1.9"
6
+ VERSION = "0.1.10"
7
7
  end
8
8
  VERSION = Version::VERSION # Traditional Constant Location
9
9
  end
@@ -35,6 +35,7 @@ module Kettle
35
35
  def results
36
36
  prompt_for_gem_signing_password if command == "release" && execute && publish && gem_signing_required?
37
37
  return branch_target_results unless config.release_target_branches.empty?
38
+ return member_local_branch_target_results if member_local_branch_targets?
38
39
 
39
40
  current_branch_results(members)
40
41
  end
@@ -88,6 +89,55 @@ module Kettle
88
89
  end
89
90
  end
90
91
 
92
+ def member_local_branch_target_results
93
+ return release_member_local_branch_target_results if command == "release"
94
+
95
+ members.each_with_object([]) do |member, memo|
96
+ member_config = member_local_release_config(member)
97
+ if member_config
98
+ memo.concat(member_local_workflow(member: member, member_config: member_config).results)
99
+ else
100
+ memo.concat(current_branch_results([member]))
101
+ end
102
+ break memo unless memo.last&.ok?
103
+ end
104
+ end
105
+
106
+ def release_member_local_branch_target_results
107
+ runner = command_runner
108
+ results = []
109
+ append_family_changelog_result(runner: runner, memo: results)
110
+ return results unless results.all?(&:ok?)
111
+
112
+ members.each_with_object(results) do |member, memo|
113
+ member_config = member_local_release_config(member)
114
+ if member_config
115
+ memo.concat(member_local_workflow(member: member, member_config: member_config).results)
116
+ else
117
+ memo.concat(release_member_results([member], include_family_changelog: false))
118
+ end
119
+ break memo unless memo.last&.ok?
120
+ end
121
+ end
122
+
123
+ def member_local_workflow(member:, member_config:)
124
+ self.class.new(
125
+ command: command,
126
+ config: member_config,
127
+ members: [member],
128
+ execute: execute,
129
+ commit: commit,
130
+ allow_dirty: allow_dirty,
131
+ publish: publish,
132
+ push: push,
133
+ tag: tag,
134
+ start_step: start_step,
135
+ local_ci: local_ci,
136
+ continue_ci_failures: continue_ci_failures,
137
+ env_overrides: env_overrides
138
+ )
139
+ end
140
+
91
141
  def release_member_results(release_members, include_family_changelog: false)
92
142
  runner = command_runner
93
143
  results = []
@@ -127,6 +177,21 @@ module Kettle
127
177
  ordered.select { |member| selected_names.include?(member.name) }
128
178
  end
129
179
 
180
+ def member_local_branch_targets?
181
+ members.any? { |member| member_local_release_config(member) }
182
+ end
183
+
184
+ def member_local_release_config(member)
185
+ member_config = Config.load(root: member.root)
186
+ return unless member_config.path
187
+ return if config.path && File.realpath(member_config.path) == File.realpath(config.path)
188
+ return if member_config.release_target_branches.empty?
189
+
190
+ member_config
191
+ rescue Errno::ENOENT
192
+ nil
193
+ end
194
+
130
195
  def checkout_branch_result(branch:, runner:)
131
196
  runner.call(
132
197
  member: family_member,
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.1.9
4
+ version: 0.1.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -309,10 +309,10 @@ licenses:
309
309
  - AGPL-3.0-only
310
310
  metadata:
311
311
  homepage_uri: https://kettle-family.galtzo.com
312
- source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.9
313
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.9/CHANGELOG.md
312
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v0.1.10
313
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v0.1.10/CHANGELOG.md
314
314
  bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
315
- documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.9
315
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/0.1.10
316
316
  funding_uri: https://github.com/sponsors/pboling
317
317
  wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
318
318
  news_uri: https://www.railsbling.com/tags/kettle-family
metadata.gz.sig CHANGED
Binary file