diff --git a/mercurial/copies.py b/mercurial/copies.py --- a/mercurial/copies.py +++ b/mercurial/copies.py @@ -13,6 +13,9 @@ from .i18n import _ + +from .revlogutils.flagutil import REVIDX_SIDEDATA + from . import ( error, match as matchmod, @@ -21,6 +24,9 @@ pycompat, util, ) + +from .revlogutils import sidedata as sidedatamod + from .utils import stringutil @@ -955,3 +961,49 @@ # 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 @@ -13,6 +13,7 @@ from .pycompat import getattr from . import ( changelog, + copies, error, filelog, hg, @@ -31,7 +32,6 @@ RECLONES_REQUIREMENTS = { b'generaldelta', localrepo.SPARSEREVLOG_REQUIREMENT, - localrepo.SIDEDATA_REQUIREMENT, } @@ -77,6 +77,7 @@ supported = { localrepo.SPARSEREVLOG_REQUIREMENT, localrepo.SIDEDATA_REQUIREMENT, + localrepo.COPIESSDC_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -103,6 +104,7 @@ b'store', localrepo.SPARSEREVLOG_REQUIREMENT, localrepo.SIDEDATA_REQUIREMENT, + localrepo.COPIESSDC_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -129,6 +131,7 @@ b'generaldelta', localrepo.SPARSEREVLOG_REQUIREMENT, localrepo.SIDEDATA_REQUIREMENT, + localrepo.COPIESSDC_REQUIREMENT, } for name in compression.compengines: engine = compression.compengines[name] @@ -698,6 +701,7 @@ 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): @@ -706,6 +710,10 @@ 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 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 ..