[PATCH 1 of 1] fix sparse:subprepo.subrepo - now provide DummySubrepo for subs out of sparse
Augie Fackler
raf at durin42.com
Wed May 19 14:58:14 UTC 2021
Elaborating more: this appears to introduce import cycles caught by running the tests under Python 2.7. I’m not sure why that test is broken on Python 3, but I’ll try to make a note to explore that.
> On May 19, 2021, at 4:29 AM, Raphaël Gomès <raphael.gomes at octobus.net> wrote:
>
> Hi,
>
> This patch breaks a few tests in the Heptapod CI [1]. I have removed it from the queue, please feel free to send a second version.
>
> [1] https://foss.heptapod.net/octobus/mercurial-devel/-/pipelines/22116 <https://foss.heptapod.net/octobus/mercurial-devel/-/pipelines/22116>
> On 5/13/21 7:35 PM, alexrayne wrote:
>> # HG changeset patch
>> # User alexrayne <alexraynepe196 at gmail.com> <mailto:alexraynepe196 at gmail.com>
>> # Date 1619989845 -10800
>> # Mon May 03 00:10:45 2021 +0300
>> # Branch stable
>> # Node ID 57d1837724ebe88c276013a621a3de9163bd51f7
>> # Parent b7e623ac98b6f0d3b4e2f394637ae3f1a2a59711
>> fix sparse:subprepo.subrepo - now provide DummySubrepo for subs out of sparse.
>> This dummy sub is empty node, always clean and ready to get/remove
>> fix subrepoutil.submerge - now ignores changes for items out of sparce
>>
>> diff --git a/hgext/sparse.py b/hgext/sparse.py
>> --- a/hgext/sparse.py
>> +++ b/hgext/sparse.py
>> @@ -78,6 +78,8 @@
>> from mercurial import (
>> commands,
>> dirstate,
>> + subrepoutil,
>> + subrepo,
>> error,
>> extensions,
>> logcmdutil,
>> @@ -106,6 +108,7 @@
>> _setuplog(ui)
>> _setupadd(ui)
>> _setupdirstate(ui)
>> + _setupsubrepo(ui)
>>
>>
>> def replacefilecache(cls, propname, replacement):
>> @@ -285,6 +288,52 @@
>>
>> extensions.wrapfunction(dirstate.dirstate, func, _wrapper)
>>
>> +class DummySubrepo(subrepo.abstractsubrepo):
>> + """ Dumy subrepo is replacement of subrepo, that should be filterout from sparce.
>> + this subrepo acts as always clean and always get/remove well.
>> + """
>> +
>> + def dirty(self, ignoreupdate=False, missing=False):
>> + return False
>> +
>> + def get(self, state, overwrite=False):
>> + return
>> +
>> + def remove(self):
>> + return
>> +
>> +
>> +
>> +def _setupsubrepo(ui):
>> + """Modify the dirstate to prevent stat'ing excluded files,
>> + and to prevent modifications to files outside the checkout.
>> + """
>> +
>> + def _state(orig, ctx, ui):
>> + sparsematch = sparse.matcher(ctx.repo(), revs=[ ctx.rev() ])
>> + if not sparsematch.always():
>> + # filter allstate, leave only sparce pathes
>> + allstate = orig(ctx, ui)
>> + sparcestate = dict()
>> + for (idx, item) in allstate.items():
>> + if sparsematch(idx):
>> + sparcestate[idx] = item
>> + return sparcestate
>> + else:
>> + return orig(ctx, ui)
>> +
>> + #extensions.wrapfunction(subrepoutil, b'state', _state)
>> +
>> + """ provide DummySubrepo for pathes out of sparse
>> + """
>> + def _subrepo(orig, ctx, path, allowwdir=False, allowcreate=True):
>> + sparsematch = sparse.matcher(ctx.repo(), revs=[ ctx.rev() ])
>> + if not sparsematch.always():
>> + if not sparsematch(path):
>> + return DummySubrepo(ctx, path)
>> + return orig(ctx, path, allowwdir, allowcreate)
>> +
>> + extensions.wrapfunction(subrepo, b'subrepo', _subrepo)
>>
>> @command(
>> b'debugsparse',
>> diff --git a/mercurial/subrepoutil.py b/mercurial/subrepoutil.py
>> --- a/mercurial/subrepoutil.py
>> +++ b/mercurial/subrepoutil.py
>> @@ -21,6 +21,7 @@
>> pathutil,
>> phases,
>> pycompat,
>> + sparse,
>> util,
>> )
>> from .utils import (
>> @@ -183,6 +184,9 @@
>> sa = actx.substate
>> sm = {}
>>
>> + s1match = sparse.matcher(repo, revs=[ wctx.rev() ])
>> + s2match = sparse.matcher(repo, revs=[ mctx.rev() ])
>> +
>> repo.ui.debug(b"subrepo merge %s %s %s\n" % (wctx, mctx, actx))
>>
>> def debug(s, msg, r=b""):
>> @@ -192,6 +196,9 @@
>>
>> promptssrc = filemerge.partextras(labels)
>> for s, l in sorted(pycompat.iteritems(s1)):
>> + if not s1match(s):
>> + sm[s] = l # ignore changes out of sparse
>> + continue
>> a = sa.get(s, nullstate)
>> ld = l # local state with possible dirty flag for compares
>> if wctx.sub(s).dirty():
>> @@ -202,6 +209,9 @@
>> prompts = promptssrc.copy()
>> prompts[b's'] = s
>> if s in s2:
>> + if not s2match(s):
>> + sm[s] = l # ignore changes out of sparse
>> + continue
>> r = s2[s]
>> if ld == r or r == a: # no change or local is newer
>> sm[s] = l
>> @@ -288,6 +298,14 @@
>> mctx.sub(s).get(r)
>> sm[s] = r
>> elif r != sa[s]:
>> + if not s2match(s):
>> + # ignore changes out of sparse,
>> + continue
>> + elif not s1match(s):
>> + # recreate changes out of sparse,
>> + # sm[s] = r
>> + continue
>> +
>> prompts = promptssrc.copy()
>> prompts[b's'] = s
>> if (
>>
>>
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org <mailto:Mercurial-devel at mercurial-scm.org>
>> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel <https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-devel/attachments/20210519/c8fe7f22/attachment-0002.html>
More information about the Mercurial-devel
mailing list