From 789666effaa54ca9c2636ff71084a51ab5265f5c Mon Sep 17 00:00:00 2001 From: Herbert Damker <52109189+hdamker@users.noreply.github.com> Date: Fri, 23 Oct 2026 22:37:50 +0200 Subject: [PATCH] fix(ra): treat a missing ref as absent when deleting a branch GitHub answers a DELETE on a nonexistent ref with 422 "Reference does not exist", not 404. The first discard of a snapshot id therefore failed to rename the review branch to -preserved. --- release_automation/scripts/github_client.py | 3 ++- release_automation/tests/test_github_client.py | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/release_automation/scripts/github_client.py b/release_automation/scripts/github_client.py index d330666..a5b7d99 100644 --- a/release_automation/scripts/github_client.py +++ b/release_automation/scripts/github_client.py @@ -1173,7 +1173,8 @@ def delete_branch(self, branch_name: str) -> bool: return True except GitHubClientError as e: error_msg = str(e).lower() - if "404" in error_msg or "not found" in error_msg: + # A DELETE on a missing ref answers 422 "Reference does not exist", not 404 + if "404" in error_msg or "not found" in error_msg or "reference does not exist" in error_msg: return False raise diff --git a/release_automation/tests/test_github_client.py b/release_automation/tests/test_github_client.py index 7f1a524..5a16b6b 100644 --- a/release_automation/tests/test_github_client.py +++ b/release_automation/tests/test_github_client.py @@ -69,6 +69,22 @@ def test_list_branches(self, mock_run_gh): self.assertEqual(branches[1].name, "branch2") self.assertEqual(branches[1].sha, "sha2") + @patch("release_automation.scripts.github_client.GitHubClient._run_gh") + def test_delete_branch(self, mock_run_gh): + mock_run_gh.return_value = "" + self.assertTrue(self.client.delete_branch("feature")) + + # GitHub answers a DELETE on a missing ref with 422, not 404 + mock_run_gh.side_effect = GitHubClientError("gh: Reference does not exist (HTTP 422)") + self.assertFalse(self.client.delete_branch("missing")) + + mock_run_gh.side_effect = GitHubClientError("gh: Not Found (HTTP 404)") + self.assertFalse(self.client.delete_branch("missing")) + + mock_run_gh.side_effect = GitHubClientError("gh: Resource not accessible by integration (HTTP 403)") + with self.assertRaises(GitHubClientError): + self.client.delete_branch("protected") + @patch("release_automation.scripts.github_client.GitHubClient._run_gh") def test_get_file_content(self, mock_run_gh): mock_run_gh.return_value = "file content"