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
6 changes: 5 additions & 1 deletion percona_obs/obs_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -1966,6 +1966,10 @@ def _remove_release_targets(
) -> None:
"""Remove <releasetarget> entries added by _add_release_targets.

Also drops targets in the ``deleted`` project: OBS rewrites references to
a force-deleted project that way, so a leftover target whose release
project was since deleted (e.g. a recreated pre-release) would make
``osc release`` fail with "no permission to write in project deleted".
Safe to call when no releasetargets are present (no-op).
Never raises — errors are printed as warnings so the caller's
finally-block does not mask the primary exception.
Expand All @@ -1979,7 +1983,7 @@ def _remove_release_targets(
removed = 0
for repo_elem in root.findall("repository"):
for rt in repo_elem.findall("releasetarget"):
if rt.get("project") == release_obs_project:
if rt.get("project") in (release_obs_project, "deleted"):
repo_elem.remove(rt)
removed += 1

Expand Down
24 changes: 24 additions & 0 deletions tests/test_obs_api_markers.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,3 +130,27 @@ def test_single_marker_is_appended_last(monkeypatch):
desc = ET.fromstring(pushed["meta"]).findtext("description")
assert desc.splitlines()[-1] == "release_id: 17.11-2"
assert "source_commit: old" in desc


def test_remove_release_targets_drops_deleted_project_targets(monkeypatch):
"""OBS rewrites targets of a force-deleted project to project="deleted";
those can never be released into and are removed with ours."""
meta = (
'<project name="S"><title>t</title><description/>'
'<repository name="r">'
'<releasetarget project="deleted" repository="deleted" trigger="manual"/>'
'<releasetarget project="PR:rel" repository="r" trigger="manual"/>'
'<releasetarget project="other" repository="r" trigger="manual"/>'
"</repository></project>"
)
pushed = {}
monkeypatch.setattr(obs_api.osc.core, "show_project_meta", lambda a, p: meta)
monkeypatch.setattr(
obs_api,
"_edit_project_meta",
lambda a, p, meta, force: pushed.setdefault("meta", meta) and False,
)
obs_api._remove_release_targets("http://obs", "S", "PR:rel")
assert 'project="deleted"' not in pushed["meta"]
assert 'project="PR:rel"' not in pushed["meta"]
assert 'project="other"' in pushed["meta"]
Loading