--- a/mercurial/upgrade_utils/engine.py Mon Dec 06 10:52:40 2021 +0100
+++ b/mercurial/upgrade_utils/engine.py Mon Dec 06 10:08:04 2021 +0100
@@ -7,6 +7,7 @@
from __future__ import absolute_import
+import errno
import stat
from ..i18n import _
@@ -633,16 +634,29 @@
util.copyfile(
srcrepo.vfs.join(b'requires'), backupvfs.join(b'requires')
)
- util.copyfile(
- srcrepo.vfs.join(b'dirstate'), backupvfs.join(b'dirstate')
- )
+ try:
+ util.copyfile(
+ srcrepo.vfs.join(b'dirstate'), backupvfs.join(b'dirstate')
+ )
+ except (IOError, OSError) as e:
+ # The dirstate does not exist on an empty repo or a repo with no
+ # revision checked out
+ if e.errno != errno.ENOENT:
+ raise
assert srcrepo.dirstate._use_dirstate_v2 == (old == b'v2')
srcrepo.dirstate._map.preload()
srcrepo.dirstate._use_dirstate_v2 = new == b'v2'
srcrepo.dirstate._map._use_dirstate_v2 = srcrepo.dirstate._use_dirstate_v2
srcrepo.dirstate._dirty = True
- srcrepo.vfs.unlink(b'dirstate')
+ try:
+ srcrepo.vfs.unlink(b'dirstate')
+ except (IOError, OSError) as e:
+ # The dirstate does not exist on an empty repo or a repo with no
+ # revision checked out
+ if e.errno != errno.ENOENT:
+ raise
+
srcrepo.dirstate.write(None)
scmutil.writereporequirements(srcrepo, upgrade_op.new_requirements)