diff --git a/hgext/narrow/narrowbundle2.py b/hgext/narrow/narrowbundle2.py --- a/hgext/narrow/narrowbundle2.py +++ b/hgext/narrow/narrowbundle2.py @@ -19,6 +19,7 @@ from mercurial import ( repair, requirements, scmutil, + transaction, util, wireprototypes, ) @@ -293,7 +294,7 @@ def handlechangegroup_widen(op, inpart): finally: f.close() - repair.cleanup_undo_files(repo) + transaction.cleanup_undo_files(repo) # Remove partial backup only if there were no exceptions op._widen_uninterr.__exit__(None, None, None) diff --git a/mercurial/repair.py b/mercurial/repair.py --- a/mercurial/repair.py +++ b/mercurial/repair.py @@ -7,8 +7,6 @@ # GNU General Public License version 2 or any later version. -import errno - from .i18n import _ from .node import ( hex, @@ -31,7 +29,6 @@ from . import ( ) from .utils import ( hashutil, - stringutil, urlutil, ) @@ -114,43 +111,6 @@ def _collectbrokencsets(repo, files, str return s -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 = transaction.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 strip(ui, repo, nodelist, backup=True, topic=b'backup'): # This function requires the caller to lock the repo, but it operates # within a transaction of its own, and thus requires there to be no current @@ -299,7 +259,7 @@ def strip(ui, repo, nodelist, backup=Tru bmchanges = [(m, repo[newbmtarget].node()) for m in updatebm] repo._bookmarks.applychanges(repo, tr, bmchanges) - cleanup_undo_files(repo) + transaction.cleanup_undo_files(repo) except: # re-raises if backupfile: diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -20,10 +20,10 @@ from . import ( narrowspec, phases, pycompat, - repair, requirements as requirementsmod, scmutil, store, + transaction, util, ) from .revlogutils import ( @@ -932,4 +932,4 @@ def local_copy(src_repo, dest_repo): dest_repo.store.write(tr) # clean up transaction file as they do not make sense - repair.cleanup_undo_files(dest_repo) + transaction.cleanup_undo_files(dest_repo) diff --git a/mercurial/transaction.py b/mercurial/transaction.py --- a/mercurial/transaction.py +++ b/mercurial/transaction.py @@ -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 @@ def active(func): 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,