Mercurial > public > mercurial-scm > hg-stable
diff mercurial/revset.py @ 38625:52f19a840543
revset: add optimization for heads(commonancestors())
Previously, the only way to get these commits were (tested on
mozilla-central):
hg perfrevset 'heads(::a7cf55 and ::d8b15)'
! wall 4.988366 comb 4.960000 user 4.780000 sys 0.180000 (best of 3)
After this patch:
(python)
hg perfrevset 'heads(commonancestors(a7cf55 + d8b15))'
! wall 0.002155 comb 0.000000 user 0.000000 sys 0.000000 (best of 1107)
(C)
hg perfrevset 'heads(commonancestors(a7cf55 + d8b15))'
! wall 0.000568 comb 0.000000 user 0.000000 sys 0.000000 (best of 4646)
author | Sean Farley <sean@farley.io> |
---|---|
date | Tue, 26 Jun 2018 15:26:21 -0700 |
parents | 5460926352ee |
children | 607e2a2501e6 |
line wrap: on
line diff
--- a/mercurial/revset.py Mon Jun 18 19:41:54 2018 -0700 +++ b/mercurial/revset.py Tue Jun 26 15:26:21 2018 -0700 @@ -608,6 +608,19 @@ return subset.filter(lambda r: repo[r].closesbranch(), condrepr='<branch closed>') +# for internal use +@predicate('_commonancestorheads(set)', safe=True) +def _commonancestorheads(repo, subset, x): + # This is an internal method is for quickly calculating "heads(::x and + # ::y)" + + # These greatest common ancestors are the same ones that the consesus bid + # merge will find. + h = heads(repo, fullreposet(repo), x, defineorder) + + ancs = repo.changelog._commonancestorsheads(*list(h)) + return subset & baseset(ancs) + @predicate('commonancestors(set)', safe=True) def commonancestors(repo, subset, x): """Returns all common ancestors of the set.