annotate hgext3rd/topic/revset.py @ 4095:aabf436c11cb

topic: refactor revset.py slightly Checking both kind == 'literal' and topic.startswith('literal:') seems to be redundant, because of how stringutil.stringmatcher() works.
author Anton Shestakov <av6@dwimlabs.net>
date Tue, 04 Sep 2018 19:30:19 +0800
parents a2c0133006c6
children 09337aae08d4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
1 from __future__ import absolute_import
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
2
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
3 from mercurial import (
4058
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
4 error,
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
5 registrar,
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
6 revset,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
7 util,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
8 )
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
9
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
10 from . import (
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
11 destination,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
12 stack,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
13 )
1845
24d8053020a2 constants: extract key for extra into a constant
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
14
1865
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
15 try:
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
16 mkmatcher = revset._stringmatcher
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
17 except AttributeError:
3613
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
18 try:
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
19 from mercurial.utils import stringutil
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
20 mkmatcher = stringutil.stringmatcher
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
21 except (ImportError, AttributeError):
bf583a8dc637 compat: search for stringmatcher in the new location
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3156
diff changeset
22 mkmatcher = util.stringmatcher
1865
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
23
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
24 revsetpredicate = registrar.revsetpredicate()
1865
558dd43b599d topic: work around stringmatcher moving during development of hg 3.6
Augie Fackler <raf@durin42.com>
parents: 1864
diff changeset
25
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
26 def getstringstrict(x, err):
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
27 if x and x[0] == 'string':
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
28 return x[1]
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
29 raise error.ParseError(err)
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
30
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
31 @revsetpredicate('topic([string or set])')
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
32 def topicset(repo, subset, x):
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
33 """All changesets with the specified topic or the topics of the given
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
34 changesets. Without the argument, all changesets with any topic specified.
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
35
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
36 If `string` starts with `re:` the remainder of the name is treated
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
37 as a regular expression.
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
38 """
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
39 args = revset.getargs(x, 0, 1, 'topic takes one or no arguments')
4057
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
40
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
41 mutable = revset._notpublic(repo, revset.fullreposet(repo), ())
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
42
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
43 if not args:
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
44 return (subset & mutable).filter(lambda r: bool(repo[r].topic()))
4058
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
45
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
46 try:
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
47 topic = getstringstrict(args[0], '')
4058
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
48 except error.ParseError:
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
49 # not a string, but another revset
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
50 pass
4057
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
51 else:
4061
ad4194399b47 topic: handle ambiguous arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4060
diff changeset
52 kind, pattern, matcher = mkmatcher(topic)
2651
6a3df2404472 topic-revset: update the revset to no longer build changectx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2650
diff changeset
53
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
54 if topic.startswith('literal:') and pattern not in repo.topics:
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
55 raise error.RepoLookupError("topic '%s' does not exist" % pattern)
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
56
4059
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
57 def matches(r):
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
58 topic = repo[r].topic()
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
59 if not topic:
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
60 return False
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
61 return matcher(topic)
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
62
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
63 return (subset & mutable).filter(matches)
4059
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
64
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
65 s = revset.getset(repo, revset.fullreposet(repo), x)
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
66 topics = {repo[r].topic() for r in s}
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
67 topics.discard('')
2651
6a3df2404472 topic-revset: update the revset to no longer build changectx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2650
diff changeset
68
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
69 def matches(r):
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
70 if r in s:
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
71 return True
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
72 topic = repo[r].topic()
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
73 if not topic:
2651
6a3df2404472 topic-revset: update the revset to no longer build changectx
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2650
diff changeset
74 return False
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
75 return topic in topics
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
76
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
77 return (subset & mutable).filter(matches)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
78
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
79 @revsetpredicate('ngtip([branch])')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
80 def ngtipset(repo, subset, x):
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
81 """The untopiced tip.
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
82
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
83 Name is horrible so that people change it.
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
84 """
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
85 args = revset.getargs(x, 1, 1, 'topic takes one')
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
86 # match a specific topic
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
87 branch = revset.getstring(args[0], 'ngtip() argument must be a string')
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
88 if branch == '.':
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
89 branch = repo['.'].branch()
1986
042356d5ba59 ngtip: rely on topicmap for 'ngtip'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1943
diff changeset
90 return subset & revset.baseset(destination.ngtip(repo, branch))
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
91
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
92 @revsetpredicate('stack()')
1910
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
93 def stackset(repo, subset, x):
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
94 """All relevant changes in the current topic,
1910
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
95
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
96 This is roughly equivalent to 'topic(.) - obsolete' with a sorting moving
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
97 unstable changeset after there future parent (as if evolve where already
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
98 run)."""
2681
aa4db71a6224 topics: return a parse error if stack() revset is passed with argument
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2669
diff changeset
99 err = 'stack() takes no argument, it works on current topic'
aa4db71a6224 topics: return a parse error if stack() revset is passed with argument
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2669
diff changeset
100 revset.getargs(x, 0, 0, err)
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
101 topic = None
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
102 branch = None
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
103 if repo.currenttopic:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
104 topic = repo.currenttopic
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
105 else:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
106 branch = repo[None].branch()
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2712
diff changeset
107 return revset.baseset(stack.stack(repo, branch=branch, topic=topic)[1:]) & subset