# HG changeset patch # User Durham Goode # Date 2014-09-12 22:00:51 # Node ID 95af98616aa70e83e9eebaed72083831779f6ae5 # Parent da05fe01170b4d56b3cbdd115fec0bb751fef4bf revset: make parents() O(number of parents) Strip executes a revset like this: max(parents(_intlist('1234\x001235')) - _intlist('1234\x001235')) Previously the parents() revset would do 'subset & parents' which iterates over each item in the subset and checks if it's in parents. subset is usually the entire repo (a spanset) so this takes a while. Reversing the parameters to be 'parents & subset' means the operation becomes O(number of parents) instead of O(size of repo). It also means the result gets evaluated immediately (since parents isn't a lazy set), but I think this is a win in most scenarios. This shaves 0.3 seconds off strip (amend/histedit/rebase/etc) for large repositories. revset #0: parents(20000) 0) obsolete feature not enabled but 54243 markers found! ! wall 0.006256 comb 0.010000 user 0.010000 sys 0.000000 (best of 289) 1) obsolete feature not enabled but 54243 markers found! ! wall 0.000391 comb 0.000000 user 0.000000 sys 0.000000 (best of 4323) diff --git a/contrib/revsetbenchmarks.txt b/contrib/revsetbenchmarks.txt --- a/contrib/revsetbenchmarks.txt +++ b/contrib/revsetbenchmarks.txt @@ -23,4 +23,5 @@ draft() max(::(tip~20) - obsolete()) roots((0:tip)::) (not public() - obsolete()) +parents(20000) (20000::) - (20000) diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -1236,7 +1236,7 @@ def parents(repo, subset, x): cl = repo.changelog for r in getset(repo, spanset(repo), x): ps.update(cl.parentrevs(r)) - return subset & ps + return baseset(ps) & subset def parentspec(repo, subset, x, n): """``set^0`` diff --git a/tests/test-revset.t b/tests/test-revset.t --- a/tests/test-revset.t +++ b/tests/test-revset.t @@ -567,10 +567,10 @@ test subtracting something from an addse test intersecting something with an addset $ log 'parents(outgoing() or removes(a))' + 8 1 4 5 - 8 check that conversion to only works $ try --optimize '::3 - ::1'