Patchwork [STABLE] annotate: reuse ancestry context when adjusting linkrev (issue4532)

login
register
mail settings
Submitter Pierre-Yves David
Date March 20, 2015, 3:16 a.m.
Message ID <d0ecf62a37d0ab1c2f73.1426821375@marginatus.alto.octopoid.net>
Download mbox | patch
Permalink /patch/8196/
State Accepted
Commit dd01834a696f5e141933f80640ae0eea148ff42c
Headers show

Comments

Pierre-Yves David - March 20, 2015, 3:16 a.m.
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david@fb.com>
# Date 1426819943 25200
#      Thu Mar 19 19:52:23 2015 -0700
# Branch stable
# Node ID d0ecf62a37d0ab1c2f737a164c5d0b50af6fbb31
# Parent  6136704b975df292819647ba8ac46209487fbc46
annotate: reuse ancestry context when adjusting linkrev (issue4532)

The linkrev adjustment will likely do the same ancestry walking multiple time
so we already have an optional mechanism to take advantage of this. Since
2896f53509a7, linkrev adjustment was done lazily to prevent too bad performance
impact on rename computation. However, this laziness created a quadratic
situation in 'annotate'.

Mercurial repo: hg annotate mercurial/commands.py
before:   8.090
after:  36.300

Mozilla repo: hg annotate layout/generic/nsTextFrame.cpp
before:   1.190
after:  290.230


So we setup sharing of the ancestry context in the annotate case too. Linkrev
adjustment still have an impact but it a much more sensible one.

Mercurial repo: hg annotate mercurial/commands.py
before:  36.300
after:   10.230

Mozilla repo: hg annotate layout/generic/nsTextFrame.cpp
before: 290.230
after:    5.560
Matt Mackall - March 20, 2015, 7:15 p.m.
On Thu, 2015-03-19 at 20:16 -0700, Pierre-Yves David wrote:
> # HG changeset patch
> # User Pierre-Yves David <pierre-yves.david@fb.com>
> # Date 1426819943 25200
> #      Thu Mar 19 19:52:23 2015 -0700
> # Branch stable
> # Node ID d0ecf62a37d0ab1c2f737a164c5d0b50af6fbb31
> # Parent  6136704b975df292819647ba8ac46209487fbc46
> annotate: reuse ancestry context when adjusting linkrev (issue4532)

Queued for stable, thanks for looking into this.

Patch

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -911,10 +911,12 @@  class basefilectx(object):
         # use linkrev to find the first changeset where self appeared
         base = self
         introrev = self.introrev()
         if self.rev() != introrev:
             base = self.filectx(self.filenode(), changeid=introrev)
+            ac = self._repo.changelog.ancestors([introrev], inclusive=True)
+            base._ancestrycontext = ac
 
         # This algorithm would prefer to be recursive, but Python is a
         # bit recursion-hostile. Instead we do an iterative
         # depth-first search.