mercurial/transaction.py
branchstable
changeset 50299 3d0b5760851c
parent 50297 a43f0562220c
child 50300 7ce9862fca7c
--- a/mercurial/transaction.py	Mon Mar 06 19:39:35 2023 +0100
+++ b/mercurial/transaction.py	Mon Mar 06 21:03:45 2023 +0100
@@ -11,6 +11,7 @@
 # This software may be used and distributed according to the terms of the
 # GNU General Public License version 2 or any later version.
 
+import errno
 import os
 
 from .i18n import _
@@ -39,6 +40,43 @@
     return _active
 
 
+UNDO_BACKUP = b'undo.backupfiles'
+
+
+def cleanup_undo_files(repo):
+    """remove "undo" files used by the rollback logic
+
+    This is useful to prevent rollback running in situation were it does not
+    make sense. For example after a strip.
+    """
+    backup_entries = []
+    undo_files = []
+    vfsmap = repo.vfs_map
+    try:
+        with repo.svfs(UNDO_BACKUP) as f:
+            backup_entries = read_backup_files(repo.ui.warn, f)
+    except OSError as e:
+        if e.errno != errno.ENOENT:
+            msg = _(b'could not read %s: %s\n')
+            msg %= (repo.svfs.join(UNDO_BACKUP), stringutil.forcebytestr(e))
+            repo.ui.warn(msg)
+
+    for location, f, backup_path, c in backup_entries:
+        if location in vfsmap and backup_path:
+            undo_files.append((vfsmap[location], backup_path))
+
+    undo_files.append((repo.svfs, UNDO_BACKUP))
+    undo_files.extend(repo.undofiles())
+    for undovfs, undofile in undo_files:
+        try:
+            undovfs.unlink(undofile)
+        except OSError as e:
+            if e.errno != errno.ENOENT:
+                msg = _(b'error removing %s: %s\n')
+                msg %= (undovfs.join(undofile), stringutil.forcebytestr(e))
+                repo.ui.warn(msg)
+
+
 def _playback(
     journal,
     report,