hgext/evolve.py
author Pierre-Yves David <pierre-yves.david@fb.com>
Wed, 27 Aug 2014 10:21:30 +0200
changeset 1069 356552e55489
parent 1068 9f87b103f7b5
child 1070 527b12a59628
permissions -rw-r--r--
evolve: always use the transaction version of phase movement This drop compat with all known released version of Mercurial.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#                Logilab SA        <contact@logilab.fr>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
#                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
519
9825c7da5b54 ensure all file have a copyright notice
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 517
diff changeset
     4
#                Patrick Mezard <patrick@mezard.eu>
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
#
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     8
893
12ed6dfa8eea evolve: downcase first word in module doc
Olle Lundberg <geek@nerd.sh>
parents: 892
diff changeset
     9
'''extends Mercurial feature related to Changeset Evolution
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    10
540
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
    11
This extension provides several commands to mutate history and deal with
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
    12
issues it may raise.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    13
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    14
It also:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    15
540
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
    16
    - enables the "Changeset Obsolescence" feature of mercurial,
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
    17
    - alters core commands and extensions that rewrite history to use
8c5da9e75ae0 evolve: fixing syntax/grammar
Patrick Mezard <patrick@mezard.eu>
parents: 539
diff changeset
    18
      this feature,
1011
0b44ae30cf3b evolve: drop reference to 2.3 in the extension help text
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 973
diff changeset
    19
    - improves some aspect of the early implementation in Mercurial core
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    20
'''
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    21
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
    22
testedwith = ''
1012
205d549a972f evolve: point to the core mercurial tracker for bugfix
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1011
diff changeset
    23
buglink = 'http://bz.selenic.com/'
584
af3b0d696e7f evolve: add tested with info
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 577
diff changeset
    24
675
af9cc1e861a4 add an explicite warning when repo contains invalid obsolescence markers
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 674
diff changeset
    25
import sys
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
    26
import random
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
    27
from StringIO import StringIO
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
    28
import struct
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
    29
import urllib
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
    30
670
97ce1f801309 evolve: drop unused import
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 663
diff changeset
    31
import mercurial
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    32
from mercurial import util
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    33
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    34
try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    35
    from mercurial import obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    36
    if not obsolete._enabled:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    37
        obsolete._enabled = True
952
f83f46411b09 evolve: bump requirement to 3.0.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 950
diff changeset
    38
    from mercurial import wireproto
f83f46411b09 evolve: bump requirement to 3.0.1
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 950
diff changeset
    39
    gboptslist = getattr(wireproto, 'gboptslist', None)
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    40
    gboptsmap = getattr(wireproto, 'gboptsmap', None)
591
012e48e80840 evolve: require Mercurial 2.4 to work
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 590
diff changeset
    41
except (ImportError, AttributeError):
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    42
    gboptslist = gboptsmap = None
585
f013ca072bd9 evolve: detect and abort if 2.4 is detected
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 584
diff changeset
    43
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    44
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
    45
from mercurial import base85
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    46
from mercurial import bookmarks
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    47
from mercurial import cmdutil
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    48
from mercurial import commands
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    49
from mercurial import context
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    50
from mercurial import copies
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    51
from mercurial import error
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
    52
from mercurial import exchange
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    53
from mercurial import extensions
880
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
    54
from mercurial import httppeer
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    55
from mercurial import hg
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
    56
from mercurial import lock as lockmod
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    57
from mercurial import merge
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    58
from mercurial import node
113
3bdabdbb4140 adapt evolution to phase in core.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 108
diff changeset
    59
from mercurial import phases
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
    60
from mercurial import patch
1007
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
    61
from mercurial import pushkey
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    62
from mercurial import revset
490
8096833e9226 sort import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 485
diff changeset
    63
from mercurial import scmutil
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    64
from mercurial import templatekw
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    65
from mercurial.i18n import _
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
    66
from mercurial.commands import walkopts, commitopts, commitopts2, mergetoolopts
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    67
from mercurial.node import nullid
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
    68
from mercurial import wireproto
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
    69
from mercurial import localrepo
869
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
    70
from mercurial.hgweb import hgweb_mod
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
    71
from mercurial import bundle2
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    72
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
    73
cmdtable = {}
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
    74
command = cmdutil.command(cmdtable)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
    75
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
    76
_pack = struct.pack
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    77
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    78
if gboptsmap is not None:
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    79
    memfilectx = context.memfilectx
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    80
elif gboptslist is not None:
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    81
    oldmemfilectx = context.memfilectx
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    82
    def memfilectx(repo, *args, **kwargs):
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    83
        return oldmemfilectx(*args, **kwargs)
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    84
else:
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    85
    raise util.Abort('Your Mercurial is too old for this version of Evolve\n'
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    86
                     'requires version 3.0.1 or above')
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
    87
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    88
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    89
# This extension contains the following code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    90
#
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    91
# - Extension Helper code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    92
# - Obsolescence cache
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    93
# - ...
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    94
# - Older format compat
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    95
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    96
1014
93507c20739e evolve: add a custom layer around retractboundary
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1013
diff changeset
    97
