kettle-family 1.2.26 → 1.2.27
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 +2 -4
- data/CHANGELOG.md +18 -1
- data/README.md +1 -1
- data/lib/kettle/family/cli.rb +21 -2
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow_progress.rb +33 -13
- data.tar.gz.sig +0 -0
- metadata +7 -7
- 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: 7eb22e412099103ce6ac398ea2fc72f6a0ff8a9bf73834207deb5bcf3b66ba15
|
|
4
|
+
data.tar.gz: '09f4b61f9a2cae67da04bbd532d7955c57bdcf33699f68d497d044e87c4964d4'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 4db2cc116774e175b9ac032f2f786dc787d9c42b3a141a4669f9a55ec5eae582525fc3974f3f15d36936c6513f5b2278af0ecf1ac1b1520708dd07cfe7f07beb
|
|
7
|
+
data.tar.gz: 6091f9b45eaa9d9d32480a0c92e22b51238992e920fade590cedf1c5e3ce6ca44a773c540a1f419dbdecc3c65dca96f9c3eab80ddb48993adf4b328a7033414d
|
checksums.yaml.gz.sig
CHANGED
|
@@ -1,4 +1,2 @@
|
|
|
1
|
-
X
|
|
2
|
-
|
|
3
|
-
���L
|
|
4
|
-
����/뱊�U�?��'K?��v� d�����@�2�v�,��'��ـŲ@� ���L�i���B�឵�j�@��t�����a�
|
|
1
|
+
)�Ky�I�qȘׂ�a�|9�X�z�x��&�\�������c�ݔ���,�5٢/���x�F�`�K��"�
|
|
2
|
+
�ƚ��ۡg�C��_�y�仁E����p�"x �V�R�T�ͧ��%���c8�T3(xݺU�a�'DT�<]-��.����+i��z�'��yQ~���3{��:r�9�f݂��:K5�u@hV�zVP��5��I���7d`q�Y�
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,21 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [1.2.27] - 2026-08-03
|
|
34
|
+
|
|
35
|
+
- TAG: [v1.2.27][1.2.27t]
|
|
36
|
+
- COVERAGE: 93.95% -- 4720/5024 lines in 31 files
|
|
37
|
+
- BRANCH COVERAGE: 76.57% -- 1853/2420 branches in 31 files
|
|
38
|
+
- 29.31% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Clear shortened release progress statuses on TTY redraws
|
|
43
|
+
|
|
44
|
+
- Redraw concurrent TTY progress rows from a stable block anchor.
|
|
45
|
+
|
|
46
|
+
- List release members in deterministic release-wave order.
|
|
47
|
+
|
|
33
48
|
## [1.2.26] - 2026-08-03
|
|
34
49
|
|
|
35
50
|
- TAG: [v1.2.26][1.2.26t]
|
|
@@ -1705,7 +1720,9 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
1705
1720
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
1706
1721
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
1707
1722
|
|
|
1708
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.
|
|
1723
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.27...HEAD
|
|
1724
|
+
[1.2.27]: https://github.com/kettle-dev/kettle-family/compare/v1.2.26...v1.2.27
|
|
1725
|
+
[1.2.27t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.27
|
|
1709
1726
|
[1.2.26]: https://github.com/kettle-dev/kettle-family/compare/v1.2.25...v1.2.26
|
|
1710
1727
|
[1.2.26t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.26
|
|
1711
1728
|
[1.2.25]: https://github.com/kettle-dev/kettle-family/compare/v1.2.24...v1.2.25
|
data/README.md
CHANGED
|
@@ -828,7 +828,7 @@ Thanks for RTFM. ☺️
|
|
|
828
828
|
[📌gitmoji]: https://gitmoji.dev
|
|
829
829
|
[📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
|
|
830
830
|
[🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
|
|
831
|
-
[🧮kloc-img]: https://img.shields.io/badge/KLOC-5.
|
|
831
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-5.024-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
|
|
832
832
|
[🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
|
|
833
833
|
[🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
|
|
834
834
|
[📄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
|
@@ -641,7 +641,9 @@ module Kettle
|
|
|
641
641
|
release_state_results = release_state_results_for_selection(config: config, members: ordered, only: effective_only)
|
|
642
642
|
selected = Selection.new(members: ordered, release_state_results: release_state_results).apply(only: effective_only, exclude: options[:exclude], start_at: start_at.member)
|
|
643
643
|
result_members = selected
|
|
644
|
-
|
|
644
|
+
display_members = display_members_for(command: command, config: config, members: ordered, selected_members: selected)
|
|
645
|
+
display_selected_members = display_members_for(command: command, config: config, members: selected, selected_members: selected)
|
|
646
|
+
print_execution_intent(command: command, config: config, members: display_selected_members, options: options, start_at: start_at)
|
|
645
647
|
started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
646
648
|
results = command_results(command: command, config: config, members: result_members, options: options, start_at: start_at)
|
|
647
649
|
elapsed_seconds = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at
|
|
@@ -649,7 +651,7 @@ module Kettle
|
|
|
649
651
|
family_name: config.family_name,
|
|
650
652
|
family_mode: config.family_mode,
|
|
651
653
|
order_mode: config.order_mode,
|
|
652
|
-
members:
|
|
654
|
+
members: display_members,
|
|
653
655
|
selected_members: selected,
|
|
654
656
|
config_path: config.path,
|
|
655
657
|
branch_lanes: config.branch_lanes,
|
|
@@ -693,6 +695,23 @@ module Kettle
|
|
|
693
695
|
names
|
|
694
696
|
end
|
|
695
697
|
|
|
698
|
+
def display_members_for(command:, config:, members:, selected_members:)
|
|
699
|
+
return members unless command == "release"
|
|
700
|
+
|
|
701
|
+
require_relative "release_waves"
|
|
702
|
+
planned = ReleaseWaves.new(
|
|
703
|
+
members: selected_members,
|
|
704
|
+
configured_waves: config.release_waves,
|
|
705
|
+
strict_cycles: true
|
|
706
|
+
).waves.flatten
|
|
707
|
+
planned_names = planned.map(&:name)
|
|
708
|
+
planned + members.reject { |member| planned_names.include?(member.name) }
|
|
709
|
+
rescue Error
|
|
710
|
+
# Let the workflow report invalid cycles or wave configuration. The
|
|
711
|
+
# display should not prevent that diagnostic from being produced.
|
|
712
|
+
members
|
|
713
|
+
end
|
|
714
|
+
|
|
696
715
|
def command_results_for_current_branch(command:, config:, members:, options:, start_at: StartAt.new(nil, nil))
|
|
697
716
|
return mise_trust_results(config: config, members: members) if command == "mise-trust"
|
|
698
717
|
return bump_version_results(members: members, options: options, phase: command) if %w[bump bump-version].include?(command)
|
|
@@ -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.27"
|
|
9
9
|
end
|
|
10
10
|
# Current gem version exposed at the traditional constant location.
|
|
11
11
|
VERSION = Version::VERSION # Traditional Constant Location
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require "tty-progressbar"
|
|
4
3
|
require "tty-screen"
|
|
5
4
|
|
|
6
5
|
module Kettle
|
|
@@ -9,7 +8,7 @@ module Kettle
|
|
|
9
8
|
MEMBER_WIDTH = 24
|
|
10
9
|
PROGRESS_WIDTH = 7
|
|
11
10
|
ELAPSED_WIDTH = 7
|
|
12
|
-
FORMAT = "%<member>-#{MEMBER_WIDTH}.#{MEMBER_WIDTH}s
|
|
11
|
+
FORMAT = "%<member>-#{MEMBER_WIDTH}.#{MEMBER_WIDTH}s %<progress>s %<duration>s %<events>s %<status>s"
|
|
13
12
|
EVENT_WIDTH = 20
|
|
14
13
|
MIN_STATUS_WIDTH = 12
|
|
15
14
|
DEFAULT_TERMINAL_WIDTH = 80
|
|
@@ -23,7 +22,6 @@ module Kettle
|
|
|
23
22
|
@heading = heading
|
|
24
23
|
@clock = clock || lambda { Process.clock_gettime(Process::CLOCK_MONOTONIC) }
|
|
25
24
|
@enabled = enabled && !!io
|
|
26
|
-
@bars = {}
|
|
27
25
|
@line_order = members.map(&:name)
|
|
28
26
|
@started = false
|
|
29
27
|
@stopped = false
|
|
@@ -35,7 +33,8 @@ module Kettle
|
|
|
35
33
|
@member_statuses = Hash.new("")
|
|
36
34
|
@mutex = Mutex.new
|
|
37
35
|
@tty = @enabled && io.respond_to?(:tty?) && io.tty?
|
|
38
|
-
@
|
|
36
|
+
@tty_rendered = false
|
|
37
|
+
@tty_rows = 0
|
|
39
38
|
end
|
|
40
39
|
|
|
41
40
|
def start
|
|
@@ -46,7 +45,10 @@ module Kettle
|
|
|
46
45
|
|
|
47
46
|
write_line(@heading || "#{@label} #{@total} member#{plural(@total)} with #{@jobs} job#{plural(@jobs)}:")
|
|
48
47
|
@started = true
|
|
49
|
-
|
|
48
|
+
if @tty
|
|
49
|
+
@line_order.each { |member_name| render_name(member_name, status: "") }
|
|
50
|
+
render_tty_block unless @line_order.empty?
|
|
51
|
+
end
|
|
50
52
|
end
|
|
51
53
|
end
|
|
52
54
|
|
|
@@ -114,7 +116,6 @@ module Kettle
|
|
|
114
116
|
synchronize do
|
|
115
117
|
next if @stopped
|
|
116
118
|
|
|
117
|
-
@multibar&.stop
|
|
118
119
|
@stopped = true
|
|
119
120
|
end
|
|
120
121
|
end
|
|
@@ -136,6 +137,7 @@ module Kettle
|
|
|
136
137
|
|
|
137
138
|
def render(member, status:)
|
|
138
139
|
render_name(member.name, status: status)
|
|
140
|
+
render_tty_block if @tty
|
|
139
141
|
end
|
|
140
142
|
|
|
141
143
|
def append_event(member, mark)
|
|
@@ -147,8 +149,30 @@ module Kettle
|
|
|
147
149
|
def render_name(member_name, status:)
|
|
148
150
|
@member_statuses[member_name] = truncate_status(status)
|
|
149
151
|
@line_order << member_name unless @line_order.include?(member_name)
|
|
150
|
-
|
|
151
|
-
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
# Redraw the complete block from a stable cursor position. TTY::ProgressBar::Multi
|
|
155
|
+
# saves and restores the cursor independently for each bar, which is unreliable
|
|
156
|
+
# across terminals that do not implement its legacy ESC 7/ESC 8 sequences.
|
|
157
|
+
def render_tty_block
|
|
158
|
+
rows = @line_order.map { |member_name| tty_line(member_name) }
|
|
159
|
+
return if rows.empty?
|
|
160
|
+
|
|
161
|
+
output = +""
|
|
162
|
+
output << "\e[#{@tty_rows}A" if @tty_rendered && @tty_rows.positive?
|
|
163
|
+
rows.each do |line|
|
|
164
|
+
output << "\e[1G\e[2K#{line}\n"
|
|
165
|
+
end
|
|
166
|
+
@io.write(output)
|
|
167
|
+
@io.flush if @io.respond_to?(:flush)
|
|
168
|
+
@tty_rendered = true
|
|
169
|
+
@tty_rows = rows.length
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
def tty_line(member_name)
|
|
173
|
+
Kernel.format(
|
|
174
|
+
FORMAT,
|
|
175
|
+
member: member_name,
|
|
152
176
|
progress: progress_text(member_name),
|
|
153
177
|
duration: elapsed_text(member_name),
|
|
154
178
|
events: @member_events[member_name].rjust(EVENT_WIDTH),
|
|
@@ -156,10 +180,6 @@ module Kettle
|
|
|
156
180
|
)
|
|
157
181
|
end
|
|
158
182
|
|
|
159
|
-
def bar_for(member_name)
|
|
160
|
-
@bars[member_name] ||= @multibar.register(Kernel.format(FORMAT, member: member_name), total: nil)
|
|
161
|
-
end
|
|
162
|
-
|
|
163
183
|
def plural(count)
|
|
164
184
|
"s" unless count == 1
|
|
165
185
|
end
|
|
@@ -214,7 +234,7 @@ module Kettle
|
|
|
214
234
|
def truncate_status(status)
|
|
215
235
|
normalized = status.to_s.gsub(/\s+/, " ").strip
|
|
216
236
|
width = status_width
|
|
217
|
-
return normalized if normalized.length <= width
|
|
237
|
+
return normalized.ljust(width) if normalized.length <= width
|
|
218
238
|
return normalized[0, width] if width <= ELLIPSIS.length
|
|
219
239
|
|
|
220
240
|
"#{normalized[0, width - ELLIPSIS.length]}#{ELLIPSIS}"
|
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.27
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter H. Boling
|
|
@@ -120,19 +120,19 @@ dependencies:
|
|
|
120
120
|
- !ruby/object:Gem::Version
|
|
121
121
|
version: '0.2'
|
|
122
122
|
- !ruby/object:Gem::Dependency
|
|
123
|
-
name: tty-
|
|
123
|
+
name: tty-screen
|
|
124
124
|
requirement: !ruby/object:Gem::Requirement
|
|
125
125
|
requirements:
|
|
126
126
|
- - "~>"
|
|
127
127
|
- !ruby/object:Gem::Version
|
|
128
|
-
version: '0.
|
|
128
|
+
version: '0.8'
|
|
129
129
|
type: :runtime
|
|
130
130
|
prerelease: false
|
|
131
131
|
version_requirements: !ruby/object:Gem::Requirement
|
|
132
132
|
requirements:
|
|
133
133
|
- - "~>"
|
|
134
134
|
- !ruby/object:Gem::Version
|
|
135
|
-
version: '0.
|
|
135
|
+
version: '0.8'
|
|
136
136
|
- !ruby/object:Gem::Dependency
|
|
137
137
|
name: bundler-audit
|
|
138
138
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -345,10 +345,10 @@ licenses:
|
|
|
345
345
|
- AGPL-3.0-only
|
|
346
346
|
metadata:
|
|
347
347
|
homepage_uri: https://kettle-family.galtzo.com
|
|
348
|
-
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.
|
|
349
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.
|
|
348
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.27
|
|
349
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.27/CHANGELOG.md
|
|
350
350
|
bug_tracker_uri: https://github.com/kettle-dev/kettle-family/issues
|
|
351
|
-
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.
|
|
351
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.27
|
|
352
352
|
funding_uri: https://github.com/sponsors/pboling
|
|
353
353
|
wiki_uri: https://github.com/kettle-dev/kettle-family/wiki
|
|
354
354
|
news_uri: https://www.railsbling.com/tags/kettle-family
|
metadata.gz.sig
CHANGED
|
Binary file
|