annotate hgext3rd/topic/revset.py @ 6222:6020b7e92a86

topic: update topic() revset docstring, mention hg help I was curious why we don't support glob patterns, only re. But turns out it's like this in upstream (e.g. branch revset) as well, so let's point to the relevant help page.
author Anton Shestakov <av6@dwimlabs.net>
date Fri, 08 Apr 2022 02:19:50 +0300
parents a1a9e6e43d4c
children a2491c578d2b
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
6221
a1a9e6e43d4c topic: drop compatibility with hg 4.6 (f99d64e8a4e4)
Anton Shestakov <av6@dwimlabs.net>
parents: 6220
diff changeset
10 from mercurial.utils import stringutil
a1a9e6e43d4c topic: drop compatibility with hg 4.6 (f99d64e8a4e4)
Anton Shestakov <av6@dwimlabs.net>
parents: 6220
diff changeset
11
1935
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
12 from . import (
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
13 destination,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
14 stack,
11d740319280 revset: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1923
diff changeset
15 )
1845
24d8053020a2 constants: extract key for extra into a constant
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
16
2924
430fb1758d28 topic: use registrar.revsetpredicate to register revset predicate functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2915
diff changeset
17 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
18
4063
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
19 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
20 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
21 return x[1]
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
22 raise error.ParseError(err)
00c65abf99cd topic-revset: strictly read string
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4061
diff changeset
23
4717
7b36f9728351 py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4390
diff changeset
24 @revsetpredicate(b'topic([string or set])')
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
25 def topicset(repo, subset, x):
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
26 """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
27 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
28
6222
6020b7e92a86 topic: update topic() revset docstring, mention hg help
Anton Shestakov <av6@dwimlabs.net>
parents: 6221
diff changeset
29 Pattern matching is supported for `string`. See
6020b7e92a86 topic: update topic() revset docstring, mention hg help
Anton Shestakov <av6@dwimlabs.net>
parents: 6221
diff changeset
30 :hg:`help revisions.patterns`.
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
31 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
32 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
33
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
34 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
35
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
36 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
37 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
38
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
39 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
40 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
41 except error.ParseError:
90783c9c8609 topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4057
diff changeset
42 # not a string, but another revset
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
43 pass
4057
054d288680b4 topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 3613
diff changeset
44 else:
6221
a1a9e6e43d4c topic: drop compatibility with hg 4.6 (f99d64e8a4e4)
Anton Shestakov <av6@dwimlabs.net>
parents: 6220
diff changeset
45 kind, pattern, matcher = stringutil.stringmatcher(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
46
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 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
48 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
49
4059
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
50 def matches(r):
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
51 topic = repo[r].topic()
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
52 if not topic:
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
53 return False
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
54 return matcher(topic)
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
55
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
56 return (subset & mutable).filter(matches)
4059
1914a53fe792 topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents: 4058
diff changeset
57
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
58 s = revset.getset(repo, revset.fullreposet(repo), x)
4095
aabf436c11cb topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents: 4064
diff changeset
59 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
60 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
61
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
62 def matches(r):
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
63 topic = repo[r].topic()
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
64 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
65 return False
4060
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
66 return topic in topics
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
67
54eade86ac31 topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4059
diff changeset
68 return (subset & mutable).filter(matches)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff changeset
69
4717
7b36f9728351 py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4390
diff changeset
70 @revsetpredicate(b'ngtip([branch])')
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
71 def ngtipset(repo, subset, x):
5603
5e71952c8b4a ngtip: make revset help text slightly more descriptive
Sietse Brouwer <sbbrouwer@gmail.com>
parents: 5602
diff changeset
72 """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
73
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
74 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
75 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
76 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
77 # 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
78 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
79 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
80 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
81 # list of length 1
e25394b6d021 ngtip: fix TypeError: make revset from revs, not nodes (issue6405)
Sietse Brouwer <sbbrouwer@gmail.com>
parents: 5507
diff changeset
82 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
83 return subset & revset.baseset(revs)
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1865
diff changeset
84
4717
7b36f9728351 py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4390
diff changeset
85 @revsetpredicate(b'stack()')
1910
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
86 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
87 """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
88
24986e5a537c stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
89 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
90 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
91 run).
09337aae08d4 topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents: 4095
diff changeset
92 """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4717
diff changeset
93 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
94 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
95 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
96 branch = None
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
97 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
98 topic = repo.currenttopic
3156
31493a1b0e39 revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2924
diff changeset
99 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
100 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
101 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
102
5335
e5406605d8f5 topic: document the other safehasattr() compatibility check
Anton Shestakov <av6@dwimlabs.net>
parents: 5334
diff changeset
103 # 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
104 # hg <= 4.8 (e54bfde922f2)
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
105 if util.safehasattr(revset, 'subscriptrelations'):
5332
801bbfc4e2e8 topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents: 5253
diff changeset
106 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
107 """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
108
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
109 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
110 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
111 (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
112 revset-friendly.
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
113 """
4390
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
114 # 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
115 if isinstance(z, tuple):
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
116 a, b = revset.getintrange(
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
117 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
118 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
119 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
120 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
121 else:
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
122 # hg <= 4.9 (431cf2c8c839+13f7a6a4f0db)
4390
312b9e8a4c9c revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents: 4381
diff changeset
123 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
124
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
125 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
126 if not s:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
127 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
128
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
129 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
130 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
131 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
132 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
133
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
134 revs = []
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
135 for r in s:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
136 topic = repo[r].topic()
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
137 if topic:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
138 st = stack.stack(repo, topic=topic)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
139 else:
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
140 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
141 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
142 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
143 # 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
144 # 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
145 continue
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
146 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
147 # 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
148 # 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
149 continue
5f1d0cff514d topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents: 4380
diff changeset
150 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
151 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
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 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
154 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
155
4322
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
156 return subset & revset.baseset(revs)
41f38bf15b4c topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4290
diff changeset
157
5332
801bbfc4e2e8 topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents: 5253
diff changeset
158 revset.subscriptrelations[b'stack'] = stacksubrel
801bbfc4e2e8 topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents: 5253
diff changeset
159 revset.subscriptrelations[b's'] = stacksubrel
4339
0f015fe4f71f topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents: 4323
diff changeset
160
5334
498dc93c3fa0 topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents: 5333
diff changeset
161 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
162 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
163 # 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
164 # hg <= 5.3 (8859de3e83dc)
a828c7a7ace1 topic: use generationssubrel less directly, because it was recently renamed
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
165 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
166 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
167
5334
498dc93c3fa0 topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents: 5333
diff changeset
168 revset.subscriptrelations[b'topic'] = topicsubrel
498dc93c3fa0 topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents: 5333
diff changeset
169 revset.subscriptrelations[b't'] = topicsubrel
5333
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
170
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
171 # 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
172 # hg <= 5.3 (eca82eb9d777)
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
173 if util.safehasattr(revset, 'relations'):
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
174 def stackrel(repo, subset, x, rel, order):
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
175 z = (b'rangeall', None)
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
176 return stacksubrel(repo, subset, x, rel, z, order)
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 revset.relations[b'stack'] = stackrel
028e4ea75456 topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents: 5332
diff changeset
179 revset.relations[b's'] = stackrel