kettle-family 1.2.75 → 1.2.77

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: 1646de2982d2372560fe6619e24afa7abb1573dc7a19889ae207f8bbd3c55247
4
- data.tar.gz: d735b77106c08653c95cb039476c2f1ff7a6f08bb35232cdcd5cc4489693e0cf
3
+ metadata.gz: 1ca9ff18bda1392f68441dbf441572ceaa754fb959a619a75b86488184671f7d
4
+ data.tar.gz: 632ee5ca19cbc6048c31f531472298f6268c846441113cf483724a23aaca61ab
5
5
  SHA512:
6
- metadata.gz: b2adcb3a0921026fa2d50c59d22f9ba2990c4a682bca13f2e61368e161d8273e640b72e95728951db62527ede8d64dc94b9d089f81f2c68947b3b6b13508ac21
7
- data.tar.gz: 0700e5424babd6ad5ecc9fb2338f06fbb424fb150b566ed8f8c82601e18c14d2b7808089c973f3a2c8a31c7cc4c33adee975250eeea4a17aa5817dd50e72ece4
6
+ metadata.gz: 35d3075ea7a12f54b64e5beeaf64f1571a201d74f53c63c356807b91c115d38dae3a1097ed73f7c85dbbe57d9bb6047012edcb02252073acbf8e8d6203cb7c9b
7
+ data.tar.gz: 25aaf12398678d93df41e1d4bb38d0e20ffe4fc092576b69d24b8076f917e37d10946717242f8f3ca8d65c52c19efaadf4116d5f75e32edc1723e9b3b3b9a3fb
checksums.yaml.gz.sig CHANGED
@@ -1,2 +1,3 @@
1
- �,�)r��a���T)��� �(��(DOB,o�VC0>ׁ�Z��a��@�s����Ӕ�� �A�0'Ӣo��2�դ]c��!Ҵu;�
2
- G�f2T�
1
+ x��, ��* ;jb#Olc&(��{��~~���ey�3N?:u��C�X^�SRsަ,��%�T@ ��A�P����A_ ���n0Ķ��� )j�S�r�U~U �p?p����1�%�_A���F�����\�R`�ޫ�r�#8�}�ؼQ��g�TD����
2
+ �RG�)ʝU;�D�3q�q�� e@,��OT8{��&��%�~{���~}
3
+ � 7i��@�ĩ3�d Q
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.77] - 2026-08-31
34
+
35
+ - TAG: [v1.2.77][1.2.77t]
36
+ - COVERAGE: 93.33% -- 5568/5966 lines in 33 files
37
+ - BRANCH COVERAGE: 76.69% -- 2290/2986 branches in 33 files
38
+ - 30.69% documented
39
+
40
+ ### Added
41
+
42
+ - Stream aggregate monorepo GitHub Release asset events through family release progress.
43
+
44
+ ## [1.2.76] - 2026-08-31
45
+
46
+ - TAG: [v1.2.76][1.2.76t]
47
+ - COVERAGE: 93.32% -- 5558/5956 lines in 33 files
48
+ - BRANCH COVERAGE: 76.76% -- 2286/2978 branches in 33 files
49
+ - 30.69% documented
50
+
51
+ ### Fixed
52
+
53
+ - Avoid invalid member-scoped resume hints for synthetic aggregate GitHub Release failures.
54
+
55
+ - Include all shared-family artifacts when recovering an interrupted aggregate GitHub Release.
56
+
33
57
  ## [1.2.75] - 2026-08-31
34
58
 
35
59
  - TAG: [v1.2.75][1.2.75t]
@@ -2403,7 +2427,11 @@ Please file a bug if you notice a violation of semantic versioning.
2403
2427
  - Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
2404
2428
  - Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
2405
2429
 
2406
- [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.75...HEAD
2430
+ [Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.77...HEAD
2431
+ [1.2.77]: https://github.com/kettle-dev/kettle-family/compare/v1.2.76...v1.2.77
2432
+ [1.2.77t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.77
2433
+ [1.2.76]: https://github.com/kettle-dev/kettle-family/compare/v1.2.75...v1.2.76
2434
+ [1.2.76t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.76
2407
2435
  [1.2.75]: https://github.com/kettle-dev/kettle-family/compare/v1.2.74...v1.2.75
2408
2436
  [1.2.75t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.75
2409
2437
  [1.2.74]: https://github.com/kettle-dev/kettle-family/compare/v1.2.73...v1.2.74
data/README.md CHANGED
@@ -1049,7 +1049,7 @@ Thanks for RTFM. ☺️
1049
1049
  [📌gitmoji]: https://gitmoji.dev
1050
1050
  [📌gitmoji-img]: https://img.shields.io/badge/gitmoji_commits-%20%F0%9F%98%9C%20%F0%9F%98%8D-34495e.svg?style=flat-square
1051
1051
  [🧮kloc]: https://www.youtube.com/watch?v=dQw4w9WgXcQ
1052
- [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.951-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1052
+ [🧮kloc-img]: https://img.shields.io/badge/KLOC-5.966-FFDD67.svg?style=for-the-badge&logo=YouTube&logoColor=blue
1053
1053
  [🔐security]: https://github.com/kettle-dev/kettle-family/blob/main/SECURITY.md
1054
1054
  [🔐security-img]: https://img.shields.io/badge/security-policy-259D6C.svg?style=flat
1055
1055
  [📄copyright-notice-explainer]: https://opensource.stackexchange.com/questions/5778/why-do-licenses-such-as-the-mit-license-specify-a-single-year
@@ -17,7 +17,8 @@ module Kettle
17
17
  :branch,
18
18
  :output_streamed,
19
19
  :log_path,
20
- :resume_step
20
+ :resume_step,
21
+ :resume_command
21
22
  ) do
22
23
  def to_h
23
24
  {
@@ -35,7 +36,8 @@ module Kettle
35
36
  "reason" => reason,
36
37
  "output_streamed" => output_streamed?,
37
38
  "log_path" => log_path,
38
- "resume_step" => resume_step
39
+ "resume_step" => resume_step,
40
+ "resume_command" => resume_command
39
41
  }
40
42
  end
41
43
 
@@ -122,7 +122,8 @@ module Kettle
122
122
  lines << " #{result_state(result)} #{result.member_name} #{result.phase} #{result.reason || ""}".rstrip
123
123
  append_result_stdout(lines, result)
124
124
  append_indented_output(lines, result.stderr) if !result.ok? && !result.stderr.to_s.empty?
125
- lines << " resume: #{resume_hint_for(result)}" unless result.ok?
125
+ resume_hint = resume_hint_for(result)
126
+ lines << " resume: #{resume_hint}" if !result.ok? && resume_hint
126
127
  end
127
128
  append_template_summary(lines) if command == "template"
128
129
  end
@@ -687,7 +688,7 @@ module Kettle
687
688
  end
688
689
 
689
690
  def release_resume_hints
690
- failed_hints = visible_results.reject(&:ok?).map { |result| resume_hint_for(result) }.uniq
691
+ failed_hints = visible_results.reject(&:ok?).filter_map { |result| resume_hint_for(result) }.uniq
691
692
  pending_names = summary_pending.map { |entry| entry.fetch("member") }
692
693
  return failed_hints if pending_names.empty?
693
694
 
@@ -701,6 +702,9 @@ module Kettle
701
702
  end
702
703
 
703
704
  def release_resume_hint(result)
705
+ return result.resume_command if result.respond_to?(:resume_command) && !result.resume_command.to_s.empty?
706
+ return nil if result.phase == "aggregate_github_release"
707
+
704
708
  hint = release_resume_base
705
709
  hint = "#{hint} --only #{result.member_name}" if result.member_name
706
710
  hint = "#{hint} --start-step #{result.resume_step}" if result.respond_to?(:resume_step) && result.resume_step
@@ -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.75"
8
+ VERSION = "1.2.77"
9
9
  end
10
10
  # Current gem version exposed at the traditional constant location.
11
11
  VERSION = Version::VERSION # Traditional Constant Location
@@ -520,8 +520,8 @@ module Kettle
520
520
  results.concat(release_member_results(workflow_members, include_family_changelog: !skip_changelog))
521
521
  return results unless explicit_monorepo_mode? && results.all?(&:ok?)
522
522
 
523
- aggregate_members = aggregate_release_members(workflow_members)
524
- results << aggregate_monorepo_github_release(aggregate_members) unless aggregate_members.empty?
523
+ selected_aggregate_members = aggregate_release_members(workflow_members)
524
+ results << aggregate_monorepo_github_release(aggregate_github_release_members) unless selected_aggregate_members.empty?
525
525
  return results
526
526
  end
527
527
  return git_sync_results(workflow_members) if GIT_SYNC_COMMANDS.key?(command)
@@ -2396,6 +2396,13 @@ module Kettle
2396
2396
  member && aggregate_release_members.include?(member)
2397
2397
  end
2398
2398
 
2399
+ # A resumed release may select only the members that remain unpublished.
2400
+ # The repository-level release still needs every shared-version artifact,
2401
+ # including members published by an earlier interrupted wave.
2402
+ def aggregate_github_release_members
2403
+ aggregate_release_members(family_members)
2404
+ end
2405
+
2399
2406
  def fast_recovery_for?(member)
2400
2407
  return false unless fast_recovery
2401
2408
  return false unless member
@@ -2609,7 +2616,7 @@ module Kettle
2609
2616
  checksum_path = File.join(member.root, "checksums", "#{member.name}-#{version.first}.gem.sha256")
2610
2617
  gem_path + (File.file?(checksum_path) ? [checksum_path] : [])
2611
2618
  end
2612
- command = ["bundle", "exec", "kettle-gh-release", "--allow-unpublished", "--release-version", version.first]
2619
+ command = ["bundle", "exec", "kettle-gh-release", "--allow-unpublished", "--events", "--release-version", version.first]
2613
2620
  assets.each { |asset| command.concat(["--asset", asset]) }
2614
2621
  return aggregate_release_dry_run_result(command) unless execute
2615
2622
 
@@ -2625,21 +2632,18 @@ module Kettle
2625
2632
  # implementation needed by this aggregate step.
2626
2633
  local_kettle_dev = ENV.fetch("KETTLE_DEV_DEV", "").to_s.strip
2627
2634
  env["KETTLE_DEV_DEV"] = local_kettle_dev if local_path_env_value?(local_kettle_dev)
2628
- started = Process.clock_gettime(Process::CLOCK_MONOTONIC)
2629
- stdout, stderr, status = Open3.capture3(env, *command, chdir: config.root)
2630
- CommandResult.new(
2631
- member_name: config.family_name,
2635
+ aggregate_member = family_member
2636
+ result = command_runner.call(
2637
+ member: aggregate_member,
2632
2638
  phase: "aggregate_github_release",
2633
2639
  command: command,
2634
- workdir: config.root,
2635
- status: status.exitstatus,
2636
- success: status.success?,
2637
- stdout: stdout,
2638
- stderr: stderr,
2639
- elapsed_seconds: Process.clock_gettime(Process::CLOCK_MONOTONIC) - started,
2640
- skipped: false,
2641
- reason: status.success? ? nil : "aggregate GitHub release failed"
2640
+ env: env,
2641
+ stdout_line_handler: aggregate_github_release_event_line_handler(aggregate_member),
2642
+ log_path: release_command_log_path(aggregate_member, "aggregate_github_release"),
2643
+ passthrough_output: release_command_passthrough_output?
2642
2644
  )
2645
+ result.resume_command = aggregate_github_release_resume_command(env, command) unless result.ok?
2646
+ result
2643
2647
  rescue => error
2644
2648
  aggregate_release_result("#{error.class}: #{error.message}")
2645
2649
  end
@@ -2651,6 +2655,23 @@ module Kettle
2651
2655
  def aggregate_monorepo_github_release?
2652
2656
  explicit_monorepo_mode? && family_members.length > 1
2653
2657
  end
2658
+
2659
+ def aggregate_github_release_resume_command(env, command)
2660
+ assignments = env.sort_by { |key, _value| key }.filter_map do |key, value|
2661
+ "#{key}=#{Shellwords.escape(value.to_s)}" unless value.nil?
2662
+ end
2663
+ (["env", *assignments].join(" ") + " " + Shellwords.join(command)).strip
2664
+ end
2665
+
2666
+ def aggregate_github_release_event_line_handler(member)
2667
+ lambda do |line|
2668
+ event = parse_template_event(line)
2669
+ next false unless event && event["type"] == "github_release"
2670
+
2671
+ emit_template_event_line(member, github_release_event_mark(event), github_release_event_label(event)) if progress_io
2672
+ true
2673
+ end
2674
+ end
2654
2675
  # simplecov:enable
2655
2676
 
2656
2677
  def aggregate_release_result(reason)
@@ -3725,6 +3746,21 @@ module Kettle
3725
3746
  parts.reject(&:empty?).join(":")
3726
3747
  end
3727
3748
 
3749
+ def github_release_event_label(event)
3750
+ parts = ["github_release", event["action"].to_s]
3751
+ asset = event["asset"].to_s
3752
+ parts << asset unless asset.empty?
3753
+ parts << "#{event["attempt"]}/#{event["attempts"]}" if event["attempt"] && event["attempts"]
3754
+ parts.reject(&:empty?).join(":")
3755
+ end
3756
+
3757
+ def github_release_event_mark(event)
3758
+ return "F" if event["status"].to_s == "failed"
3759
+ return "." if event["status"].to_s == "ok"
3760
+
3761
+ ">"
3762
+ end
3763
+
3728
3764
  def diagnostic_event_label(event)
3729
3765
  message = event["message"]
3730
3766
  return message.to_s unless message.to_s.empty? || message.is_a?(Hash)
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.75
4
+ version: 1.2.77
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter H. Boling
@@ -91,7 +91,7 @@ dependencies:
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 3.0.25
94
+ version: 3.0.27
95
95
  - - "<"
96
96
  - !ruby/object:Gem::Version
97
97
  version: 4.0.0
@@ -101,7 +101,7 @@ dependencies:
101
101
  requirements:
102
102
  - - ">="
103
103
  - !ruby/object:Gem::Version
104
- version: 3.0.25
104
+ version: 3.0.27
105
105
  - - "<"
106
106
  - !ruby/object:Gem::Version
107
107
  version: 4.0.0
@@ -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.75
445
- changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.75/CHANGELOG.md
444
+ source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.77
445
+ changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.77/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.75
447
+ documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.77
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