Mercurial > hg
changeset 32484:c50f29b37aab
annotate: make pair take all parents to pair against
In upcoming patches we'll need to be aware of all parents at the same time.
This also exposes a potential bug: if a line can be annotated with both parents
of a merge commit, it'll always be annotated with p2, not p1. I'm not sure if
that's what we want, but at least the code makes it clear now.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Wed, 24 May 2017 17:40:08 -0700 |
parents | f8fb8a441b4a |
children | 05abc47f3746 |
files | mercurial/context.py |
diffstat | 1 files changed, 12 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/context.py Wed May 24 17:38:28 2017 -0700 +++ b/mercurial/context.py Wed May 24 17:40:08 2017 -0700 @@ -1044,8 +1044,8 @@ if ready: visit.pop() curr = decorate(f.data(), f) + curr = _annotatepair([hist[p] for p in pl], curr, diffopts) for p in pl: - curr = _annotatepair(hist[p], curr, diffopts) if needed[p] == 1: del hist[p] del needed[p] @@ -1073,13 +1073,17 @@ c = visit.pop(max(visit)) yield c -def _annotatepair(parent, child, diffopts): - blocks = mdiff.allblocks(parent[1], child[1], opts=diffopts) - for (a1, a2, b1, b2), t in blocks: - # Changed blocks ('!') or blocks made only of blank lines ('~') - # belong to the child. - if t == '=': - child[0][b1:b2] = parent[0][a1:a2] +def _annotatepair(parents, child, diffopts): + pblocks = [(parent, mdiff.allblocks(parent[1], child[1], opts=diffopts)) + for parent in parents] + # Mercurial currently prefers p2 over p1 for annotate. + # TODO: change this? + for parent, blocks in pblocks: + for (a1, a2, b1, b2), t in blocks: + # Changed blocks ('!') or blocks made only of blank lines ('~') + # belong to the child. + if t == '=': + child[0][b1:b2] = parent[0][a1:a2] return child class filectx(basefilectx):