From a72f17a204b9db11e830d2c9d26959e629096f1b Mon Sep 17 00:00:00 2001 From: Serhii Ilin Date: Fri, 7 Feb 2025 14:01:15 +0200 Subject: [PATCH] fix(branch removal(closing)): added check to avoid deleting(closing) landing branches during PR merge with delete source branch option enabled. --- rhodecode/lib/vcs/backends/git/repository.py | 9 ++++++++- rhodecode/lib/vcs/backends/hg/repository.py | 8 +++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rhodecode/lib/vcs/backends/git/repository.py b/rhodecode/lib/vcs/backends/git/repository.py index 19efa3c7..0eb337c9 100644 --- a/rhodecode/lib/vcs/backends/git/repository.py +++ b/rhodecode/lib/vcs/backends/git/repository.py @@ -965,6 +965,7 @@ class GitRepository(BaseRepository): log.debug( "Executing merge_repo with %s strategy, dry_run mode:%s", "rebase" if use_rebase else "merge", dry_run ) + from rhodecode.model.repo import RepoModel if target_ref.commit_id != self.branches[target_ref.name]: log.warning( @@ -1056,7 +1057,13 @@ class GitRepository(BaseRepository): rc_scm_data=self.config.get("rhodecode", "RC_SCM_DATA"), ) merge_succeeded = True - if close_branch and source_ref.name != target_ref.name and not dry_run and source_ref.type == "branch": + if ( + close_branch + and RepoModel().get_repo(repo_id).landing_ref_name != source_ref.name + and source_ref.name != target_ref.name + and not dry_run + and source_ref.type == "branch" + ): self.delete_branch(source_ref.name) except RepositoryError: log.exception( diff --git a/rhodecode/lib/vcs/backends/hg/repository.py b/rhodecode/lib/vcs/backends/hg/repository.py index e945eb46..3adc80b7 100644 --- a/rhodecode/lib/vcs/backends/hg/repository.py +++ b/rhodecode/lib/vcs/backends/hg/repository.py @@ -813,6 +813,7 @@ class MercurialRepository(BaseRepository): log.debug( "Executing merge_repo with %s strategy, dry_run mode:%s", "rebase" if use_rebase else "merge", dry_run ) + from rhodecode.model.repo import RepoModel if target_ref.commit_id not in self._heads(): return MergeResponse( @@ -868,7 +869,12 @@ class MercurialRepository(BaseRepository): close_branch = close_branch and source_ref.name != target_ref.name needs_push_on_close = False - if close_branch and not use_rebase and not dry_run: + if ( + close_branch + and RepoModel().get_repo(repo_id).landing_ref_name != source_ref.name + and not use_rebase + and not dry_run + ): try: close_commit_id, needs_push_on_close = shadow_repo._local_close( target_ref, merger_name, merger_email, source_ref