Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions percona_obs/cmd_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -2604,10 +2604,13 @@ def _merge_release_obs_data(parts: "list[_ReleaseObsData]") -> _ReleaseObsData:
"""Union per-instance CHANGELOG inputs.

A key's source value comes from the first part that has it; its release
value comes from that SAME part, so an instance's source is never diffed
against another instance's (possibly stale) release copy. Keys no part
has on the source side (removal candidates) take the first part's release
value that has them. Instances hold disjoint slices of a release, so an
value comes from that same part when it has one (so a stale copy elsewhere
never shadows the owner's), otherwise from the first part that has it: the
previous release of a slice may live on another instance (labs holds
staging for the UBI slice while the previous release was cut from
build.opensuse.org). Keys no part has on the source side (removal
candidates) take the first part's release value that has them. Instances
hold disjoint slices of a release, so an
image present on two instances is the same image and is not an error
(unlike the within-instance ``_merge_container_pkgs`` check).
``release_versions`` stays ``None`` only when no instance has the release
Expand All @@ -2627,8 +2630,7 @@ def _paired(
merged_rel: dict[str, Any] = {}
for rel in releases:
for k, v in (rel or {}).items():
if k not in owner:
merged_rel.setdefault(k, v)
merged_rel.setdefault(k, v)
for k, i in owner.items():
owner_rel = releases[i]
if owner_rel is not None and k in owner_rel:
Expand Down
18 changes: 14 additions & 4 deletions tests/test_project_release.py
Original file line number Diff line number Diff line change
Expand Up @@ -1387,13 +1387,23 @@ def test_merge_release_obs_data_pairs_release_with_source_instance(tmp_path):
assert "h3 (extras)" not in section


def test_merge_release_obs_data_source_owner_without_release_entry():
# The owning instance has no release entry: the key is new there, the
# other instance's stale release copy is not borrowed.
def test_merge_release_obs_data_source_owner_falls_back_to_other_instance():
# The owning instance has no release entry: the previous release lives on
# another instance, so its value is used.
boo = _obs_data(source_versions={}, release_versions={"h3 (extras)": "4.4.0-1"})
labs = _obs_data(source_versions={"h3 (extras)": "4.5.0-1"}, release_versions={})
merged = cmd_project._merge_release_obs_data([boo, labs])
assert merged.release_versions == {}
assert merged.release_versions == {"h3 (extras)": "4.4.0-1"}


def test_merge_release_obs_data_fallback_yields_update_line(tmp_path):
boo = _obs_data(source_versions={}, release_versions={"h3 (extras)": "4.4.0-1"})
labs = _obs_data(source_versions={"h3 (extras)": "4.5.0-1"}, release_versions=None)
merged = cmd_project._merge_release_obs_data([boo, labs])
section = cmd_project._build_changelog_section(
"17.11-2", merged.source_versions, merged.release_versions, tmp_path
)
assert "- h3 (extras): update upstream version 4.5.0" in section


def test_merge_release_obs_data_removal_candidate_first_wins():
Expand Down
Loading