hgext3rd/evolve/safeguard.py
author Anton Shestakov <av6@dwimlabs.net>
Fri, 08 May 2020 18:45:49 +0800
branchstable
changeset 5355 0b5d1b0b3336
parent 5288 5cfec61b872b
permissions -rw-r--r--
packaging: prepare evolve version 10.0.0

# Code dedicated to adding various "safeguard" around evolution
#
# Some of these will be pollished and upstream when mature. Some other will be
# replaced by better alternative later.
#
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.

from mercurial.i18n import _

from mercurial import (
    configitems,
    error,
)

from . import exthelper

eh = exthelper.exthelper()

# hg <= 4.8 (33d30fb1e4ae)
if b'auto-publish' not in configitems.coreitems.get(b'experimental', {}):

    eh.configitem(b'experimental', b'auto-publish', b'publish')

    def _checkpublish(pushop):
        repo = pushop.repo
        ui = repo.ui
        behavior = ui.config(b'experimental', b'auto-publish')
        nocheck = behavior not in (b'warn', b'abort')
        if nocheck or getattr(pushop, 'publish', False):
            return
        remotephases = pushop.remote.listkeys(b'phases')
        publishing = remotephases.get(b'publishing', False)
        if publishing:
            if pushop.revs is None:
                published = repo.filtered(b'served').revs(b"not public()")
            else:
                published = repo.revs(b"::%ln - public()", pushop.revs)
            if published:
                if behavior == b'warn':
                    ui.warn(_(b'%i changesets about to be published\n')
                            % len(published))
                elif behavior == b'abort':
                    msg = _(b'push would publish 1 changesets')
                    hint = _(b"behavior controlled by "
                             b"'experimental.auto-publish' config")
                    raise error.Abort(msg, hint=hint)

    @eh.reposetup
    def setuppublishprevention(ui, repo):

        class noautopublishrepo(repo.__class__):

            def checkpush(self, pushop):
                super(noautopublishrepo, self).checkpush(pushop)
                _checkpublish(pushop)

        repo.__class__ = noautopublishrepo