diff -r bf37ba1c80ee -r 8431bb224862 hgext3rd/topic/flow.py --- a/hgext3rd/topic/flow.py Sat Mar 21 15:04:18 2020 +0100 +++ b/hgext3rd/topic/flow.py Tue Apr 07 19:33:40 2020 +0200 @@ -118,3 +118,57 @@ extendpushoperation) extensions.wrapfunction(exchange, '_pushdiscoveryphase', wrapphasediscovery) exchange.pushdiscoverymapping[b'phase'] = exchange._pushdiscoveryphase + +def replacecheckpublish(orig, pushop): + listkeys = exchange.listkeys + repo = pushop.repo + ui = repo.ui + behavior = ui.config(b'experimental', b'auto-publish') + if pushop.publish or behavior not in (b'warn', b'confirm', b'abort'): + return + + # possible modes are: + # + # none -> nothing is published on push + # all -> everything is published on push + # auto -> only changeset without topic are published on push + # + # Unknown mode is assumed "all" for safety. + # + # TODO: do a wider brain storming about mode names. + + mode = b'all' + remotephases = listkeys(pushop.remote, b'phases') + if not remotephases.get(b'publishing', False): + mode = b'none' + for c in pushop.remote.capabilities(): + if c.startswith(b'ext-topics-publish'): + mode = c.split(b'=', 1)[1] + break + if mode == b'none': + return + + if pushop.revs is None: + published = repo.filtered(b'served').revs(b'not public()') + else: + published = repo.revs(b'::%ln - public()', pushop.revs) + if mode == b'auto': + published = repo.revs(b'%ld::(%ld - topic())', published, published) + if published: + if behavior == b'warn': + ui.warn( + _(b'%i changesets about to be published\n') % len(published) + ) + elif behavior == b'confirm': + if ui.promptchoice( + _(b'push and publish %i changesets (yn)?$$ &Yes $$ &No') + % len(published) + ): + raise error.Abort(_(b'user quit')) + elif behavior == b'abort': + msg = _(b'push would publish %i changesets') % len(published) + hint = _( + b"use --publish or adjust 'experimental.auto-publish'" + b" config" + ) + raise error.Abort(msg, hint=hint)