Mercurial > public > mercurial-scm > hg-stable
diff mercurial/upgrade_utils/engine.py @ 48339:6e4999cb085e stable
dirstate-v2: fix upgrade on an empty repository
This used to crash as the dirstate file does not exist in this case.
Differential Revision: https://phab.mercurial-scm.org/D11866
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 06 Dec 2021 10:08:04 +0100 |
parents | bf8837e3d7ce |
children | 5ba24e886cec |
line wrap: on
line diff
--- 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)