#####################################################################
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    98
### Extension helper                                              ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    99
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   100
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   101
class exthelper(object):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   102
    """Helper for modular extension setup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   103
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   104
    A single helper should be instanciated for each extension. Helper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   105
    methods are then used as decorator for various purpose.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   106
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   107
    All decorators return the original function and may be chained.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   108
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   109
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   110
    def __init__(self):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   111
        self._uicallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   112
        self._extcallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   113
        self._repocallables = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   114
        self._revsetsymbols = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   115
        self._templatekws = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   116
        self._commandwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   117
        self._extcommandwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   118
        self._functionwrappers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   119
        self._duckpunchers = []
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   120
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   121
    def final_uisetup(self, ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   122
        """Method to be used as the extension uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   123
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   124
        The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   125
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   126
        - Changes to ui.__class__ . The ui object that will be used to run the
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   127
          command has not yet been created. Changes made here will affect ui
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   128
          objects created after this, and in particular the ui that will be
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   129
          passed to runcommand
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   130
        - Command wraps (extensions.wrapcommand)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   131
        - Changes that need to be visible to other extensions: because
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   132
          initialization occurs in phases (all extensions run uisetup, then all
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   133
          run extsetup), a change made here will be visible to other extensions
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   134
          during extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   135
        - Monkeypatch or wrap function (extensions.wrapfunction) of dispatch
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   136
          module members
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   137
        - Setup of pre-* and post-* hooks
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   138
        - pushkey setup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   139
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   140
        for cont, funcname, func in self._duckpunchers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   141
            setattr(cont, funcname, func)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   142
        for command, wrapper in self._commandwrappers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   143
            extensions.wrapcommand(commands.table, command, wrapper)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   144
        for cont, funcname, wrapper in self._functionwrappers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   145
            extensions.wrapfunction(cont, funcname, wrapper)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   146
        for c in self._uicallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   147
            c(ui)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   148
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   149
    def final_extsetup(self, ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   150
        """Method to be used as a the extension extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   151
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   152
        The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   153
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   154
        - Changes depending on the status of other extensions. (if
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   155
          extensions.find('mq'))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   156
        - Add a global option to all commands
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   157
        - Register revset functions
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   158
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   159
        knownexts = {}
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   160
        for name, symbol in self._revsetsymbols:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   161
            revset.symbols[name] = symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   162
        for name, kw in self._templatekws:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   163
            templatekw.keywords[name] = kw
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   164
        for ext, command, wrapper in self._extcommandwrappers:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   165
            if ext not in knownexts:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   166
                e = extensions.find(ext)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   167
                if e is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   168
                    raise util.Abort('extension %s not found' % ext)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   169
                knownexts[ext] = e.cmdtable
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   170
            extensions.wrapcommand(knownexts[ext], commands, wrapper)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   171
        for c in self._extcallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   172
            c(ui)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   173
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   174
    def final_reposetup(self, ui, repo):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   175
        """Method to be used as a the extension reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   176
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   177
        The following operations belong here:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   178
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   179
        - All hooks but pre-* and post-*
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   180
        - Modify configuration variables
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   181
        - Changes to repo.__class__, repo.dirstate.__class__
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   182
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   183
        for c in self._repocallables:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   184
            c(ui, repo)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   185
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   186
    def uisetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   187
        """Decorated function will be executed during uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   188
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   189
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   190
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   191
            @eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   192
            def setupbabar(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   193
                print 'this is uisetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   194
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   195
        self._uicallables.append(call)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   196
        return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   197
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   198
    def extsetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   199
        """Decorated function will be executed during extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   200
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   201
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   202
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   203
            @eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   204
            def setupcelestine(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   205
                print 'this is extsetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   206
        """
672
f7834b360f8f evolve: fix extsetup extension helper
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 671
diff changeset
   207
        self._extcallables.append(call)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   208
        return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   209
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   210
    def reposetup(self, call):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   211
        """Decorated function will be executed during reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   212
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   213
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   214
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   215
            @eh.reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   216
            def setupzephir(ui, repo):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   217
                print 'this is reposetup!'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   218
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   219
        self._repocallables.append(call)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   220
        return call
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   221
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   222
    def revset(self, symbolname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   223
        """Decorated function is a revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   224
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   225
        The name of the symbol must be given as the decorator argument.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   226
        The symbol is added during `extsetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   227
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   228
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   229
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   230
            @eh.revset('hidden')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   231
            def revsetbabar(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   232
                args = revset.getargs(x, 0, 0, 'babar accept no argument')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   233
                return [r for r in subset if 'babar' in repo[r].description()]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   234
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   235
        def dec(symbol):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   236
            self._revsetsymbols.append((symbolname, symbol))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   237
            return symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   238
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   239
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   240
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   241
    def templatekw(self, keywordname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   242
        """Decorated function is a revset keyword
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   243
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   244
        The name of the keyword must be given as the decorator argument.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   245
        The symbol is added during `extsetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   246
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   247
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   248
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   249
            @eh.templatekw('babar')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   250
            def kwbabar(ctx):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   251
                return 'babar'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   252
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   253
        def dec(keyword):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   254
            self._templatekws.append((keywordname, keyword))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   255
            return keyword
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   256
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   257
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   258
    def wrapcommand(self, command, extension=None):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   259
        """Decorated function is a command wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   260
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   261
        The name of the command must be given as the decorator argument.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   262
        The wrapping is installed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   263
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   264
        If the second option `extension` argument is provided, the wrapping
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   265
        will be applied in the extension commandtable. This argument must be a
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   266
        string that will be searched using `extension.find` if not found and
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   267
        Abort error is raised. If the wrapping applies to an extension, it is
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   268
        installed during `extsetup`
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   269
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   270
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   271
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   272
            @eh.wrapcommand('summary')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   273
            def wrapsummary(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   274
                ui.note('Barry!')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   275
                return orig(ui, repo, *args, **kwargs)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   276
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   277
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   278
        def dec(wrapper):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   279
            if extension is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   280
                self._commandwrappers.append((command, wrapper))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   281
            else:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   282
                self._extcommandwrappers.append((extension, command, wrapper))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   283
            return wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   284
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   285
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   286
    def wrapfunction(self, container, funcname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   287
        """Decorated function is a function wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   288
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   289
        This function takes two arguments, the container and the name of the
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   290
        function to wrap. The wrapping is performed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   291
        (there is no extension support)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   292
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   293
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   294
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   295
            @eh.function(discovery, 'checkheads')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   296
            def wrapfunction(orig, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   297
                ui.note('His head smashed in and his heart cut out')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   298
                return orig(*args, **kwargs)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   299
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   300
        def dec(wrapper):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   301
            self._functionwrappers.append((container, funcname, wrapper))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   302
            return wrapper
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   303
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   304
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   305
    def addattr(self, container, funcname):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   306
        """Decorated function is to be added to the container
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   307
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   308
        This function takes two arguments, the container and the name of the
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   309
        function to wrap. The wrapping is performed during `uisetup`.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   310
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   311
        example::
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   312
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   313
            @eh.function(context.changectx, 'babar')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   314
            def babar(ctx):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   315
                return 'babar' in ctx.description
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   316
        """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   317
        def dec(func):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   318
            self._duckpunchers.append((container, funcname, func))
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   319
            return func
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   320
        return dec
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   321
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   322
eh = exthelper()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   323
uisetup = eh.final_uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   324
extsetup = eh.final_extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   325
reposetup = eh.final_reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   326
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   327
#####################################################################
805
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   328
### experimental behavior                                         ###
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   329
#####################################################################
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   330
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   331
commitopts3 = [
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   332
    ('D', 'current-date', None,
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   333
     _('record the current date as commit date')),
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   334
    ('U', 'current-user', None,
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   335
     _('record the current user as committer')),
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   336
]
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   337
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   338
def _resolveoptions(ui, opts):
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   339
    """modify commit options dict to handle related options
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   340
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   341
    For now, all it does is figure out the commit date: respect -D unless
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   342
    -d was supplied.
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   343
    """
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   344
    # N.B. this is extremely similar to setupheaderopts() in mq.py
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   345
    if not opts.get('date') and opts.get('current_date'):
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   346
        opts['date'] = '%d %d' % util.makedate()
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   347
    if not opts.get('user') and opts.get('current_user'):
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
   348
        opts['user'] = ui.username()
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
   349
1067
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   350
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   351
createmarkers = obsolete.createmarkers
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   352
if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   353
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   354
    @eh.wrapfunction(mercurial.obsolete, 'createmarkers')
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   355
    def _createmarkers(orig, repo, relations, *args, **kwargs):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   356
        """register parent information at prune time"""
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   357
        # every time this test is run, a kitten is slain.
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   358
        # Change it as soon as possible
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   359
        if '[,{metadata}]' in orig.__doc__:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   360
            relations = list(relations)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   361
            for idx, rel in enumerate(relations):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   362
                prec = rel[0]
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   363
                sucs = rel[1]
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   364
                if not sucs:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   365
                    meta = {}
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   366
                    if 2 < len(rel):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   367
                        meta.update(rel[2])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   368
                    for i, p in enumerate(prec.parents(), 1):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   369
                        meta['p%i' % i] = p.hex()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   370
                    relations[idx] = (prec, sucs, meta)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   371
        return orig(repo, relations, *args, **kwargs)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   372
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   373
    def createmarkers(*args, **kwargs):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   374
        return obsolete.createmarkers(*args, **kwargs)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   375
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   376
    class pruneobsstore(obsolete.obsstore):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   377
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   378
        def __init__(self, *args, **kwargs):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   379
            self.prunedchildren = {}
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   380
            return super(pruneobsstore, self).__init__(*args, **kwargs)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   381
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   382
        def _load(self, markers):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   383
            markers = self._prunedetectingmarkers(markers)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   384
            return super(pruneobsstore, self)._load(markers)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   385
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   386
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   387
        def _prunedetectingmarkers(self, markers):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   388
            for m in markers:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   389
                if not m[1]: # no successors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   390
                    meta = obsolete.decodemeta(m[3])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   391
                    if 'p1' in meta:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   392
                        p1 = node.bin(meta['p1'])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   393
                        self.prunedchildren.setdefault(p1, set()).add(m)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   394
                    if 'p2' in meta:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   395
                        p2 = node.bin(meta['p2'])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   396
                        self.prunedchildren.setdefault(p2, set()).add(m)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   397
                yield m
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   398
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   399
    obsolete.obsstore = pruneobsstore
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   400
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   401
    @eh.addattr(obsolete.obsstore, 'relevantmarkers')
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   402
    def relevantmarkers(self, nodes):
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   403
        """return a set of all obsolescence marker relevant to a set of node.
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   404
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   405
        "relevant" to a set of node mean:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   406
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   407
        - marker that use this changeset as successors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   408
        - prune marker of direct children on this changeset.
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   409
        - recursive application of the two rules on precursors of these markers
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   410
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   411
        It  a set so you cannot rely on order"""
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   412
        seennodes = set(nodes)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   413
        seenmarkers = set()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   414
        pendingnodes = set(nodes)
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   415
        precursorsmarkers = self.precursors
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   416
        prunedchildren = self.prunedchildren
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   417
        while pendingnodes:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   418
            direct = set()
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   419
            for current in pendingnodes:
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   420
                direct.update(precursorsmarkers.get(current, ()))
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   421
                direct.update(prunedchildren.get(current, ()))
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   422
            direct -= seenmarkers
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   423
            pendingnodes = set([m[0] for m in direct])
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   424
            seenmarkers |= direct
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   425
            pendingnodes -= seennodes
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   426
            seennodes |= pendingnodes
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   427
        return seenmarkers
5d063fed9e3d evolve: yield to relevant markers handling in core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1063
diff changeset
   428
805
66c02a2e8e2f prune: wrap mercurial internal to add parent information in prune marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 804
diff changeset
   429
#####################################################################
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   430
### Critical fix                                                  ###
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   431
#####################################################################
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   432
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   433
@eh.wrapfunction(mercurial.obsolete, '_readmarkers')
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   434
def safereadmarkers(orig, data):
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   435
    """safe maker wrapper to remove nullid succesors
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   436
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   437
    Nullid successors was created by older version of evolve.
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   438
    """
675
af9cc1e861a4 add an explicite warning when repo contains invalid obsolescence markers
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 674
diff changeset
   439
    nb = 0
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   440
    for marker in orig(data):
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   441
        if nullid in marker[1]:
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   442
            marker = (marker[0],
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   443
                      tuple(s for s in marker[1] if s != nullid),
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   444
                      marker[2],
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   445
                      marker[3])
675
af9cc1e861a4 add an explicite warning when repo contains invalid obsolescence markers
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 674
diff changeset
   446
            nb += 1
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   447
        yield marker
675
af9cc1e861a4 add an explicite warning when repo contains invalid obsolescence markers
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 674
diff changeset
   448
    if nb:
af9cc1e861a4 add an explicite warning when repo contains invalid obsolescence markers
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 674
diff changeset
   449
        e = sys.stderr
af9cc1e861a4 add an explicite warning when repo contains invalid obsolescence markers
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 674
diff changeset
   450
        print >> e, 'repo contains %i invalid obsolescence markers' % nb
577
2cd2ee20d9fa evolve: filter nullid successors
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 576
diff changeset
   451
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   452
getrevs = obsolete.getrevs
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   453
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   454
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   455
### Additional Utilities                                          ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   456
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   457
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   458
# This section contains a lot of small utility function and method
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   459
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   460
# - Function to create markers
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   461
# - useful alias pstatus and pdiff (should probably go in evolve)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   462
# - "troubles" method on changectx
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   463
# - function to travel throught the obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   464
# - function to find useful changeset to stabilize
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   465
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   466
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   467
### Useful alias
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   468
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   469
@eh.uisetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   470
def _installalias(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   471
    if ui.config('alias', 'pstatus', None) is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   472
        ui.setconfig('alias', 'pstatus', 'status --rev .^')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   473
    if ui.config('alias', 'pdiff', None) is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   474
        ui.setconfig('alias', 'pdiff', 'diff --rev .^')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   475
    if ui.config('alias', 'olog', None) is None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   476
        ui.setconfig('alias', 'olog', "log -r 'precursors(.)' --hidden")
497
43e1b2cab789 evolve: add the odiff alias
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 492
diff changeset
   477
    if ui.config('alias', 'odiff', None) is None:
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   478
        ui.setconfig('alias', 'odiff',
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   479
            "diff --hidden --rev 'limit(precursors(.),1)' --rev .")
696
121e2d265e85 alias: add a grab alias
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 695
diff changeset
   480
    if ui.config('alias', 'grab', None) is None:
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   481
        ui.setconfig('alias', 'grab',
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   482
            "! $HG rebase --dest . --rev $@ && $HG up tip")
696
121e2d265e85 alias: add a grab alias
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 695
diff changeset
   483
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   484
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   485
### Troubled revset symbol
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   486
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   487
@eh.revset('troubled')
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
   488
def revsettroubled(repo, subset, x):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   489
    """``troubled()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   490
    Changesets with troubles.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   491
    """
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
   492
    revset.getargs(x, 0, 0, 'troubled takes no arguments')
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
   493
    return repo.revs('%ld and (unstable() + bumped() + divergent())',
511
ddeb71df916d evolve: localrepo.revs() already returns a list
Patrick Mezard <patrick@mezard.eu>
parents: 510
diff changeset
   494
                     subset)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   495
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   496
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   497
### Obsolescence graph
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   498
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   499
# XXX SOME MAJOR CLEAN UP TO DO HERE XXX
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   500
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   501
def _precursors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   502
    """Precursor of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   503
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   504
    nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   505
    markerbysubj = repo.obsstore.precursors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   506
    for r in s:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   507
        for p in markerbysubj.get(repo[r].node(), ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   508
            pr = nm.get(p[0])
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   509
            if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   510
                cs.add(pr)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   511
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   512
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   513
def _allprecursors(repo, s):  # XXX we need a better naming
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   514
    """transitive precursors of a subset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   515
    toproceed = [repo[r].node() for r in s]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   516
    seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   517
    allsubjects = repo.obsstore.precursors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   518
    while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   519
        nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   520
        for mark in allsubjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   521
            np = mark[0]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   522
            if np not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   523
                seen.add(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   524
                toproceed.append(np)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   525
    nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   526
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   527
    for p in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   528
        pr = nm.get(p)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   529
        if pr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   530
            cs.add(pr)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   531
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   532
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   533
def _successors(repo, s):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   534
    """Successors of a changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   535
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   536
    nm = repo.changelog.nodemap
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   537
    markerbyobj = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   538
    for r in s:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   539
        for p in markerbyobj.get(repo[r].node(), ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   540
            for sub in p[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   541
                sr = nm.get(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   542
                if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   543
                    cs.add(sr)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   544
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   545
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   546
def _allsuccessors(repo, s, haltonflags=0):  # XXX we need a better naming
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   547
    """transitive successors of a subset
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   548
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   549
    haltonflags allows to provide flags which prevent the evaluation of a
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   550
    marker.  """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   551
    toproceed = [repo[r].node() for r in s]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   552
    seen = set()
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   553
    allobjects = repo.obsstore.successors
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   554
    while toproceed:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   555
        nc = toproceed.pop()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   556
        for mark in allobjects.get(nc, ()):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   557
            if mark[2] & haltonflags:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   558
                continue
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   559
            for sub in mark[1]:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   560
                if sub == nullid:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   561
                    continue # should not be here!
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   562
                if sub not in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   563
                    seen.add(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   564
                    toproceed.append(sub)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   565
    nm = repo.changelog.nodemap
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   566
    cs = set()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   567
    for s in seen:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   568
        sr = nm.get(s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   569
        if sr is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   570
            cs.add(sr)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   571
    return cs
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   572
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   573
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   574
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   575
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   576
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   577
### Extending revset and template                                 ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   578
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   579
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   580
# this section add several useful revset symbol not yet in core.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   581
# they are subject to changes
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   582
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   583
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   584
### XXX I'm not sure this revset is useful
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   585
@eh.revset('suspended')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   586
def revsetsuspended(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   587
    """``suspended()``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   588
    Obsolete changesets with non-obsolete descendants.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   589
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   590
    args = revset.getargs(x, 0, 0, 'suspended takes no arguments')
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   591
    suspended = getrevs(repo, 'suspended')
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   592
    return [r for r in subset if r in suspended]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   593
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   594
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   595
@eh.revset('precursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   596
def revsetprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   597
    """``precursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   598
    Immediate precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   599
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   600
    s = revset.getset(repo, range(len(repo)), x)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   601
    cs = _precursors(repo, s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   602
    return [r for r in subset if r in cs]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   603
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   604
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   605
@eh.revset('allprecursors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   606
def revsetallprecursors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   607
    """``allprecursors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   608
    Transitive precursors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   609
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   610
    s = revset.getset(repo, range(len(repo)), x)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   611
    cs = _allprecursors(repo, s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   612
    return [r for r in subset if r in cs]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   613
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   614
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   615
@eh.revset('successors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   616
def revsetsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   617
    """``successors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   618
    Immediate successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   619
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   620
    s = revset.getset(repo, range(len(repo)), x)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   621
    cs = _successors(repo, s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   622
    return [r for r in subset if r in cs]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   623
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   624
@eh.revset('allsuccessors')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   625
def revsetallsuccessors(repo, subset, x):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   626
    """``allsuccessors(set)``
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   627
    Transitive successors of changesets in set.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   628
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   629
    s = revset.getset(repo, range(len(repo)), x)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   630
    cs = _allsuccessors(repo, s)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   631
    return [r for r in subset if r in cs]
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   632
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   633
### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   634
# XXX it does not handle troubles well :-/
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   635
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   636
@eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   637
def obsoletekw(repo, ctx, templ, **args):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   638
    """:obsolete: String. The obsolescence level of the node, could be
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   639
    ``stable``, ``unstable``, ``suspended`` or ``extinct``.
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   640
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   641
    rev = ctx.rev()
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   642
    if ctx.obsolete():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   643
        if ctx.extinct():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   644
            return 'extinct'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   645
        else:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   646
            return 'suspended'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   647
    elif ctx.unstable():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   648
        return 'unstable'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   649
    return 'stable'
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   650
982
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   651
@eh.templatekw('troubles')
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   652
def showtroubles(repo, ctx, **args):
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   653
    """:troubles: List of strings. Evolution troubles affecting the changeset
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   654
    (zero or more of "unstable", "divergent" or "bumped")."""
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   655
    return templatekw.showlist('trouble', ctx.troubles(), plural='troubles',
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   656
                               **args)
1c7b73739a0d template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 976
diff changeset
   657
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   658
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   659
### Various trouble warning                                       ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   660
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   661
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   662
# This section take care of issue warning to the user when troubles appear
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   663
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   664
@eh.wrapcommand("update")
745
99e51aff724b add obsolete parents wrapper to the 'parents' command
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 743
diff changeset
   665
@eh.wrapcommand("parents")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   666
@eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   667
def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   668
    """Warn that the working directory parent is an obsolete changeset"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   669
    res = origfn(ui, repo, *args, **opts)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   670
    if repo['.'].obsolete():
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
   671
        ui.warn(_('working directory parent is obsolete!\n'))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   672
    return res
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   673
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   674
# XXX this could wrap transaction code
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   675
# XXX (but this is a bit a layer violation)
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   676
@eh.wrapcommand("commit")
763
966e2659e989 import: warn about new unstable changesets
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 762
diff changeset
   677
@eh.wrapcommand("import")
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   678
@eh.wrapcommand("push")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   679
@eh.wrapcommand("pull")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   680
@eh.wrapcommand("graft")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   681
@eh.wrapcommand("phase")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   682
@eh.wrapcommand("unbundle")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   683
def warnobserrors(orig, ui, repo, *args, **kwargs):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   684
    """display warning is the command resulted in more instable changeset"""
658
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   685
    # part of the troubled stuff may be filtered (stash ?)
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   686
    # This needs a better implementation but will probably wait for core.
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   687
    filtered = repo.changelog.filteredrevs
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   688
    priorunstables = len(set(getrevs(repo, 'unstable')) - filtered)
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   689
    priorbumpeds = len(set(getrevs(repo, 'bumped')) - filtered)
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   690
    priordivergents = len(set(getrevs(repo, 'divergent')) - filtered)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   691
    ret = orig(ui, repo, *args, **kwargs)
552
f7e54d4a3b90 warning: work around phase limitation when computing warnings
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 551
diff changeset
   692
    # workaround phase stupidity
649
d318fbb1cd67 evolve: stop working around phase limitation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 647
diff changeset
   693
    #phases._filterunknown(ui, repo.changelog, repo._phasecache.phaseroots)
658
2a2b8c95bb43 evolve: remove revset calls in warnobserror
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 657
diff changeset
   694
    filtered = repo.changelog.filteredrevs
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   695
    newunstables = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   696
        len(set(getrevs(repo, 'unstable')) - filtered) - priorunstables
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   697
    newbumpeds = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   698
        len(set(getrevs(repo, 'bumped')) - filtered) - priorbumpeds
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   699
    newdivergents = \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
   700
        len(set(getrevs(repo, 'divergent')) - filtered) - priordivergents
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   701
    if newunstables > 0:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   702
        ui.warn(_('%i new unstable changesets\n') % newunstables)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
   703
    if newbumpeds > 0:
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
   704
        ui.warn(_('%i new bumped changesets\n') % newbumpeds)
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
   705
    if newdivergents > 0:
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
   706
        ui.warn(_('%i new divergent changesets\n') % newdivergents)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   707
    return ret
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   708
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   709
@eh.reposetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   710
def _repostabilizesetup(ui, repo):
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
   711
    """Add a hint for "hg evolve" when troubles make push fails
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   712
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   713
    if not repo.local():
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   714
        return
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   715
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
   716
    class evolvingrepo(repo.__class__):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   717
        def push(self, remote, *args, **opts):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   718
            """wrapper around pull that pull obsolete relation"""
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   719
            try:
756
64c6bdfd0518 evolve: use super for calling parent class method
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 752
diff changeset
   720
                result = super(evolvingrepo, self).push(remote, *args, **opts)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   721
            except util.Abort, ex:
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
   722
                hint = _("use 'hg evolve' to get a stable history "
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   723
                         "or --force to ignore warnings")
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   724
                if (len(ex.args) >= 1
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   725
                    and ex.args[0].startswith('push includes ')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   726
                    and ex.hint is None):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   727
                    ex.hint = hint
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   728
                raise
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   729
            return result
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
   730
    repo.__class__ = evolvingrepo
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   731
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   732
def summaryhook(ui, repo):
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   733
    def write(fmt, count):
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   734
        s = fmt % count
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   735
        if count:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   736
            ui.write(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   737
        else:
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   738
            ui.note(s)
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   739
590
02cadd3dc9f4 evolve: adapt to 2.4 code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 589
diff changeset
   740
    nbunstable = len(getrevs(repo, 'unstable'))
594
7f89b31fcb26 merge bumped rename
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 592 593
diff changeset
   741
    nbbumped = len(getrevs(repo, 'bumped'))
626
896463193675 merge with fix in 2.3
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 621 623
diff changeset
   742
    nbdivergent = len(getrevs(repo, 'divergent'))
513
4602104b190d evolve: factor out copy/paste in obssummary()
Patrick Mezard <patrick@mezard.eu>
parents: 512
diff changeset
   743
    write('unstable: %i changesets\n', nbunstable)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
   744
    write('bumped: %i changesets\n', nbbumped)
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
   745
    write('divergent: %i changesets\n', nbdivergent)
788
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   746
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   747
@eh.extsetup
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   748
def obssummarysetup(ui):
e973dd5bf583 evolve: register a summary hook instead of wrapping the summary command
Simon Heimberg <simohe@besonet.ch>
parents: 776
diff changeset
   749
    cmdutil.summaryhooks.add('evolve', summaryhook)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   750
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   751
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   752
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   753
### Core Other extension compat                                   ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   754
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   755
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   756
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   757
@eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   758
def _rebasewrapping(ui):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   759
    # warning about more obsolete
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   760
    try:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   761
        rebase = extensions.find('rebase')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   762
        if rebase:
572
dc107acd0bd2 adapt to core rebase support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 571
diff changeset
   763
            extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   764
    except KeyError:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   765
        pass  # rebase not found
678
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   766
    try:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   767
        histedit = extensions.find('histedit')
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   768
        if histedit:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   769
            extensions.wrapcommand(histedit.cmdtable, 'histedit', warnobserrors)
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   770
    except KeyError:
718262019c6f evolve: warn for troubles created by histedit too.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 677
diff changeset
   771
        pass  # rebase not found
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   772
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   773
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   774
### Old Evolve extension content                                  ###
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   775
#####################################################################
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   776
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   777
# XXX need clean up and proper sorting in other section
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   778
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   779
### util function
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   780
#############################
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
   781
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   782
### changeset rewriting logic
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   783
#############################
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   784
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   785
def rewrite(repo, old, updates, head, newbases, commitopts):
265
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
   786
    """Return (nodeid, created) where nodeid is the identifier of the
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
   787
    changeset generated by the rewrite process, and created is True if
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
   788
    nodeid was actually created. If created is False, nodeid
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
   789
    references a changeset existing before the rewrite call.
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
   790
    """
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   791
    if len(old.parents()) > 1: #XXX remove this unecessary limitation.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   792
        raise error.Abort(_('cannot amend merge changesets'))
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   793
    base = old.p1()
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   794
    updatebookmarks = _bookmarksupdater(repo, old.node())
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   795
1017
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   796
    # commit a new version of the old changeset, including the update
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   797
    # collect all files which might be affected
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   798
    files = set(old.files())
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   799
    for u in updates:
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   800
        files.update(u.files())
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   801
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   802
    # Recompute copies (avoid recording a -> b -> a)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   803
    copied = copies.pathcopies(base, head)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   804
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   805
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   806
    # prune files which were reverted by the updates
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   807
    def samefile(f):
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   808
        if f in head.manifest():
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   809
            a = head.filectx(f)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   810
            if f in base.manifest():
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   811
                b = base.filectx(f)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   812
                return (a.data() == b.data()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   813
                        and a.flags() == b.flags())
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   814
            else:
1017
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   815
                return False
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   816
        else:
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   817
            return f not in base.manifest()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   818
    files = [f for f in files if not samefile(f)]
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   819
    # commit version of these files as defined by head
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   820
    headmf = head.manifest()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   821
    def filectxfn(repo, ctx, path):
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   822
        if path in headmf:
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   823
            fctx = head[path]
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   824
            flags = fctx.flags()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   825
            mctx = memfilectx(repo, fctx.path(), fctx.data(),
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   826
                              islink='l' in flags,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   827
                              isexec='x' in flags,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   828
                              copied=copied.get(path))
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   829
            return mctx
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   830
        raise IOError()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   831
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   832
    message = cmdutil.logmessage(repo.ui, commitopts)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   833
    if not message:
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   834
        message = old.description()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   835
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   836
    user = commitopts.get('user') or old.user()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   837
    date = commitopts.get('date') or None # old.date()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   838
    extra = dict(commitopts.get('extra', {}))
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   839
    extra['branch'] = head.branch()
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   840
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   841
    new = context.memctx(repo,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   842
                         parents=newbases,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   843
                         text=message,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   844
                         files=files,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   845
                         filectxfn=filectxfn,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   846
                         user=user,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   847
                         date=date,
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   848
                         extra=extra)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   849
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   850
    if commitopts.get('edit'):
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   851
        new._text = cmdutil.commitforceeditor(repo, new, [])
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   852
    revcount = len(repo)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   853
    newid = repo.commitctx(new)
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   854
    new = repo[newid]
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   855
    created = len(repo) != revcount
186b72e41294 evolve: drop useless wlock in rewrite
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1016
diff changeset
   856
    updatebookmarks(newid)
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   857
265
24943df310d4 amend: do not traceback on no-ops
Patrick Mezard <patrick@mezard.eu>
parents: 264
diff changeset
   858
    return newid, created
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
   859
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   860
class MergeFailure(util.Abort):
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   861
    pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   862
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
   863
def relocate(repo, orig, dest):
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
   864
    """rewrite <rev> on dest"""
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   865
    if orig.rev() == dest.rev():
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   866
        raise util.Abort(_('tried to relocate a node on top of itself'),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   867
                         hint=_("This shouldn't happen. If you still "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   868
                                "need to move changesets, please do so "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   869
                                "manually with nothing to rebase - working "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   870
                                "directory parent is also destination"))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   871
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   872
    rebase = extensions.find('rebase')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   873
    # dummy state to trick rebase node
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   874
    if not orig.p2().rev() == node.nullrev:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   875
        raise util.Abort(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   876
            'no support for evolving merge changesets yet',
1052
ac47c2f774a8 relocate: fix typo
Faheem Mitha <faheem@faheem.info>
parents: 1047
diff changeset
   877
            hint="Redo the merge and use `hg prune` to obsolete the old one")
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   878
    destbookmarks = repo.nodebookmarks(dest.node())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   879
    nodesrc = orig.node()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   880
    destphase = repo[nodesrc].phase()
1023
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   881
    tr = repo.transaction('relocate')
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
   882
    try:
326
52c53e2d413b stabilize: clear error message than conflict during rebase offer no hope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 319
diff changeset
   883
        try:
674
b3ce838a077e evolve: remove pre 2.3 code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 673
diff changeset
   884
            r = rebase.rebasenode(repo, orig.node(), dest.node(),
b3ce838a077e evolve: remove pre 2.3 code
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 673
diff changeset
   885
                                  {node.nullrev: node.nullrev}, False)
550
362e65fc6146 evolve-cmd: fix merge error detection for external tools.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 549
diff changeset
   886
            if r[-1]: #some conflict
362e65fc6146 evolve-cmd: fix merge error detection for external tools.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 549
diff changeset
   887
                raise util.Abort(
362e65fc6146 evolve-cmd: fix merge error detection for external tools.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 549
diff changeset
   888
                        'unresolved merge conflicts (see hg help resolve)')
901
4f84b3307dc2 Fix preservation of rename information on evolve (#33)
Julien Cristau <julien.cristau@logilab.fr>
parents: 893
diff changeset
   889
            cmdutil.duplicatecopies(repo, orig.node(), dest.node())
326
52c53e2d413b stabilize: clear error message than conflict during rebase offer no hope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 319
diff changeset
   890
            nodenew = rebase.concludenode(repo, orig.node(), dest.node(),
52c53e2d413b stabilize: clear error message than conflict during rebase offer no hope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 319
diff changeset
   891
                                          node.nullid)
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   892
        except util.Abort, exc:
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   893
            class LocalMergeFailure(MergeFailure, exc.__class__):
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   894
                pass
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
   895
            exc.__class__ = LocalMergeFailure
326
52c53e2d413b stabilize: clear error message than conflict during rebase offer no hope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 319
diff changeset
   896
            raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
   897
        oldbookmarks = repo.nodebookmarks(nodesrc)
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   898
        if nodenew is not None:
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
   899
            phases.retractboundary(repo, tr, destphase, [nodenew])
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   900
            createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   901
            for book in oldbookmarks:
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   902
                repo._bookmarks[book] = nodenew
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   903
        else:
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
   904
            createmarkers(repo, [(repo[nodesrc], ())])
284
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   905
            # Behave like rebase, move bookmarks to dest
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   906
            for book in oldbookmarks:
88a851a54f26 evolve: fix relocate() with removed revision
Patrick Mezard <patrick@mezard.eu>
parents: 272
diff changeset
   907
                repo._bookmarks[book] = dest.node()
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
   908
        for book in destbookmarks: # restore bookmark that rebase move
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
   909
            repo._bookmarks[book] = dest.node()
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
   910
        if oldbookmarks or destbookmarks:
612
15299bfd0813 adapt to 7f5dab94e48c in crew
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 604
diff changeset
   911
            repo._bookmarks.write()
1023
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   912
        tr.close()
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   913
    finally:
7c8e3941241f relocate: add transaction around phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1022
diff changeset
   914
        tr.release()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
   915
    return nodenew
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
   916
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   917
def _bookmarksupdater(repo, oldid):
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   918
    """Return a callable update(newid) updating the current bookmark
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   919
    and bookmarks bound to oldid to newid.
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   920
    """
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   921
    bm = bookmarks.readcurrent(repo)
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   922
    def updatebookmarks(newid):
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   923
        dirty = False
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   924
        if bm:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   925
            repo._bookmarks[bm] = newid
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   926
            dirty = True
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   927
        oldbookmarks = repo.nodebookmarks(oldid)
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   928
        if oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   929
            for b in oldbookmarks:
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   930
                repo._bookmarks[b] = newid
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   931
            dirty = True
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   932
        if dirty:
612
15299bfd0813 adapt to 7f5dab94e48c in crew
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 604
diff changeset
   933
            repo._bookmarks.write()
313
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   934
    return updatebookmarks
47d10459fa24 uncommit: handle bookmarks
Patrick Mezard <patrick@mezard.eu>
parents: 312
diff changeset
   935
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   936
### new command
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   937
#############################
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   938
metadataopts = [
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   939
    ('d', 'date', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   940
     _('record the specified date in metadata'), _('DATE')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   941
    ('u', 'user', '',
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   942
     _('record the specified user in metadata'), _('USER')),
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   943
]
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
   944
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   945
@eh.uisetup
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   946
def _installimportobsolete(ui):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   947
    entry = cmdutil.findcmd('import', commands.table)[1]
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   948
    entry[1].append(('', 'obsolete', False,
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   949
                    _('mark the old node as obsoleted by'
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   950
                      'the created commit')))
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
   951
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   952
@eh.wrapfunction(mercurial.cmdutil, 'tryimportone')
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   953
def tryimportone(orig, ui, repo, hunk, parents, opts, *args, **kwargs):
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   954
    extracted = patch.extract(ui, hunk)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   955
    expected = extracted[5]
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   956
    if extracted is not None:
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   957
        expected = node.bin(expected)
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   958
    oldextract = patch.extract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   959
    try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   960
        patch.extract = lambda ui, hunk: extracted
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   961
        ret = orig(ui, repo, hunk, parents, opts, *args, **kwargs)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   962
    finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   963
        patch.extract = oldextract
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   964
    created = ret[1]
1055
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   965
    if (opts['obsolete'] and None not in (created, expected)
cfe1b9d3e5d9 import: handle patch with no node information
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1054
diff changeset
   966
        and created != expected):
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   967
            tr = repo.transaction('import-obs')
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   968
            try:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   969
                metadata = {'user': ui.username()}
1054
93e920feff5e import: compare binary node with binary node when using --obsolete
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1052
diff changeset
   970
                repo.obsstore.create(tr, expected, (created,),
953
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   971
                                     metadata=metadata)
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   972
                tr.close()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   973
            finally:
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   974
                tr.release()
a02e5916a7e3 import: drop version check for ``import --obsolete``
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 952
diff changeset
   975
    return ret
930
cac35bef8aee import: --obsolete flag for automatic obsolescence marker creation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 927
diff changeset
   976
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   977
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   978
def _deprecatealias(oldalias, newalias):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   979
    '''Deprecates an alias for a command in favour of another
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   980
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   981
    Creates a new entry in the command table for the old alias. It creates a
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   982
    wrapper that has its synopsis set to show that is has been deprecated.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   983
    The documentation will be replace with a pointer to the new alias.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   984
    If a user invokes the command a deprecation warning will be printed and
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   985
    the command of the *new* alias will be invoked.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   986
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   987
    This function is loosely based on the extensions.wrapcommand function.
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   988
    '''
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   989
    aliases, entry = cmdutil.findcmd(newalias, cmdtable)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   990
    for alias, e in cmdtable.iteritems():
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   991
        if e is entry:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   992
            break
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   993
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   994
    synopsis = '(DEPRECATED)'
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   995
    if len(entry) > 2:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   996
        fn, opts, _syn = entry
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   997
    else:
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   998
        fn, opts, = entry
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
   999
    deprecationwarning = _('%s have been deprecated in favor of %s\n' % (
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1000
        oldalias, newalias))
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1001
    def newfn(*args, **kwargs):
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1002
        ui = args[0]
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1003
        ui.warn(deprecationwarning)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1004
        util.checksignature(fn)(*args, **kwargs)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1005
    newfn.__doc__  = deprecationwarning
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1006
    cmdwrapper = command(oldalias, opts, synopsis)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1007
    cmdwrapper(newfn)
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1008
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1009
@eh.extsetup
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1010
def deprecatealiases(ui):
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1011
    _deprecatealias('gup', 'next')
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1012
    _deprecatealias('gdown', 'previous')
894
4f21a3279a60 evolve: add function to deprecate an alias
Olle Lundberg <geek@nerd.sh>
parents: 890
diff changeset
  1013
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1014
@command('debugrecordpruneparents', [], '')
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1015
def cmddebugrecordpruneparents(ui, repo):
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1016
    """add parents data to prune markers when possible
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1017
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1018
    This commands search the repo for prune markers without parent information.
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1019
    If the pruned node is locally known, a new markers with parent data is
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1020
    created."""
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1021
    pgop = 'reading markers'
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1022
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1023
    # lock from the beginning to prevent race
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1024
    wlock = lock = tr = None
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1025
    try:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1026
        wlock = repo.wlock()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1027
        lock = repo.lock()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1028
        tr = repo.transaction('recordpruneparents')
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1029
        unfi = repo.unfiltered()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1030
        nm = unfi.changelog.nodemap
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1031
        store = repo.obsstore
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1032
        pgtotal = len(store._all)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1033
        for idx, mark in enumerate(list(store._all)):
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1034
            if not mark[1]:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1035
                rev = nm.get(mark[0])
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1036
                if rev is not None:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1037
                    ctx = unfi[rev]
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1038
                    meta = obsolete.decodemeta(mark[3])
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1039
                    for i, p in enumerate(ctx.parents(), 1):
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1040
                        meta['p%i' % i] = p.hex()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1041
                    before = len(store._all)
1061
f3867e60d072 compat: always call metadata as a keyword argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1042
                    store.create(tr, mark[0], mark[1], mark[2], metadata=meta)
811
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1043
                    if len(store._all) - before:
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1044
                        ui.write('created new markers for %i\n' % rev)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1045
            ui.progress(pgop, idx, total=pgtotal)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1046
        tr.close()
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1047
        ui.progress(pgop, None)
acfa2b67cff6 evolve: add a cmddebugrecordpruneparents command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 809
diff changeset
  1048
    finally:
1018
30262465b932 debugrecordpruneparents: release tr the same way than the lock
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1017
diff changeset
  1049
        lockmod.release(tr, lock, wlock)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1050
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1051
@command('debugobsstorestat', [], '')
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1052
def cmddebugobsstorestat(ui, repo):
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1053
    """print statistic about obsolescence markers in the repo"""
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1054
    store = repo.obsstore
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1055
    unfi = repo.unfiltered()
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1056
    nm = unfi.changelog.nodemap
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1057
    ui.write('markers total:              %9i\n' % len(store._all))
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1058
    sucscount = [0, 0 , 0, 0]
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1059
    known = 0
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1060
    parentsdata = 0
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1061
    metatotallenght = 0
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1062
    metakeys = {}
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1063
    # node -> cluster mapping
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1064
    #   a cluster is a (set(nodes), set(markers)) tuple
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1065
    clustersmap = {}
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1066
    # same data using parent information
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1067
    pclustersmap= {}
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1068
    for mark in store:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1069
        if mark[0] in nm:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1070
            known += 1
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1071
        nbsucs = len(mark[1])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1072
        sucscount[min(nbsucs, 3)] += 1
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1073
        metatotallenght += len(mark[3])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1074
        meta = obsolete.decodemeta(mark[3])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1075
        for key in meta:
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1076
            metakeys.setdefault(key, 0)
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1077
            metakeys[key] += 1
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1078
        parents = [meta.get('p1'), meta.get('p2')]
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1079
        parents = [node.bin(p) for p in parents if p is not None]
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1080
        if parents:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1081
            parentsdata += 1
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1082
        # cluster handling
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1083
        nodes = set()
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1084
        nodes.add(mark[0])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1085
        nodes.update(mark[1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1086
        c = (set(nodes), set([mark]))
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1087
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1088
        toproceed = set(nodes)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1089
        while toproceed:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1090
            n = toproceed.pop()
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1091
            other = clustersmap.get(n)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1092
            if (other is not None
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1093
                and other is not c):
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1094
                other[0].update(c[0])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1095
                other[1].update(c[1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1096
                for on in c[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1097
                    if on in toproceed:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1098
                        continue
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1099
                    clustersmap[on] = other
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1100
                c = other
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1101
            clustersmap[n] = c
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1102
        # same with parent data
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1103
        nodes.update(parents)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1104
        c = (set(nodes), set([mark]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1105
        toproceed = set(nodes)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1106
        while toproceed:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1107
            n = toproceed.pop()
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1108
            other = pclustersmap.get(n)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1109
            if (other is not None
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1110
                and other is not c):
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1111
                other[0].update(c[0])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1112
                other[1].update(c[1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1113
                for on in c[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1114
                    if on in toproceed:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1115
                        continue
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1116
                    pclustersmap[on] = other
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1117
                c = other
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1118
            pclustersmap[n] = c
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1119
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1120
    # freezing the result
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1121
    for c in clustersmap.values():
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1122
        fc = (frozenset(c[0]), frozenset(c[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1123
        for n in fc[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1124
            clustersmap[n] = fc
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1125
    # same with parent data
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1126
    for c in pclustersmap.values():
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1127
        fc = (frozenset(c[0]), frozenset(c[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1128
        for n in fc[0]:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1129
            pclustersmap[n] = fc
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1130
    ui.write('    for known precursors:   %9i\n' % known)
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1131
    ui.write('    with parents data:      %9i\n' % parentsdata)
807
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1132
    # successors data
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1133
    ui.write('markers with no successors: %9i\n' % sucscount[0])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1134
    ui.write('              1 successors: %9i\n' % sucscount[1])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1135
    ui.write('              2 successors: %9i\n' % sucscount[2])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1136
    ui.write('    more than 2 successors: %9i\n' % sucscount[3])
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1137
    # meta data info
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1138
    ui.write('average meta length:        %9i\n'
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1139
             % (metatotallenght/len(store._all)))
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1140
    ui.write('    available  keys:\n')
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1141
    for key in sorted(metakeys):
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1142
        ui.write('    %15s:        %9i\n' % (key, metakeys[key]))
4dd1cda16fd0 evolve: add a debugobsstorestat command
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 806
diff changeset
  1143
809
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1144
    allclusters = list(set(clustersmap.values()))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1145
    allclusters.sort(key=lambda x: len(x[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1146
    ui.write('disconnected clusters:      %9i\n' % len(allclusters))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1147
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1148
    ui.write('        any known node:     %9i\n'
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1149
             % len([c for c in allclusters
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1150
                    if [n for n in c[0] if nm.get(n) is not None]]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1151
    if allclusters:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1152
        nbcluster = len(allclusters)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1153
        ui.write('        smallest length:    %9i\n' % len(allclusters[0][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1154
        ui.write('        longer length:      %9i\n' % len(allclusters[-1][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1155
        median = len(allclusters[nbcluster//2][1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1156
        ui.write('        median length:      %9i\n' % median)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1157
        mean = sum(len(x[1]) for x in allclusters) // nbcluster
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1158
        ui.write('        mean length:        %9i\n' % mean)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1159
    allpclusters = list(set(pclustersmap.values()))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1160
    allpclusters.sort(key=lambda x: len(x[1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1161
    ui.write('    using parents data:     %9i\n' % len(allpclusters))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1162
    ui.write('        any known node:     %9i\n'
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1163
             % len([c for c in allclusters
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1164
                    if [n for n in c[0] if nm.get(n) is not None]]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1165
    if allpclusters:
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1166
        nbcluster = len(allpclusters)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1167
        ui.write('        smallest length:    %9i\n' % len(allpclusters[0][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1168
        ui.write('        longer length:      %9i\n' % len(allpclusters[-1][1]))
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1169
        median = len(allpclusters[nbcluster//2][1])
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1170
        ui.write('        median length:      %9i\n' % median)
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1171
        mean = sum(len(x[1]) for x in allpclusters) // nbcluster
5d3ddede6ccf debugobsstorestat: add information about cluster
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 808
diff changeset
  1172
        ui.write('        mean length:        %9i\n' % mean)
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1173
714
3867f7b1fe6e evolve: remove duplicate alias.
Levi Bard <levi@unity3d.com>
parents: 710
diff changeset
  1174
@command('^evolve|stabilize|solve',
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1175
    [('n', 'dry-run', False,
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1176
        'do not perform actions, just print what would be done'),
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1177
     ('', 'confirm', False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1178
        'ask for confirmation before performing the action'),
1044
c878deb2fd73 evolve: attempt to clarify the documentation around --all and --any
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1043
diff changeset
  1179
    ('A', 'any', False, 'also consider troubled changesets unrelated to current working directory'),
1045
b346d7a3d89e doc: forgotten amend
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1044
diff changeset
  1180
    ('a', 'all', False, 'evolve all troubled changesets in the repo '
b346d7a3d89e doc: forgotten amend
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1044
diff changeset
  1181
                        '(implies any)'),
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
  1182
    ('c', 'continue', False, 'continue an interrupted evolution'),
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
  1183
    ] + mergetoolopts,
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1184
    _('[OPTIONS]...'))
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1185
def evolve(ui, repo, **opts):
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1186
    """Solve trouble in your repository
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1187
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1188
    - rebase unstable changesets to make them stable again,
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1189
    - create proper diffs from bumped changesets,
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1190
    - merge divergent changesets,
750
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1191
    - update to a successor if the working directory parent is
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1192
      obsolete
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1193
1044
c878deb2fd73 evolve: attempt to clarify the documentation around --all and --any
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1043
diff changeset
  1194
    By default a single changeset is evolved for each invocation and only
1045
b346d7a3d89e doc: forgotten amend
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1044
diff changeset
  1195
    troubled changesets that would evolve as a descendant of the current
1044
c878deb2fd73 evolve: attempt to clarify the documentation around --all and --any
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1043
diff changeset
  1196
    working directory will be considered. See --all and --any options to change
c878deb2fd73 evolve: attempt to clarify the documentation around --all and --any
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1043
diff changeset
  1197
    this behavior.
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
  1198
708
0ff2251adfe0 evolve: clean up help message
Levi Bard <levi@unity3d.com>
parents: 707
diff changeset
  1199
    - For unstable, this means taking the first which could be rebased as a
0ff2251adfe0 evolve: clean up help message
Levi Bard <levi@unity3d.com>
parents: 707
diff changeset
  1200
      child of the working directory parent revision or one of its descendants
0ff2251adfe0 evolve: clean up help message
Levi Bard <levi@unity3d.com>
parents: 707
diff changeset
  1201
      and rebasing it.
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
  1202
708
0ff2251adfe0 evolve: clean up help message
Levi Bard <levi@unity3d.com>
parents: 707
diff changeset
  1203
    - For divergent, this means taking "." if applicable.
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1204
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1205
    With --any, evolve picks any troubled changeset to repair.
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1206
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1207
    The working directory is updated to the newly created revision.
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
  1208
    """
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1209
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1210
    contopt = opts['continue']
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1211
    anyopt = opts['any']
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
  1212
    allopt = opts['all']
703
a246b02499d9 evolve: extract evolve --any implementation into a function.
Levi Bard <levi@unity3d.com>
parents: 663
diff changeset
  1213
    dryrunopt = opts['dry_run']
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1214
    confirmopt = opts['confirm']
986
c1f8ece4182d evolve: add --tool option so we don't have to use HGMERGE
Greg Ward <greg@gerg.ca>
parents: 985
diff changeset
  1215
    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1216
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1217
    if contopt:
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1218
        if anyopt:
947
9a6cc7e6f0dd evolve: improve wording of a few of messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 946
diff changeset
  1219
            raise util.Abort('cannot specify both "--any" and "--continue"')
704
2ec7c3673679 evolve: add --all argument.
Levi Bard <levi@unity3d.com>
parents: 703
diff changeset
  1220
        if allopt:
947
9a6cc7e6f0dd evolve: improve wording of a few of messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 946
diff changeset
  1221
            raise util.Abort('cannot specify both "--all" and "--continue"')
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1222
        graftcmd = commands.table['graft'][0]
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1223
        return graftcmd(ui, repo, old_obsolete=True, **{'continue': True})
703
a246b02499d9 evolve: extract evolve --any implementation into a function.
Levi Bard <levi@unity3d.com>
parents: 663
diff changeset
  1224
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1225
    tro = _picknexttroubled(ui, repo, anyopt or allopt)
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1226
    if tro is None:
750
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1227
        if repo['.'].obsolete():
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1228
            displayer = cmdutil.show_changeset(
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1229
                ui, repo, {'template': shorttemplate})
750
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1230
            successors = set()
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1231
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1232
            for successorsset in obsolete.successorssets(repo, repo['.'].node()):
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1233
                for nodeid in successorsset:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1234
                    successors.add(repo[nodeid])
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1235
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1236
            if not successors:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1237
                ui.warn(_('parent is obsolete without successors; ' +
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1238
                          'likely killed\n'))
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1239
                return 2
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1240
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1241
            elif len(successors) > 1:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1242
                ui.warn(_('parent is obsolete with multiple successors:\n'))
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1243
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1244
                for ctx in sorted(successors, key=lambda ctx: ctx.rev()):
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1245
                    displayer.show(ctx)
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1246
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1247
                return 2
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1248
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1249
            else:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1250
                ctx = successors.pop()
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1251
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1252
                ui.status(_('update:'))
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1253
                if not ui.quiet:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1254
                    displayer.show(ctx)
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1255
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1256
                if dryrunopt:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1257
                    print 'hg update %s' % ctx.rev()
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1258
                    return 0
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1259
                else:
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1260
                    return hg.update(repo, ctx.rev())
ddbea2fdee5e evolve: allow updating to the successor if the parent is obsolete
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 749
diff changeset
  1261
511
ddeb71df916d evolve: localrepo.revs() already returns a list
Patrick Mezard <patrick@mezard.eu>
parents: 510
diff changeset
  1262
        troubled = repo.revs('troubled()')
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1263
        if troubled:
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1264
            ui.write_err(_('nothing to evolve here\n'))
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1265
            ui.status(_('(%i troubled changesets, do you want --any ?)\n')
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1266
                      % len(troubled))
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1267
            return 2
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1268
        else:
722
4e7e7a7d8500 evolve: remove trailing spaces
AndréSintzoff <andre.sintzoff@gmail.com>
parents: 716
diff changeset
  1269
            ui.write_err(_('no troubled changesets\n'))
145
928f217c1701 stabilize: stabilize my topological branch only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 142
diff changeset
  1270
            return 1
706
90f0a1ede70a evolve: clean up evolve implementation.
Levi Bard <levi@unity3d.com>
parents: 704
diff changeset
  1271
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1272
    def progresscb():
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1273
        if allopt:
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1274
            ui.progress('evolve', seen, unit='changesets', total=count)
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1275
    seen = 1
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1276
    count = allopt and _counttroubled(ui, repo) or 1
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1277
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1278
    while tro is not None:
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1279
        progresscb()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1280
        wlock = lock = tr = None
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1281
        try:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1282
            wlock = repo.wlock()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1283
            lock = repo.lock()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1284
            tr = repo.transaction("evolve")
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1285
            result = _evolveany(ui, repo, tro, dryrunopt, confirmopt,
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1286
                                progresscb=progresscb)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1287
            tr.close()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1288
        finally:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1289
            lockmod.release(tr, lock, wlock)
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1290
        progresscb()
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1291
        seen += 1
707
f914e315b717 evolve: remove magic return values from utility functions
Levi Bard <levi@unity3d.com>
parents: 706
diff changeset
  1292
        if not allopt:
706
90f0a1ede70a evolve: clean up evolve implementation.
Levi Bard <levi@unity3d.com>
parents: 704
diff changeset
  1293
            return result
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1294
        progresscb()
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1295
        tro = _picknexttroubled(ui, repo, anyopt or allopt)
722
4e7e7a7d8500 evolve: remove trailing spaces
AndréSintzoff <andre.sintzoff@gmail.com>
parents: 716
diff changeset
  1296
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1297
    if allopt:
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1298
        ui.progress('evolve', None)
706
90f0a1ede70a evolve: clean up evolve implementation.
Levi Bard <levi@unity3d.com>
parents: 704
diff changeset
  1299
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1300
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1301
def _evolveany(ui, repo, tro, dryrunopt, confirmopt, progresscb):
651
609faf10d307 evolve: ensure evolve command run unfiltered
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 649
diff changeset
  1302
    repo = repo.unfiltered()
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1303
    tro = repo[tro.rev()]
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1304
    cmdutil.bailifchanged(repo)
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1305
    troubles = tro.troubles()
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1306
    if 'unstable' in troubles:
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1307
        return _solveunstable(ui, repo, tro, dryrunopt, confirmopt, progresscb)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1308
    elif 'bumped' in troubles:
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1309
        return _solvebumped(ui, repo, tro, dryrunopt, confirmopt, progresscb)
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1310
    elif 'divergent' in troubles:
625
e291e5271694 prepare for Full scale filtering !!!
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 622
diff changeset
  1311
        repo = repo.unfiltered()
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1312
        tro = repo[tro.rev()]
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1313
        return _solvedivergent(ui, repo, tro, dryrunopt, confirmopt,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1314
                               progresscb)
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1315
    else:
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1316
        assert False  # WHAT? unknown troubles
269
6c6bb7a23bb5 stabilize: improve unstable selection heuristic
Patrick Mezard <patrick@mezard.eu>
parents: 268
diff changeset
  1317
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1318
def _counttroubled(ui, repo):
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1319
    """Count the amount of troubled changesets"""
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1320
    troubled = set()
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1321
    troubled.update(getrevs(repo, 'unstable'))
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1322
    troubled.update(getrevs(repo, 'bumped'))
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1323
    troubled.update(getrevs(repo, 'divergent'))
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1324
    return len(troubled)
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1325
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1326
def _picknexttroubled(ui, repo, pickany=False, progresscb=None):
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1327
    """Pick a the next trouble changeset to solve"""
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1328
    if progresscb: progresscb()
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1329
    tro = _stabilizableunstable(repo, repo['.'])
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1330
    if tro is None:
484
20e2f2dd71f1 stabilize: conflicting changeset are considered if "."
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 482
diff changeset
  1331
        wdp = repo['.']
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1332
        if 'divergent' in wdp.troubles():
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1333
            tro = wdp
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1334
    if tro is None and pickany:
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1335
        troubled = list(repo.set('unstable()'))
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1336
        if not troubled:
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1337
            troubled = list(repo.set('bumped()'))
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1338
        if not troubled:
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1339
            troubled = list(repo.set('divergent()'))
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1340
        if troubled:
1015
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1341
            tro = troubled[0]
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1342
68d9c7e4a03d evolve: rename `tr` variable (for troubled) to `tro`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1014
diff changeset
  1343
    return tro
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1344
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1345
def _stabilizableunstable(repo, pctx):
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1346
    """Return a changectx for an unstable changeset which can be
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1347
    stabilized on top of pctx or one of its descendants. None if none
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1348
    can be found.
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1349
    """
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1350
    def selfanddescendants(repo, pctx):
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1351
        yield pctx
636
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1352
        for prec in repo.set('allprecursors(%d)', pctx):
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1353
            yield prec
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1354
        for ctx in pctx.descendants():
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1355
            yield ctx
636
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1356
            for prec in repo.set('allprecursors(%d)', ctx):
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1357
                yield prec
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1358
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1359
    # Look for an unstable which can be stabilized as a child of
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1360
    # node. The unstable must be a child of one of node predecessors.
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1361
    for ctx in selfanddescendants(repo, pctx):
636
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1362
        for child in ctx.children():
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1363
            if child.unstable():
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1364
                return child
509
c072e559746d evolve: move _stabilizableunstable() with related functions
Patrick Mezard <patrick@mezard.eu>
parents: 507
diff changeset
  1365
    return None
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1366
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1367
def _solveunstable(ui, repo, orig, dryrun=False, confirm=False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1368
                   progresscb=None):
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1369
    """Stabilize a unstable changeset"""
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
  1370
    obs = orig.parents()[0]
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
  1371
    if not obs.obsolete():
636
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1372
        print obs.rev(), orig.parents()
27c890b4f864 evolve: make evolve smarter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 626
diff changeset
  1373
        print orig.rev()
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
  1374
        obs = orig.parents()[1]
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
  1375
    assert obs.obsolete()
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
  1376
    newer = obsolete.successorssets(repo, obs.node())
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1377
    # search of a parent which is not killed
588
89c8550019d0 mercurial: replace all `newerversion` call by `successorsset` call
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 587
diff changeset
  1378
    while not newer or newer == [()]:
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1379
        ui.debug("stabilize target %s is plain dead,"
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  1380
                 " trying to stabilize on its parent")
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1381
        obs = obs.parents()[0]
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
  1382
        newer = obsolete.successorssets(repo, obs.node())
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1383
    if len(newer) > 1:
707
f914e315b717 evolve: remove magic return values from utility functions
Levi Bard <levi@unity3d.com>
parents: 706
diff changeset
  1384
        raise util.Abort(_("conflict rewriting. can't choose destination\n"))
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1385
    targets = newer[0]
466
b98490b689a5 stabilize: handle killed changeset in stabilize.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 465
diff changeset
  1386
    assert targets
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1387
    if len(targets) > 1:
707
f914e315b717 evolve: remove magic return values from utility functions
Levi Bard <levi@unity3d.com>
parents: 706
diff changeset
  1388
        raise util.Abort(_("does not handle split parents yet\n"))
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1389
        return 2
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  1390
    target = targets[0]
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1391
    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1392
    target = repo[target]
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1393
    if not ui.quiet or confirm:
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1394
        repo.ui.write(_('move:'))
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
  1395
        displayer.show(orig)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1396
        repo.ui.write(_('atop:'))
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
  1397
        displayer.show(target)
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1398
    if confirm and ui.prompt('perform evolve? [Ny]') != 'y':
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1399
            raise util.Abort(_('evolve aborted by user'))
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1400
    if progresscb: progresscb()
546
415540dee2bd fix missing --dest evolve output in dryrun
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 540
diff changeset
  1401
    todo = 'hg rebase -r %s -d %s\n' % (orig, target)
468
6b1b6d338478 stabilize: rework stabilize code to allow selection of latecomer and conflicting
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 466
diff changeset
  1402
    if dryrun:
146
e80a6c8ad452 stabilize: proper --quiet behavior
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 145
diff changeset
  1403
        repo.ui.write(todo)
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1404
    else:
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1405
        repo.ui.note(todo)
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1406
        if progresscb: progresscb()
139
9b9500175ae5 evolve that does something \o/
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 137
diff changeset
  1407
        try:
464
d88c761f97c4 stabilize: rename "node" variable to "orig"
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 463
diff changeset
  1408
            relocate(repo, orig, target)
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
  1409
        except MergeFailure:
465
4a039a8c1cf3 stabilize: --continue support !!!
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 464
diff changeset
  1410
            repo.opener.write('graftstate', orig.hex() + '\n')
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1411
            repo.ui.write_err(_('evolve failed!\n'))
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1412
            repo.ui.write_err(
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1413
                _('fix conflict and run "hg evolve --continue"\n'))
463
3f91654713dd obsolete Move merge failure handling into stabilize code
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 455
diff changeset
  1414
            raise
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
  1415
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1416
def _solvebumped(ui, repo, bumped, dryrun=False, confirm=False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1417
                 progresscb=None):
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1418
    """Stabilize a bumped changeset"""
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1419
    # For now we deny bumped merge
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1420
    if len(bumped.parents()) > 1:
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1421
        raise util.Abort('late comer stabilization is confused by bumped'
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1422
                         ' %s being a merge' % bumped)
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1423
    prec = repo.set('last(allprecursors(%d) and public())', bumped).next()
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1424
    # For now we deny target merge
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1425
    if len(prec.parents()) > 1:
492
7ecd41520dae rename `stabilize` to `evolve`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 491
diff changeset
  1426
        raise util.Abort('late comer evolution is confused by precursors'
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1427
                         ' %s being a merge' % prec)
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1428
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1429
    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1430
    if not ui.quiet or confirm:
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1431
        repo.ui.write(_('recreate:'))
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1432
        displayer.show(bumped)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1433
        repo.ui.write(_('atop:'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1434
        displayer.show(prec)
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1435
    if confirm and ui.prompt('perform evolve? [Ny]') != 'y':
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1436
        raise util.Abort(_('evolve aborted by user'))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1437
    if dryrun:
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1438
        todo = 'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1439
        repo.ui.write(todo)
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1440
        repo.ui.write('hg update %s;\n' % prec)
593
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1441
        repo.ui.write('hg revert --all --rev %s;\n' % bumped)
26f76b38f879 evolve: Rename latecomer into bumped
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 588
diff changeset
  1442
        repo.ui.write('hg commit --msg "bumped update to %s"')
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1443
        return 0
762
942aabaa8a8e evolve: show progress
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 760
diff changeset
  1444
    if progresscb: progresscb()
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1445
    newid = tmpctx = None
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1446
    tmpctx = bumped
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1447
    bmupdate = _bookmarksupdater(repo, bumped.node())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1448
    # Basic check for common parent. Far too complicated and fragile
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1449
    tr = repo.transaction('bumped-stabilize')
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1450
    try:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1451
        if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1452
            # Need to rebase the changeset at the right place
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1453
            repo.ui.status(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1454
                _('rebasing to destination parent: %s\n') % prec.p1())
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1455
            try:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1456
                tmpid = relocate(repo, bumped, prec.p1())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1457
                if tmpid is not None:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1458
                    tmpctx = repo[tmpid]
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1459
                    createmarkers(repo, [(bumped, (tmpctx,))])
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1460
            except MergeFailure:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1461
                repo.opener.write('graftstate', bumped.hex() + '\n')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1462
                repo.ui.write_err(_('evolution failed!\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1463
                repo.ui.write_err(
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1464
                    _('fix conflict and run "hg evolve --continue"\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1465
                raise
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1466
        # Create the new commit context
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1467
        repo.ui.status(_('computing new diff\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1468
        files = set()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1469
        copied = copies.pathcopies(prec, bumped)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1470
        precmanifest = prec.manifest()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1471
        for key, val in bumped.manifest().iteritems():
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1472
            if precmanifest.pop(key, None) != val:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1473
                files.add(key)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1474
        files.update(precmanifest)  # add missing files
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1475
        # commit it
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1476
        if files: # something to commit!
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1477
            def filectxfn(repo, ctx, path):
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1478
                if path in bumped:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1479
                    fctx = bumped[path]
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1480
                    flags = fctx.flags()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1481
                    mctx = memfilectx(repo, fctx.path(), fctx.data(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1482
                                      islink='l' in flags,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1483
                                      isexec='x' in flags,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1484
                                      copied=copied.get(path))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1485
                    return mctx
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1486
                raise IOError()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1487
            text = 'bumped update to %s:\n\n' % prec
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1488
            text += bumped.description()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1489
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1490
            new = context.memctx(repo,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1491
                                 parents=[prec.node(), node.nullid],
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1492
                                 text=text,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1493
                                 files=files,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1494
                                 filectxfn=filectxfn,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1495
                                 user=bumped.user(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1496
                                 date=bumped.date(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1497
                                 extra=bumped.extra())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1498
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1499
            newid = repo.commitctx(new)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1500
        if newid is None:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1501
            createmarkers(repo, [(tmpctx, ())])
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1502
            newid = prec.node()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1503
        else:
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
  1504
            phases.retractboundary(repo, tr, bumped.phase(), [newid])
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1505
            createmarkers(repo, [(tmpctx, (repo[newid],))],
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1506
                                   flag=obsolete.bumpedfix)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1507
        bmupdate(newid)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1508
        tr.close()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1509
        repo.ui.status(_('committed as %s\n') % node.short(newid))
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1510
    finally:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1511
        tr.release()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1512
    # reroute the working copy parent to the new changeset
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1513
    repo.dirstate.setparents(newid, node.nullid)
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1514
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1515
def _solvedivergent(ui, repo, divergent, dryrun=False, confirm=False,
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1516
                    progresscb=None):
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1517
    base, others = divergentdata(divergent)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1518
    if len(others) > 1:
760
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1519
        othersstr = "[%s]" % (','.join([str(i) for i in others]))
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1520
        hint = ("changeset %d is divergent with a changeset that got splitted "
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1521
                "| into multiple ones:\n[%s]\n"
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1522
                "| This is not handled by automatic evolution yet\n"
947
9a6cc7e6f0dd evolve: improve wording of a few of messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 946
diff changeset
  1523
                "| You have to fallback to manual handling with commands "
9a6cc7e6f0dd evolve: improve wording of a few of messages
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 946
diff changeset
  1524
                "such as:\n"
760
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1525
                "| - hg touch -D\n"
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1526
                "| - hg prune\n"
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1527
                "| \n"
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1528
                "| You should contact your local evolution Guru for help.\n"
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1529
                % (divergent, othersstr))
948
b2b3d5aa16bc evolve: start all util.Abort messages with lower case
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 947
diff changeset
  1530
        raise util.Abort("we do not handle divergence with split yet",
1016
facb5efa8ea4 divergence: actually use the hint that have been around for age
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1015
diff changeset
  1531
                         hint=hint)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1532
    other = others[0]
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1533
    if divergent.phase() <= phases.public:
948
b2b3d5aa16bc evolve: start all util.Abort messages with lower case
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 947
diff changeset
  1534
        raise util.Abort("we can't resolve this conflict from the public side",
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1535
                    hint="%s is public, try from %s" % (divergent, other))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1536
    if len(other.parents()) > 1:
760
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1537
        raise util.Abort("divergent changeset can't be a merge (yet)",
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1538
                    hint="You have to fallback to solving this by hand...\n"
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1539
                         "| This probably means redoing the merge and using "
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1540
                         "| `hg prune` to kill older version.")
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1541
    if other.p1() not in divergent.parents():
760
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1542
        raise util.Abort("parents are not common (not handled yet)",
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1543
                    hint="| %(d)s, %(o)s are not based on the same changeset."
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1544
                         "| With the current state of its implementation, "
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1545
                         "| evolve does not work in that case.\n"
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1546
                         "| rebase one of them next to the other and run "
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1547
                         "| this command again.\n"
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1548
                         "| - either: hg rebase -dest 'p1(%(d)s)' -r %(o)s"
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1549
                         "| - or:     hg rebase -dest 'p1(%(d)s)' -r %(o)s"
760
bbb3a0e1dfea evolve: add more details when we abort for case not handled yet
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1550
                              % {'d': divergent, 'o': other})
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1551
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1552
    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1553
    if not ui.quiet or confirm:
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1554
        ui.write(_('merge:'))
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1555
        displayer.show(divergent)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1556
        ui.write(_('with: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1557
        displayer.show(other)
1046
296d48e1f55a evolve: gather evolve output together
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1045
diff changeset
  1558
        ui.write(_('base: '))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1559
        displayer.show(base)
1047
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1560
    if confirm and ui.prompt('perform evolve? [Ny]') != 'y':
d830377bf186 evolve: adds a --confirm option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1046
diff changeset
  1561
        raise util.Abort(_('evolve aborted by user'))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1562
    if dryrun:
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1563
        ui.write('hg update -c %s &&\n' % divergent)
533
87c41ef95ebf test conflicting conflicting (sic) resolution
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 523
diff changeset
  1564
        ui.write('hg merge %s &&\n' % other)
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  1565
        ui.write('hg commit -m "auto merge resolving conflict between '
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1566
                 '%s and %s"&&\n' % (divergent, other))
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1567
        ui.write('hg up -C %s &&\n' % base)
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1568
        ui.write('hg revert --all --rev tip &&\n')
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  1569
        ui.write('hg commit -m "`hg log -r %s --template={desc}`";\n'
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1570
                 % divergent)
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1571
        return
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1572
    if divergent not in repo[None].parents():
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1573
        repo.ui.status(_('updating to "local" conflict\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1574
        hg.update(repo, divergent.rev())
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1575
    repo.ui.note(_('merging divergent changeset\n'))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1576
    if progresscb: progresscb()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1577
    stats = merge.update(repo,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1578
                         other.node(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1579
                         branchmerge=True,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1580
                         force=False,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1581
                         partial=None,
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1582
                         ancestor=base.node(),
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1583
                         mergeancestor=True)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1584
    hg._showstats(repo, stats)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1585
    if stats[3]:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1586
        repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1587
                         "or 'hg update -C .' to abandon\n"))
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1588
    if stats[3] > 0:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1589
        raise util.Abort('merge conflict between several amendments '
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1590
            '(this is not automated yet)',
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1591
            hint="""/!\ You can try:
534
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1592
/!\ * manual merge + resolve => new cset X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1593
/!\ * hg up to the parent of the amended changeset (which are named W and Z)
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1594
/!\ * hg revert --all -r X
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1595
/!\ * hg ci -m "same message as the amended changeset" => new cset Y
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1596
/!\ * hg kill -n Y W Z
45ccaba212f9 a better msg for this tricky situation
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 533
diff changeset
  1597
""")
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1598
    if progresscb: progresscb()
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1599
    tr = repo.transaction('stabilize-divergent')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1600
    try:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1601
        repo.dirstate.setparents(divergent.node(), node.nullid)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1602
        oldlen = len(repo)
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1603
        amend(ui, repo, message='', logfile='')
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1604
        if oldlen == len(repo):
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1605
            new = divergent
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1606
            # no changes
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1607
        else:
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1608
            new = repo['.']
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1609
        createmarkers(repo, [(other, (new,))])
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
  1610
        phases.retractboundary(repo, tr, other.phase(), [new.node()])
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1611
        tr.close()
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1612
    finally:
1021
200f2d9b9f39 evolve: saner locking an transaction in `hg evolve`
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1020
diff changeset
  1613
        tr.release()
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1614
586
f01721161532 evolve: rename conflicting into divergent
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 585
diff changeset
  1615
def divergentdata(ctx):
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1616
    """return base, other part of a conflict
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1617
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1618
    This only return the first one.
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1619
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1620
    XXX this woobly function won't survive XXX
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1621
    """
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1622
    for base in ctx._repo.set('reverse(precursors(%d))', ctx):
630
722b52c75f02 compat: adapt to upstreaming of divergent logic
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 622
diff changeset
  1623
        newer = obsolete.successorssets(ctx._repo, base.node())
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1624
        # drop filter and solution including the original ctx
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1625
        newer = [n for n in newer if n and ctx.node() not in n]
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1626
        if newer:
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1627
            return base, tuple(ctx._repo[o] for o in newer[0])
749
f728edc7fcd1 evolve: abort on unknown divergent changeset base
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 745
diff changeset
  1628
    raise util.Abort('base of divergent changeset not found',
f728edc7fcd1 evolve: abort on unknown divergent changeset base
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 745
diff changeset
  1629
                     hint='this case is not yet handled')
485
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1630
41bf6c27a122 evolve: stabilize now handle conflicting changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 484
diff changeset
  1631
469
abeb17a9e313 stabilize: handle latecomer
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 468
diff changeset
  1632
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1633
shorttemplate = '[{rev}] {desc|firstline}\n'
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1634
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1635
@command('^previous',
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1636
         [],
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1637
         '')
751
a5474648a9d2 gdown/gup: add next/previous alias
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 750
diff changeset
  1638
def cmdprevious(ui, repo):
724
fa049c1d9445 evolve: fix typo
André Sintzoff <andre.sintzoff@gmail.com>
parents: 723
diff changeset
  1639
    """update to parent and display summary lines"""
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1640
    wkctx = repo[None]
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1641
    wparents = wkctx.parents()
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1642
    if len(wparents) != 1:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1643
        raise util.Abort('merge in progress')
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1644
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1645
    parents = wparents[0].parents()
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1646
    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1647
    if len(parents) == 1:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1648
        p = parents[0]
892
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1649
        bm = bookmarks.readcurrent(repo)
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1650
        shouldmove = bm is not None and bookmarks.iscurrent(repo, bm)
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1651
        ret = hg.update(repo, p.rev())
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1652
        if not ret and shouldmove:
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1653
            repo._bookmarks[bm] = p.node()
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1654
            repo._bookmarks.write()
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1655
        displayer.show(p)
88
64fe5a4f877e [evolution] first workign draft of a relocate function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 87
diff changeset
  1656
        return 0
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1657
    else:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1658
        for p in parents:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1659
            displayer.show(p)
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1660
        ui.warn(_('multiple parents, explicitly update to one\n'))
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1661
        return 1
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1662
895
17ac69db9329 evolve: deprecate gup and gdown aliases
Olle Lundberg <geek@nerd.sh>
parents: 894
diff changeset
  1663
@command('^next',
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1664
         [],
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1665
         '')
751
a5474648a9d2 gdown/gup: add next/previous alias
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 750
diff changeset
  1666
def cmdnext(ui, repo):
724
fa049c1d9445 evolve: fix typo
André Sintzoff <andre.sintzoff@gmail.com>
parents: 723
diff changeset
  1667
    """update to child and display summary lines"""
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1668
    wkctx = repo[None]
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1669
    wparents = wkctx.parents()
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1670
    if len(wparents) != 1:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1671
        raise util.Abort('merge in progress')
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
  1672
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1673
    children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1674
    displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1675
    if not children:
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
  1676
        ui.warn(_('no non-obsolete children\n'))
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1677
        return 1
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1678
    if len(children) == 1:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1679
        c = children[0]
892
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1680
        bm = bookmarks.readcurrent(repo)
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1681
        shouldmove = bm is not None and bookmarks.iscurrent(repo, bm)
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1682
        ret = hg.update(repo, c.rev())
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1683
        if not ret and shouldmove:
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1684
            repo._bookmarks[bm] = c.node()
947fb5b1915b evolve: active bookmark should move when using prev/next (#37)
Olle Lundberg <geek@nerd.sh>
parents: 891
diff changeset
  1685
            repo._bookmarks.write()
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1686
        displayer.show(c)
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1687
        return 0
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1688
    else:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1689
        for c in children:
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1690
            displayer.show(c)
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1691
        ui.warn(_('multiple non-obsolete children, '
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1692
            'explicitly update to one of them\n'))
127
7e113963f2c8 Add gup and gdown command to mimic qpop and qpush command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 119
diff changeset
  1693
        return 1
87
246b8fefd0a5 [evolution/obsolete] very experimental and crude evolve support.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 82
diff changeset
  1694
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1695
def _reachablefrombookmark(repo, revs, mark):
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1696
    """filter revisions and bookmarks reachable from the given bookmark
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1697
    yoinked from mq.py
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1698
    """
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1699
    marks = repo._bookmarks
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1700
    if mark not in marks:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1701
        raise util.Abort(_("bookmark '%s' not found") % mark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1702
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1703
    # If the requested bookmark is not the only one pointing to a
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1704
    # a revision we have to only delete the bookmark and not strip
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1705
    # anything. revsets cannot detect that case.
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1706
    uniquebm = True
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1707
    for m, n in marks.iteritems():
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1708
        if m != mark and n == repo[mark].node():
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1709
            uniquebm = False
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1710
            break
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1711
    if uniquebm:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1712
        rsrevs = repo.revs("ancestors(bookmark(%s)) - "
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1713
                           "ancestors(head() and not bookmark(%s)) - "
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1714
                           "ancestors(bookmark() and not bookmark(%s)) - "
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1715
                           "obsolete()",
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1716
                           mark, mark, mark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1717
        revs.update(set(rsrevs))
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1718
    return marks,revs
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1719
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1720
def _deletebookmark(ui, marks, mark):
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1721
    del marks[mark]
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1722
    marks.write()
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1723
    ui.write(_("bookmark '%s' deleted\n") % mark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1724
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1725
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1726
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1727
def _getmetadata(**opts):
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1728
    metadata = {}
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1729
    date = opts.get('date')
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1730
    user = opts.get('user')
818
fcdd9b8c970b prune: accept '0 0' as a valide --date value
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 757
diff changeset
  1731
    if date:
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1732
        metadata['date'] = '%i %i' % util.parsedate(date)
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1733
    if user:
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1734
        metadata['user'] = user
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1735
    return metadata
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1736
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1737
365
9f6a77ec66cb evolve: switch the official name for "kill" to prune
Pierre-Yves.David@ens-lyon.org
parents: 362
diff changeset
  1738
@command('^prune|obsolete|kill',
682
6cbb52a8401b prune: rename --new to --succ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 681
diff changeset
  1739
    [('n', 'new', [], _("successor changeset (DEPRECATED)")),
6cbb52a8401b prune: rename --new to --succ
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 681
diff changeset
  1740
     ('s', 'succ', [], _("successor changeset")),
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1741
     ('r', 'rev', [], _("revisions to prune")),
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1742
     ('', 'biject', False, _("do a 1-1 map between rev and successor ranges")),
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1743
     ('B', 'bookmark', '', _("remove revs only reachable from given"
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1744
                             " bookmark"))] + metadataopts,
644
8e41d5b78dff support -r option in prune, add a test for this
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 636
diff changeset
  1745
    _('[OPTION] [-r] REV...'))
690
929d7617a13d prune: more command switch idea
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 689
diff changeset
  1746
    # -U  --noupdate option to prevent wc update and or bookmarks update ?
681
eff18fcaaddc prune: improve command function name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 680
diff changeset
  1747
def cmdprune(ui, repo, *revs, **opts):
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1748
    """hide changesets by marking them obsolete
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1749
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  1750
    Obsolete changesets becomes invisible to all commands.
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  1751
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1752
    Unpruned descendants of pruned changesets becomes "unstable". Use the
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  1753
    :hg:`evolve` to handle such situation.
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1754
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1755
    When the working directory parent is pruned, the repository is updated to a
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1756
    non-obsolete parent.
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1757
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1758
    You can use the ``--succ`` option to inform mercurial that a newer version
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  1759
    of the pruned changeset exists.
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1760
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1761
    You can use the ``--biject`` option to specify a 1-1 (bijection) between
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1762
    revisions to prune and successor changesets. This option may be removed in
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1763
    a future release (with the functionality absorbed automatically).
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1764
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1765
    """
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1766
    revs = set(scmutil.revrange(repo, list(revs) + opts.get('rev')))
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1767
    succs = opts['new'] + opts['succ']
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1768
    bookmark = opts.get('bookmark')
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1769
    metadata = _getmetadata(**opts)
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1770
    biject = opts.get('biject')
689
d48aae167b9d prune: documentation update
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 688
diff changeset
  1771
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1772
    if bookmark:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1773
        marks,revs = _reachablefrombookmark(repo, revs, bookmark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1774
        if not revs:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1775
            # no revisions to prune - delete bookmark immediately
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1776
            _deletebookmark(ui, marks, bookmark)
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1777
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1778
    if not revs:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1779
        raise util.Abort(_('nothing to prune'))
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1780
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1781
    wlock = lock = None
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1782
    try:
1019
0c733dab0036 prune: lock inside the try
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1018
diff changeset
  1783
        wlock = repo.wlock()
0c733dab0036 prune: lock inside the try
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1018
diff changeset
  1784
        sortedrevs = lambda specs: sorted(set(scmutil.revrange(repo, specs)))
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  1785
        lock = repo.lock()
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
  1786
        # defines pruned changesets
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  1787
        precs = []
685
7398f9729821 prune: add test and more robusness
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 684
diff changeset
  1788
        for p in sortedrevs(revs):
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  1789
            cp = repo[p]
687
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
  1790
            if not cp.mutable():
927
154510dc4318 evolve: fix grammar in a comment
Greg Ward <greg@gerg.ca>
parents: 925
diff changeset
  1791
                # note: createmarkers() would have raised something anyway
687
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
  1792
                raise util.Abort('cannot prune immutable changeset: %s' % cp,
6c1fbef2952e prune: test and improve message of immutable aborting.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 685
diff changeset
  1793
                                 hint='see "hg help phases" for details')
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  1794
            precs.append(cp)
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  1795
        if not precs:
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1796
            raise util.Abort('nothing to prune')
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1797
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
  1798
        # defines successors changesets
685
7398f9729821 prune: add test and more robusness
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 684
diff changeset
  1799
        sucs = tuple(repo[n] for n in sortedrevs(succs))
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1800
        if not biject and len(sucs) > 1 and len(precs) > 1:
684
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  1801
            msg = "Can't use multiple successors for multiple precursors"
19a1a8f93c07 prune: detect bad input
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 683
diff changeset
  1802
            raise util.Abort(msg)
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1803
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1804
        if biject and len(sucs) != len(precs):
949
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1805
            msg = "Can't use %d successors for %d precursors" \
2b2a4ab0eb68 evolve: make most line lenghts 80 characters or less
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 948
diff changeset
  1806
                % (len(sucs), len(precs))
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1807
            raise util.Abort(msg)
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1808
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1809
        relations = [(p, sucs) for p in precs]
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1810
        if biject:
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1811
            relations = [(p, (s,)) for p, s in zip(precs, sucs)]
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1812
691
6e63b4185a5c prune: update inline documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 690
diff changeset
  1813
        # create markers
789
0d2bb0282e78 prune: add biject option
Sean Farley <sean.michael.farley@gmail.com>
parents: 788
diff changeset
  1814
        createmarkers(repo, relations, metadata=metadata)
716
4c0f6d555032 prune: add --user and --date options
Levi Bard <levi@unity3d.com>
parents: 715
diff changeset
  1815
688
f2c3fd21fa63 prune: add an informative message about the number of pruned changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 687
diff changeset
  1816
        # informs that changeset have been pruned
f2c3fd21fa63 prune: add an informative message about the number of pruned changesets
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 687
diff changeset
  1817
        ui.status(_('%i changesets pruned\n') % len(precs))
931
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1818
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1819
        wdp = repo['.']
931
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1820
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1821
        if len(sucs) == 1 and len(precs) == 1 and wdp in precs:
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1822
            # '.' killed, so update to the successor
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1823
            newnode = sucs[0]
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1824
        else:
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1825
            # update to an unkilled parent
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1826
            newnode = wdp
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1827
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1828
            while newnode.obsolete():
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1829
                newnode = newnode.parents()[0]
32915143d448 prune: update to successor rather than parent when prune '.'
Dan Villiom Podlaski Christiansen <dan@cabo.dk>
parents: 930
diff changeset
  1830
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1831
        if newnode.node() != wdp.node():
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1832
            commands.update(ui, repo, newnode.rev())
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1833
            ui.status(_('working directory now at %s\n') % newnode)
715
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1834
        # update bookmarks
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1835
        if bookmark:
070bbbb0e6f2 prune: add strip-like bookmark
Levi Bard <levi@unity3d.com>
parents: 714
diff changeset
  1836
            _deletebookmark(ui, marks, bookmark)
693
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  1837
        for ctx in repo.unfiltered().set('bookmark() and %ld', precs):
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  1838
            ldest = list(repo.set('max((::%d) - obsolete())', ctx))
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  1839
            if ldest:
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  1840
                dest = ldest[0]
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  1841
                updatebookmarks = _bookmarksupdater(repo, ctx.node())
d3c1fe0035d1 prune: handle bookmark
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 691
diff changeset
  1842
                updatebookmarks(dest.node())
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1843
    finally:
683
6d24bd455f79 simplify locking in prune
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 682
diff changeset
  1844
        lockmod.release(lock, wlock)
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
  1845
673
761b5b266985 evolve: removes amend from the list of advertised function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 672
diff changeset
  1846
@command('amend|refresh',
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1847
    [('A', 'addremove', None,
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1848
     _('mark new/missing files as added/removed before committing')),
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  1849
    ('e', 'edit', False, _('invoke editor on commit messages')),
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1850
    ('', 'close-branch', None,
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1851
     _('mark a branch as closed, hiding it from the branch list')),
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1852
    ('s', 'secret', None, _('use the secret phase for committing')),
976
bed842762447 amend: add -D/--current-date option, just like mq's qrefresh has
Greg Ward <greg@gerg.ca>
parents: 962
diff changeset
  1853
    ] + walkopts + commitopts + commitopts2 + commitopts3,
82
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1854
    _('[OPTION]... [FILE]...'))
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1855
def amend(ui, repo, *pats, **opts):
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1856
    """combine a changeset with updates and replace it with a new one
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1857
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1858
    Commits a new changeset incorporating both the changes to the given files
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1859
    and all the changes from the current parent changeset into the repository.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1860
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1861
    See :hg:`commit` for details about committing changes.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1862
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1863
    If you don't specify -m, the parent's message will be reused.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1864
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1865
    Behind the scenes, Mercurial first commits the update as a regular child
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1866
    of the current parent. Then it creates a new commit on the parent's parents
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1867
    with the updated contents. Then it changes the working copy parent to this
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1868
    new combined changeset. Finally, the old changeset and its update are hidden
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1869
    from :hg:`log` (unless you use --hidden with log).
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1870
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1871
    Returns 0 on success, 1 if nothing changed.
8108d566a8b5 [evolution] imported hg amend from parren works
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 81
diff changeset
  1872
    """
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1873
    opts = opts.copy()
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1874
    edit = opts.pop('edit', False)
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1875
    opts['amend'] = True
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1876
    if not (edit or opts['message']):
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1877
        opts['message'] = repo['.'].description()
985
6a37044ec0b3 amend: add -U/--current-user option (inspired by mq)
Greg Ward <greg@gerg.ca>
parents: 983
diff changeset
  1878
    _resolveoptions(ui, opts)
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1879
    _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  1880
    return commitcmd[0](ui, repo, *pats, **opts)
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  1881
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1882
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1883
def _touchedbetween(repo, source, dest, match=None):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1884
    touched = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1885
    for files in repo.status(source, dest, match=match)[:3]:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1886
        touched.update(files)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1887
    return touched
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1888
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1889
def _commitfiltered(repo, ctx, match, target=None):
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1890
    """Recommit ctx with changed files not in match. Return the new
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1891
    node identifier, or None if nothing changed.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1892
    """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1893
    base = ctx.p1()
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1894
    if target is None:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1895
        target = base
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1896
    # ctx
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1897
    initialfiles = _touchedbetween(repo, base, ctx)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1898
    if base == target:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1899
        affected = set(f for f in initialfiles if match(f))
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1900
        newcontent = set()
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1901
    else:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1902
        affected = _touchedbetween(repo, target, ctx, match=match)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1903
        newcontent = _touchedbetween(repo, target, base, match=match)
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1904
    # The commit touchs all existing files
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1905
    # + all file that needs a new content
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1906
    # - the file affected bny uncommit with the same content than base.
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1907
    files = (initialfiles - affected) | newcontent
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1908
    if not newcontent and files == initialfiles:
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1909
        return None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1910
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1911
    # Filter copies
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1912
    copied = copies.pathcopies(target, ctx)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1913
    copied = dict((src, dst) for src, dst in copied.iteritems()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1914
                  if dst in files)
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1915
    def filectxfn(repo, memctx, path, contentctx=ctx, redirect=newcontent):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1916
        if path in redirect:
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1917
            return filectxfn(repo, memctx, path, contentctx=target, redirect=())
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1918
        if path not in contentctx:
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1919
            raise IOError()
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1920
        fctx = contentctx[path]
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1921
        flags = fctx.flags()
955
72670e282460 evolve: compatibility with memfilectx change
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 954
diff changeset
  1922
        mctx = memfilectx(repo, fctx.path(), fctx.data(),
954
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
  1923
                          islink='l' in flags,
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
  1924
                          isexec='x' in flags,
ef155e3ead8f evolve: abstract access to context.memfilectx
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 953
diff changeset
  1925
                          copied=copied.get(path))
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1926
        return mctx
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1927
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1928
    new = context.memctx(repo,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1929
                         parents=[base.node(), node.nullid],
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1930
                         text=ctx.description(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1931
                         files=files,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1932
                         filectxfn=filectxfn,
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1933
                         user=ctx.user(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1934
                         date=ctx.date(),
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1935
                         extra=ctx.extra())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1936
    # commitctx always create a new revision, no need to check
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1937
    newid = repo.commitctx(new)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1938
    return newid
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1939
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1940
def _uncommitdirstate(repo, oldctx, match):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1941
    """Fix the dirstate after switching the working directory from
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1942
    oldctx to a copy of oldctx not containing changed files matched by
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1943
    match.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1944
    """
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1945
    ctx = repo['.']
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1946
    ds = repo.dirstate
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1947
    copies = dict(ds.copies())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1948
    m, a, r = repo.status(oldctx.p1(), oldctx, match=match)[:3]
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1949
    for f in m:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1950
        if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1951
            # modified + removed -> removed
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1952
            continue
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1953
        ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1954
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1955
    for f in a:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1956
        if ds[f] == 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1957
            # added + removed -> unknown
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1958
            ds.drop(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1959
        elif ds[f] != 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1960
            ds.add(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1961
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1962
    for f in r:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1963
        if ds[f] == 'a':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1964
            # removed + added -> normal
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1965
            ds.normallookup(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1966
        elif ds[f] != 'r':
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1967
            ds.remove(f)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1968
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1969
    # Merge old parent and old working dir copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1970
    oldcopies = {}
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1971
    for f in (m + a):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1972
        src = oldctx[f].renamed()
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1973
        if src:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1974
            oldcopies[f] = src[0]
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1975
    oldcopies.update(copies)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1976
    copies = dict((dst, oldcopies.get(src, src))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1977
                  for dst, src in oldcopies.iteritems())
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1978
    # Adjust the dirstate copies
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1979
    for dst, src in copies.iteritems():
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1980
        if (src not in ctx or dst in ctx or ds[dst] != 'a'):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1981
            src = None
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1982
        ds.copy(src, dst)
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1983
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1984
@command('^uncommit',
314
ebd286f06879 uncommit: add --all option
Patrick Mezard <patrick@mezard.eu>
parents: 313
diff changeset
  1985
    [('a', 'all', None, _('uncommit all changes when no arguments given')),
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  1986
     ('r', 'rev', '', _('revert commit content to REV instead')),
314
ebd286f06879 uncommit: add --all option
Patrick Mezard <patrick@mezard.eu>
parents: 313
diff changeset
  1987
     ] + commands.walkopts,
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1988
    _('[OPTION]... [NAME]'))
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1989
def uncommit(ui, repo, *pats, **opts):
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1990
    """move changes from parent revision to working directory
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1991
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1992
    Changes to selected files in the checked out revision appear again as
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1993
    uncommitted changed in the working directory. A new revision
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1994
    without the selected changes is created, becomes the checked out
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  1995
    revision, and obsoletes the previous one.
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1996
867
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
  1997
    The --include option specifies patterns to uncommit.
6a67606e1c34 evolve: fix typos in uncommit docstring
André Sintzoff <andre.sintzoff@gmail.com>
parents: 858
diff changeset
  1998
    The --exclude option specifies patterns to keep in the commit.
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  1999
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2000
    The --rev argument let you change the commit file to a content of another
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2001
    revision. It still does not change the content of your file in the working
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2002
    directory.
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2003
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2004
    Return 0 if changed files are uncommitted.
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2005
    """
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2006
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2007
    wlock = lock = tr = None
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2008
    try:
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2009
        wlock = repo.wlock()
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2010
        lock = repo.lock()
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2011
        wctx = repo[None]
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2012
        if len(wctx.parents()) <= 0:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2013
            raise util.Abort(_("cannot uncommit null changeset"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2014
        if len(wctx.parents()) > 1:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2015
            raise util.Abort(_("cannot uncommit while merging"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2016
        old = repo['.']
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2017
        if old.phase() == phases.public:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2018
            raise util.Abort(_("cannot rewrite immutable changeset"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2019
        if len(old.parents()) > 1:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2020
            raise util.Abort(_("cannot uncommit merge changeset"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2021
        oldphase = old.phase()
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2022
        updatebookmarks = _bookmarksupdater(repo, old.node())
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2023
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2024
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2025
        rev = None
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2026
        if opts.get('rev'):
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2027
            rev = scmutil.revsingle(repo, opts.get('rev'))
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2028
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2029
        # Recommit the filtered changeset
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2030
        tr = repo.transaction('uncommit')
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2031
        newid = None
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2032
        if (pats or opts.get('include') or opts.get('exclude')
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2033
            or opts.get('all')):
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2034
            match = scmutil.match(old, pats, opts)
1058
00bc31523074 uncommit: add a --rev argument
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1055
diff changeset
  2035
            newid = _commitfiltered(repo, old, match, target=rev)
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2036
        if newid is None:
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2037
            raise util.Abort(_('nothing to uncommit'),
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2038
                             hint=_("use --all to uncommit all files"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2039
        # Move local changes on filtered changeset
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2040
        createmarkers(repo, [(old, (repo[newid],))])
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
  2041
        phases.retractboundary(repo, tr, oldphase, [newid])
1020
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2042
        repo.dirstate.setparents(newid, node.nullid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2043
        _uncommitdirstate(repo, old, match)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2044
        updatebookmarks(newid)
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2045
        if not repo[newid].files():
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2046
            ui.warn(_("new changeset is empty\n"))
155949287628 uncommit: saner locking scheme
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1019
diff changeset
  2047
            ui.status(_('(use "hg prune ." to remove it)\n'))
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2048
        tr.close()
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2049
    finally:
1022
6f4fd3e49d1c uncommit tr
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1021
diff changeset
  2050
        lockmod.release(tr, lock, wlock)
312
a7b5989d1d92 evolve: add uncommit command
Patrick Mezard <patrick@mezard.eu>
parents: 309
diff changeset
  2051
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2052
@eh.wrapcommand('commit')
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  2053
def commitwrapper(orig, ui, repo, *arg, **kwargs):
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2054
    if kwargs.get('amend', False):
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2055
        lock = None
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2056
    else:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2057
        lock = repo.lock()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2058
    try:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2059
        obsoleted = kwargs.get('obsolete', [])
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2060
        if obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2061
            obsoleted = repo.set('%lr', obsoleted)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2062
        result = orig(ui, repo, *arg, **kwargs)
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2063
        if not result: # commit successed
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2064
            new = repo['-1']
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2065
            oldbookmarks = []
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2066
            markers = []
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2067
            for old in obsoleted:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2068
                oldbookmarks.extend(repo.nodebookmarks(old.node()))
444
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2069
                markers.append((old, (new,)))
aedb6b8ace86 drop repo.addobsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 443
diff changeset
  2070
            if markers:
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2071
                createmarkers(repo, markers)
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2072
            for book in oldbookmarks:
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2073
                repo._bookmarks[book] = new.node()
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2074
            if oldbookmarks:
612
15299bfd0813 adapt to 7f5dab94e48c in crew
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 604
diff changeset
  2075
                repo._bookmarks.write()
137
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2076
        return result
bbc653876876 fix evolve test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 133
diff changeset
  2077
    finally:
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2078
        if lock is not None:
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2079
            lock.release()
116
64ca29eef349 Add a -o option to commit
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 113
diff changeset
  2080
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2081
@command('^touch',
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2082
    [('r', 'rev', [], 'revision to update'),
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2083
     ('D', 'duplicate', False,
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2084
      'do not mark the new revision as successor of the old one')],
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2085
    # allow to choose the seed ?
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2086
    _('[-r] revs'))
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2087
def touch(ui, repo, *revs, **opts):
891
36c1c80e99a3 commands: small language fixes in help
Brendan Cully <brendan@kublai.com>
parents: 867
diff changeset
  2088
    """Create successors that are identical to their predecessors except for the changeset ID
517
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  2089
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  2090
    This is used to "resurrect" changesets
0bc0c9edcb15 evolve: usual syntax/grammar errors/long lines cleanup
Patrick Mezard <patrick@mezard.eu>
parents: 516
diff changeset
  2091
    """
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2092
    duplicate = opts['duplicate']
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2093
    revs = list(revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2094
    revs.extend(opts['rev'])
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2095
    if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2096
        revs = ['.']
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2097
    revs = scmutil.revrange(repo, revs)
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2098
    if not revs:
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2099
        ui.write_err('no revision to touch\n')
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2100
        return 1
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2101
    if not duplicate and repo.revs('public() and %ld', revs):
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2102
        raise util.Abort("can't touch public revision")
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2103
    wlock = lock = None
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2104
    try:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2105
        wlock = repo.wlock()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2106
        lock = repo.lock()
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2107
        tr = repo.transaction('touch')
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2108
        revs.sort() # ensure parent are run first
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2109
        newmapping = {}
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2110
        try:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2111
            for r in revs:
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2112
                ctx = repo[r]
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2113
                extra = ctx.extra().copy()
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2114
                extra['__touch-noise__'] = random.randint(0, 0xffffffff)
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2115
                # search for touched parent
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2116
                p1 = ctx.p1().node()
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2117
                p2 = ctx.p2().node()
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2118
                p1 = newmapping.get(p1, p1)
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2119
                p2 = newmapping.get(p2, p2)
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2120
                new, unusedvariable = rewrite(repo, ctx, [], ctx,
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2121
                                              [p1, p2],
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2122
                                              commitopts={'extra': extra})
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2123
                # store touched version to help potential children
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2124
                newmapping[ctx.node()] = new
701
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2125
                if not duplicate:
f752089479ce add a duplicate option in touch
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 699
diff changeset
  2126
                    createmarkers(repo, [(ctx, (repo[new],))])
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
  2127
                phases.retractboundary(repo, tr, ctx.phase(), [new])
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2128
                if ctx in repo[None].parents():
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2129
                    repo.dirstate.setparents(new, node.nullid)
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2130
            tr.close()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2131
        finally:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2132
            tr.release()
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2133
    finally:
514
ea667749ccd1 touch: simplify locking pattern
Patrick Mezard <patrick@mezard.eu>
parents: 513
diff changeset
  2134
        lockmod.release(lock, wlock)
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2135
934
f13facb01ac5 fold: add squash as a possible alias
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 933
diff changeset
  2136
@command('^fold|squash',
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2137
    [('r', 'rev', [], _("revision to fold")),
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2138
     ('', 'exact', None, _("only fold specified revisions"))
933
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2139
    ] + commitopts + commitopts2,
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2140
    _('hg fold [OPTION]... [-r] REV'))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2141
def fold(ui, repo, *revs, **opts):
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2142
    """fold multiple revisions into a single one
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2143
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2144
    Folds a set of revisions with the parent of the working directory.
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2145
    All revisions linearly between the given revisions and the parent
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2146
    of the working directory will also be folded.
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2147
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2148
    Use --exact for folding only the specified revisions while ignoring the
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2149
    parent of the working directory. In this case, the given revisions must
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2150
    form a linear unbroken chain.
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2151
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2152
    .. container:: verbose
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2153
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2154
     Some examples:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2155
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2156
     - Fold the current revision with its parent::
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2157
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2158
         hg fold .^
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2159
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2160
     - Fold all draft revisions with working directory parent::
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2161
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2162
         hg fold 'draft()'
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2163
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2164
       See :hg:`help phases` for more about draft revisions and
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2165
       :hg:`help revsets` for more about the `draft()` keyword
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2166
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2167
     - Fold revisions 3, 4, 5, and 6 with the working directory parent::
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2168
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2169
         hg fold 3:6
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2170
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2171
     - Only fold revisions linearly between foo and @::
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2172
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2173
         hg fold foo::@ --exact
702
b5a85a8909d3 touch: properly handle touching multiple changeset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 701
diff changeset
  2174
    """
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2175
    revs = list(revs)
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2176
    revs.extend(opts['rev'])
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2177
    if not revs:
994
debf44fa91a2 fold: clarify message for empty revision set and abort instead (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 993
diff changeset
  2178
        raise util.Abort(_('no revisions specified'))
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
  2179
996
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2180
    revs = scmutil.revrange(repo, revs)
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2181
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2182
    if not opts['exact']:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2183
        # Try to extend given revision starting from the working directory
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2184
        extrevs = repo.revs('(%ld::.) or (.::%ld)', revs, revs)
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2185
        discardedrevs = [r for r in revs if r not in extrevs]
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2186
        if discardedrevs:
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2187
            raise util.Abort(_("cannot fold non-linear revisions"),
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2188
                               hint=_("given revisions are unrelated to parent "
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2189
                                      "of working directory"))
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2190
        revs = extrevs
b98dd5d3065c fold: overhaul handling of revisions with --rev (BC)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 995
diff changeset
  2191
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
  2192
    if len(revs) == 1:
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
  2193
        ui.write_err(_('single revision specified, nothing to fold\n'))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2194
        return 1
995
0f3a7efd6ee9 fold: emit error message when folding a single revision
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 994
diff changeset
  2195
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2196
    roots = repo.revs('roots(%ld)', revs)
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2197
    if len(roots) > 1:
998
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2198
        raise util.Abort(_("cannot fold non-linear revisions "
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2199
                           "(multiple roots given)"))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2200
    root = repo[roots[0]]
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2201
    if root.phase() <= phases.public:
997
f48cd2f48d14 fold: reword error message for public commits
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 996
diff changeset
  2202
        raise util.Abort(_("cannot fold public revisions"))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2203
    heads = repo.revs('heads(%ld)', revs)
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2204
    if len(heads) > 1:
998
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2205
        raise util.Abort(_("cannot fold non-linear revisions "
85ec2a55fe7c fold: improve error messages for multiple heads and roots
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 997
diff changeset
  2206
                           "(multiple heads given)"))
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2207
    head = repo[heads[0]]
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2208
    wlock = lock = None
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2209
    try:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2210
        wlock = repo.wlock()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2211
        lock = repo.lock()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2212
        tr = repo.transaction('touch')
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2213
        try:
915
1ebe5c51919b fold: enable --date and --user options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 912
diff changeset
  2214
            commitopts = opts.copy()
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2215
            allctx = [repo[r] for r in revs]
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2216
            targetphase = max(c.phase() for c in allctx)
933
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2217
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2218
            if commitopts.get('message') or commitopts.get('logfile'):
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2219
                commitopts['edit'] = False
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2220
            else:
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2221
                msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2222
                msgs += ["HG: Commit message of changeset %s.\n\n%s\n" %
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2223
                         (c.rev(), c.description()) for c in allctx]
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2224
                commitopts['message'] =  "\n".join(msgs)
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2225
                commitopts['edit'] = True
e5baeb8fefec fold: add --message and --logfile options
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 931
diff changeset
  2226
993
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2227
            newid, unusedvariable = rewrite(repo, root, allctx, head,
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2228
                                            [root.p1().node(), root.p2().node()],
8a4a8fe50c26 evolve: do not use _ as an unused variable
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 988
diff changeset
  2229
                                            commitopts=commitopts)
1069
356552e55489 evolve: always use the transaction version of phase movement
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1068
diff changeset
  2230
            phases.retractboundary(repo, tr, targetphase, [newid])
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2231
            createmarkers(repo, [(ctx, (repo[newid],))
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2232
                                 for ctx in allctx])
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2233
            tr.close()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2234
        finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2235
            tr.release()
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2236
        ui.status('%i changesets folded\n' % len(revs))
632
cb0807646f5a fold: work around potential bug with filtering
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 631
diff changeset
  2237
        if repo['.'].rev() in revs:
549
b047e9417d96 Properly update after fold
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 548
diff changeset
  2238
            hg.update(repo, newid)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2239
    finally:
515
0b60c28d9c43 fold: simplify locking
Patrick Mezard <patrick@mezard.eu>
parents: 514
diff changeset
  2240
        lockmod.release(lock, wlock)
482
d2531a747ff5 evolve: fold command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 481
diff changeset
  2241
587
8152fedbac65 evolve: smarter code for divergent changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 586
diff changeset
  2242
481
4e0f1aae8d24 evolve: touch command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 477
diff changeset
  2243
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2244
@eh.wrapcommand('graft')
117
438fe133b068 Add a -o and -O option to graft.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 116
diff changeset
  2245
def graftwrapper(orig, ui, repo, *revs, **kwargs):
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2246
    kwargs = dict(kwargs)
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2247
    revs = list(revs) + kwargs.get('rev', [])
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2248
    kwargs['rev'] = []
417
a1fb18ad29a1 evolve: avoid duplication in graft wrapper
Patrick Mezard <patrick@mezard.eu>
parents: 416
diff changeset
  2249
    obsoleted = kwargs.setdefault('obsolete', [])
419
03672e955bc8 evolve: make graft wrapper handle --rev
Patrick Mezard <patrick@mezard.eu>
parents: 410
diff changeset
  2250
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2251
    lock = repo.lock()
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2252
    try:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2253
        if kwargs.get('old_obsolete'):
418
18a0d96ed559 evolve: graft --continue is optional, test
Patrick Mezard <patrick@mezard.eu>
parents: 417
diff changeset
  2254
            if kwargs.get('continue'):
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2255
                obsoleted.extend(repo.opener.read('graftstate').splitlines())
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2256
            else:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2257
                obsoleted.extend(revs)
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2258
        # convert obsolete target into revs to avoid alias joke
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2259
        obsoleted[:] = [str(i) for i in repo.revs('%lr', obsoleted)]
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2260
        if obsoleted and len(revs) > 1:
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2261
743
af74a5cdf96b conform to the Mercurial custom of lowercase messages
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 742
diff changeset
  2262
            raise error.Abort(_('cannot graft multiple revisions while '
151
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2263
                                'obsoleting (for now).'))
e73944b6be8f evolve: improve graft handling of -O
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 147
diff changeset
  2264
119
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2265
        return commitwrapper(orig, ui, repo,*revs, **kwargs)
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2266
    finally:
22f2b700bd59 evolution: proper locking scheme
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 118
diff changeset
  2267
        lock.release()
117
438fe133b068 Add a -o and -O option to graft.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 116
diff changeset
  2268
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2269
@eh.extsetup
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2270
def oldevolveextsetup(ui):
211
69a37d56c7fb evolve: issue the "%i new unstable changeset" in more place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 196
diff changeset
  2271
    try:
69a37d56c7fb evolve: issue the "%i new unstable changeset" in more place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 196
diff changeset
  2272
        rebase = extensions.find('rebase')
69a37d56c7fb evolve: issue the "%i new unstable changeset" in more place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 196
diff changeset
  2273
    except KeyError:
416
22f348c25d25 obsolete/evolve: fix grammar in prerequisite messages
Patrick Mezard <patrick@mezard.eu>
parents: 414
diff changeset
  2274
        raise error.Abort(_('evolution extension requires rebase extension.'))
211
69a37d56c7fb evolve: issue the "%i new unstable changeset" in more place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 196
diff changeset
  2275
742
760d01a549a6 amend: use core mechanism for amend
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 741
diff changeset
  2276
    for cmd in ['kill', 'uncommit', 'touch', 'fold']:
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 355
diff changeset
  2277
        entry = extensions.wrapcommand(cmdtable, cmd,
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2278
                                       warnobserrors)
356
56d4c6207ef9 Move obserror warning into the obsolete extension.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 355
diff changeset
  2279
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2280
    entry = cmdutil.findcmd('commit', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  2281
    entry[1].append(('o', 'obsolete', [],
1008
a010ba5a0ffb evolve: deprecated --obsolete and --old-obsolete option on commit and graft
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1007
diff changeset
  2282
                     _("make commit obsolete this revision (DEPRECATED)")))
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
  2283
    entry = cmdutil.findcmd('graft', commands.table)[1]
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  2284
    entry[1].append(('o', 'obsolete', [],
1008
a010ba5a0ffb evolve: deprecated --obsolete and --old-obsolete option on commit and graft
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1007
diff changeset
  2285
                     _("make graft obsoletes this revision (DEPRECATED)")))
303
8529b4b95f5d evolve: tidy up a bit
Patrick Mezard <patrick@mezard.eu>
parents: 298
diff changeset
  2286
    entry[1].append(('O', 'old-obsolete', False,
1008
a010ba5a0ffb evolve: deprecated --obsolete and --old-obsolete option on commit and graft
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1007
diff changeset
  2287
                     _("make graft obsoletes its source (DEPRECATED)")))
211
69a37d56c7fb evolve: issue the "%i new unstable changeset" in more place
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 196
diff changeset
  2288
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2289
#####################################################################
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2290
### Obsolescence marker exchange experimenation                   ###
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2291
#####################################################################
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2292
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2293
def obsexcmsg(ui, message, important=False):
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2294
    verbose = ui.configbool('experimental', 'verbose-obsolescence-exchange',
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2295
                             False)
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2296
    if verbose:
1035
59bc29c84ce0 evolve: hide the OBSEXC message behind a config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1034
diff changeset
  2297
        message = 'OBSEXC: ' + message
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2298
    if important or verbose:
1035
59bc29c84ce0 evolve: hide the OBSEXC message behind a config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1034
diff changeset
  2299
        ui.status(message)
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2300
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2301
def obsexcprg(ui, *args, **kwargs):
1043
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
  2302
    topic = 'obsmarkers exchange'
1035
59bc29c84ce0 evolve: hide the OBSEXC message behind a config option
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1034
diff changeset
  2303
    if ui.configbool('experimental', 'verbose-obsolescence-exchange', False):
1043
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
  2304
        topic = 'OBSEXC'
6a7d34010f8f evolve: re enable progress for all
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1042
diff changeset
  2305
    ui.progress(topic, *args, **kwargs)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2306
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2307
816
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2308
03587920dfd9 evolve: add relevant marker exchange machinery
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 811
diff changeset
  2309
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2310
_pushkeyescape = getattr(obsolete, '_pushkeyescape', None)
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2311
if _pushkeyescape is None:
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
  2312
    _maxpayload = 5300
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2313
    def _pushkeyescape(markers):
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2314
        """encode markers into a dict suitable for pushkey exchange
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2315
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2316
        - binary data are base86 encoded
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2317
        - splited in chunk less than 5300 bytes"""
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2318
        parts = []
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2319
        currentlen = _maxpayload * 2  # ensure we create a new part
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2320
        for marker in markers:
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
  2321
            nextdata = obsolete._encodeonemarker(marker)
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2322
            if (len(nextdata) + currentlen > _maxpayload):
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2323
                currentpart = []
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2324
                currentlen = 0
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2325
                parts.append(currentpart)
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2326
            currentpart.append(nextdata)
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2327
            currentlen += len(nextdata)
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2328
        keys = {}
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2329
        for idx, part in enumerate(reversed(parts)):
820
a9a66143e2ec exchange: actually use _pushkeyescape fallback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 819
diff changeset
  2330
            data = ''.join([_pack('>B', 0)] + part)
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2331
            keys['dump%i' % idx] = base85.b85encode(data)
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2332
        return keys
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2333
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2334
def _encodemarkersstream(fp, markers):
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2335
    fp.write(_pack('>B', 0))
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2336
    for mark in markers:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2337
        fp.write(obsolete._encodeonemarker(mark))
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2338
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2339
class pushobsmarkerStringIO(StringIO):
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2340
    """hacky string io for progress"""
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2341
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2342
    @util.propertycache
879
85b3d54516a7 exchange: expose length of pushed markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 877
diff changeset
  2343
    def length(self):
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2344
        return len(self.getvalue())
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2345
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2346
    def read(self, size):
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2347
        obsexcprg(self.ui, self.tell(), unit="bytes", total=self.length)
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2348
        return StringIO.read(self, size)
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2349
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2350
    def __iter__(self):
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2351
        d = self.read(4096)
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2352
        while d:
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2353
            yield d
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2354
            d = self.read(4096)
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2355
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2356
bundle2partsgenerators = getattr(exchange, 'bundle2partsgenerators', None)
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2357
1007
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2358
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2359
if bundle2partsgenerators is not None:
1007
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2360
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2361
    def _pushb2phases(pushop, bundler):
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2362
        """adds phases update to the main bundle2 push"""
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2363
        outgoing = pushop.outgoing
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2364
        unfi = pushop.repo.unfiltered()
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2365
        remotephases = pushop.remote.listkeys('phases')
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2366
        publishing = remotephases.get('publishing', False)
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2367
        ana = phases.analyzeremotephases(pushop.repo,
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2368
                                         outgoing.commonheads,
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2369
                                         remotephases)
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2370
        pheads, droots = ana
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2371
        revset = 'heads((%ln::%ln))'
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2372
        if not publishing:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2373
            revset += ' and public()'
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2374
        # Get the list of all revs draft on remote by public here.
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2375
        # XXX Beware that revset break if droots is not strictly
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2376
        # XXX root we may want to ensure it is but it is costly
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2377
        fallback = list(unfi.set(revset, droots, outgoing.commonheads))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2378
        if not outgoing.missing:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2379
            future = fallback
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2380
        else:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2381
            # adds changeset we are going to push as draft
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2382
            #
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2383
            # should not be necessary for pushblishing server, but because of
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2384
            # an issue fixed in xxxxx we have to do it anyway.
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2385
            fdroots = list(unfi.set('roots(%ln  + %ln::)', outgoing.missing, droots))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2386
            fdroots = [f.node() for f in fdroots]
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2387
            future = list(unfi.set(revset, fdroots, outgoing.missingheads))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2388
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2389
        b2caps = bundle2.bundle2caps(pushop.remote)
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2390
        if 'b2x:pushkey' not in b2caps:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2391
            return
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2392
        pushop.stepsdone.add('phases')
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2393
        part2node = []
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2394
        enc = pushkey.encode
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2395
        for newremotehead in future:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2396
            part = bundler.newpart('b2x:pushkey')
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2397
            part.addparam('namespace', enc('phases'))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2398
            part.addparam('key', enc(newremotehead.hex()))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2399
            part.addparam('old', enc(str(phases.draft)))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2400
            part.addparam('new', enc(str(phases.public)))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2401
            part2node.append((part.id, newremotehead))
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2402
        def handlereply(op):
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2403
            for partid, pnode in part2node:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2404
                partrep = op.records.getreplies(partid)
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2405
                results = partrep['pushkey']
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2406
                assert len(results) <= 1
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2407
                msg = None
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2408
                if not results:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2409
                    msg = _('server ignored update of %s to public!\n') % pnode
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2410
                elif not int(results[0]['return']):
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2411
                    msg = _('updating %s to public failed!\n') % pnode
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2412
                if msg is not None:
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2413
                    pushop.ui.warn(msg)
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2414
        return handlereply
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2415
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2416
    def _pushb2obsmarker(pushop, bundler):
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2417
        """adds obsmarker to the main bundle2 push"""
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2418
        repo = pushop.repo
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2419
        remote = pushop.remote
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2420
        if ('obsmarkers' not in pushop.stepsdone
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2421
            and (obsolete._enabled and repo.obsstore and
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2422
                 'obsolete' in remote.listkeys('namespaces'))
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2423
            and remote.capable('_evoext_b2x_obsmarkers_0')):
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2424
            #
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2425
            pushop.stepsdone.add('obsmarkers')
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2426
            markers = _obsmarkersdiscovery(pushop)
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2427
            if not markers:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2428
                obsexcmsg(repo.ui, "no marker to push\n")
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2429
                obsexcmsg(repo.ui, "DONE\n")
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2430
                return
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2431
            obsdata = pushobsmarkerStringIO()
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2432
            _encodemarkersstream(obsdata, markers)
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2433
            obsdata.seek(0)
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2434
            obsdata.ui = repo.ui
1037
bddee73b361e evolve: add "absolescence" in front of markers in the message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1036
diff changeset
  2435
            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2436
                               % (len(markers), len(obsdata.getvalue())),
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2437
                      True)
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2438
            bundler.newpart('EVOLVE:B2X:OBSMARKERV1', data=obsdata)
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2439
            def callback(op):
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2440
                obsexcprg(repo.ui, None)
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2441
                obsexcmsg(repo.ui, "DONE\n")
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2442
            return callback
1007
1d8ba8244001 push: put phase in the same bundle2 than changegroup and obsmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1006
diff changeset
  2443
    bundle2partsgenerators.append(_pushb2phases)
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2444
    bundle2partsgenerators.append(_pushb2obsmarker)
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2445
1005
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2446
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2447
def _obsmarkersdiscovery(pushop):
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2448
    """return the list of marker that needs to be pushed to the server
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2449
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2450
    When used before (or at the same time) the changegroup have been pushed, it
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2451
    returns the value as if the planned changegroup was succesful. Othewise it
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2452
    use te actual common heads to decide whats needs to be pushed.
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2453
    """
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2454
    repo = pushop.repo
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2455
    remote = pushop.remote
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2456
    unfi = repo.unfiltered()
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2457
    cl = unfi.changelog
1005
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2458
    commonheads = pushop.commonheads
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2459
    if commonheads is None:
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2460
        if pushop.revs is None:
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2461
            commonheads = pushop.outgoing.commonheads
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2462
            sch = set(commonheads)
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2463
            commonheads.extend(h for h in pushop.outgoing.missingheads
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2464
                               if h not in sch)
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2465
        else:
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2466
            commonheads = pushop.outgoing.missingheads
817
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2467
    if (obsolete._enabled and repo.obsstore and
c2bf0eb727f1 exchange: only push the set of marker relevant to want we push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 816
diff changeset
  2468
        'obsolete' in remote.listkeys('namespaces')):
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2469
        obsexcmsg(repo.ui, "computing relevant nodes\n")
1005
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2470
        revs = unfi.revs('::%ln', commonheads)
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2471
        common = []
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2472
        if remote.capable('_evoext_obshash_0'):
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2473
            obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2474
                               % len(revs))
1006
deba3a063c63 push: put obsmarkers in the same bundle2 than changeset
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1005
diff changeset
  2475
            common = findcommonobsmarkers(pushop.ui, unfi, remote, revs)
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2476
            revs = list(unfi.revs('%ld - (::%ln)', revs, common))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2477
        nodes = [cl.node(r) for r in revs]
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2478
        if nodes:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2479
            obsexcmsg(repo.ui, "computing markers relevant to %i nodes\n"
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2480
                               % len(nodes))
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2481
            markers = repo.obsstore.relevantmarkers(nodes)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2482
        else:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2483
            obsexcmsg(repo.ui, "markers already in sync\n")
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2484
            markers = []
1005
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2485
        return markers
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2486
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2487
@eh.wrapfunction(exchange, '_pushobsolete')
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2488
def _pushobsolete(orig, pushop):
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2489
    """utility function to push obsolete markers to a remote"""
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2490
    stepsdone = getattr(pushop, 'stepsdone', None)
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2491
    if stepsdone is not None:
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2492
        if 'obsmarkers' in stepsdone:
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2493
            return
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2494
        stepsdone.add('obsmarkers')
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2495
    pushop.ui.debug('try to push obsolete markers to remote\n')
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2496
    repo = pushop.repo
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2497
    remote = pushop.remote
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2498
    unfi = repo.unfiltered()
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2499
    cl = unfi.changelog
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2500
    if (obsolete._enabled and repo.obsstore and
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2501
        'obsolete' in remote.listkeys('namespaces')):
4fe159fdfc4c push: extract obsmarkers discovery in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1004
diff changeset
  2502
        markers = _obsmarkersdiscovery(pushop)
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2503
        if not markers:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2504
            obsexcmsg(repo.ui, "no marker to push\n")
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2505
        elif remote.capable('_evoext_b2x_obsmarkers_0'):
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2506
            obsdata = pushobsmarkerStringIO()
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2507
            _encodemarkersstream(obsdata, markers)
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2508
            obsdata.seek(0)
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2509
            obsdata.ui = repo.ui
1037
bddee73b361e evolve: add "absolescence" in front of markers in the message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1036
diff changeset
  2510
            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2511
                               % (len(markers), len(obsdata.getvalue())),
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2512
                      True)
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2513
            bundler = bundle2.bundle20(pushop.ui, {})
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2514
            capsblob = bundle2.encodecaps(pushop.repo.bundle2caps)
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2515
            bundler.addpart(bundle2.bundlepart('b2x:replycaps', data=capsblob))
961
8de88b323fb6 evolve: install progress support for the bundle2 push path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 960
diff changeset
  2516
            cgpart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1', data=obsdata)
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2517
            bundler.addpart(cgpart)
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2518
            stream = util.chunkbuffer(bundler.getchunks())
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2519
            try:
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2520
                reply = pushop.remote.unbundle(stream, ['force'], 'push')
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2521
            except bundle2.UnknownPartError, exc:
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2522
                raise util.Abort('missing support for %s' % exc)
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2523
            try:
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2524
                op = bundle2.processbundle(pushop.repo, reply)
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2525
            except bundle2.UnknownPartError, exc:
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2526
                raise util.Abort('missing support for %s' % exc)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2527
            obsexcprg(repo.ui, None)
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2528
        elif remote.capable('_evoext_pushobsmarkers_0'):
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2529
            obsdata = pushobsmarkerStringIO()
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2530
            _encodemarkersstream(obsdata, markers)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2531
            obsdata.seek(0)
854
86b826399dfd exchange: add progress bar when pushing using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 853
diff changeset
  2532
            obsdata.ui = repo.ui
1037
bddee73b361e evolve: add "absolescence" in front of markers in the message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1036
diff changeset
  2533
            obsexcmsg(repo.ui, "pushing %i obsolescence markers (%i bytes)\n"
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2534
                               % (len(markers), len(obsdata.getvalue())),
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2535
                      True)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2536
            remote.evoext_pushobsmarkers_0(obsdata)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2537
            obsexcprg(repo.ui, None)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2538
        else:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2539
            rslts = []
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2540
            remotedata = _pushkeyescape(markers).items()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2541
            totalbytes = sum(len(d) for k,d in remotedata)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2542
            sentbytes = 0
1037
bddee73b361e evolve: add "absolescence" in front of markers in the message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1036
diff changeset
  2543
            obsexcmsg(repo.ui, "pushing %i obsolescence markers in %i pushkey payload (%i bytes)\n"
1036
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2544
                                % (len(markers), len(remotedata), totalbytes),
70de12b7721a evolve: re-introduce the "pushing 42 markers…" message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1035
diff changeset
  2545
                      True)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2546
            for key, data in remotedata:
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2547
                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2548
                          total=totalbytes)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2549
                rslts.append(remote.pushkey('obsolete', key, '', data))
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2550
                sentbytes += len(data)
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2551
                obsexcprg(repo.ui, sentbytes, item=key, unit="bytes",
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2552
                          total=totalbytes)
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2553
            obsexcprg(repo.ui, None)
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2554
            if [r for r in rslts if not r]:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2555
                msg = _('failed to push some obsolete markers!\n')
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2556
                repo.ui.warn(msg)
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2557
        obsexcmsg(repo.ui, "DONE\n")
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2558
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2559
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2560
@eh.addattr(wireproto.wirepeer, 'evoext_pushobsmarkers_0')
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2561
def client_pushobsmarkers(self, obsfile):
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2562
    """wireprotocol peer method"""
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2563
    self.requirecap('_evoext_pushobsmarkers_0',
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2564
                    _('push obsolete markers faster'))
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2565
    ret, output = self._callpush('evoext_pushobsmarkers_0', obsfile)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2566
    for l in output.splitlines(True):
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2567
        self.ui.status(_('remote: '), l)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2568
    return ret
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2569
880
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2570
@eh.addattr(httppeer.httppeer, 'evoext_pushobsmarkers_0')
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2571
def httpclient_pushobsmarkers(self, obsfile):
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2572
    """httpprotocol peer method
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2573
    (Cannot simply use _callpush as http is doing some special handling)"""
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2574
    self.requirecap('_evoext_pushobsmarkers_0',
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2575
                    _('push obsolete markers faster'))
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2576
    ret, output = self._call('evoext_pushobsmarkers_0', data=obsfile)
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2577
    for l in output.splitlines(True):
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2578
        if l.strip():
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2579
            self.ui.status(_('remote: '), l)
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2580
    return ret
7fe06f32d1ad exchange: fix push markers over wire protocol for http peer
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 879
diff changeset
  2581
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2582
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2583
def srv_pushobsmarkers(repo, proto):
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2584
    """wireprotocol command"""
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2585
    fp = StringIO()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2586
    proto.redirect()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2587
    proto.getfile(fp)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2588
    data = fp.getvalue()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2589
    fp.close()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2590
    lock = repo.lock()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2591
    try:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2592
        tr = repo.transaction('pushkey: obsolete markers')
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2593
        try:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2594
            repo.obsstore.mergemarkers(tr, data)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2595
            tr.close()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2596
        finally:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2597
            tr.release()
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2598
    finally:
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2599
        lock.release()
888
097ddcb0da25 evolve: add a hook related to the new pushobsmarkers command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 887
diff changeset
  2600
    repo.hook('evolve_pushobsmarkers')
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2601
    return wireproto.pushres(0)
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2602
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2603
@bundle2.parthandler('evolve:b2x:obsmarkerv1')
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2604
def handleobsmarkerv1(op, inpart):
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2605
    """add a stream of obsmarker to the repo"""
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2606
    tr = op.gettransaction()
962
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2607
    advparams = dict(inpart.advisoryparams)
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2608
    length = advparams.get('totalbytes')
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2609
    if length is None:
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2610
        obsdata = inpart.read()
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2611
    else:
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2612
        length = int(length)
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2613
        data = StringIO()
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2614
        current = 0
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2615
        obsexcprg(op.repo.ui, current, unit="bytes", total=length)
962
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2616
        while current < length:
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2617
            readsize = min(length-current, 4096)
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2618
            data.write(inpart.read(readsize))
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2619
            current += readsize
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2620
            obsexcprg(op.repo.ui, current, unit="bytes", total=length)
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2621
        obsexcprg(op.repo.ui, None)
962
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2622
        obsdata = data.getvalue()
958
6d18a1ab496c evolve: add bytes and new marker data when processing part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 957
diff changeset
  2623
    totalsize = len(obsdata)
6d18a1ab496c evolve: add bytes and new marker data when processing part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 957
diff changeset
  2624
    old = len(op.repo.obsstore._all)
6d18a1ab496c evolve: add bytes and new marker data when processing part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 957
diff changeset
  2625
    op.repo.obsstore.mergemarkers(tr, obsdata)
6d18a1ab496c evolve: add bytes and new marker data when processing part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 957
diff changeset
  2626
    new = len(op.repo.obsstore._all) - old
6d18a1ab496c evolve: add bytes and new marker data when processing part
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 957
diff changeset
  2627
    op.records.add('evo_obsmarkers', {'new': new, 'bytes': totalsize})
959
d39a5c8c82ad evolve: advertise obsmarker creation in the transation hook
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 958
diff changeset
  2628
    tr.hookargs['evolve_new_obsmarkers'] = str(new)
957
2cde59f3cb5d evolve: add a push pass using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 956
diff changeset
  2629
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2630
def _buildpullobsmerkersboundaries(pullop):
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2631
    """small funtion returning the argument for pull markers call
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2632
    may to contains 'heads' and 'common'. skip the key for None.
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2633
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2634
    Its a separed functio to play around with strategy for that."""
865
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2635
    repo = pullop.repo
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2636
    cl = pullop.repo.changelog
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2637
    remote = pullop.remote
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2638
    unfi = repo.unfiltered()
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2639
    revs = unfi.revs('::%ln', pullop.pulledsubset)
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2640
    common = [nullid]
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2641
    if remote.capable('_evoext_obshash_0'):
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2642
        obsexcmsg(repo.ui, "looking for common markers in %i nodes\n"
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2643
                           % len(revs))
865
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2644
        common = findcommonobsmarkers(repo.ui, repo, remote, revs)
5c40b2a4b52f discovery: use the discovery process for pull
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 864
diff changeset
  2645
    return {'heads': pullop.pulledsubset, 'common': common}
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2646
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2647
@eh.uisetup
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2648
def addgetbundleargs(self):
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2649
    if gboptsmap is not None:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2650
        gboptsmap['evo_obsmarker'] = 'plain'
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2651
        gboptsmap['evo_obscommon'] = 'plain'
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2652
        gboptsmap['evo_obsheads'] = 'plain'
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2653
    else:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2654
        gboptslist.append('evo_obsheads')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2655
        gboptslist.append('evo_obscommon')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2656
        gboptslist.append('evo_obsmarker')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2657
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2658
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2659
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2660
@eh.wrapfunction(exchange, '_getbundleextrapart')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2661
def _getbundleextrapart(orig, bundler, repo, source, **kwargs):
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2662
    if int(kwargs.pop('evo_obsmarker', False)):
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2663
        common = kwargs.pop('evo_obscommon')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2664
        common = wireproto.decodelist(common)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2665
        heads = kwargs.pop('evo_obsheads')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2666
        heads = wireproto.decodelist(heads)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2667
        obsdata = _getobsmarkersstream(repo, common=common, heads=heads)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2668
        if len(obsdata.getvalue()) > 5:
962
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2669
            advparams = [('totalbytes', str(len(obsdata.getvalue())))]
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2670
            obspart = bundle2.bundlepart('EVOLVE:B2X:OBSMARKERV1',
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2671
                                         advisoryparams=advparams,
d04a52f40f41 evolve: install progress support for the bundle2 pull path
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 961
diff changeset
  2672
                                         data=obsdata)
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2673
            bundler.addpart(obspart)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2674
    orig(bundler, repo, source)
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2675
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2676
@eh.wrapfunction(exchange, '_pullobsolete')
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2677
def _pullobsolete(orig, pullop):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2678
    if not obsolete._enabled:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2679
        return None
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2680
    b2xpull = pullop.remote.capable('_evoext_b2x_obsmarkers_0')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2681
    wirepull = pullop.remote.capable('_evoext_pullobsmarkers_0')
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2682
    if not (b2xpull or wirepull):
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2683
        return orig(pullop)
883
d2fa1061df16 evolve: do not exchange obsolescence markers when server refuse it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 880
diff changeset
  2684
    if 'obsolete' not in pullop.remote.listkeys('namespaces'):
d2fa1061df16 evolve: do not exchange obsolescence markers when server refuse it
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 880
diff changeset
  2685
        return None # remote opted out of obsolescence marker exchange
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2686
    tr = None
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2687
    ui = pullop.repo.ui
825
7671717afef8 exchange: extract computation of pulled markers boundary in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 824
diff changeset
  2688
    boundaries = _buildpullobsmerkersboundaries(pullop)
1041
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
  2689
    if not set(boundaries['heads']) - set(boundaries['common']):
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
  2690
        obsexcmsg(ui, "nothing to pull\n")
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
  2691
        return None
7632f1f79946 evolve: do not even try to pull if all remote markers are known
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1040
diff changeset
  2692
1042
86bd794f6037 evolve: stop pretending we are pulling markers when we don't
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1041
diff changeset
  2693
    obsexcmsg(ui, "pull obsolescence markers\n", True)
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2694
    new = 0
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2695
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2696
    if b2xpull:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2697
        kwargs = {'bundlecaps': set(['HG2X'])}
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2698
        capsblob = bundle2.encodecaps(pullop.repo.bundle2caps)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2699
        kwargs['bundlecaps'].add('bundle2=' + urllib.quote(capsblob))
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2700
        kwargs['heads'] = [nullid]
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2701
        kwargs['common'] = [nullid]
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2702
        kwargs['evo_obsmarker'] = '1'
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2703
        kwargs['evo_obscommon'] = wireproto.encodelist(boundaries['common'])
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2704
        kwargs['evo_obsheads'] = wireproto.encodelist(boundaries['heads'])
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2705
        bundle = pullop.remote.getbundle('pull', **kwargs)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2706
        try:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2707
            op = bundle2.processbundle(pullop.repo, bundle, pullop.gettransaction)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2708
        except bundle2.UnknownPartError, exc:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2709
            raise util.Abort('missing support for %s' % exc)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2710
        bytes = new = 0
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2711
        for entry in op.records['evo_obsmarkers']:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2712
            bytes += entry.get('bytes', 0)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2713
            new += entry.get('new', 0)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2714
        if 5 < bytes:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2715
            obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2716
                      % bytes)
1040
640f3280559e evolve: add "obsolescence" in front of marked in the previous message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1039
diff changeset
  2717
            obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2718
            tr = op.gettransaction()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2719
        else:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2720
            obsexcmsg(ui, "no unknown remote markers\n")
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2721
        obsexcmsg(ui, "DONE\n")
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2722
    elif wirepull:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2723
        obsdata = pullop.remote.evoext_pullobsmarkers_0(**boundaries)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2724
        obsdata = obsdata.read()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2725
        if len(obsdata) > 5:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2726
            obsexcmsg(ui, "merging obsolescence markers (%i bytes)\n"
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2727
                           % len(obsdata))
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2728
            tr = pullop.gettransaction()
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2729
            old = len(pullop.repo.obsstore._all)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2730
            pullop.repo.obsstore.mergemarkers(tr, obsdata)
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2731
            new = len(pullop.repo.obsstore._all) - old
1040
640f3280559e evolve: add "obsolescence" in front of marked in the previous message
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1039
diff changeset
  2732
            obsexcmsg(ui, "%i obsolescence markers added\n" % new, True)
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2733
        else:
1033
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2734
            obsexcmsg(ui, "no unknown remote markers\n")
908273755215 evolve: move OBSEXC message in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1032
diff changeset
  2735
        obsexcmsg(ui, "DONE\n")
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2736
    if new:
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2737
        pullop.repo.invalidatevolatilesets()
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2738
    return tr
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2739
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2740
def _getobsmarkersstream(repo, heads=None, common=None):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2741
    revset = ''
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2742
    args = []
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2743
    repo = repo.unfiltered()
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2744
    if heads is None:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2745
        revset = 'all()'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2746
    elif heads:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2747
        revset += "(::%ln)"
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2748
        args.append(heads)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2749
    else:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2750
        assert False, 'pulling no heads?'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2751
    if common:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2752
        revset += ' - (::%ln)'
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2753
        args.append(common)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2754
    nodes = [c.node() for c in repo.set(revset, *args)]
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2755
    markers = repo.obsstore.relevantmarkers(nodes)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2756
    obsdata = StringIO()
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2757
    _encodemarkersstream(obsdata, markers)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2758
    obsdata.seek(0)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2759
    return obsdata
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2760
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2761
@eh.addattr(wireproto.wirepeer, 'evoext_pullobsmarkers_0')
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2762
def client_pullobsmarkers(self, heads=None, common=None):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2763
    self.requirecap('_evoext_pullobsmarkers_0', _('look up remote obsmarkers'))
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2764
    opts = {}
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2765
    if heads is not None:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2766
        opts['heads'] = wireproto.encodelist(heads)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2767
    if common is not None:
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2768
        opts['common'] = wireproto.encodelist(common)
897
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  2769
    if util.safehasattr(self, '_callcompressable'):
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  2770
        f = self._callcompressable("evoext_pullobsmarkers_0", **opts)
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  2771
    else:
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  2772
        f = self._callstream("evoext_pullobsmarkers_0", **opts)
b5227608d9dd evolve: use new api _callcompressable
Olle Lundberg <geek@nerd.sh>
parents: 896
diff changeset
  2773
        f = self._decompress(f)
898
934b6f0feffd evolve: small white space change
Olle Lundberg <geek@nerd.sh>
parents: 897
diff changeset
  2774
    length = int(f.read(20))
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2775
    chunk = 4096
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2776
    current = 0
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2777
    data = StringIO()
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2778
    ui = self.ui
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2779
    obsexcprg(ui, current, unit="bytes", total=length)
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2780
    while current < length:
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2781
        readsize = min(length-current, chunk)
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2782
        data.write(f.read(readsize))
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2783
        current += readsize
1034
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2784
        obsexcprg(ui, current, unit="bytes", total=length)
5fd28e46e8f5 evolve: move OBSEXC progress in a dedicated function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1033
diff changeset
  2785
    obsexcprg(ui, None)
870
1a23c7c52a43 exchange: fix pull over wire protocol
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 869
diff changeset
  2786
    data.seek(0)
853
b82b49189328 exchange: add progress bar when pulling using wire protocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 825
diff changeset
  2787
    return data
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2788
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2789
@eh.addattr(localrepo.localpeer, 'evoext_pullobsmarkers_0')
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2790
def local_pullobsmarkers(self, heads=None, common=None):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2791
    return _getobsmarkersstream(self._repo, heads=heads, common=common)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2792
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2793
def srv_pullobsmarkers(repo, proto, others):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2794
    opts = wireproto.options('', ['heads', 'common'], others)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2795
    for k, v in opts.iteritems():
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2796
        if k in ('heads', 'common'):
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2797
            opts[k] = wireproto.decodelist(v)
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2798
    obsdata = _getobsmarkersstream(repo, **opts)
877
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  2799
    finaldata = StringIO()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  2800
    obsdata = obsdata.getvalue()
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  2801
    finaldata.write('%20i' % len(obsdata))
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  2802
    finaldata.write(obsdata)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  2803
    finaldata.seek(0)
cf35f38d6a10 exchange: fix changeset pulling over http
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 875
diff changeset
  2804
    return wireproto.streamres(proto.groupchunks(finaldata))
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2805
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2806
def _obsrelsethashtree(repo):
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2807
    cache = []
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2808
    unfi = repo.unfiltered()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2809
    for i in unfi:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2810
        ctx = unfi[i]
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2811
        entry = 0
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2812
        sha = util.sha1()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2813
        # add data from p1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2814
        for p in ctx.parents():
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2815
            p = p.rev()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2816
            if p < 0:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2817
                p = nullid
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2818
            else:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2819
                p = cache[p][1]
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2820
            if p != nullid:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2821
                entry += 1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2822
                sha.update(p)
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2823
        tmarkers = repo.obsstore.relevantmarkers([ctx.node()])
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2824
        if tmarkers:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2825
            bmarkers = [obsolete._encodeonemarker(m) for m in tmarkers]
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2826
            bmarkers.sort()
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2827
            for m in bmarkers:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2828
                entry += 1
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2829
                sha.update(m)
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2830
        if entry:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2831
            cache.append((ctx.node(), sha.digest()))
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2832
        else:
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2833
            cache.append((ctx.node(), nullid))
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2834
    return cache
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2835
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2836
@command('debugobsrelsethashtree',
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2837
        [] , _(''))
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2838
def debugobsrelsethashtree(ui, repo):
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2839
    """display Obsolete markers, Relevant Set, Hash Tree
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2840
    changeset-node obsrelsethashtree-node
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2841
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2842
    It computed form the "orsht" of its parent and markers
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2843
    relevant to the changeset itself."""
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2844
    for chg, obs in _obsrelsethashtree(repo):
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2845
        ui.status('%s %s\n' % (node.hex(chg), node.hex(obs)))
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2846
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2847
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2848
### Set discovery START
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2849
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2850
import random
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2851
from mercurial import dagutil
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2852
from mercurial import setdiscovery
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2853
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2854
def _obshash(repo, nodes):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2855
    hashs = _obsrelsethashtree(repo)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2856
    nm = repo.changelog.nodemap
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2857
    return  [hashs[nm.get(n)][1] for n in nodes]
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2858
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2859
def srv_obshash(repo, proto, nodes):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2860
    return wireproto.encodelist(_obshash(repo, wireproto.decodelist(nodes)))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2861
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2862
@eh.addattr(localrepo.localpeer, 'evoext_obshash')
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2863
def local_obshash(peer, nodes):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2864
    return _obshash(peer._repo, nodes)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2865
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2866
@eh.addattr(wireproto.wirepeer, 'evoext_obshash')
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2867
def peer_obshash(self, nodes):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2868
    d = self._call("evoext_obshash", nodes=wireproto.encodelist(nodes))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2869
    try:
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2870
        return wireproto.decodelist(d)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2871
    except ValueError:
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2872
        self._abort(error.ResponseError(_("unexpected response:"), d))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2873
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2874
def findcommonobsmarkers(ui, local, remote, probeset,
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2875
                    initialsamplesize=100,
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2876
                    fullsamplesize=200):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2877
    # from discovery
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2878
    roundtrips = 0
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2879
    cl = local.changelog
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2880
    dag = dagutil.revlogdag(cl)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2881
    localhash = _obsrelsethashtree(local)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2882
    missing = set()
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2883
    common = set()
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2884
    undecided = set(probeset)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2885
    _takefullsample = setdiscovery._takefullsample
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2886
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2887
    while undecided:
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2888
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2889
        ui.note(_("sampling from both directions\n"))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2890
        sample = _takefullsample(dag, undecided, size=fullsamplesize)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2891
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2892
        roundtrips += 1
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2893
        ui.debug("query %i; still undecided: %i, sample size is: %i\n"
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2894
                 % (roundtrips, len(undecided), len(sample)))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2895
        # indices between sample and externalized version must match
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2896
        sample = list(sample)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2897
        remotehash = remote.evoext_obshash(dag.externalizeall(sample))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2898
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2899
        yesno = [localhash[ix][1] == remotehash[si]
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2900
                 for si, ix in enumerate(sample)]
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2901
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2902
        commoninsample = set(n for i, n in enumerate(sample) if yesno[i])
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2903
        common.update(dag.ancestorset(commoninsample, common))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2904
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2905
        missinginsample = [n for i, n in enumerate(sample) if not yesno[i]]
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2906
        missing.update(dag.descendantset(missinginsample, missing))
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2907
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2908
        undecided.difference_update(missing)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2909
        undecided.difference_update(common)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2910
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2911
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2912
    result = dag.headsetofconnecteds(common)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2913
    ui.debug("%d total queries\n" % roundtrips)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2914
887
0ea9cecbbd28 exchange: dropping dead code (issue36)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 886
diff changeset
  2915
    if not result:
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2916
        return set([nullid])
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2917
    return dag.externalizeall(result)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2918
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2919
@eh.wrapfunction(wireproto, 'capabilities')
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2920
def capabilities(orig, repo, proto):
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2921
    """wrapper to advertise new capability"""
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2922
    caps = orig(repo, proto)
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2923
    if obsolete._enabled:
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2924
        caps += ' _evoext_pushobsmarkers_0'
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2925
        caps += ' _evoext_pullobsmarkers_0'
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2926
        caps += ' _evoext_obshash_0'
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2927
        caps += ' _evoext_b2x_obsmarkers_0'
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2928
    return caps
863
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2929
e9693738f234 discovery: first version of the "hash tree" idea
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 861
diff changeset
  2930
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2931
@eh.extsetup
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2932
def _installwireprotocol(ui):
941
576d3a198269 evolve: drop some pre-3.0 compatibility code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 940
diff changeset
  2933
    localrepo.moderncaps.add('_evoext_pullobsmarkers_0')
960
0c1142059a82 evolve: add a pull path using bundle2
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 959
diff changeset
  2934
    localrepo.moderncaps.add('_evoext_b2x_obsmarkers_0')
869
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
  2935
    hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push'
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
  2936
    hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull'
e9eeef0d07ec exchange: enforce permission on new wireprotocol command
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 868
diff changeset
  2937
    hgweb_mod.perms['evoext_obshash'] = 'pull'
821
202376586cf6 exchange: introduce a wireprotocol command to push markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 820
diff changeset
  2938
    wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
823
9aa20585e158 exchange: add a new method to pull markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 821
diff changeset
  2939
    wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*')
875
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  2940
    # wrap command content
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  2941
    oldcap, args = wireproto.commands['capabilities']
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  2942
    def newcap(repo, proto):
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  2943
        return capabilities(oldcap, repo, proto)
10867a8e27c6 exchange: properly wrap wireprotocol capabilities
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 871
diff changeset
  2944
    wireproto.commands['capabilities'] = (newcap, args)
864
401da1b38cca discovery: implement a discovery process and use it for push
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 863
diff changeset
  2945
    wireproto.commands['evoext_obshash'] = (srv_obshash, 'nodes')