diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -13,6 +13,11 @@ from .i18n import _ + +from .revlogutils.flagutil import ( + REVIDX_SIDEDATA, +) + from . import ( error, match as matchmod, @@ -20,6 +25,11 @@ pathutil, util, ) + +from .revlogutils import ( + sidedata as sidedatamod, +) + from .utils import ( stringutil, ) @@ -906,3 +916,43 @@ # Perhaps someone had chosen the same key name (e.g. "added") and # used different syntax for the value. return None + +def _getsidedata(srcrepo, rev): + ctx = srcrepo[rev] + filescopies = computechangesetcopies(ctx) + filesadded = computechangesetfilesadded(ctx) + filesremoved = computechangesetfilesremoved(ctx) + sidedata = {} + if any([filescopies, filesadded, filesremoved]): + sortedfiles = sorted(ctx.files()) + p1copies, p2copies = filescopies + p1copies = encodecopies(sortedfiles, p1copies) + p2copies = encodecopies(sortedfiles, p2copies) + filesadded = encodefileindices(sortedfiles, filesadded) + filesremoved = encodefileindices(sortedfiles, filesremoved) + sidedata[sidedatamod.SD_P1COPIES] = p1copies + sidedata[sidedatamod.SD_P2COPIES] = p2copies + sidedata[sidedatamod.SD_FILESADDED] = filesadded + sidedata[sidedatamod.SD_FILESREMOVED] = filesremoved + return sidedata + +def getsidedataadder(srcrepo, destrepo): + def sidedatacompanion(revlog, rev): + sidedata = {} + if util.safehasattr(revlog, 'filteredrevs'): # this is a changelog + sidedata = _getsidedata(srcrepo, rev) + return False, (), sidedata + return sidedatacompanion + +def getsidedataremover(srcrepo, destrepo): + def sidedatacompanion(revlog, rev): + f = () + if util.safehasattr(revlog, 'filteredrevs'): # this is a changelog + if revlog.flags(rev) & REVIDX_SIDEDATA: + f = (sidedatamod.SD_P1COPIES, + sidedatamod.SD_P2COPIES, + sidedatamod.SD_FILESADDED, + sidedatamod.SD_FILESREMOVED, + ) + return False, f, {} + return sidedatacompanion diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py --- a/mercurial/upgrade.py +++ b/mercurial/upgrade.py @@ -12,6 +12,7 @@ from .i18n import _ from . import ( changelog, + copies, error, filelog, hg, @@ -32,7 +33,6 @@ RECLONES_REQUIREMENTS = { 'generaldelta', localrepo.SPARSEREVLOG_REQUIREMENT, - localrepo.SIDEDATA_REQUIREMENT, } def requiredsourcerequirements(repo): @@ -75,6 +75,7 @@ supported = { localrepo.SPARSEREVLOG_REQUIREMENT, localrepo.SIDEDATA_REQUIREMENT, + localrepo.COPIESSDC_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -100,6 +101,7 @@ 'store', localrepo.SPARSEREVLOG_REQUIREMENT, localrepo.SIDEDATA_REQUIREMENT, + localrepo.COPIESSDC_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -125,6 +127,7 @@ 'generaldelta', localrepo.SPARSEREVLOG_REQUIREMENT, localrepo.SIDEDATA_REQUIREMENT, + localrepo.COPIESSDC_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -612,12 +615,17 @@ def getsidedatacompanion(srcrepo, dstrepo): sidedatacompanion = None removedreqs = srcrepo.requirements - dstrepo.requirements + addedreqs = dstrepo.requirements - srcrepo.requirements if localrepo.SIDEDATA_REQUIREMENT in removedreqs: def sidedatacompanion(rl, rev): rl = getattr(rl, '_revlog', rl) if rl.flags(rev) & revlog.REVIDX_SIDEDATA: return True, (), {} return False, (), {} + elif localrepo.COPIESSDC_REQUIREMENT in addedreqs: + sidedatacompanion = copies.getsidedataadder(srcrepo, dstrepo) + elif localrepo.COPIESSDC_REQUIREMENT in removedreqs: + sidedatacompanion = copies.getsidedataremover(srcrepo, dstrepo) return sidedatacompanion def matchrevlog(revlogfilter, entry): diff --git a/tests/test-copies-in-changeset.t b/tests/test-copies-in-changeset.t --- a/tests/test-copies-in-changeset.t +++ b/tests/test-copies-in-changeset.t @@ -450,4 +450,91 @@ $ hg ci -Aqm 'add a' $ hg mv a b $ hg ci -m 'remove a' a + +#if sidedata + +Test upgrading/downgrading to sidedata storage +============================================== + +downgrading (keeping some sidedata) + + $ hg debugformat -v + format-variant repo config default + fncache: yes yes yes + dotencode: yes yes yes + generaldelta: yes yes yes + sparserevlog: yes yes yes + sidedata: yes yes no + copies-sdc: yes yes no + plain-cl-delta: yes yes yes + compression: zlib zlib zlib + compression-level: default default default + $ hg debugsidedata -c -- 0 + 4 sidedata entries + entry-0010 size 0 + entry-0011 size 0 + entry-0012 size 1 + entry-0013 size 0 + $ hg debugsidedata -c -- 1 + 4 sidedata entries + entry-0010 size 0 + entry-0011 size 0 + entry-0012 size 0 + entry-0013 size 1 + $ hg debugsidedata -m -- 0 + $ cat << EOF > .hg/hgrc + > [format] + > use-side-data = yes + > exp-use-copies-side-data-changeset = no + > EOF + $ hg debugupgraderepo --run --quiet --no-backup > /dev/null + $ hg debugformat -v + format-variant repo config default + fncache: yes yes yes + dotencode: yes yes yes + generaldelta: yes yes yes + sparserevlog: yes yes yes + sidedata: yes yes no + copies-sdc: no no no + plain-cl-delta: yes yes yes + compression: zlib zlib zlib + compression-level: default default default + $ hg debugsidedata -c -- 0 + $ hg debugsidedata -c -- 1 + $ hg debugsidedata -m -- 0 + +upgrading + + $ cat << EOF > .hg/hgrc + > [format] + > exp-use-copies-side-data-changeset = yes + > EOF + $ hg debugupgraderepo --run --quiet --no-backup > /dev/null + $ hg debugformat -v + format-variant repo config default + fncache: yes yes yes + dotencode: yes yes yes + generaldelta: yes yes yes + sparserevlog: yes yes yes + sidedata: yes yes no + copies-sdc: yes yes no + plain-cl-delta: yes yes yes + compression: zlib zlib zlib + compression-level: default default default + $ hg debugsidedata -c -- 0 + 4 sidedata entries + entry-0010 size 0 + entry-0011 size 0 + entry-0012 size 1 + entry-0013 size 0 + $ hg debugsidedata -c -- 1 + 4 sidedata entries + entry-0010 size 0 + entry-0011 size 0 + entry-0012 size 0 + entry-0013 size 1 + $ hg debugsidedata -m -- 0 + +#endif + $ cd ..