Mercurial > public > mercurial-scm > hg-stable
diff mercurial/exchange.py @ 40801:33d30fb1e4ae
push: config option to control behavior when pushing to a publishing server
Pushing to a publishing server by mistake can lead to a difficult situation to
solve because evolution doesn't work on public changesets. This new
experimental config tries to help avoiding unintentionally (or at least being
aware of) pushing to publishing remotes.
`hg push --publish` can be used to make push succeed even when auto-publish is
set to 'abort'.
author | Anton Shestakov <av6@dwimlabs.net> |
---|---|
date | Mon, 05 Nov 2018 13:52:19 +0800 |
parents | 9b8d1ad851f8 |
children | 876494fd967d |
line wrap: on
line diff
--- a/mercurial/exchange.py Fri Nov 30 17:42:55 2018 +0300 +++ b/mercurial/exchange.py Mon Nov 05 13:52:19 2018 +0800 @@ -334,6 +334,34 @@ heads = cl.heads() return discovery.outgoing(repo, common, heads) +def _checkpublish(pushop): + repo = pushop.repo + ui = repo.ui + behavior = ui.config('experimental', 'auto-publish') + if pushop.publish or behavior not in ('warn', 'confirm', 'abort'): + return + remotephases = listkeys(pushop.remote, 'phases') + if not remotephases.get('publishing', False): + return + + if pushop.revs is None: + published = repo.filtered('served').revs('not public()') + else: + published = repo.revs('::%ln - public()', pushop.revs) + if published: + if behavior == 'warn': + ui.warn(_('%i changesets about to be published\n') + % len(published)) + elif behavior == 'confirm': + if ui.promptchoice(_('push and publish %i changesets (yn)?' + '$$ &Yes $$ &No') % len(published)): + raise error.Abort(_('user quit')) + elif behavior == 'abort': + msg = _('push would publish %i changesets') % len(published) + hint = _("use --publish or adjust 'experimental.auto-publish'" + " config") + raise error.Abort(msg, hint=hint) + def _forcebundle1(op): """return true if a pull/push must use bundle1 @@ -533,6 +561,7 @@ lock or util.nullcontextmanager(), \ pushop.trmanager or util.nullcontextmanager(): pushop.repo.checkpush(pushop) + _checkpublish(pushop) _pushdiscovery(pushop) if not _forcebundle1(pushop): _pushbundle2(pushop)