Mercurial > evolve
annotate hgext3rd/topic/revset.py @ 6935:954d7ea5cd67 stable
stack: when stack base is obsolete, pick any successor, even if at random
There are situations when s0 is obsolete and we also cannot pick just one
successor for it to use in stack. In such a case, let's pick the "latest"
successor from the first set.
We're assuming that obsutil.successorssets() returns data in the same order (it
should, since it makes sure to sort data internally). Keeping that in mind,
while the successor picked for s0 by this code is not based on any sort of
sophisticated logic, it should nonetheless be the same every time.
This patch is probably not going to completely break anything that was
previously working fine, because the previous behavior was to just abort with
an exception.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Sat, 16 Nov 2024 17:01:02 +0400 |
parents | 3d16c9a8cf3a |
children | 8a51498b9976 |
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 |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
24 @revsetpredicate(b'topicnamespace([string or set])') |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
25 def topicnamespaceset(repo, subset, x): |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
26 """All changesets with the specified topic namespace or the topic |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
27 namespaces of the given changesets. Without the argument, all changesets |
6487
963471ebe26a
topic: make topic namespace use string "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents:
6415
diff
changeset
|
28 with any non-empty topic namespace. |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
29 |
6415
ff103a813110
topic: fix strange indentation in revset docstrings
Anton Shestakov <av6@dwimlabs.net>
parents:
6297
diff
changeset
|
30 Pattern matching is supported for `string`. See |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
31 :hg:`help revisions.patterns`. |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
32 """ |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
33 args = revset.getargs(x, 0, 1, b'topicnamespace takes one or no arguments') |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
34 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
35 mutable = revset._notpublic(repo, revset.fullreposet(repo), ()) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
36 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
37 if not args: |
6533
3d16c9a8cf3a
topic: update topic namespace revset to use "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents:
6487
diff
changeset
|
38 return (subset & mutable).filter(lambda r: repo[r].topic_namespace() != b'none') |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
39 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
40 try: |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
41 tns = getstringstrict(args[0], b'') |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
42 except error.ParseError: |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
43 # not a string, but another revset |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
44 pass |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
45 else: |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
46 kind, pattern, matcher = stringutil.stringmatcher(tns) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
47 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
48 if tns.startswith(b'literal:') and pattern not in repo.topic_namespaces: |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
49 raise error.RepoLookupError(b"topic namespace '%s' does not exist" % pattern) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
50 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
51 def matches(r): |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
52 tns = repo[r].topic_namespace() |
6533
3d16c9a8cf3a
topic: update topic namespace revset to use "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents:
6487
diff
changeset
|
53 if tns == b'none': |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
54 return False |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
55 return matcher(tns) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
56 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
57 return (subset & mutable).filter(matches) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
58 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
59 s = revset.getset(repo, revset.fullreposet(repo), x) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
60 namespaces = {repo[r].topic_namespace() for r in s} |
6533
3d16c9a8cf3a
topic: update topic namespace revset to use "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents:
6487
diff
changeset
|
61 namespaces.discard(b'none') |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
62 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
63 def matches(r): |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
64 tns = repo[r].topic_namespace() |
6533
3d16c9a8cf3a
topic: update topic namespace revset to use "none" as the default/empty value
Anton Shestakov <av6@dwimlabs.net>
parents:
6487
diff
changeset
|
65 if tns == b'none': |
6261
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
66 return False |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
67 return tns in namespaces |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
68 |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
69 return (subset & mutable).filter(matches) |
a2491c578d2b
topic: namespace revset predicate
Anton Shestakov <av6@dwimlabs.net>
parents:
6222
diff
changeset
|
70 |
4717
7b36f9728351
py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4390
diff
changeset
|
71 @revsetpredicate(b'topic([string or set])') |
1843
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
72 def topicset(repo, subset, x): |
4060
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
73 """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
|
74 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
|
75 |
6415
ff103a813110
topic: fix strange indentation in revset docstrings
Anton Shestakov <av6@dwimlabs.net>
parents:
6297
diff
changeset
|
76 Pattern matching is supported for `string`. See |
6222
6020b7e92a86
topic: update topic() revset docstring, mention hg help
Anton Shestakov <av6@dwimlabs.net>
parents:
6221
diff
changeset
|
77 :hg:`help revisions.patterns`. |
1843
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
78 """ |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4717
diff
changeset
|
79 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
|
80 |
054d288680b4
topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
3613
diff
changeset
|
81 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
|
82 |
054d288680b4
topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
3613
diff
changeset
|
83 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
|
84 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
|
85 |
90783c9c8609
topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4057
diff
changeset
|
86 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
|
87 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
|
88 except error.ParseError: |
90783c9c8609
topic: prepare to handle non-string arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4057
diff
changeset
|
89 # not a string, but another revset |
4060
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
90 pass |
4057
054d288680b4
topic: return result early if there are no arguments to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
3613
diff
changeset
|
91 else: |
6221
a1a9e6e43d4c
topic: drop compatibility with hg 4.6 (f99d64e8a4e4)
Anton Shestakov <av6@dwimlabs.net>
parents:
6220
diff
changeset
|
92 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
|
93 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4717
diff
changeset
|
94 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
|
95 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
|
96 |
4059
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
97 def matches(r): |
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
98 topic = repo[r].topic() |
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
99 if not topic: |
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
100 return False |
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
101 return matcher(topic) |
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
102 |
4095
aabf436c11cb
topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents:
4064
diff
changeset
|
103 return (subset & mutable).filter(matches) |
4059
1914a53fe792
topic: handle string argument to topic() revset earlier
Anton Shestakov <av6@dwimlabs.net>
parents:
4058
diff
changeset
|
104 |
4060
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
105 s = revset.getset(repo, revset.fullreposet(repo), x) |
4095
aabf436c11cb
topic: refactor revset.py slightly
Anton Shestakov <av6@dwimlabs.net>
parents:
4064
diff
changeset
|
106 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
|
107 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
|
108 |
4060
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
109 def matches(r): |
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
110 topic = repo[r].topic() |
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
111 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
|
112 return False |
4060
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
113 return topic in topics |
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
114 |
54eade86ac31
topic: handle revsets passed to topic() revset
Anton Shestakov <av6@dwimlabs.net>
parents:
4059
diff
changeset
|
115 return (subset & mutable).filter(matches) |
1843
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 |
4717
7b36f9728351
py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4390
diff
changeset
|
117 @revsetpredicate(b'ngtip([branch])') |
1870
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1865
diff
changeset
|
118 def ngtipset(repo, subset, x): |
5603
5e71952c8b4a
ngtip: make revset help text slightly more descriptive
Sietse Brouwer <sbbrouwer@gmail.com>
parents:
5602
diff
changeset
|
119 """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
|
120 |
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1865
diff
changeset
|
121 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
|
122 """ |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4717
diff
changeset
|
123 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
|
124 # 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
|
125 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
|
126 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
|
127 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
|
128 # list of length 1 |
e25394b6d021
ngtip: fix TypeError: make revset from revs, not nodes (issue6405)
Sietse Brouwer <sbbrouwer@gmail.com>
parents:
5507
diff
changeset
|
129 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
|
130 return subset & revset.baseset(revs) |
1870
8dd5200b4086
topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1865
diff
changeset
|
131 |
4717
7b36f9728351
py3: use bytes for revset predicate registrations
Martin von Zweigbergk <martinvonz@google.com>
parents:
4390
diff
changeset
|
132 @revsetpredicate(b'stack()') |
1910
24986e5a537c
stack: add a 'stack()' revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1901
diff
changeset
|
133 def stackset(repo, subset, x): |
6297
0ef3c127cf28
doc: fix typo in revset/stack() help text
pacien <pacien.trangirard@pacien.net>
parents:
6261
diff
changeset
|
134 """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
|
135 |
6297
0ef3c127cf28
doc: fix typo in revset/stack() help text
pacien <pacien.trangirard@pacien.net>
parents:
6261
diff
changeset
|
136 This is roughly equivalent to 'topic(.) - obsolete()' with a sorting moving |
0ef3c127cf28
doc: fix typo in revset/stack() help text
pacien <pacien.trangirard@pacien.net>
parents:
6261
diff
changeset
|
137 unstable changeset after their future parent (as if evolve were already |
4290
09337aae08d4
topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents:
4095
diff
changeset
|
138 run). |
09337aae08d4
topic: make revset argument messages be similar to such messages in core
Anton Shestakov <av6@dwimlabs.net>
parents:
4095
diff
changeset
|
139 """ |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4717
diff
changeset
|
140 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
|
141 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
|
142 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
|
143 branch = None |
3156
31493a1b0e39
revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2924
diff
changeset
|
144 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
|
145 topic = repo.currenttopic |
3156
31493a1b0e39
revset: clean up some messy logic
Pulkit Goyal <7895pulkit@gmail.com>
parents:
2924
diff
changeset
|
146 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
|
147 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
|
148 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
|
149 |
5335
e5406605d8f5
topic: document the other safehasattr() compatibility check
Anton Shestakov <av6@dwimlabs.net>
parents:
5334
diff
changeset
|
150 # 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
|
151 # hg <= 4.8 (e54bfde922f2) |
4322
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
152 if util.safehasattr(revset, 'subscriptrelations'): |
5332
801bbfc4e2e8
topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents:
5253
diff
changeset
|
153 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
|
154 """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
|
155 |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
156 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
|
157 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
|
158 (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
|
159 revset-friendly. |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
160 """ |
4390
312b9e8a4c9c
revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents:
4381
diff
changeset
|
161 # 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
|
162 if isinstance(z, tuple): |
312b9e8a4c9c
revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents:
4381
diff
changeset
|
163 a, b = revset.getintrange( |
312b9e8a4c9c
revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents:
4381
diff
changeset
|
164 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
|
165 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
|
166 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
|
167 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
|
168 else: |
5193
a4d081923c81
compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
169 # hg <= 4.9 (431cf2c8c839+13f7a6a4f0db) |
4390
312b9e8a4c9c
revset: use getintrange() to parse relation subscript
Anton Shestakov <av6@dwimlabs.net>
parents:
4381
diff
changeset
|
170 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
|
171 |
4322
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
172 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
|
173 if not s: |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
174 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
|
175 |
5f1d0cff514d
topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents:
4380
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 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
|
180 |
4322
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
181 revs = [] |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
182 for r in s: |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
183 topic = repo[r].topic() |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
184 if topic: |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
185 st = stack.stack(repo, topic=topic) |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
186 else: |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
187 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
|
188 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
|
189 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
|
190 # 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
|
191 # 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
|
192 continue |
5f1d0cff514d
topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents:
4380
diff
changeset
|
193 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
|
194 # 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
|
195 # 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
|
196 continue |
5f1d0cff514d
topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents:
4380
diff
changeset
|
197 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
|
198 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
|
199 continue |
5f1d0cff514d
topic: make ranges work in revset relations like 'foo#stack[1:2]'
Anton Shestakov <av6@dwimlabs.net>
parents:
4380
diff
changeset
|
200 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
|
201 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
|
202 |
4322
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
203 return subset & revset.baseset(revs) |
41f38bf15b4c
topic: make revsets like 'foo#stack[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4290
diff
changeset
|
204 |
5332
801bbfc4e2e8
topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents:
5253
diff
changeset
|
205 revset.subscriptrelations[b'stack'] = stacksubrel |
801bbfc4e2e8
topic: rename stackrel() to stacksubrel()
Anton Shestakov <av6@dwimlabs.net>
parents:
5253
diff
changeset
|
206 revset.subscriptrelations[b's'] = stacksubrel |
4339
0f015fe4f71f
topic: make revsets like 'foo#topic[0]' work
Anton Shestakov <av6@dwimlabs.net>
parents:
4323
diff
changeset
|
207 |
5334
498dc93c3fa0
topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents:
5333
diff
changeset
|
208 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
|
209 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
|
210 # 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
|
211 # hg <= 5.3 (8859de3e83dc) |
a828c7a7ace1
topic: use generationssubrel less directly, because it was recently renamed
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
212 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
|
213 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
|
214 |
5334
498dc93c3fa0
topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents:
5333
diff
changeset
|
215 revset.subscriptrelations[b'topic'] = topicsubrel |
498dc93c3fa0
topic: rename topicrel() to topicsubrel() while at it
Anton Shestakov <av6@dwimlabs.net>
parents:
5333
diff
changeset
|
216 revset.subscriptrelations[b't'] = topicsubrel |
5333
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
217 |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
218 # 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
|
219 # hg <= 5.3 (eca82eb9d777) |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
220 if util.safehasattr(revset, 'relations'): |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
221 def stackrel(repo, subset, x, rel, order): |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
222 z = (b'rangeall', None) |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
223 return stacksubrel(repo, subset, x, rel, z, order) |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
224 |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
225 revset.relations[b'stack'] = stackrel |
028e4ea75456
topic: support foo#stack syntax
Anton Shestakov <av6@dwimlabs.net>
parents:
5332
diff
changeset
|
226 revset.relations[b's'] = stackrel |