diff -r b35fb0e5b8d6 -r 81870c92c293 mercurial/localrepo.py --- a/mercurial/localrepo.py Wed Feb 15 23:39:10 2023 +0100 +++ b/mercurial/localrepo.py Thu Feb 16 00:26:24 2023 +0100 @@ -2709,6 +2709,8 @@ @unfilteredmethod # Until we get smarter cache management def _rollback(self, dryrun, force, dsguard): ui = self.ui + + parents = self.dirstate.parents() try: args = self.vfs.read(b'undo.desc').splitlines() (oldlen, desc, detail) = (int(args[0]), args[1], None) @@ -2725,9 +2727,11 @@ msg = _( b'repository tip rolled back to revision %d (undo %s)\n' ) % (oldtip, desc) + parentgone = any(self[p].rev() > oldtip for p in parents) except IOError: msg = _(b'rolling back unknown transaction\n') desc = None + parentgone = True if not force and self[b'.'] != self[b'tip'] and desc == b'commit': raise error.Abort( @@ -2742,7 +2746,6 @@ if dryrun: return 0 - parents = self.dirstate.parents() self.destroying() vfsmap = {b'plain': self.vfs, b'': self.svfs} transaction.rollback( @@ -2757,8 +2760,6 @@ self.svfs.rename(b'undo.phaseroots', b'phaseroots', checkambig=True) self.invalidate() - has_node = self.changelog.index.has_node - parentgone = any(not has_node(p) for p in parents) if parentgone: # prevent dirstateguard from overwriting already restored one dsguard.close()