annotate hgext3rd/topic/revset.py @ 5913:e682bbe66e37

compat: add check_at_most_one_arg() and check_incompatible_arguments()
author Anton Shestakov <av6@dwimlabs.net>
date Sat, 15 May 2021 02:58:04 +0800
parents f27ef537bf83
children 7847e0800263
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):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
27 if x and x[0] == b'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
4717
7b36f9728351 py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4390
diff changeset
31 @revsetpredicate(b'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 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
39 args = revset.getargs(x, 0, 1, b'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:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
47 topic = getstringstrict(args[0], b'')
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
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
54 if topic.startswith(b'literal:') and pattern not in repo.topics:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
55 raise error.RepoLookupError(b"topic '%s' does not exist" % pattern)
4095
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}
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
67 topics.discard(b'')
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 topic = repo[r].topic()
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
71 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
72 return False
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
73 return topic in topics
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
74
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
75 return (subset & mutable).filter(matches)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
76
4717
7b36f9728351 py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4390
diff changeset
77 @revsetpredicate(b'ngtip([branch])')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
78 def ngtipset(repo, subset, x):
5603
5e71952c8b4a ngtip: make revset help text slightly more descriptive
Sietse Brouwer <sbbrouwer@gmail.com>
parents: 5602
diff changeset
79 """The tip of a branch, ignoring changesets with a topic.
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
80
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
81 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
82 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
83 args = revset.getargs(x, 1, 1, b'ngtip takes one argument')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
84 # match a specific topic
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
85 branch = revset.getstring(args[0], b'ngtip requires a string')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
86 if branch == b'.':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
87 branch = repo[b'.'].branch()
5602
e25394b6d021 ngtip: fix TypeError: make revset from revs, not nodes (issue6405)
Sietse Brouwer <sbbrouwer@gmail.com>
parents: 5507
diff changeset
88 # list of length 1
e25394b6d021 ngtip: fix TypeError: make revset from revs, not nodes (issue6405)
Sietse Brouwer <sbbrouwer@gmail.com>
parents: 5507
diff changeset
89 revs = [repo[node].rev() for node in destination.ngtip(repo, branch)]
e25394b6d021 ngtip: fix TypeError: make revset from revs, not nodes (issue6405)
Sietse Brouwer <sbbrouwer@gmail.com>
parents: 5507
diff changeset
90 return subset & revset.baseset(revs)
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
91
4717
7b36f9728351 py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4390
diff changeset
92 @revsetpredicate(b'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
4290
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
98 run).
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
99 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
100 err = b'stack takes no arguments, it works on current topic'
2681
aa4db71a6224 topics: return a parse error if stack() revset is passed with argument
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2669
diff changeset
101 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
102 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
103 branch = None
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
104 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
105 topic = repo.currenttopic
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
106 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
107 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
108 return revset.baseset(stack.stack(repo, branch=branch, topic=topic)[1:]) & subset
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
109
5335
e5406605d8f5 topic: document the other safehasattr() compatibility check
Anton Shestakov <av6@dwimlabs.net>
parents: 5334
diff changeset
110 # x#y[z] revset operator support (no support for older version)
e5406605d8f5 topic: document the other safehasattr() compatibility check
Anton Shestakov <av6@dwimlabs.net>
parents: 5334
diff changeset
111 # hg <= 4.8 (e54bfde922f2)
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
112 if util.safehasattr(revset, 'subscriptrelations'):
5332
801bbfc4e2e8 topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents: 5253
diff changeset
113 def stacksubrel(repo, subset, x, rel, z, order):
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
114 """This is a revset-flavored implementation of stack aliases.
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
115
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
116 The syntax is: rev#stack[n] or rev#s[n]. Plenty of logic is borrowed
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
117 from topic._namemap, but unlike that function, which prefers to abort
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
118 (e.g. when stack index is too high), this returns empty set to be more
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
119 revset-friendly.
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
120 """
4390
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
121 # hg 4.9 provides a number or None, hg 5.0 provides a tuple of tokens
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
122 if isinstance(z, tuple):
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
123 a, b = revset.getintrange(
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
124 z,
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
125 b'relation subscript must be an integer or a range',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
126 b'relation subscript bounds must be integers',
4390
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
127 None, None)
4381
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
128 else:
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
129 # hg <= 4.9 (431cf2c8c839+13f7a6a4f0db)
4390
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
130 a = b = z
4381
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
131
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
132 s = revset.getset(repo, revset.fullreposet(repo), x)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
133 if not s:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
134 return revset.baseset()
4381
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
135
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
136 def getrange(st, a, b):
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
137 start = 1 if a is None else a
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
138 end = len(st.revs) if b is None else b + 1
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
139 return range(start, end)
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
140
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
141 revs = []
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
142 for r in s:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
143 topic = repo[r].topic()
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
144 if topic:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
145 st = stack.stack(repo, topic=topic)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
146 else:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
147 st = stack.stack(repo, branch=repo[r].branch())
4381
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
148 for n in getrange(st, a, b):
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
149 if abs(n) >= len(st.revs):
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
150 # also means stack base is not accessible with n < 0, which
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
151 # is by design
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
152 continue
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
153 if n == 0 and b != 0 and a != 0:
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
154 # quirk: we don't want stack base unless specifically asked
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
155 # for it (at least one of the indices is 0)
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
156 continue
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
157 rev = st.revs[n]
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
158 if rev == -1 and n == 0:
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
159 continue
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
160 if rev not in revs:
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
161 revs.append(rev)
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
162
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
163 return subset & revset.baseset(revs)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
164
5332
801bbfc4e2e8 topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents: 5253
diff changeset
165 revset.subscriptrelations[b'stack'] = stacksubrel
801bbfc4e2e8 topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents: 5253
diff changeset
166 revset.subscriptrelations[b's'] = stacksubrel
4339
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
167
5334
498dc93c3fa0 topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents: 5333
diff changeset
168 def topicsubrel(repo, subset, x, *args):
4379
2893b127923b topic: make ranges work in revset relations like 'foo#topic[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4369
diff changeset
169 subset &= topicset(repo, subset, x)
5252
a828c7a7ace1 topic: use generationssubrel less directly, because it was recently renamed
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
170 # not using revset.generationssubrel directly because it was renamed
a828c7a7ace1 topic: use generationssubrel less directly, because it was recently renamed
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
171 # hg <= 5.3 (8859de3e83dc)
a828c7a7ace1 topic: use generationssubrel less directly, because it was recently renamed
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
172 generationssubrel = revset.subscriptrelations[b'generations']
a828c7a7ace1 topic: use generationssubrel less directly, because it was recently renamed
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
173 return generationssubrel(repo, subset, x, *args)
4339
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
174
5334
498dc93c3fa0 topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents: 5333
diff changeset
175 revset.subscriptrelations[b'topic'] = topicsubrel
498dc93c3fa0 topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents: 5333
diff changeset
176 revset.subscriptrelations[b't'] = topicsubrel
5333
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
177
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
178 # x#y revset operator support (no support for older version)
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
179 # hg <= 5.3 (eca82eb9d777)
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
180 if util.safehasattr(revset, 'relations'):
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
181 def stackrel(repo, subset, x, rel, order):
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
182 z = (b'rangeall', None)
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
183 return stacksubrel(repo, subset, x, rel, z, order)
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
184
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
185 revset.relations[b'stack'] = stackrel
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
186 revset.relations[b's'] = stackrel