kettle-family 1.2.82 → 1.2.84
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 +27 -1
- data/README.md +1 -1
- data/lib/kettle/family/version.rb +1 -1
- data/lib/kettle/family/workflow.rb +285 -12
- data.tar.gz.sig +0 -0
- metadata +6 -6
- 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: 9d60e9fc61486c0ac3adcbbd20df98c09cab7c9758e9eb5caa3a95c4308bb168
|
|
4
|
+
data.tar.gz: 0bb55d3a77da5d9fdf94c73d4295ae8f5a772b8f9a07e5da4108970135b690c2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f868bb0dbf6665ea261cb0011a04b33125c8bf794a51e2b4092359993a6ab5d35fa19ed2d006279f0c1d13694aedd439caf913c3918763d0c03304808a2649cc
|
|
7
|
+
data.tar.gz: 8fe0c820e3b2b2d17c627b0a6fb7d44e28b8f885c4daa1d379fed8b45fac134b9b84e6b9037829bdfb22026d17e0e74b183f3c4067ecc90b57433189ac583fe1
|
checksums.yaml.gz.sig
CHANGED
|
Binary file
|
data/CHANGELOG.md
CHANGED
|
@@ -30,6 +30,28 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
30
30
|
|
|
31
31
|
### Security
|
|
32
32
|
|
|
33
|
+
## [1.2.84] - 2026-09-05
|
|
34
|
+
|
|
35
|
+
- TAG: [v1.2.84][1.2.84t]
|
|
36
|
+
- COVERAGE: 93.08% -- 5783/6213 lines in 33 files
|
|
37
|
+
- BRANCH COVERAGE: 76.04% -- 2345/3084 branches in 33 files
|
|
38
|
+
- 30.69% documented
|
|
39
|
+
|
|
40
|
+
### Fixed
|
|
41
|
+
|
|
42
|
+
- Keep changelog tooling out of nomono-only template bootstrap resolution.
|
|
43
|
+
|
|
44
|
+
## [1.2.83] - 2026-09-02
|
|
45
|
+
|
|
46
|
+
- TAG: [v1.2.83][1.2.83t]
|
|
47
|
+
- COVERAGE: 93.08% -- 5782/6212 lines in 33 files
|
|
48
|
+
- BRANCH COVERAGE: 76.04% -- 2345/3084 branches in 33 files
|
|
49
|
+
- 30.69% documented
|
|
50
|
+
|
|
51
|
+
### Fixed
|
|
52
|
+
|
|
53
|
+
- Run aggregate monorepo release members in isolated worktrees and serialize shared release finalization.
|
|
54
|
+
|
|
33
55
|
## [1.2.82] - 2026-09-01
|
|
34
56
|
|
|
35
57
|
- TAG: [v1.2.82][1.2.82t]
|
|
@@ -2488,7 +2510,11 @@ Please file a bug if you notice a violation of semantic versioning.
|
|
|
2488
2510
|
- Fixed CI load failures on engines without compatible `pty` support by falling back to Open3 for interactive release commands.
|
|
2489
2511
|
- Fixed Ruby 3.2 version-bump support by loading Prism lazily and wiring the Prism gem only for MRI versions that need it.
|
|
2490
2512
|
|
|
2491
|
-
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.
|
|
2513
|
+
[Unreleased]: https://github.com/kettle-dev/kettle-family/compare/v1.2.84...HEAD
|
|
2514
|
+
[1.2.84]: https://github.com/kettle-dev/kettle-family/compare/v1.2.83...v1.2.84
|
|
2515
|
+
[1.2.84t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.84
|
|
2516
|
+
[1.2.83]: https://github.com/kettle-dev/kettle-family/compare/v1.2.82...v1.2.83
|
|
2517
|
+
[1.2.83t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.83
|
|
2492
2518
|
[1.2.82]: https://github.com/kettle-dev/kettle-family/compare/v1.2.81...v1.2.82
|
|
2493
2519
|
[1.2.82t]: https://github.com/kettle-dev/kettle-family/releases/tag/v1.2.82
|
|
2494
2520
|
[1.2.81]: https://github.com/kettle-dev/kettle-family/compare/v1.2.80...v1.2.81
|
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-6.
|
|
1052
|
+
[🧮kloc-img]: https://img.shields.io/badge/KLOC-6.213-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
|
|
@@ -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.84"
|
|
9
9
|
end
|
|
10
10
|
# Current gem version exposed at the traditional constant location.
|
|
11
11
|
VERSION = Version::VERSION # Traditional Constant Location
|
|
@@ -824,6 +824,9 @@ module Kettle
|
|
|
824
824
|
|
|
825
825
|
def template_bootstrap_dependency_env(_member)
|
|
826
826
|
env = template_prepare_env
|
|
827
|
+
# This refresh only activates nomono. Changelog tooling is not needed
|
|
828
|
+
# and can pin a previously released monorepo dependency graph.
|
|
829
|
+
env["KETTLE_DEV_SKIP_CHANGELOG_DEPENDENCY"] = "true"
|
|
827
830
|
env["K_JEM_TEMPLATING"] = "false"
|
|
828
831
|
env["BUNDLE_DISABLE_CHECKSUM_VALIDATION"] = "true"
|
|
829
832
|
env
|
|
@@ -1014,15 +1017,15 @@ module Kettle
|
|
|
1014
1017
|
File.join(config.root, "tmp", "kettle-family", "template-worktrees", safe_member, "#{Process.pid}-#{safe_branch}")
|
|
1015
1018
|
end
|
|
1016
1019
|
|
|
1017
|
-
def relocate_member_to_worktree(member, worktree_root)
|
|
1020
|
+
def relocate_member_to_worktree(member, worktree_root, source_root: member.root)
|
|
1018
1021
|
relocate = lambda do |path|
|
|
1019
1022
|
next unless path
|
|
1020
1023
|
|
|
1021
|
-
relative = Pathname.new(path).relative_path_from(Pathname.new(
|
|
1024
|
+
relative = Pathname.new(path).relative_path_from(Pathname.new(source_root))
|
|
1022
1025
|
File.join(worktree_root, relative)
|
|
1023
1026
|
end
|
|
1024
1027
|
member.dup.tap do |worktree_member|
|
|
1025
|
-
worktree_member.root =
|
|
1028
|
+
worktree_member.root = relocate.call(member.root)
|
|
1026
1029
|
worktree_member.gemspec_path = relocate.call(member.gemspec_path)
|
|
1027
1030
|
worktree_member.version_file = relocate.call(member.version_file)
|
|
1028
1031
|
end
|
|
@@ -1443,6 +1446,8 @@ module Kettle
|
|
|
1443
1446
|
end
|
|
1444
1447
|
|
|
1445
1448
|
def parallel_release_member_results(release_members, initial_results)
|
|
1449
|
+
return parallel_monorepo_release_member_results(release_members, initial_results) if monorepo_release_workers?
|
|
1450
|
+
|
|
1446
1451
|
results = initial_results.dup
|
|
1447
1452
|
waves = release_waves(release_members)
|
|
1448
1453
|
completed_members = []
|
|
@@ -1502,6 +1507,248 @@ module Kettle
|
|
|
1502
1507
|
ordered_results.compact
|
|
1503
1508
|
end
|
|
1504
1509
|
|
|
1510
|
+
def parallel_monorepo_release_member_results(release_members, initial_results)
|
|
1511
|
+
results = initial_results.dup
|
|
1512
|
+
completed_members = []
|
|
1513
|
+
@release_completed_member_names = []
|
|
1514
|
+
release_progress = start_release_progress(release_members)
|
|
1515
|
+
@release_progress = release_progress
|
|
1516
|
+
begin
|
|
1517
|
+
release_waves(release_members).each_with_index do |wave, index|
|
|
1518
|
+
results << release_wave_result(wave, index: index, total: release_waves(release_members).length)
|
|
1519
|
+
aggregate_members, independent_members = wave.partition { |member| aggregate_release_member?(member) }
|
|
1520
|
+
|
|
1521
|
+
unless aggregate_members.empty?
|
|
1522
|
+
worker_results = run_monorepo_release_wave(aggregate_members)
|
|
1523
|
+
results.concat(worker_results.flatten)
|
|
1524
|
+
break unless worker_results.all? { |member_results| member_results.all?(&:ok?) }
|
|
1525
|
+
|
|
1526
|
+
finalization_results = finalize_monorepo_release_wave(aggregate_members)
|
|
1527
|
+
results.concat(finalization_results)
|
|
1528
|
+
break unless finalization_results.all?(&:ok?)
|
|
1529
|
+
end
|
|
1530
|
+
|
|
1531
|
+
independent_members.each do |member|
|
|
1532
|
+
results.concat(release_results_for_member(member, runner: release_command_runner))
|
|
1533
|
+
break unless results.last.ok?
|
|
1534
|
+
end
|
|
1535
|
+
break unless results.last&.ok?
|
|
1536
|
+
|
|
1537
|
+
completed_members.concat(wave)
|
|
1538
|
+
@release_completed_member_names.concat(wave.map(&:name))
|
|
1539
|
+
remaining_members = release_members - completed_members
|
|
1540
|
+
append_dependency_floor_results(released_members: wave, dependent_members: remaining_members, runner: release_command_runner, memo: results)
|
|
1541
|
+
break unless results.last&.ok?
|
|
1542
|
+
end
|
|
1543
|
+
ensure
|
|
1544
|
+
emit_release_progress_summary(results, progress: release_progress)
|
|
1545
|
+
@release_progress = nil
|
|
1546
|
+
end
|
|
1547
|
+
results
|
|
1548
|
+
end
|
|
1549
|
+
|
|
1550
|
+
def run_monorepo_release_wave(members)
|
|
1551
|
+
entries, setup_results = monorepo_release_worktree_entries(members)
|
|
1552
|
+
unless setup_results.all?(&:ok?)
|
|
1553
|
+
return setup_results.zip
|
|
1554
|
+
end
|
|
1555
|
+
|
|
1556
|
+
worker_results = run_monorepo_release_worktree_entries(entries)
|
|
1557
|
+
materialization_results = materialize_monorepo_release_artifacts(entries, worker_results)
|
|
1558
|
+
worker_results.each_with_index.map do |member_results, index|
|
|
1559
|
+
artifact_result = materialization_results[index]
|
|
1560
|
+
artifact_result ? [*member_results, artifact_result] : member_results
|
|
1561
|
+
end
|
|
1562
|
+
ensure
|
|
1563
|
+
cleanup_monorepo_release_worktrees(entries || [])
|
|
1564
|
+
end
|
|
1565
|
+
|
|
1566
|
+
def monorepo_release_worktree_entries(members)
|
|
1567
|
+
runner = command_runner
|
|
1568
|
+
control_member = monorepo_release_control_member
|
|
1569
|
+
entries = []
|
|
1570
|
+
results = []
|
|
1571
|
+
members.each do |member|
|
|
1572
|
+
root = monorepo_release_worktree_path(member)
|
|
1573
|
+
result = runner.call(
|
|
1574
|
+
member: control_member,
|
|
1575
|
+
phase: "release_worktree_add",
|
|
1576
|
+
command: ["git", "worktree", "add", "--detach", root, "HEAD"]
|
|
1577
|
+
)
|
|
1578
|
+
results << result
|
|
1579
|
+
break unless result.ok?
|
|
1580
|
+
|
|
1581
|
+
entries << {member: relocate_member_to_worktree(member, root, source_root: config.root), original_member: member, worktree_root: root}
|
|
1582
|
+
end
|
|
1583
|
+
[entries, results]
|
|
1584
|
+
end
|
|
1585
|
+
|
|
1586
|
+
def monorepo_release_worktree_path(member)
|
|
1587
|
+
safe_member = member.name.to_s.gsub(/[^A-Za-z0-9_.-]+/, "_")
|
|
1588
|
+
File.join(config.root, "tmp", "kettle-family", "release-worktrees", safe_member, "#{Process.pid}-#{Time.now.to_i}")
|
|
1589
|
+
end
|
|
1590
|
+
|
|
1591
|
+
def monorepo_release_control_member
|
|
1592
|
+
family_member.dup.tap { |member| member.root = config.root }
|
|
1593
|
+
end
|
|
1594
|
+
|
|
1595
|
+
def run_monorepo_release_worktree_entries(entries)
|
|
1596
|
+
queue = Queue.new
|
|
1597
|
+
entries.each_with_index { |entry, index| queue << [index, entry] }
|
|
1598
|
+
ordered_results = Array.new(entries.length)
|
|
1599
|
+
mutex = Mutex.new
|
|
1600
|
+
stop = false
|
|
1601
|
+
Array.new(release_jobs(entries)) do
|
|
1602
|
+
Thread.new do # rubocop:disable ThreadSafety/NewThread -- each member has an isolated detached monorepo worktree.
|
|
1603
|
+
loop do
|
|
1604
|
+
break if mutex.synchronize { stop }
|
|
1605
|
+
|
|
1606
|
+
index, entry = queue.pop(true)
|
|
1607
|
+
member_results = release_results_for_monorepo_worktree(entry)
|
|
1608
|
+
mutex.synchronize do
|
|
1609
|
+
ordered_results[index] = member_results
|
|
1610
|
+
stop = true unless member_results.all?(&:ok?)
|
|
1611
|
+
end
|
|
1612
|
+
rescue ThreadError
|
|
1613
|
+
break
|
|
1614
|
+
rescue => error
|
|
1615
|
+
mutex.synchronize do
|
|
1616
|
+
ordered_results[index] = [release_worker_error_result(entry.fetch(:original_member), error)]
|
|
1617
|
+
stop = true
|
|
1618
|
+
end
|
|
1619
|
+
break
|
|
1620
|
+
end
|
|
1621
|
+
end
|
|
1622
|
+
end.each(&:join)
|
|
1623
|
+
ordered_results.compact
|
|
1624
|
+
end
|
|
1625
|
+
|
|
1626
|
+
def release_results_for_monorepo_worktree(entry)
|
|
1627
|
+
member = entry.fetch(:member)
|
|
1628
|
+
original_member = entry.fetch(:original_member)
|
|
1629
|
+
progress = @release_progress
|
|
1630
|
+
progress&.start_member(original_member, total: release_phase_total(original_member), status: "check")
|
|
1631
|
+
[].tap do |memo|
|
|
1632
|
+
if skip_already_released?(original_member)
|
|
1633
|
+
memo << already_released_result(original_member)
|
|
1634
|
+
emit_member_result_progress(original_member, memo.last, progress: progress)
|
|
1635
|
+
return memo
|
|
1636
|
+
end
|
|
1637
|
+
|
|
1638
|
+
append_release_internal_checks(member: member, memo: memo)
|
|
1639
|
+
memo.last(2).each { |result| emit_member_result_progress(original_member, result, progress: progress) }
|
|
1640
|
+
return memo unless memo.last(2).all?(&:ok?)
|
|
1641
|
+
|
|
1642
|
+
release_event_state = {}
|
|
1643
|
+
result = release_command_runner.call(
|
|
1644
|
+
member: member,
|
|
1645
|
+
phase: release_phase,
|
|
1646
|
+
command: release_command_for(member),
|
|
1647
|
+
env: release_env_for_member(member, family_root: entry.fetch(:worktree_root)).merge("KETTLE_RELEASE_FAMILY_MEMBER_PUBLISH" => "true"),
|
|
1648
|
+
interactive: release_command_interactive?,
|
|
1649
|
+
stdout_line_handler: release_event_line_handler(original_member, progress: progress, state: release_event_state),
|
|
1650
|
+
log_path: release_command_log_path(original_member, release_phase),
|
|
1651
|
+
passthrough_output: release_command_passthrough_output?
|
|
1652
|
+
)
|
|
1653
|
+
result.member_name = original_member.name
|
|
1654
|
+
result.resume_step = release_event_state[:failed_step] unless result.ok?
|
|
1655
|
+
memo << result
|
|
1656
|
+
emit_member_result_progress(original_member, result, progress: progress)
|
|
1657
|
+
ensure
|
|
1658
|
+
finished_result = memo.find { |result| result.phase == release_phase } || memo.last
|
|
1659
|
+
progress&.finish_member(original_member, success: memo.all?(&:ok?), status: release_member_finish_status(finished_result)) if finished_result
|
|
1660
|
+
end
|
|
1661
|
+
end
|
|
1662
|
+
|
|
1663
|
+
def materialize_monorepo_release_artifacts(entries, worker_results)
|
|
1664
|
+
entries.each_with_index.map do |entry, index|
|
|
1665
|
+
next unless worker_results[index]&.all?(&:ok?)
|
|
1666
|
+
|
|
1667
|
+
copy_monorepo_release_artifact(entry)
|
|
1668
|
+
end
|
|
1669
|
+
end
|
|
1670
|
+
|
|
1671
|
+
def copy_monorepo_release_artifact(entry)
|
|
1672
|
+
member = entry.fetch(:member)
|
|
1673
|
+
original_member = entry.fetch(:original_member)
|
|
1674
|
+
version = original_member.version.to_s
|
|
1675
|
+
source = Dir[File.join(member.root, "pkg", "#{original_member.name}-#{version}.gem")].first
|
|
1676
|
+
destination = File.join(original_member.root, "pkg", "#{original_member.name}-#{version}.gem")
|
|
1677
|
+
unless source && File.file?(source)
|
|
1678
|
+
return release_worker_error_result(original_member, Error.new("worker did not produce #{File.basename(destination)}"))
|
|
1679
|
+
end
|
|
1680
|
+
|
|
1681
|
+
FileUtils.mkdir_p(File.dirname(destination))
|
|
1682
|
+
FileUtils.cp(source, destination)
|
|
1683
|
+
CommandResult.new(
|
|
1684
|
+
member_name: original_member.name,
|
|
1685
|
+
phase: "release_artifact_materialize",
|
|
1686
|
+
command: ["internal", "copy-release-artifact"],
|
|
1687
|
+
workdir: original_member.root,
|
|
1688
|
+
status: 0,
|
|
1689
|
+
success: true,
|
|
1690
|
+
stdout: File.basename(destination),
|
|
1691
|
+
stderr: "",
|
|
1692
|
+
elapsed_seconds: 0.0,
|
|
1693
|
+
skipped: false,
|
|
1694
|
+
reason: "copied from isolated release worktree"
|
|
1695
|
+
)
|
|
1696
|
+
rescue => error
|
|
1697
|
+
release_worker_error_result(original_member, error)
|
|
1698
|
+
end
|
|
1699
|
+
|
|
1700
|
+
def cleanup_monorepo_release_worktrees(entries)
|
|
1701
|
+
runner = command_runner
|
|
1702
|
+
control_member = monorepo_release_control_member
|
|
1703
|
+
entries.each do |entry|
|
|
1704
|
+
root = entry.fetch(:worktree_root)
|
|
1705
|
+
next unless Dir.exist?(root)
|
|
1706
|
+
|
|
1707
|
+
runner.call(member: control_member, phase: "release_worktree_remove", command: ["git", "worktree", "remove", "--force", root])
|
|
1708
|
+
end
|
|
1709
|
+
end
|
|
1710
|
+
|
|
1711
|
+
def finalize_monorepo_release_wave(members)
|
|
1712
|
+
runner = release_command_runner
|
|
1713
|
+
results = []
|
|
1714
|
+
members.each do |member|
|
|
1715
|
+
results << ensure_monorepo_release_tag(member, runner: runner)
|
|
1716
|
+
break unless results.last.ok?
|
|
1717
|
+
|
|
1718
|
+
results << runner.call(
|
|
1719
|
+
member: member,
|
|
1720
|
+
phase: "release_finalize",
|
|
1721
|
+
command: release_command_for(member),
|
|
1722
|
+
env: release_env_for_member(member).merge("KETTLE_RELEASE_FAMILY_MEMBER_FINALIZE" => "true"),
|
|
1723
|
+
interactive: release_command_interactive?,
|
|
1724
|
+
stdout_line_handler: release_event_line_handler(member, progress: @release_progress, state: {}),
|
|
1725
|
+
log_path: release_command_log_path(member, "release_finalize"),
|
|
1726
|
+
passthrough_output: release_command_passthrough_output?
|
|
1727
|
+
)
|
|
1728
|
+
break unless results.last.ok?
|
|
1729
|
+
end
|
|
1730
|
+
return results unless results.all?(&:ok?)
|
|
1731
|
+
|
|
1732
|
+
results << runner.call(
|
|
1733
|
+
member: monorepo_release_control_member,
|
|
1734
|
+
phase: "release_shared_push",
|
|
1735
|
+
command: config.release_push_command
|
|
1736
|
+
)
|
|
1737
|
+
results
|
|
1738
|
+
end
|
|
1739
|
+
|
|
1740
|
+
def ensure_monorepo_release_tag(member, runner:)
|
|
1741
|
+
version = member.version.to_s
|
|
1742
|
+
tag = release_tag_name(version)
|
|
1743
|
+
escaped_tag = Shellwords.escape(tag)
|
|
1744
|
+
runner.call(
|
|
1745
|
+
member: monorepo_release_control_member,
|
|
1746
|
+
phase: "release_shared_tag",
|
|
1747
|
+
command: ["sh", "-lc", "git rev-parse -q --verify refs/tags/#{escaped_tag} >/dev/null || git tag -a #{escaped_tag} -m #{escaped_tag}"],
|
|
1748
|
+
env: release_env
|
|
1749
|
+
)
|
|
1750
|
+
end
|
|
1751
|
+
|
|
1505
1752
|
def release_wave_result(wave, index:, total:, jobs: nil)
|
|
1506
1753
|
CommandResult.new(
|
|
1507
1754
|
member_name: "wave #{index + 1}",
|
|
@@ -1626,7 +1873,19 @@ module Kettle
|
|
|
1626
1873
|
execute &&
|
|
1627
1874
|
release_jobs(release_members) > 1 &&
|
|
1628
1875
|
release_members.length > 1 &&
|
|
1629
|
-
distinct_git_roots?(release_members)
|
|
1876
|
+
(distinct_git_roots?(release_members) || monorepo_release_workers?)
|
|
1877
|
+
end
|
|
1878
|
+
|
|
1879
|
+
# Aggregate monorepo members share one Git checkout, so their complete
|
|
1880
|
+
# kettle-release workflows cannot safely run concurrently. They are
|
|
1881
|
+
# instead published from disposable worktrees using the explicit
|
|
1882
|
+
# member-only contract, then finalized serially in the primary checkout.
|
|
1883
|
+
def monorepo_release_workers?
|
|
1884
|
+
execute &&
|
|
1885
|
+
publish &&
|
|
1886
|
+
config.configured_monorepo_release? &&
|
|
1887
|
+
aggregate_monorepo_github_release? &&
|
|
1888
|
+
kettle_release_command?(raw_release_command)
|
|
1630
1889
|
end
|
|
1631
1890
|
|
|
1632
1891
|
def release_jobs(release_members)
|
|
@@ -2680,10 +2939,10 @@ module Kettle
|
|
|
2680
2939
|
# A monorepo member runs kettle-release from its own checkout, while its
|
|
2681
2940
|
# changelog may live at the family root. Pass the shared paths to the
|
|
2682
2941
|
# member release phase as well as to the separate family phase.
|
|
2683
|
-
def release_env_for_member(member)
|
|
2942
|
+
def release_env_for_member(member, family_root: config.root)
|
|
2684
2943
|
env = release_env
|
|
2685
|
-
env.merge!(release_wave_local_path_env_for(member))
|
|
2686
|
-
env.merge!(release_local_path_policy_env)
|
|
2944
|
+
env.merge!(release_wave_local_path_env_for(member, family_root: family_root))
|
|
2945
|
+
env.merge!(release_local_path_policy_env(family_root: family_root))
|
|
2687
2946
|
# Family release performs one live pin review before member releases.
|
|
2688
2947
|
# Child kettle-release must consume that reviewed cache instead of
|
|
2689
2948
|
# repeating the GitHub API lookup for every member.
|
|
@@ -2703,7 +2962,7 @@ module Kettle
|
|
|
2703
2962
|
if config.family_mode == "monorepo"
|
|
2704
2963
|
# Monorepo members release from subdirectories, while CI workflows
|
|
2705
2964
|
# live at the shared repository root.
|
|
2706
|
-
env["K_RELEASE_CI_ROOT"] =
|
|
2965
|
+
env["K_RELEASE_CI_ROOT"] = family_root
|
|
2707
2966
|
env["K_RELEASE_CI_WORKFLOWS"] ||= "current.yml"
|
|
2708
2967
|
# Explicit multi-gem monorepos publish one aggregate GitHub Release
|
|
2709
2968
|
# after their member gems. A standalone gem uses the default
|
|
@@ -2763,13 +3022,13 @@ module Kettle
|
|
|
2763
3022
|
# release for the next member. Dependencies outside the selected set are
|
|
2764
3023
|
# already treated as registry dependencies; this is what makes resume
|
|
2765
3024
|
# runs work after an earlier wave has been published.
|
|
2766
|
-
def release_wave_local_path_env_for(member)
|
|
3025
|
+
def release_wave_local_path_env_for(member, family_root: config.root)
|
|
2767
3026
|
# Monorepo members and their sibling dependencies share the same CI
|
|
2768
3027
|
# checkout, so their canonical development lockfile may keep those
|
|
2769
3028
|
# paths throughout every release wave.
|
|
2770
3029
|
if config.configured_monorepo_release?
|
|
2771
3030
|
env_name = config.family_local_path_env_name
|
|
2772
|
-
return env_name ? {env_name =>
|
|
3031
|
+
return env_name ? {env_name => family_local_path_root_for(family_root)} : {}
|
|
2773
3032
|
end
|
|
2774
3033
|
|
|
2775
3034
|
return {} unless config.release_local_path_strategy == "waves"
|
|
@@ -4430,14 +4689,28 @@ module Kettle
|
|
|
4430
4689
|
config.release_allowed_local_path_roots
|
|
4431
4690
|
end
|
|
4432
4691
|
|
|
4692
|
+
def family_local_path_root_for(family_root)
|
|
4693
|
+
return config.family_local_path_root if File.expand_path(family_root) == File.expand_path(config.root)
|
|
4694
|
+
|
|
4695
|
+
relative = Pathname.new(config.family_local_path_root).relative_path_from(Pathname.new(config.root))
|
|
4696
|
+
File.expand_path(relative, family_root)
|
|
4697
|
+
end
|
|
4698
|
+
|
|
4433
4699
|
def release_allowed_local_path_env_names
|
|
4434
4700
|
names = config.release_allowed_local_path_env_names
|
|
4435
4701
|
names << "K_JEM_TEMPLATING" if preserve_monorepo_template_context?
|
|
4436
4702
|
names.uniq
|
|
4437
4703
|
end
|
|
4438
4704
|
|
|
4439
|
-
def release_local_path_policy_env
|
|
4440
|
-
roots = release_allowed_local_path_roots
|
|
4705
|
+
def release_local_path_policy_env(family_root: config.root)
|
|
4706
|
+
roots = release_allowed_local_path_roots.map do |root|
|
|
4707
|
+
if File.expand_path(family_root) == File.expand_path(config.root)
|
|
4708
|
+
root
|
|
4709
|
+
else
|
|
4710
|
+
relative = Pathname.new(root).relative_path_from(Pathname.new(config.root))
|
|
4711
|
+
File.expand_path(relative, family_root)
|
|
4712
|
+
end
|
|
4713
|
+
end
|
|
4441
4714
|
env_names = release_allowed_local_path_env_names
|
|
4442
4715
|
return {} if roots.empty? && env_names.empty?
|
|
4443
4716
|
|
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.84
|
|
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.
|
|
94
|
+
version: 3.0.30
|
|
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.
|
|
104
|
+
version: 3.0.30
|
|
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.
|
|
445
|
-
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.
|
|
444
|
+
source_code_uri: https://github.com/kettle-dev/kettle-family/tree/v1.2.84
|
|
445
|
+
changelog_uri: https://github.com/kettle-dev/kettle-family/blob/v1.2.84/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.
|
|
447
|
+
documentation_uri: https://www.rubydoc.info/gems/kettle-family/1.2.84
|
|
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
|