[PATCH] revset: add 'only' revset
Lucas Moscovicz
lmoscovicz at fb.com
Thu Feb 27 13:07:05 CST 2014
On 2/27/14, 10:37 AM, "Lucas Moscovicz" <lmoscovicz at fb.com> wrote:
>
>
>On 2/26/14, 11:35 AM, "Durham Goode" <durham at fb.com> wrote:
>
>># HG changeset patch
>># User Durham Goode <durham at fb.com>
>># Date 1384621028 28800
>># Sat Nov 16 08:57:08 2013 -0800
>># Node ID 9bcbd10a93137b4dbc83bebd41fb4f00143a7615
>># Parent 0ad353831461516132f57ccda8e8e0515213ec60
>>revset: add 'only' revset
>>
>>Adds a only() revset that has two forms:
>>
>>only(<set>) is equivalent to "::<set> - ::(heads() - heads(<set>::))"
>>
>>only(<include>,<exclude>) is equivalent to "::<include> - ::<exclude>"
>>
>>On a large repo, this implementation can process/traverse 50,000 revs in
>>0.7
>>seconds, versus 4.2 seconds using "::<include> - ::<exclude>".
>>
>>This is useful for performing histedits on your branch:
>>hg histedit -r 'first(only(.))'
>>
>>Or lifting branch foo off of branch bar:
>>hg rebase -d @ -s 'only(foo, bar)'
>>
>>Or a variety of other uses.
>>
>>diff --git a/mercurial/revset.py b/mercurial/revset.py
>>--- a/mercurial/revset.py
>>+++ b/mercurial/revset.py
>>@@ -9,6 +9,7 @@
>> import parser, util, error, discovery, hbisect, phases
>> import node
>> import match as matchmod
>>+import ancestor as ancestormod
>> from i18n import _
>> import encoding
>> import obsolete as obsmod
>>@@ -351,6 +352,25 @@
>> kind, pattern, matcher = _substringmatcher(n)
>> return lazyset(subset, lambda x:
>>matcher(encoding.lower(repo[x].user())))
>>
>>+def only(repo, subset, x):
>>+ """``only(set, [set])
>>+ Changesets that are only ancestors of the first set, but not the
>>second.
>>+ If no second set is specified, it is assumed to be the heads that
>>are
>>+ not in or descendants of the first set.
>>+ """
>>+ cl = repo.changelog
>>+ args = getargs(x, 1, 2, _('only takes one or two arguments'))
>>+ include = set(getset(repo, baseset(cl), args[0]))
>
>Here you should use getset(repo, baseset(cl), args[0]).set() since
>anything returned by getset should have that method at this point and in
>many cases it will be more efficient (when it¹s a spanset for example
>it¹ll just return itself since it¹s contains is fast instead of going
>through all the values to build a set)
Also, I would consider using spanset(repo) instead of baseset(cl)
>
>>+ if len(args) == 1:
>>+ descendants = set(_revdescendants(repo, include, False))
>>+ exclude = [rev for rev in cl.headrevs()
>>+ if not rev in descendants and not rev in include]
>>+ else:
>>+ exclude = getset(repo, baseset(cl), args[1])
>>+
Here too
>>+ results = set(ancestormod.missingancestors(include, exclude,
>>cl.parentrevs))
>>+ return lazyset(subset, lambda x: x in results)
>>+
>> def bisect(repo, subset, x):
>> """``bisect(string)``
>> Changesets marked in the specified bisect status:
>>@@ -1587,6 +1607,7 @@
>> "ancestors": ancestors,
>> "_firstancestors": _firstancestors,
>> "author": author,
>>+ "only": only,
>> "bisect": bisect,
>> "bisected": bisected,
>> "bookmark": bookmark,
>>diff --git a/tests/test-revset.t b/tests/test-revset.t
>>--- a/tests/test-revset.t
>>+++ b/tests/test-revset.t
>>@@ -367,6 +367,22 @@
>> 4
>> $ log 'id(5)'
>> 2
>>+ $ log 'only(9)'
>>+ 8
>>+ 9
>>+ $ log 'only(8)'
>>+ 8
>>+ $ log 'only(9, 5)'
>>+ 2
>>+ 4
>>+ 8
>>+ 9
>>+ $ log 'only(7 + 9, 5 + 2)'
>>+ 4
>>+ 6
>>+ 7
>>+ 8
>>+ 9
>> $ log 'outgoing()'
>> 8
>> 9
>>_______________________________________________
>>Mercurial-devel mailing list
>>Mercurial-devel at selenic.com
>>https://urldefense.proofpoint.com/v1/url?u=http://selenic.com/mailman/lis
>>t
>>info/mercurial-devel&k=ZVNjlDMF0FElm4dQtryO4A%3D%3D%0A&r=OvJpSDyvbZ%2BdRI
>>G
>>uE%2BQNXdEMu%2FMWX%2BVvreTVxvKUMnE%3D%0A&m=9HUK%2FsgHAMmXj9vn9d7PymqiQsJ4
>>u
>>KxSQcakrrGrIvs%3D%0A&s=7c65d79c34da7f3b293578f7330bfbff9814de6fd83ee718c8
>>4
>>a39913c4d6270
>
>_______________________________________________
>Mercurial-devel mailing list
>Mercurial-devel at selenic.com
>https://urldefense.proofpoint.com/v1/url?u=http://selenic.com/mailman/list
>info/mercurial-devel&k=ZVNjlDMF0FElm4dQtryO4A%3D%3D%0A&r=OvJpSDyvbZ%2BdRIG
>uE%2BQNXdEMu%2FMWX%2BVvreTVxvKUMnE%3D%0A&m=nMIWf8eyyaRvndoubomHZzQOYPdThGl
>sBsCZiAFqMu4%3D%0A&s=a7edeaa8dc910c50c7c575af444a6b5aaf706e9dd813a110f5c5b
>00592520bf8
More information about the Mercurial-devel
mailing list