[PATCH 06 of 10 V4] context: introduce an `isintroducedafter` method and use it in copies
Boris FELD
boris.feld at octobus.net
Wed Oct 10 04:43:29 EDT 2018
On 04/10/2018 19:24, Martin von Zweigbergk via Mercurial-devel wrote:
>
>
> On Thu, Oct 4, 2018 at 7:44 AM Boris Feld <boris.feld at octobus.net
> <mailto:boris.feld at octobus.net>> wrote:
>
> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net
> <mailto:boris.feld at octobus.net>>
> # Date 1536252767 14400
> # Thu Sep 06 12:52:47 2018 -0400
> # Node ID 1ef29e4089dde437729f46bb6b8acb451e11a7f5
> # Parent 36a3f6fc8dbd727e1369fb29c5bda044a9b44754
> # EXP-Topic copy-perf
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> # hg pull
> https://bitbucket.org/octobus/mercurial-devel/ -r 1ef29e4089dd
> context: introduce an `isintroducedafter` method and use it in copies
>
> Right now, copy tracing make effort to not traverse the graph too
> much to save
> performance. It uses a "limit" acting as a floor revision past
> which data are
> no longer relevant to the current copy tracing.
>
> However, to enforce this limit, it uses a call to `filectx.rev()`,
> that call
> can trigger a graph traversal on its own. That extra graph
> traversal is
> unaware of the current limit and can become very expensive. That
> cost is
> increased by the nature of work done in adjust link rev, we are
> not only
> walking down the graph, we are also checking the affected file for
> each
> revision we walk through. Something significantly more expensive
> than the walk
> itself.
>
> To work around this we need to make the `filectx` operation aware
> of the
> current limit. The first step is to introduce a dedicated method:
> `isintroducedafter`. We'll then rework that method logic to stop
> traversal as
> soon as possible.
>
> diff --git a/mercurial/context.py b/mercurial/context.py
> --- a/mercurial/context.py
> +++ b/mercurial/context.py
> @@ -767,6 +767,12 @@ class basefilectx(object):
> # result is crash somewhere else at to some point.
> return lkr
>
> + def isintroducedafter(self, changelogrev):
> + """True if a filectx have been introduced after a given
> floor revision
> + """
> + return (self.linkrev() > changelogrev
> + or self.introrev() > changelogrev)
>
>
> test-mv-cp-st-diff.t and test-mq-merge.t fail with this patch. I
> assume it's because .rev() in copies.py changed to .introrev() here,
> but I haven't confirmed that.
We have sent a V5 series that fixes the tests, it was caused by the
condition that was `>` instead of `>=`
>
>
> +
> def introrev(self):
> """return the rev of the changeset which introduced this
> file revision
>
> diff --git a/mercurial/copies.py b/mercurial/copies.py
> --- a/mercurial/copies.py
> +++ b/mercurial/copies.py
> @@ -139,7 +139,7 @@ def _tracefile(fctx, am, limit=-1):
> for f in fctx.ancestors():
> if am.get(f.path(), None) == f.filenode():
> return f
> - if limit >= 0 and f.linkrev() < limit and f.rev() < limit:
> + if limit >= 0 and not f.isintroducedafter(limit):
> return None
>
> def _dirstatecopies(d, match=None):
>
>
> _______________________________________________
> 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://www.mercurial-scm.org/pipermail/mercurial-devel/attachments/20181010/9b68eaef/attachment.html>
More information about the Mercurial-devel
mailing list