summaryrefslogtreecommitdiff
path: root/zuul/merger/merger.py
diff options
context:
space:
mode:
Diffstat (limited to 'zuul/merger/merger.py')
-rw-r--r--zuul/merger/merger.py28
1 files changed, 27 insertions, 1 deletions
diff --git a/zuul/merger/merger.py b/zuul/merger/merger.py
index 1e2de27b8..e4688a1b7 100644
--- a/zuul/merger/merger.py
+++ b/zuul/merger/merger.py
@@ -333,6 +333,26 @@ class Repo(object):
os.rmdir(root)
@staticmethod
+ def _cleanup_leaked_rebase_dirs(local_path, log, messages):
+ for rebase_dir in [".git/rebase-merge", ".git/rebase-apply"]:
+ leaked_dir = os.path.join(local_path, rebase_dir)
+ if not os.path.exists(leaked_dir):
+ continue
+ if log:
+ log.debug("Cleaning leaked %s dir", leaked_dir)
+ else:
+ messages.append(
+ f"Cleaning leaked {leaked_dir} dir")
+ try:
+ shutil.rmtree(leaked_dir)
+ except Exception as exc:
+ msg = f"Failed to remove leaked {leaked_dir} dir:"
+ if log:
+ log.exception(msg)
+ else:
+ messages.append(f"{msg}\n{exc}")
+
+ @staticmethod
def refNameToZuulRef(ref_name: str) -> str:
return "refs/zuul/{}".format(
hashlib.sha1(ref_name.encode("utf-8")).hexdigest()
@@ -384,6 +404,8 @@ class Repo(object):
messages.append("Delete stale Zuul ref {}".format(ref))
Repo._deleteRef(ref.path, repo)
+ Repo._cleanup_leaked_rebase_dirs(local_path, log, messages)
+
# Note: Before git 2.13 deleting a a ref foo/bar leaves an empty
# directory foo behind that will block creating the reference foo
# in the future. As a workaround we must clean up empty directories
@@ -615,7 +637,11 @@ class Repo(object):
self.fetch(ref, zuul_event_id=zuul_event_id)
log.debug("Rebasing %s with args %s", ref, args)
repo.git.checkout('FETCH_HEAD')
- repo.git.rebase(*args)
+ try:
+ repo.git.rebase(*args)
+ except Exception:
+ repo.git.rebase(abort=True)
+ raise
return repo.head.commit
def fetch(self, ref, zuul_event_id=None):