Mercurial > evolve
annotate hgext3rd/topic/revset.py @ 5633:4ab2f602beb3 mercurial-5.3
tests: back out changeset 028e4ea75456
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Sat, 31 Oct 2020 18:48:57 +0800 |
parents | f27ef537bf83 |
children | 7847e0800263 |
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 |