diff --git a/scmrepo/git/backend/pygit2.py b/scmrepo/git/backend/pygit2.py index 063d32ea..e07b11ce 100644 --- a/scmrepo/git/backend/pygit2.py +++ b/scmrepo/git/backend/pygit2.py @@ -369,8 +369,8 @@ def get_ref(self, name, follow: bool = True) -> Optional[str]: def remove_ref(self, name: str, old_ref: Optional[str] = None): ref = self.repo.references.get(name) - if not ref: - raise SCMError(f"Ref '{name}' does not exist") + if not ref and not old_ref: + return if old_ref and old_ref != str(ref.target): raise SCMError(f"Failed to remove '{name}'") ref.delete() diff --git a/tests/test_git.py b/tests/test_git.py index 0c0014bc..bf51bb03 100644 --- a/tests/test_git.py +++ b/tests/test_git.py @@ -295,6 +295,9 @@ def test_remove_ref(tmp_dir: TmpDir, scm: Git, git: Git): scm.add_commit("file", message="init") init_rev = scm.get_rev() + # remove nonexistent ref should silently pass when old_ref is None) + git.remove_ref("refs/foo/bar", old_ref=None) + tmp_dir.gen(os.path.join(".git", "refs", "foo", "bar"), init_rev) tmp_dir.gen({"file": "1"}) scm.add_commit("file", message="commit")