Mercurial > evolve
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 |
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 |