hgext3rd/evolve/safeguard.py
author Anton Shestakov <av6@dwimlabs.net>
Thu, 07 May 2020 01:29:24 +0200
changeset 5348 a9f9edb168a1
parent 5288 5cfec61b872b
permissions -rw-r--r--
obslog: add a --origin flag to show predecessors instead of successors This flag will be turned on by default in the next changeset.
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
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    11
from mercurial.i18n import _
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    12
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    13
from mercurial import (
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    14
    configitems,
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    15
    error,
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    16
)
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    17
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    18
from . import exthelper
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    19
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    20
eh = exthelper.exthelper()
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
5277
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    22
# hg <= 4.8 (33d30fb1e4ae)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4324
diff changeset
    23
if b'auto-publish' not in configitems.coreitems.get(b'experimental', {}):
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    24
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4324
diff changeset
    25
    eh.configitem(b'experimental', b'auto-publish', b'publish')
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 2286
diff changeset
    26
5277
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    27
    def _checkpublish(pushop):
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    28
        repo = pushop.repo
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    29
        ui = repo.ui
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    30
        behavior = ui.config(b'experimental', b'auto-publish')
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    31
        nocheck = behavior not in (b'warn', b'abort')
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    32
        if nocheck or getattr(pushop, 'publish', False):
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    33
            return
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    34
        remotephases = pushop.remote.listkeys(b'phases')
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    35
        publishing = remotephases.get(b'publishing', False)
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    36
        if publishing:
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    37
            if pushop.revs is None:
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    38
                published = repo.filtered(b'served').revs(b"not public()")
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    39
            else:
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    40
                published = repo.revs(b"::%ln - public()", pushop.revs)
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    41
            if published:
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    42
                if behavior == b'warn':
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    43
                    ui.warn(_(b'%i changesets about to be published\n')
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    44
                            % len(published))
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    45
                elif behavior == b'abort':
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    46
                    msg = _(b'push would publish 1 changesets')
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    47
                    hint = _(b"behavior controlled by "
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    48
                             b"'experimental.auto-publish' config")
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    49
                    raise error.Abort(msg, hint=hint)
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    50
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    51
    @eh.reposetup
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    52
    def setuppublishprevention(ui, repo):
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    53
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    54
        class noautopublishrepo(repo.__class__):
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    55
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    56
            def checkpush(self, pushop):
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    57
                super(noautopublishrepo, self).checkpush(pushop)
5277
9ed5f9c5d8ae topic: hg <= 4.8 compatibility for wrapping exchange._checkpublish()
Anton Shestakov <av6@dwimlabs.net>
parents: 4814
diff changeset
    58
                _checkpublish(pushop)
2286
a4c5744a7b93 safeguard: add an option to disable automatic publishing
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    59
4287
b7b6a4524ef7 safeguard: don't reimplement auto-publish if it's in core (will be in 4.9)
Anton Shestakov <av6@dwimlabs.net>
parents: 4286
diff changeset
    60
        repo.__class__ = noautopublishrepo