Mercurial > evolve
annotate hgext3rd/topic/flow.py @ 6935:954d7ea5cd67 stable tip
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 | 9638df99836f |
children | b88cd2f549a8 |
rev | line source |
---|---|
3157
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
1 from __future__ import absolute_import |
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
2 |
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
3 from mercurial import ( |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
4 commands, |
3157
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
5 error, |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
6 exchange, |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
7 extensions, |
3157
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
8 node, |
3158
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
9 phases, |
5204
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
10 util, |
3157
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
11 ) |
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
12 |
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
13 from mercurial.i18n import _ |
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
14 |
4743
92e3db149d7d
py3: call branchmap.items() on py3 and continue to call iteritems() on py2
Martin von Zweigbergk <martinvonz@google.com>
parents:
4647
diff
changeset
|
15 from . import ( |
92e3db149d7d
py3: call branchmap.items() on py3 and continue to call iteritems() on py2
Martin von Zweigbergk <martinvonz@google.com>
parents:
4647
diff
changeset
|
16 compat, |
92e3db149d7d
py3: call branchmap.items() on py3 and continue to call iteritems() on py2
Martin von Zweigbergk <martinvonz@google.com>
parents:
4647
diff
changeset
|
17 ) |
92e3db149d7d
py3: call branchmap.items() on py3 and continue to call iteritems() on py2
Martin von Zweigbergk <martinvonz@google.com>
parents:
4647
diff
changeset
|
18 |
3157
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
19 def enforcesinglehead(repo, tr): |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
20 branchmap = repo.filtered(b'visible').branchmap() |
4743
92e3db149d7d
py3: call branchmap.items() on py3 and continue to call iteritems() on py2
Martin von Zweigbergk <martinvonz@google.com>
parents:
4647
diff
changeset
|
21 for name, heads in compat.branchmapitems(branchmap): |
3157
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
22 if len(heads) > 1: |
f286eefbd20d
topic: add an option to enforce a single head per name in a repository
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff
changeset
|
23 hexs = [node.short(n) for n in heads] |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
24 raise error.Abort(_(b'%d heads on "%s"') % (len(heads), name), |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
25 hint=(b', '.join(hexs))) |
3158
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
26 |
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
27 def publishbarebranch(repo, tr): |
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
28 """Publish changeset without topic""" |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
29 if b'node' not in tr.hookargs: # no new node |
3158
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
30 return |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
31 startnode = node.bin(tr.hookargs[b'node']) |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
32 topublish = repo.revs(b'not public() and (%n:) - hidden() - topic()', startnode) |
3158
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
33 if topublish: |
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
34 cl = repo.changelog |
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
35 nodes = [cl.node(r) for r in topublish] |
678a9802c56b
topic: add an option to automatically publish topic-less changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3157
diff
changeset
|
36 repo._phasecache.advanceboundary(repo, tr, phases.public, nodes) |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
37 |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
38 def rejectuntopicedchangeset(repo, tr): |
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
39 """Reject the push if there are changeset without topic""" |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
40 if b'node' not in tr.hookargs: # no new revs |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
41 return |
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
42 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
43 startnode = node.bin(tr.hookargs[b'node']) |
3282
3675fe74521d
topic: use 'hookargs' over 'tr.changes' for flow control
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3235
diff
changeset
|
44 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
45 mode = repo.ui.config(b'experimental', b'topic-mode.server', b'ignore') |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
46 |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
47 untopiced = repo.revs(b'not public() and (%n:) - hidden() - topic()', startnode) |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
48 if untopiced: |
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
49 num = len(untopiced) |
6742
0592ae24c470
topic: get changeset node using the designated functions
Anton Shestakov <av6@dwimlabs.net>
parents:
6322
diff
changeset
|
50 cl = repo.changelog |
0592ae24c470
topic: get changeset node using the designated functions
Anton Shestakov <av6@dwimlabs.net>
parents:
6322
diff
changeset
|
51 fnode = node.short(cl.node(untopiced.first())) |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
52 if num == 1: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
53 msg = _(b"%s") % fnode |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
54 else: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
55 msg = _(b"%s and %d more") % (fnode, num - 1) |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
56 if mode == b'warning': |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
57 fullmsg = _(b"pushed draft changeset without topic: %s\n") |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
58 repo.ui.warn(fullmsg % msg) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
59 elif mode == b'enforce': |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
60 fullmsg = _(b"rejecting draft changesets: %s") |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
61 raise error.Abort(fullmsg % msg) |
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
62 else: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
63 repo.ui.warn(_(b"unknown 'topic-mode.server': %s\n" % mode)) |
3235
8a772f0c54d9
topics: add a config to reject draft changeset without topic on a server
Pulkit Goyal <7895pulkit@gmail.com>
parents:
3226
diff
changeset
|
64 |
4647
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
65 def reject_publish(repo, tr): |
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
66 """prevent a transaction to be publish anything""" |
5204
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
67 if util.safehasattr(tr.changes[b'phases'], 'items'): |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
68 # hg <= 5.3 (fdc802f29b2c) |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
69 published = { |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
70 r for r, (o, n) in tr.changes[b'phases'].items() |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
71 if n == phases.public |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
72 } |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
73 else: |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
74 revranges = [ |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
75 r for r, (o, n) in tr.changes[b'phases'] |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
76 if n == phases.public |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
77 ] |
d7f87c7cb1f0
topic: compat with tr.changes[b'phases'], it's now a list
Anton Shestakov <av6@dwimlabs.net>
parents:
5193
diff
changeset
|
78 published = {r for revrange in revranges for r in revrange} |
4647
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
79 if published: |
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
80 r = min(published) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
81 msg = b"rejecting publishing of changeset %s" % repo[r] |
4647
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
82 if len(published) > 1: |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
83 msg += b' and %d others' % (len(published) - 1) |
4647
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
84 raise error.Abort(msg) |
228caeb8b7af
topic: add a simple option to reject publishing
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4263
diff
changeset
|
85 |
6743
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
86 def reject_csets_with_tns(repo, tr): |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
87 """Reject the push if there are changesets with any topic namespace""" |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
88 if b'node' not in tr.hookargs: # no new revs |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
89 return |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
90 |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
91 reject = repo.ui.config(b'experimental', b'tns-reject-push') |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
92 if not reject: |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
93 return |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
94 |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
95 startnode = node.bin(tr.hookargs[b'node']) |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
96 repo = repo.unfiltered() |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
97 with_tns = repo.revs(b'not public() and extra("topic-namespace") and (%n:) - hidden()', startnode) |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
98 if with_tns: |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
99 num = len(with_tns) |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
100 cl = repo.changelog |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
101 fnode = node.short(cl.node(with_tns.first())) |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
102 if num == 1: |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
103 msg = _(b"%s") % fnode |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
104 else: |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
105 msg = _(b"%s and %d more") % (fnode, num - 1) |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
106 fullmsg = _(b"rejecting draft changesets with topic namespace: %s") |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
107 raise error.Abort(fullmsg % msg) |
ab60707314e9
topic: new experimental.tns-reject-push config to refuse changesets with tns
Anton Shestakov <av6@dwimlabs.net>
parents:
6742
diff
changeset
|
108 |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
109 def wrappush(orig, repo, remote, *args, **kwargs): |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
110 """interpret the --publish flag and pass it to the push operation""" |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
111 newargs = kwargs.copy() |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
112 if kwargs.pop('publish', False): |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
113 opargs = kwargs.get('opargs') |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
114 if opargs is None: |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
115 opargs = {} |
4808
14c12df16ab5
python3: add raw prefix to edge-cases kwargs-like objects
Raphaël Gomès <rgomes@octobus.net>
parents:
4743
diff
changeset
|
116 newargs[r'opargs'] = opargs.copy() |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
117 newargs[r'opargs'][b'publish'] = True |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
118 return orig(repo, remote, *args, **newargs) |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
119 |
3204
a342c454ccf3
pusoperation: wrap pushoperation __init__ directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3159
diff
changeset
|
120 def extendpushoperation(orig, self, *args, **kwargs): |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
121 publish = kwargs.pop('publish', False) |
3204
a342c454ccf3
pusoperation: wrap pushoperation __init__ directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3159
diff
changeset
|
122 orig(self, *args, **kwargs) |
a342c454ccf3
pusoperation: wrap pushoperation __init__ directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3159
diff
changeset
|
123 self.publish = publish |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
124 |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
125 def wrapphasediscovery(orig, pushop): |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
126 orig(pushop) |
3226
5dfe4e5cf9e4
topic: use more protective code to access publishing code
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3204
diff
changeset
|
127 if getattr(pushop, 'publish', False): |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
128 if not pushop.remotephases.publishing: |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
129 unfi = pushop.repo.unfiltered() |
6787
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
130 if util.safehasattr(pushop.remotephases, 'draftroots'): |
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
131 # hg <= 6.7 (22cc679a7312) |
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
132 droots = pushop.remotephases.draftroots |
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
133 revset = b'%ln and (not public() or %ln::)' |
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
134 else: |
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
135 droots = pushop.remotephases.draft_roots |
9638df99836f
topic: compatibility for RemotePhasesSummary.draft_roots
Anton Shestakov <av6@dwimlabs.net>
parents:
6743
diff
changeset
|
136 revset = b'%ln and (not public() or %ld::)' |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
137 future = list(unfi.set(revset, pushop.futureheads, droots)) |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
138 pushop.outdatedphases = future |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
139 |
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
140 def installpushflag(ui): |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
141 entry = extensions.wrapcommand(commands.table, b'push', wrappush) |
5193
a4d081923c81
compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
142 if not any(opt for opt in entry[1] if opt[1] == b'publish'): |
a4d081923c81
compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents:
4814
diff
changeset
|
143 # hg <= 4.8 (9b8d1ad851f8) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
144 entry[1].append((b'', b'publish', False, |
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
145 _(b'push the changeset as public'))) |
3204
a342c454ccf3
pusoperation: wrap pushoperation __init__ directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3159
diff
changeset
|
146 extensions.wrapfunction(exchange.pushoperation, '__init__', |
a342c454ccf3
pusoperation: wrap pushoperation __init__ directly
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3159
diff
changeset
|
147 extendpushoperation) |
3159
90515d0bfb08
push: add a --publish flag
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
3158
diff
changeset
|
148 extensions.wrapfunction(exchange, '_pushdiscoveryphase', wrapphasediscovery) |
4814
48b30ff742cb
python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents:
4808
diff
changeset
|
149 exchange.pushdiscoverymapping[b'phase'] = exchange._pushdiscoveryphase |
5221
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
150 |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
151 def replacecheckpublish(orig, pushop): |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
152 listkeys = exchange.listkeys |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
153 repo = pushop.repo |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
154 ui = repo.ui |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
155 behavior = ui.config(b'experimental', b'auto-publish') |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
156 if pushop.publish or behavior not in (b'warn', b'confirm', b'abort'): |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
157 return |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
158 |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
159 # possible modes are: |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
160 # |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
161 # none -> nothing is published on push |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
162 # all -> everything is published on push |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
163 # auto -> only changeset without topic are published on push |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
164 # |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
165 # Unknown mode is assumed "all" for safety. |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
166 # |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
167 # TODO: do a wider brain storming about mode names. |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
168 |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
169 mode = b'all' |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
170 remotephases = listkeys(pushop.remote, b'phases') |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
171 if not remotephases.get(b'publishing', False): |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
172 mode = b'none' |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
173 for c in pushop.remote.capabilities(): |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
174 if c.startswith(b'ext-topics-publish'): |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
175 mode = c.split(b'=', 1)[1] |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
176 break |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
177 if mode == b'none': |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
178 return |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
179 |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
180 if pushop.revs is None: |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
181 published = repo.filtered(b'served').revs(b'not public()') |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
182 else: |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
183 published = repo.revs(b'::%ln - public()', pushop.revs) |
5932
fe25ec8f0124
topic: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents:
5230
diff
changeset
|
184 # we want to use pushop.revs in the revset even if they themselves are |
fe25ec8f0124
topic: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents:
5230
diff
changeset
|
185 # secret, but we don't want to have anything that the server won't see |
fe25ec8f0124
topic: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents:
5230
diff
changeset
|
186 # in the result of this expression |
fe25ec8f0124
topic: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents:
5230
diff
changeset
|
187 published &= repo.filtered(b'served') |
fe25ec8f0124
topic: use "served" repo filter to guess what the server will publish
Anton Shestakov <av6@dwimlabs.net>
parents:
5230
diff
changeset
|
188 |
5221
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
189 if mode == b'auto': |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
190 published = repo.revs(b'%ld::(%ld - topic())', published, published) |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
191 if published: |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
192 if behavior == b'warn': |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
193 ui.warn( |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
194 _(b'%i changesets about to be published\n') % len(published) |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
195 ) |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
196 elif behavior == b'confirm': |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
197 if ui.promptchoice( |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
198 _(b'push and publish %i changesets (yn)?$$ &Yes $$ &No') |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
199 % len(published) |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
200 ): |
6322
57f9cdbf6a99
topic: use compat.CanceledError for user quit situations
Anton Shestakov <av6@dwimlabs.net>
parents:
5932
diff
changeset
|
201 raise compat.CanceledError(_(b'user quit')) |
5221
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
202 elif behavior == b'abort': |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
203 msg = _(b'push would publish %i changesets') % len(published) |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
204 hint = _( |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
205 b"use --publish or adjust 'experimental.auto-publish'" |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
206 b" config" |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
207 ) |
af9f40236037
topics: fix auto-publish=abort with servers publishing bare branches
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
4814
diff
changeset
|
208 raise error.Abort(msg, hint=hint) |