comparison hgext3rd/topic/flow.py @ 5221:af9f40236037 stable

topics: fix auto-publish=abort with servers publishing bare branches Before this change, servers that automatically publish bare branches were detected as "non publishing" and the check for automatic publishing on push assumed nothing was to be published. Now we signal the server-side config to clients via a new capability so that they can adjust their behavior.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 06 Apr 2020 05:05:07 +0200
parents 48b30ff742cb
children 8431bb224862
comparison
equal deleted inserted replaced
5220:151731be7166 5221:af9f40236037
106 _(b'push the changeset as public'))) 106 _(b'push the changeset as public')))
107 extensions.wrapfunction(exchange.pushoperation, '__init__', 107 extensions.wrapfunction(exchange.pushoperation, '__init__',
108 extendpushoperation) 108 extendpushoperation)
109 extensions.wrapfunction(exchange, '_pushdiscoveryphase', wrapphasediscovery) 109 extensions.wrapfunction(exchange, '_pushdiscoveryphase', wrapphasediscovery)
110 exchange.pushdiscoverymapping[b'phase'] = exchange._pushdiscoveryphase 110 exchange.pushdiscoverymapping[b'phase'] = exchange._pushdiscoveryphase
111
112 def replacecheckpublish(orig, pushop):
113 listkeys = exchange.listkeys
114 repo = pushop.repo
115 ui = repo.ui
116 behavior = ui.config(b'experimental', b'auto-publish')
117 if pushop.publish or behavior not in (b'warn', b'confirm', b'abort'):
118 return
119
120 # possible modes are:
121 #
122 # none -> nothing is published on push
123 # all -> everything is published on push
124 # auto -> only changeset without topic are published on push
125 #
126 # Unknown mode is assumed "all" for safety.
127 #
128 # TODO: do a wider brain storming about mode names.
129
130 mode = b'all'
131 remotephases = listkeys(pushop.remote, b'phases')
132 if not remotephases.get(b'publishing', False):
133 mode = b'none'
134 for c in pushop.remote.capabilities():
135 if c.startswith(b'ext-topics-publish'):
136 mode = c.split(b'=', 1)[1]
137 break
138 if mode == b'none':
139 return
140
141 if pushop.revs is None:
142 published = repo.filtered(b'served').revs(b'not public()')
143 else:
144 published = repo.revs(b'::%ln - public()', pushop.revs)
145 if mode == b'auto':
146 published = repo.revs(b'%ld::(%ld - topic())', published, published)
147 if published:
148 if behavior == b'warn':
149 ui.warn(
150 _(b'%i changesets about to be published\n') % len(published)
151 )
152 elif behavior == b'confirm':
153 if ui.promptchoice(
154 _(b'push and publish %i changesets (yn)?$$ &Yes $$ &No')
155 % len(published)
156 ):
157 raise error.Abort(_(b'user quit'))
158 elif behavior == b'abort':
159 msg = _(b'push would publish %i changesets') % len(published)
160 hint = _(
161 b"use --publish or adjust 'experimental.auto-publish'"
162 b" config"
163 )
164 raise error.Abort(msg, hint=hint)