diff --git a/mercurial/revlogutils/nodemap.py b/mercurial/revlogutils/nodemap.py --- a/mercurial/revlogutils/nodemap.py +++ b/mercurial/revlogutils/nodemap.py @@ -128,6 +128,14 @@ notr._postclose[k](None) +def delete_nodemap(tr, repo, revlog): + """ Delete nodemap data on disk for a given revlog""" + if revlog.nodemap_file is None: + msg = "calling persist nodemap on a revlog without the feature enabled" + raise error.ProgrammingError(msg) + repo.svfs.unlink(revlog.nodemap_file) + + def persist_nodemap(tr, revlog, pending=False, force=False): """Write nodemap data on disk for a given revlog""" if getattr(revlog, 'filteredrevs', ()): diff --git a/mercurial/upgrade_utils/engine.py b/mercurial/upgrade_utils/engine.py --- a/mercurial/upgrade_utils/engine.py +++ b/mercurial/upgrade_utils/engine.py @@ -476,6 +476,27 @@ tr, unfi.manifestlog._rootstore._revlog, force=True ) scmutil.writereporequirements(srcrepo, upgrade_op.new_requirements) + elif ( + len(upgrade_op.removed_actions) == 1 + and [ + x + for x in upgrade_op.removed_actions + if x.name == b'persistent-nodemap' + ] + and not upgrade_op.upgrade_actions + ): + ui.status( + _(b'downgrading repository to not use persistent nodemap feature\n') + ) + with srcrepo.transaction(b'upgrade') as tr: + unfi = srcrepo.unfiltered() + cl = unfi.changelog + nodemap.delete_nodemap(tr, srcrepo, cl) + # check comment 20 lines above for accessing private attributes + nodemap.delete_nodemap( + tr, srcrepo, unfi.manifestlog._rootstore._revlog + ) + scmutil.writereporequirements(srcrepo, upgrade_op.new_requirements) else: with dstrepo.transaction(b'upgrade') as tr: _clonerevlogs( diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t --- a/tests/test-persistent-nodemap.t +++ b/tests/test-persistent-nodemap.t @@ -581,7 +581,7 @@ plain-cl-delta: yes yes yes compression: zlib zlib zlib compression-level: default default default - $ hg debugupgraderepo --run --no-backup --quiet + $ hg debugupgraderepo --run --no-backup upgrade will perform the following actions: requirements @@ -593,8 +593,17 @@ - changelog - manifest + beginning upgrade... + repository locked and read-only + creating temporary repository to stage upgraded data: $TESTTMP/test-repo/.hg/upgrade.* (glob) + (it is safe to interrupt this process any time before data migration completes) + downgrading repository to not use persistent nodemap feature + removing temporary repository $TESTTMP/test-repo/.hg/upgrade.* (glob) $ ls -1 .hg/store/ | egrep '00(changelog|manifest)(\.n|-.*\.nd)' - [1] + 00changelog-*.nd (glob) + 00manifest-*.nd (glob) + undo.backup.00changelog.n + undo.backup.00manifest.n $ hg debugnodemap --metadata @@ -643,6 +652,8 @@ 00changelog.n 00manifest-*.nd (glob) 00manifest.n + undo.backup.00changelog.n + undo.backup.00manifest.n $ hg debugnodemap --metadata uid: * (glob)