hgext3rd/evolve/safeguard.py
author Anton Shestakov <av6@dwimlabs.net>
Sat, 01 Dec 2018 16:07:55 +0800
changeset 4286 f9a9d2fe4af5
parent 4246 2d9902f0ff17
child 4287 b7b6a4524ef7
permissions -rw-r--r--
safeguard: the new default for auto-publish is 'publish'
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Code dedicated to adding various "safeguard" around evolution
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# Some of these will be pollished and upstream when mature. Some other will be
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
# replaced by better alternative later.
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
#
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# Copyright 2017 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
#
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     8
# This software may be used and distributed according to the terms of the
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     9
# GNU General Public License version 2 or any later version.
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    10
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    11
from mercurial import error
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    12
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    13
from mercurial.i18n import _
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    14
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    15
from . import exthelper
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    16
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
eh = exthelper.exthelper()
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
    19
eh.configitem('experimental', 'auto-publish')
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
    20
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
@eh.reposetup
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    22
def setuppublishprevention(ui, repo):
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    23
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    24
    class noautopublishrepo(repo.__class__):
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    25
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    26
        def checkpush(self, pushop):
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    27
            super(noautopublishrepo, self).checkpush(pushop)
4286
f9a9d2fe4af5 safeguard: the new default for auto-publish is 'publish'
Anton Shestakov <av6@dwimlabs.net>
parents: 4246
diff changeset
    28
            behavior = self.ui.config('experimental', 'auto-publish', 'publish')
4246
2d9902f0ff17 safeguard: allow push to succeed (and without warning) with --publish
Anton Shestakov <av6@dwimlabs.net>
parents: 4244
diff changeset
    29
            nocheck = behavior not in ('warn', 'abort')
2d9902f0ff17 safeguard: allow push to succeed (and without warning) with --publish
Anton Shestakov <av6@dwimlabs.net>
parents: 4244
diff changeset
    30
            if nocheck or getattr(pushop, 'publish', False):
4244
0e266166457f safeguard: check auto-publish value before sending listkeys command
Anton Shestakov <av6@dwimlabs.net>
parents: 3647
diff changeset
    31
                return
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    32
            remotephases = pushop.remote.listkeys('phases')
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    33
            publishing = remotephases.get('publishing', False)
4244
0e266166457f safeguard: check auto-publish value before sending listkeys command
Anton Shestakov <av6@dwimlabs.net>
parents: 3647
diff changeset
    34
            if publishing:
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    35
                if pushop.revs is None:
3647
626c5fa0ef07 safeguard: use self instead of repo in noautopublishrepo.checkpush()
Anton Shestakov <av6@dwimlabs.net>
parents: 3080
diff changeset
    36
                    published = self.filtered('served').revs("not public()")
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    37
                else:
3647
626c5fa0ef07 safeguard: use self instead of repo in noautopublishrepo.checkpush()
Anton Shestakov <av6@dwimlabs.net>
parents: 3080
diff changeset
    38
                    published = self.revs("::%ln - public()", pushop.revs)
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    39
                if published:
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    40
                    if behavior == 'warn':
3647
626c5fa0ef07 safeguard: use self instead of repo in noautopublishrepo.checkpush()
Anton Shestakov <av6@dwimlabs.net>
parents: 3080
diff changeset
    41
                        self.ui.warn(_('%i changesets about to be published\n') % len(published))
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    42
                    elif behavior == 'abort':
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    43
                        msg = _('push would publish 1 changesets')
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    44
                        hint = _("behavior controlled by 'experimental.auto-publish' config")
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    45
                        raise error.Abort(msg, hint=hint)
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    46
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    47
    repo.__class__ = noautopublishrepo