hgext3rd/evolve/evolvecmd.py
author Martin von Zweigbergk <martinvonz@google.com>
Tue, 23 Apr 2019 11:02:08 -0700
changeset 4589 5ba885e2ef5e
parent 4588 5450c8069a37
child 4590 784ad6f60571
permissions -rw-r--r--
evolve: reduce indentation with an early return statement
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     1
# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     2
#                Logilab SA        <contact@logilab.fr>
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     3
#                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     4
#                Patrick Mezard <patrick@mezard.eu>
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     5
#
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     8
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
     9
"""logic related to hg evolve command"""
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    10
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
    11
import collections
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
    12
import re
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
    13
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    14
from mercurial import (
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
    15
    bookmarks as bookmarksmod,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    16
    cmdutil,
3579
3a4552b30ba8 compat: use mergetoolopts from commands.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3577
diff changeset
    17
    commands,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    18
    context,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    19
    copies,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    20
    error,
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
    21
    encoding,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    22
    hg,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    23
    merge,
4311
8aa28e68ac44 evolve: detect unresolved conflict during evolve --continue (issue5966)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4297
diff changeset
    24
    mergeutil,
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
    25
    node as nodemod,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    26
    obsolete,
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
    27
    obsutil,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    28
    phases,
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
    29
    repair,
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
    30
    scmutil,
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
    31
    simplemerge,
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
    32
    util,
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    33
)
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    34
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    35
from mercurial.i18n import _
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    36
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    37
from . import (
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    38
    cmdrewrite,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    39
    compat,
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
    40
    exthelper,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    41
    rewriteutil,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    42
    state,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    43
    utility,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    44
)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    45
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    46
TROUBLES = compat.TROUBLES
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    47
shorttemplate = utility.shorttemplate
4153
e1f6f9da82c1 utility: add a template alias that will be used in evolve msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4122
diff changeset
    48
stacktemplate = utility.stacktemplate
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    49
_bookmarksupdater = rewriteutil.bookmarksupdater
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
    50
sha1re = re.compile(r'\b[0-9a-f]{6,40}\b')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    51
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
    52
eh = exthelper.exthelper()
3579
3a4552b30ba8 compat: use mergetoolopts from commands.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3577
diff changeset
    53
mergetoolopts = commands.mergetoolopts
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    54
3821
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
    55
abortmessage = _("see `hg help evolve.interrupted`\n")
3796
ededd22e7c7b evolve: show `hg help evolve.interrupted-evolve` in error when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3795
diff changeset
    56
3478
4a1ccae58323 evolvecmd: pass evolvestate object to _solve* functions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3477
diff changeset
    57
def _solveone(ui, repo, ctx, evolvestate, dryrun, confirm,
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    58
              progresscb, category, lastsolved=None, stacktmplt=False):
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    59
    """Resolve the troubles affecting one revision
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    60
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    61
    returns a tuple (bool, newnode) where,
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    62
        bool: a boolean value indicating whether the instability was solved
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    63
        newnode: if bool is True, then the newnode of the resultant commit
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    64
                 formed. newnode can be node, when resolution led to no new
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
    65
                 commit. If bool is False, this is ".".
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    66
    """
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    67
    displayer = None
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    68
    if stacktmplt:
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    69
        displayer = compat.changesetdisplayer(ui, repo,
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    70
                                              {'template': stacktemplate})
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    71
    else:
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    72
        displayer = compat.changesetdisplayer(ui, repo,
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    73
                                              {'template': shorttemplate})
4375
07ccf1686024 evolve: use context managers for locks and transaction
Martin von Zweigbergk <martinvonz@google.com>
parents: 4348
diff changeset
    74
    with repo.wlock(), repo.lock(), repo.transaction("evolve"):
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    75
        if 'orphan' == category:
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    76
            result = _solveunstable(ui, repo, ctx, evolvestate, displayer,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    77
                                    dryrun, confirm, progresscb,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    78
                                    lastsolved=lastsolved)
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    79
        elif 'phasedivergent' == category:
3609
1c8dec54450a evolve: replace bumped in function name to phasedivergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3608
diff changeset
    80
            result = _solvephasedivergence(ui, repo, ctx, evolvestate,
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    81
                                           displayer, dryrun, confirm,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    82
                                           progresscb)
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    83
        elif 'contentdivergent' == category:
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    84
            result = _solvedivergent(ui, repo, ctx, evolvestate, displayer,
3478
4a1ccae58323 evolvecmd: pass evolvestate object to _solve* functions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3477
diff changeset
    85
                                     dryrun, confirm, progresscb)
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    86
        else:
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    87
            assert False, "unknown trouble category: %s" % (category)
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    88
        return result
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    89
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    90
def _solveunstable(ui, repo, orig, evolvestate, displayer, dryrun=False,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    91
                   confirm=False, progresscb=None, lastsolved=None):
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    92
    """ Tries to stabilize the changeset orig which is orphan.
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    93
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    94
    returns a tuple (bool, newnode) where,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    95
        bool: a boolean value indicating whether the instability was solved
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    96
        newnode: if bool is True, then the newnode of the resultant commit
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    97
                 formed. newnode can be node, when resolution led to no new
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
    98
                 commit. If bool is False, this is ".".
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    99
    """
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   100
    pctx = orig.p1()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   101
    keepbranch = orig.p1().branch() != orig.branch()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   102
    if len(orig.parents()) == 2:
3545
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   103
        p1obs = orig.p1().obsolete()
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   104
        p2obs = orig.p2().obsolete()
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   105
        if not p1obs and p2obs:
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   106
            pctx = orig.p2()  # second parent is obsolete ?
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   107
            keepbranch = orig.p2().branch() != orig.branch()
3545
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   108
        elif not p2obs and p1obs:
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   109
            pass
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   110
        else:
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   111
            # store that we are resolving an orphan merge with both parents
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   112
            # obsolete and proceed with first parent
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   113
            evolvestate['orphanmerge'] = True
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   114
            # we should process the second parent first, so that in case of
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   115
            # no-conflicts the first parent is processed later and preserved as
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   116
            # first parent
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   117
            pctx = orig.p2()
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   118
            keepbranch = orig.p2().branch() != orig.branch()
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   119
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   120
    if not pctx.obsolete():
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   121
        ui.warn(_("cannot solve instability of %s, skipping\n") % orig)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   122
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   123
    obs = pctx
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
   124
    newer = obsutil.successorssets(repo, obs.node())
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   125
    # search of a parent which is not killed
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   126
    while not newer or newer == [()]:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   127
        ui.debug("stabilize target %s is plain dead,"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   128
                 " trying to stabilize on its parent\n" %
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   129
                 obs)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   130
        obs = obs.parents()[0]
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
   131
        newer = obsutil.successorssets(repo, obs.node())
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   132
    if len(newer) > 1:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   133
        msg = _("skipping %s: divergent rewriting. can't choose "
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   134
                "destination\n") % obs
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   135
        ui.write_err(msg)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   136
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   137
    targets = newer[0]
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   138
    assert targets
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   139
    if len(targets) > 1:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   140
        # split target, figure out which one to pick, are they all in line?
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   141
        targetrevs = [repo[r].rev() for r in targets]
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   142
        roots = repo.revs('roots(%ld)', targetrevs)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   143
        heads = repo.revs('heads(%ld)', targetrevs)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   144
        if len(roots) > 1 or len(heads) > 1:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
   145
            cheader = _("ancestor '%s' split over multiple topological"
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
   146
                        " branches.\nchoose an evolve destination:") % orig
3541
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   147
            selectedrev = utility.revselectionprompt(ui, repo, list(heads),
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   148
                                                     cheader)
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   149
            if selectedrev is None:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
   150
                msg = _("could not solve instability, "
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
   151
                        "ambiguous destination: "
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
   152
                        "parent split across two branches\n")
3541
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   153
                ui.write_err(msg)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   154
                return (False, ".")
3541
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   155
            target = repo[selectedrev]
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   156
        else:
bc47c09c9782 evolve: prompt user to select destination for stabilization in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3529
diff changeset
   157
            target = repo[heads.first()]
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   158
    else:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   159
        target = targets[0]
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   160
    target = repo[target]
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   161
    if not ui.quiet or confirm:
3501
7c8150697810 color: add some colors to evolve command itself
Boris Feld <boris.feld@octobus.net>
parents: 3495
diff changeset
   162
        repo.ui.write(_('move:'), label='evolve.operation')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   163
        displayer.show(orig)
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
   164
        if lastsolved is None or target != repo[lastsolved]:
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
   165
            repo.ui.write(_('atop:'))
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
   166
            displayer.show(target)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   167
    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
4463
7d54a538dd1e evolve: unindent some lines caught by flake8
Anton Shestakov <av6@dwimlabs.net>
parents: 4427
diff changeset
   168
        raise error.Abort(_('evolve aborted by user'))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   169
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   170
        progresscb()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   171
    todo = 'hg rebase -r %s -d %s\n' % (orig, target)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   172
    if dryrun:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   173
        repo.ui.write(todo)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   174
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   175
    else:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   176
        repo.ui.note(todo)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   177
        if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   178
            progresscb()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   179
        try:
3638
7bc4a72b8a0b evolve: add evolvestate as an argument to evolvecmd.relocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3636
diff changeset
   180
            newid = relocate(repo, orig, target, evolvestate, pctx,
7bc4a72b8a0b evolve: add evolvestate as an argument to evolvecmd.relocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3636
diff changeset
   181
                             keepbranch, 'orphan')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   182
            return (True, newid)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   183
        except MergeFailure:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   184
            ops = {'current': orig.node()}
3479
4b9fc8c85ee4 evolvecmd: use the evolvestate object passed as argument in _solveunstable
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3478
diff changeset
   185
            evolvestate.addopts(ops)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   186
            evolvestate.save()
3852
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   187
            raise error.InterventionRequired(_("fix conflicts and see `hg help "
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   188
                                               "evolve.interrupted`"))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   189
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
   190
def _solvephasedivergence(ui, repo, bumped, evolvestate, displayer,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
   191
                          dryrun=False, confirm=False, progresscb=None):
3609
1c8dec54450a evolve: replace bumped in function name to phasedivergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3608
diff changeset
   192
    """Stabilize a phase divergent changeset
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   193
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   194
    returns a tuple (bool, newnode) where,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   195
        bool: a boolean value indicating whether the instability was solved
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   196
        newnode: if bool is True, then the newnode of the resultant commit
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   197
                 formed. newnode can be node, when resolution led to no new
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   198
                 commit. If bool is False, this is ".".
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   199
    """
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   200
    repo = repo.unfiltered()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   201
    bumped = repo[bumped.rev()]
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   202
    # For now we deny bumped merge
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   203
    if len(bumped.parents()) > 1:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   204
        msg = _('skipping %s : we do not handle merge yet\n') % bumped
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   205
        ui.write_err(msg)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   206
        return (False, ".")
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3503
diff changeset
   207
    prec = repo.set('last(allprecursors(%d) and public())', bumped.rev()).next()
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   208
    # For now we deny target merge
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   209
    if len(prec.parents()) > 1:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   210
        msg = _('skipping: %s: public version is a merge, '
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   211
                'this is not handled yet\n') % prec
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   212
        ui.write_err(msg)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   213
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   214
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   215
    if not ui.quiet or confirm:
3501
7c8150697810 color: add some colors to evolve command itself
Boris Feld <boris.feld@octobus.net>
parents: 3495
diff changeset
   216
        repo.ui.write(_('recreate:'), label='evolve.operation')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   217
        displayer.show(bumped)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   218
        repo.ui.write(_('atop:'))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   219
        displayer.show(prec)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   220
    if confirm and ui.prompt('perform evolve? [Ny]', 'n') != 'y':
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   221
        raise error.Abort(_('evolve aborted by user'))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   222
    if dryrun:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   223
        todo = 'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   224
        repo.ui.write(todo)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   225
        repo.ui.write(('hg update %s;\n' % prec))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   226
        repo.ui.write(('hg revert --all --rev %s;\n' % bumped))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   227
        repo.ui.write(('hg commit --msg "%s update to %s"\n' %
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   228
                       (TROUBLES['PHASEDIVERGENT'], bumped)))
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   229
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   230
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   231
        progresscb()
3622
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   232
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   233
    # Checking for whether the phase-divergent changeset has common parents as
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   234
    # it's precursors. Phase-divergent changeset and precursor having different
4054
46cd437fd3d2 pick: fix last references of grab in code
Boris Feld <boris.feld@octobus.net>
parents: 3981
diff changeset
   235
    # parents is a result of when the changeset is rebased, picked, histedit or
3622
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   236
    # evolved or any other operation which can change parent. In such cases,
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   237
    # when parents are not same, we first rebase the divergent changeset onto
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   238
    # parent or precursor and then perform later steps
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3503
diff changeset
   239
    if not list(repo.set('parents(%d) and parents(%d)', bumped.rev(), prec.rev())):
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   240
        # Need to rebase the changeset at the right place
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   241
        repo.ui.status(
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   242
            _('rebasing to destination parent: %s\n') % prec.p1())
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   243
        try:
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   244
            newnode = relocate(repo, bumped, prec.p1(), evolvestate,
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   245
                               category='phasedivergent')
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   246
            if newnode is not None:
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   247
                new = repo[newnode]
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   248
                obsolete.createmarkers(repo, [(bumped, (new,))],
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
   249
                                       operation='evolve')
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   250
                bumped = new
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   251
                evolvestate['temprevs'].append(newnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   252
        except MergeFailure:
3628
170b99a9c0b4 evolve: write data to evolvestate in case on conflicts in phase-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3627
diff changeset
   253
            evolvestate['current'] = bumped.hex()
3631
8db32b33cdf1 evolve: store the precursor of phase-divergent in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3630
diff changeset
   254
            evolvestate['precursor'] = prec.hex()
3628
170b99a9c0b4 evolve: write data to evolvestate in case on conflicts in phase-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3627
diff changeset
   255
            evolvestate.save()
3852
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   256
            raise error.InterventionRequired(_("fix conflicts and see `hg help "
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   257
                                               "evolve.interrupted`"))
3622
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   258
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   259
    return _resolvephasedivergent(ui, repo, prec, bumped)
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   260
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   261
def _resolvephasedivergent(ui, repo, prec, bumped):
4465
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   262
    """final step of a phase divergence resolution
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   263
4465
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   264
    This will create a new changesets (or nothing when applicable), the two
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   265
    changesets needs to be on the same parents.
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   266
    """
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   267
    tr = repo.currenttransaction()
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   268
    assert tr is not None
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   269
4465
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   270
    cl = repo.changelog
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   271
    prec_parent = cl.parentrevs(prec.rev())
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   272
    bump_parent = cl.parentrevs(bumped.rev())
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   273
    assert prec_parent == bump_parent, (prec_parent, bump_parent)
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   274
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   275
    bmupdate = _bookmarksupdater(repo, bumped.node(), tr)
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   276
    newid = None
3754
73ee40cbfb53 evolve: return the new replacement node to be stored in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3753
diff changeset
   277
    replacementnode = None
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   278
4558
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   279
    # Create the new commit context. This is done by applying the changes from
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   280
    # the precursor to the bumped node onto the precursor. This is effectively
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   281
    # like reverting to the bumped node.
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   282
    wctx = context.overlayworkingctx(repo)
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   283
    wctx.setbase(prec)
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   284
    merge.update(repo, bumped.node(), ancestor=prec, mergeancestor=True,
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   285
                 branchmerge=True, force=False, wc=wctx)
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   286
    if not wctx.isempty():
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   287
        text = '%s update to %s:\n\n' % (TROUBLES['PHASEDIVERGENT'], prec)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   288
        text += bumped.description()
4558
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   289
        memctx = wctx.tomemctx(text,
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   290
                               parents=(prec.node(), nodemod.nullid),
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   291
                               date=bumped.date(),
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   292
                               extra=bumped.extra(),
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   293
                               user=bumped.user())
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   294
        newid = repo.commitctx(memctx)
3754
73ee40cbfb53 evolve: return the new replacement node to be stored in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3753
diff changeset
   295
        replacementnode = newid
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   296
    if newid is None:
4453
700b8b3a5a54 evolve: clarify output when phase-divergence resolution results in no change
Martin von Zweigbergk <martinvonz@google.com>
parents: 4444
diff changeset
   297
        repo.ui.status(_('no changes to commit\n'))
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   298
        obsolete.createmarkers(repo, [(bumped, ())], operation='evolve')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   299
        newid = prec.node()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   300
    else:
4453
700b8b3a5a54 evolve: clarify output when phase-divergence resolution results in no change
Martin von Zweigbergk <martinvonz@google.com>
parents: 4444
diff changeset
   301
        repo.ui.status(_('committed as %s\n') % nodemod.short(newid))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   302
        phases.retractboundary(repo, tr, bumped.phase(), [newid])
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   303
        obsolete.createmarkers(repo, [(bumped, (repo[newid],))],
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
   304
                               flag=obsolete.bumpedfix, operation='evolve')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   305
    bmupdate(newid)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   306
    # reroute the working copy parent to the new changeset
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   307
    with repo.dirstate.parentchange():
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
   308
        repo.dirstate.setparents(newid, nodemod.nullid)
3754
73ee40cbfb53 evolve: return the new replacement node to be stored in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3753
diff changeset
   309
    return (True, replacementnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   310
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
   311
def _solvedivergent(ui, repo, divergent, evolvestate, displayer, dryrun=False,
3478
4a1ccae58323 evolvecmd: pass evolvestate object to _solve* functions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3477
diff changeset
   312
                    confirm=False, progresscb=None):
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   313
    """tries to solve content-divergence of a changeset
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   314
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   315
    returns a tuple (bool, newnode) where,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   316
        bool: a boolean value indicating whether the instability was solved
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   317
        newnode: if bool is True, then the newnode of the resultant commit
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   318
                 formed. newnode can be node, when resolution led to no new
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   319
                 commit. If bool is False, this is ".".
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   320
    """
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   321
    repo = repo.unfiltered()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   322
    divergent = repo[divergent.rev()]
3734
aae54e80c95c evolve: store divergent nodes in evolvestate when resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
   323
    evolvestate['divergent'] = divergent.node()
4408
02ece0e5865e evolve: fix the broken behaviour on div resolution in relocation case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4403
diff changeset
   324
    evolvestate['orig-divergent'] = divergent.node()
3809
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   325
    # sometimes we will relocate a node in case of different parents and we can
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   326
    # encounter conflicts after relocation is done while solving
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   327
    # content-divergence and if the user calls `hg evolve --stop`, we need to
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   328
    # strip that relocated commit. However if `--all` is passed, we need to
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   329
    # reset this value for each content-divergence resolution which we are doing
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   330
    # below.
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   331
    evolvestate['relocated'] = None
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   332
    evolvestate['relocating'] = False
3825
b5dfa78073b9 evolve: store the old other divergent node after relocation in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3824
diff changeset
   333
    # in case or relocation we get a new other node, we need to store the old
b5dfa78073b9 evolve: store the old other divergent node after relocation in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3824
diff changeset
   334
    # other for purposes like `--abort` or `--stop`
b5dfa78073b9 evolve: store the old other divergent node after relocation in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3824
diff changeset
   335
    evolvestate['old-other'] = None
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   336
    base, others = divergentdata(divergent)
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   337
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   338
    # we don't handle split in content-divergence yet
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   339
    if len(others) > 1:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   340
        othersstr = "[%s]" % (','.join([str(i) for i in others]))
4090
6179a40d27c7 evolve: fix use of "'%d' % ctx"
Martin von Zweigbergk <martinvonz@google.com>
parents: 4054
diff changeset
   341
        msg = _("skipping %s: %s with a changeset that got split"
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   342
                " into multiple ones:\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   343
                "|[%s]\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   344
                "| This is not handled by automatic evolution yet\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   345
                "| You have to fallback to manual handling with commands "
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   346
                "such as:\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   347
                "| - hg touch -D\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   348
                "| - hg prune\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   349
                "| \n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   350
                "| You should contact your local evolution Guru for help.\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   351
                ) % (divergent, TROUBLES['CONTENTDIVERGENT'], othersstr)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   352
        ui.write_err(msg)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   353
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   354
    other = others[0]
3734
aae54e80c95c evolve: store divergent nodes in evolvestate when resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
   355
    evolvestate['other-divergent'] = other.node()
3788
ae30da2e210d evolve: store the base of content-divergents in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3787
diff changeset
   356
    evolvestate['base'] = base.node()
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   357
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   358
    def swapnodes(div, other):
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   359
        div, other = other, div
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   360
        evolvestate['divergent'] = div.node()
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   361
        evolvestate['other-divergent'] = other.node()
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   362
        return div, other
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   363
    # haspubdiv: to keep track if we are solving public content-divergence
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   364
    haspubdiv = False
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   365
    if not (divergent.mutable() and other.mutable()):
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   366
        haspubdiv = True
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   367
        # for simplicity, we keep public one to local side while merging
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   368
        # (as divergent is kept at local side, pinning public -> divergent)
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   369
        if divergent.mutable():
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   370
            publicdiv = other
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   371
            divergent, other = swapnodes(divergent, other)
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   372
        else:
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   373
            publicdiv = divergent
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   374
        evolvestate['public-divergent'] = publicdiv.node()
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   375
    # we don't handle merge content-divergent changesets yet
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   376
    if len(other.parents()) > 1:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   377
        msg = _("skipping %s: %s changeset can't be "
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   378
                "a merge (yet)\n") % (divergent, TROUBLES['CONTENTDIVERGENT'])
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   379
        ui.write_err(msg)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   380
        hint = _("You have to fallback to solving this by hand...\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   381
                 "| This probably means redoing the merge and using \n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   382
                 "| `hg prune` to kill older version.\n")
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   383
        ui.write_err(hint)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   384
        return (False, ".")
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   385
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   386
    otherp1 = other.p1().rev()
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   387
    divp1 = divergent.p1().rev()
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   388
3850
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   389
    # finding single successors of otherp1 and divp1
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   390
    try:
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   391
        otherp1 = utility._singlesuccessor(repo, other.p1())
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   392
    except utility.MultipleSuccessorsError:
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   393
        pass
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   394
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   395
    try:
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   396
        divp1 = utility._singlesuccessor(repo, divergent.p1())
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   397
    except utility.MultipleSuccessorsError:
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   398
        pass
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   399
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   400
    # the changeset on which resolution changeset will be based on
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   401
    resolutionparent = repo[divp1].node()
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   402
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   403
    gca = repo.revs("ancestor(%d, %d)" % (otherp1, divp1))
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   404
    # divonly: non-obsolete csets which are topological ancestor of "divergent"
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   405
    # but not "other"
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   406
    divonly = repo.revs("only(%d, %d) - obsolete()" % (divergent.rev(),
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   407
                                                       other.rev()))
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   408
    # otheronly: non-obsolete csets which are topological ancestor of "other"
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   409
    # but not "div"
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   410
    otheronly = repo.revs("only(%d, %d) - obsolete()" % (other.rev(),
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   411
                                                         divergent.rev()))
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   412
    # make it exclusive set
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   413
    divonly = set(divonly) - {divergent.rev()}
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   414
    otheronly = set(otheronly) - {other.rev()}
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   415
    # is relocation of one of the changeset required
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   416
    relocatereq = False
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   417
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   418
    # testing how both the divergent changesets are arranged, there can be 4
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   419
    # possible cases here:
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   420
    #
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   421
    # 1) both have the same parents
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   422
    # 2) both have different parents but greatest common anscestor of them is
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   423
    #    parent of one of them
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   424
    # 3) both have different parents and gca is not parent of any of them
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   425
    # 4) one of them is parent of other
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   426
    #
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   427
    # we are handling 1) very good now.
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   428
    # for 2) we will relocate one which is behind to the parent of ahead one and
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   429
    # then solve the content-divergence the way we solve 1)
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   430
    # for 3) and 4), we still have to decide
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   431
    if otherp1 in gca and divp1 in gca:
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   432
        if otherp1 == other.p1().rev() and divp1 == divergent.p1().rev():
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   433
            # both are on the same parents
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   434
            pass
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   435
        else:
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   436
            # both are not on the same parent but have same parents's succs.
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   437
            if otheronly and divonly:
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   438
                # case: we have visible csets on both side diverging from
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   439
                # tca of "divergent" and "other". We still need to decide what
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   440
                # to do in this case
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   441
                pass
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   442
            if otheronly:
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   443
                relocatereq = True
4443
fc2214916f50 evolve: add condition in case of pubdiv to not swap the two div csets
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4442
diff changeset
   444
                if not haspubdiv:
fc2214916f50 evolve: add condition in case of pubdiv to not swap the two div csets
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4442
diff changeset
   445
                    # can't swap when public divergence, as public can't move
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   446
                    divergent, other = swapnodes(divergent, other)
4443
fc2214916f50 evolve: add condition in case of pubdiv to not swap the two div csets
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4442
diff changeset
   447
                    resolutionparent = repo[otherp1].node()
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   448
            elif divonly:
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   449
                relocatereq = True
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   450
            else:
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   451
                # no extra cset on either side; so not considering relocation
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   452
                pass
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   453
    elif otherp1 in gca and divp1 not in gca:
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   454
        relocatereq = True
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   455
        pass
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   456
    elif divp1 in gca and otherp1 not in gca:
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   457
        relocatereq = True
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   458
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   459
        # When public branch is behind to the mutable branch, for now we
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   460
        # relocate mutable cset to public one's side in every case.
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   461
        #
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   462
        # This behaviour might be sub optimal when ancestors of mutable
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   463
        # cset has changes its relocated descendant rely on.
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   464
        #
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   465
        # Otherwise, we are going to rebase the "behind" branch up to the new
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   466
        # brancmap level.
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   467
        if not haspubdiv:
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   468
            divergent, other = swapnodes(divergent, other)
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   469
            resolutionparent = divergent.p1().node()
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   470
    else:
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   471
        msg = _("skipping %s: have a different parent than %s "
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   472
                "(not handled yet)\n") % (divergent, other)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   473
        hint = _("| %(d)s, %(o)s are not based on the same changeset.\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   474
                 "| With the current state of its implementation, \n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   475
                 "| evolve does not work in that case.\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   476
                 "| rebase one of them next to the other and run \n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   477
                 "| this command again.\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   478
                 "| - either: hg rebase --dest 'p1(%(d)s)' -r %(o)s\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   479
                 "| - or:     hg rebase --dest 'p1(%(o)s)' -r %(d)s\n"
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   480
                 ) % {'d': divergent, 'o': other}
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   481
        ui.write_err(msg)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   482
        ui.write_err(hint)
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   483
        return (False, ".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   484
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   485
    if not ui.quiet or confirm:
3501
7c8150697810 color: add some colors to evolve command itself
Boris Feld <boris.feld@octobus.net>
parents: 3495
diff changeset
   486
        ui.write(_('merge:'), label='evolve.operation')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   487
        displayer.show(divergent)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   488
        ui.write(_('with: '))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   489
        displayer.show(other)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   490
        ui.write(_('base: '))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   491
        displayer.show(base)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   492
    if confirm and ui.prompt(_('perform evolve? [Ny]'), 'n') != 'y':
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   493
        raise error.Abort(_('evolve aborted by user'))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   494
    if dryrun:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   495
        ui.write(('hg update -c %s &&\n' % divergent))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   496
        ui.write(('hg merge %s &&\n' % other))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   497
        ui.write(('hg commit -m "auto merge resolving conflict between '
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   498
                 '%s and %s"&&\n' % (divergent, other)))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   499
        ui.write(('hg up -C %s &&\n' % base))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   500
        ui.write(('hg revert --all --rev tip &&\n'))
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   501
        ui.write(('hg commit -m "`hg log -r %s --template={desc}`";\n'
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   502
                 % divergent))
4297
699e25687cc5 issue-6028: resolves 6028 - return (False, ".") instead of (False, '')
James Reynolds <james.glenn.reynolds@gmail.com>
parents: 4269
diff changeset
   503
        return (False, ".")
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   504
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   505
    evolvestate['resolutionparent'] = resolutionparent
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   506
    # relocate the other divergent if required
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   507
    if relocatereq:
3809
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   508
        # relocating will help us understand during the time of conflicts that
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   509
        # whether conflicts occur at reloacting or they occured at merging
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   510
        # content divergent changesets
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   511
        evolvestate['relocating'] = True
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   512
        ui.status(_('rebasing "other" content-divergent changeset %s on'
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   513
                    ' %s\n' % (other, divergent.p1())))
3811
3273b178c202 evolve: store the evolvestate if relocation results in conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3809
diff changeset
   514
        try:
3273b178c202 evolve: store the evolvestate if relocation results in conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3809
diff changeset
   515
            newother = relocate(repo, other, divergent.p1(), evolvestate,
3273b178c202 evolve: store the evolvestate if relocation results in conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3809
diff changeset
   516
                                keepbranch=True)
3273b178c202 evolve: store the evolvestate if relocation results in conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3809
diff changeset
   517
        except MergeFailure:
3273b178c202 evolve: store the evolvestate if relocation results in conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3809
diff changeset
   518
            evolvestate['current'] = other.node()
3273b178c202 evolve: store the evolvestate if relocation results in conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3809
diff changeset
   519
            evolvestate.save()
3853
796334340cad evolve: make one missed error to align other error messages
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3852
diff changeset
   520
            raise error.InterventionRequired(_("fix conflicts and see `hg help "
796334340cad evolve: make one missed error to align other error messages
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3852
diff changeset
   521
                                               "evolve.interrupted`"))
3825
b5dfa78073b9 evolve: store the old other divergent node after relocation in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3824
diff changeset
   522
        evolvestate['old-other'] = other.node()
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   523
        other = repo[newother]
3809
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   524
        evolvestate['relocating'] = False
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   525
        evolvestate['relocated'] = other.node()
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   526
        evolvestate['temprevs'].append(other.node())
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   527
        evolvestate['other-divergent'] = other.node()
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   528
3808
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   529
    _mergecontentdivergents(repo, progresscb, divergent, other, base,
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   530
                            evolvestate)
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   531
    res, newnode = _completecontentdivergent(ui, repo, progresscb, divergent,
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   532
                                             other, base, evolvestate)
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   533
    if not haspubdiv:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   534
        return (res, newnode)
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   535
    else:
4529
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   536
        # we have content-divergence with a public cset:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   537
        # after performing content divergence resolution steps, possbile cases:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   538
        # 1) merging results in a new node:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   539
        #       we need to perform phase divergence resolution
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   540
        # 2) merging leads to same content as public cset:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   541
        #       divergence has been resolved by creating markers
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   542
        if not res:
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   543
            # resolution was not successful, return
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   544
            return (res, newnode)
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   545
        if newnode == publicdiv.node():
4529
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   546
            # case 2)
4583
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   547
            pubstr = str(publicdiv)
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   548
            othstr = str(other)
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   549
            msg = _('content divergence resolution between %s '
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   550
                    '(public) and %s has same content as %s, '
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   551
                    'discarding %s\n')
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   552
            msg %= (pubstr, othstr, pubstr, othstr)
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   553
            repo.ui.status(msg)
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   554
            return (res, newnode)
4529
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   555
        # case 1)
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   556
        prec = publicdiv
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   557
        bumped = repo[newnode]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   558
        return _resolvephasedivergent(ui, repo, prec=prec, bumped=bumped)
3808
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   559
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   560
def _mergecontentdivergents(repo, progresscb, divergent, other, base,
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   561
                            evolvestate):
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   562
    if divergent not in repo[None].parents():
3740
07e246deb612 evolve: show cset hash in "update to local conflict" message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3739
diff changeset
   563
        repo.ui.status(_("updating to \"local\" side of the conflict: %s\n") %
07e246deb612 evolve: show cset hash in "update to local conflict" message
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3739
diff changeset
   564
                       divergent.hex()[:12])
3739
0bfc4fe3baf8 evolve: use hg.updaterepo() instead of hg.update() to hide stats
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3738
diff changeset
   565
        hg.updaterepo(repo, divergent.node(), False)
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   566
    # merging the two content-divergent changesets
3741
ec460882eab7 evolve: show cset hash in "merging conetnt-divergent changeset"
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3740
diff changeset
   567
    repo.ui.status(_("merging \"other\" %s changeset '%s'\n") %
ec460882eab7 evolve: show cset hash in "merging conetnt-divergent changeset"
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3740
diff changeset
   568
                   (TROUBLES['CONTENTDIVERGENT'], other.hex()[:12]))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   569
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   570
        progresscb()
4473
14437b18b024 evolve: fix divergence resolution when not merging a descendant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4467
diff changeset
   571
    mergeancestor = repo.changelog.isancestor(divergent.node(), other.node())
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   572
    stats = merge.update(repo,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   573
                         other.node(),
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   574
                         branchmerge=True,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   575
                         force=False,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   576
                         ancestor=base.node(),
4473
14437b18b024 evolve: fix divergence resolution when not merging a descendant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4467
diff changeset
   577
                         mergeancestor=mergeancestor)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   578
    hg._showstats(repo, stats)
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   579
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   580
    # conflicts while merging content-divergent changesets
3616
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3609
diff changeset
   581
    if compat.hasconflict(stats):
3807
03ccdc753582 evolve: commit the transaction if conflicts occur while merging content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3805
diff changeset
   582
        tr = repo.currenttransaction()
03ccdc753582 evolve: commit the transaction if conflicts occur while merging content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3805
diff changeset
   583
        tr.close()
3736
4b8c63d14f18 evolve: store the evolvestate file when encountering conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3735
diff changeset
   584
        evolvestate.save()
3852
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   585
        raise error.InterventionRequired(_("fix conflicts and see `hg help "
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   586
                                           "evolve.interrupted`"))
3735
bdf7fb6af7b8 evolve: take out logic to complete phase-divergence in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3734
diff changeset
   587
3737
5b0bd82ea914 evolve: add logic to continue interrupted content-divergence resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3736
diff changeset
   588
def _completecontentdivergent(ui, repo, progresscb, divergent, other,
3789
13eef43a961f evolve: pass the base revision in _completecontentdivergent()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3788
diff changeset
   589
                              base, evolvestate):
3735
bdf7fb6af7b8 evolve: take out logic to complete phase-divergence in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3734
diff changeset
   590
    """completes the content-divergence resolution"""
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   591
    # no conflicts were there in merging content divergent changesets, let's
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   592
    # resume resolution
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   593
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   594
        progresscb()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   595
    emtpycommitallowed = repo.ui.backupconfig('ui', 'allowemptycommit')
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   596
    tr = repo.currenttransaction()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   597
    assert tr is not None
3831
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   598
    # whether to store the obsmarker in the evolvestate
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   599
    storemarker = False
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   600
    resparent = evolvestate['resolutionparent']
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   601
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   602
    # whether we are solving public divergence
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   603
    haspubdiv = False
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   604
    if evolvestate.get('public-divergent'):
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   605
        haspubdiv = True
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
   606
        publicnode = evolvestate['public-divergent']
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
   607
        publicdiv = repo[publicnode]
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   608
        othernode = evolvestate['other-divergent']
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   609
        otherdiv = repo[othernode]
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   610
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   611
        with repo.dirstate.parentchange():
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   612
            repo.dirstate.setparents(publicnode, nodemod.nullid)
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   613
            dirstatedance(repo, divergent, publicnode, None)
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   614
        # check if node to be committed has changes same as public one
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   615
        s = publicdiv.status()
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   616
        if not (s.added or s.removed or s.deleted or s.modified):
4438
a6bdb02a1902 evolve: warn user if cset desc is being lost
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4431
diff changeset
   617
            # warn user if metadata is being lost
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   618
            warnmetadataloss(repo, publicdiv, otherdiv)
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   619
            # no changes, create markers to resolve divergence
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   620
            obsolete.createmarkers(repo, [(otherdiv, (publicdiv,))],
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   621
                                   operation='evolve')
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   622
            return (True, publicnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   623
    try:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   624
        with repo.dirstate.parentchange():
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
   625
            repo.dirstate.setparents(resparent, nodemod.nullid)
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   626
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   627
        dirstatedance(repo, divergent, resparent, None)
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   628
3829
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   629
        # merge the branches
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   630
        mergebranches(repo, divergent, other, base)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   631
        # merge the commit messages
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   632
        desc = mergecommitmessages(ui, base.description(),
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   633
                                   divergent.description(),
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   634
                                   other.description())
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   635
3792
bb7d1616407f evolve: return the new node formed only as the replacement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3790
diff changeset
   636
        # new node if any formed as the replacement
bb7d1616407f evolve: return the new node formed only as the replacement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3790
diff changeset
   637
        newnode = None
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   638
3879
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   639
        mergehook(repo, base, divergent, other)
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   640
4483
7978230faa32 evolve: make sure div resolution don't replace the initial author (issue6113)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4463
diff changeset
   641
        newnode = repo.commit(text=desc, user=other.user())
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   642
        if newnode == divergent.node() or newnode is None:
3831
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   643
            # no changes
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   644
            new = divergent
3831
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   645
            storemarker = True
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   646
            repo.ui.status(_("nothing changed\n"))
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   647
            hg.updaterepo(repo, divergent.rev(), False)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   648
        else:
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   649
            new = repo[newnode]
3792
bb7d1616407f evolve: return the new node formed only as the replacement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3790
diff changeset
   650
            newnode = new.node()
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   651
            hg.updaterepo(repo, new.rev(), False)
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   652
            if haspubdiv and publicdiv == divergent:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   653
                bypassphase(repo, (divergent, new), operation='evolve')
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   654
            else:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   655
                obsolete.createmarkers(repo, [(divergent, (new,))],
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   656
                                       operation='evolve')
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   657
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   658
        # creating markers and moving phases post-resolution
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   659
        if haspubdiv and publicdiv == other:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   660
            bypassphase(repo, (other, new), operation='evolve')
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   661
        else:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   662
            obsolete.createmarkers(repo, [(other, (new,))], operation='evolve')
3831
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   663
        if storemarker:
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   664
            # storing the marker in the evolvestate
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   665
            # we just store the precursors and successor pair for now, we might
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   666
            # want to store more data and serialize obsmarker in a better way in
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   667
            # future
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   668
            evolvestate['obsmarkers'].append((other.node(), new.node()))
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   669
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   670
        phases.retractboundary(repo, tr, other.phase(), [new.node()])
3792
bb7d1616407f evolve: return the new node formed only as the replacement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3790
diff changeset
   671
        return (True, newnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   672
    finally:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   673
        repo.ui.restoreconfig(emtpycommitallowed)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   674
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   675
def warnmetadataloss(repo, local, other):
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   676
    """warn the user for the metadata being lost while resolving
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   677
    public content-divergence"""
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   678
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   679
    # needtowarn: aspects where we need to warn user
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   680
    needtowarn = ['branch', 'topic', 'close']
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   681
    aspects = set()
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   682
    localextra = local.extra()
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   683
    otherextra = other.extra()
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   684
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   685
    for asp in needtowarn:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   686
        otherasp = otherextra.get(asp)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   687
        localasp = localextra.get(asp)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   688
        if otherasp and otherasp != localasp:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   689
            aspects.add(asp)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   690
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   691
    if other.description() != local.description():
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   692
        aspects.add('description')
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   693
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   694
    if aspects:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   695
        # warn user
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   696
        locstr = str(local)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   697
        othstr = str(other)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   698
        if 'close' in aspects:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   699
            filteredasp = aspects - {'close'}
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   700
            if filteredasp:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   701
                msg = _('other divergent changeset %s is a closed branch head '
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   702
                        'and differs from local %s by "%s" only,' %
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   703
                        (othstr, locstr, ', '.join(sorted(filteredasp))))
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   704
            else:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   705
                msg = _('other divergent changeset %s is a closed branch head '
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   706
                        'and has same content as local %s,' % (othstr, locstr))
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   707
        else:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   708
            msg = _('other divergent changeset %s has same content as local %s'
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   709
                    ' and differs by "%s" only,' %
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   710
                    (othstr, locstr, ', '.join(sorted(aspects))))
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   711
        msg += _(' discarding %s\n' % othstr)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   712
        repo.ui.warn(msg)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   713
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   714
def bypassphase(repo, relation, flag=0, metadata=None, operation='evolve'):
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   715
    """function to create a single obsmarker relation even for public csets
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   716
    where relation should be a single pair (prec, succ)"""
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   717
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   718
    # prepare metadata
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   719
    if metadata is None:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   720
        metadata = {}
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   721
    if 'user' not in metadata:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   722
        luser = repo.ui.config('devel', 'user.obsmarker') or repo.ui.username()
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   723
        metadata['user'] = encoding.fromlocal(luser)
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   724
    # Operation metadata handling
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   725
    useoperation = repo.ui.configbool('experimental',
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   726
                                      'evolution.track-operation')
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   727
    if useoperation and operation:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   728
        metadata['operation'] = operation
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   729
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   730
    # Effect flag metadata handling
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   731
    saveeffectflag = repo.ui.configbool('experimental',
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   732
                                        'evolution.effect-flags')
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   733
    with repo.transaction('add-obsolescence-marker') as tr:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   734
        prec, succ = relation
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   735
        nprec = prec.node()
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   736
        npare = None
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   737
        nsucs = [succ.node()]
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   738
        if not nsucs:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   739
            npare = tuple(p.node() for p in prec.parents())
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   740
        if nprec in nsucs:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   741
            raise error.Abort(_("changeset %s cannot obsolete itself") % prec)
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   742
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   743
        if saveeffectflag:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   744
            # The effect flag is saved in a versioned field name for
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   745
            # future evolution
4431
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   746
            try:
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   747
                effectflag = obsutil.geteffectflag(prec, (succ,))
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   748
            except TypeError:
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   749
                # hg <= 4.7
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   750
                effectflag = obsutil.geteffectflag((prec, (succ,)))
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   751
            metadata[obsutil.EFFECTFLAGFIELD] = "%d" % effectflag
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   752
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   753
        # create markers
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   754
        repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare,
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   755
                             metadata=metadata, ui=repo.ui)
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   756
        repo.filteredrevcache.clear()
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   757
3847
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   758
def dirstatedance(repo, oldparent, newparent, match):
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   759
    """utility function to fix the dirstate when we change parents from
4427
9e2ee7dc5e34 evolve: fix a typo from directory to dirty
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4426
diff changeset
   760
    oldparent to newparent with a dirty working directory using
3847
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   761
    repo.dirstate.setparents()
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   762
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   763
    Lets refer oldparent as Pold
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   764
               newparent as Pnew
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   765
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   766
    Now when we are on oldparent with a dirty working directory, there are three
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   767
    types of files which we are concerned about. They are files having modified,
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   768
    added and removed status.
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   769
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   770
    Lets refer modified files as Fm
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   771
               added files as Fa
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   772
               removed files as Fr
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   773
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   774
    Now, between Pold and Pnew, files can be modified, files can be added, files
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   775
    can be removed.
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   776
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   777
    Lets refer modification of a file between Pold to Pnew as Cm
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   778
               addition of a file between Pold to Pnew as Ca
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   779
               removal of a file between Pold to Pnew as Cr
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   780
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   781
    Now let's play combinations and permutations:
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   782
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   783
    |---------------------------------------------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   784
    | Type of file |  Changes between |   End status with Pnew as   |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   785
    |   in wdir    |    Pold -> Pnew  |       wdir parent           |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   786
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   787
    |              |                  |                             |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   788
    |   Fm         |      Cm          |       Modified or clean     |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   789
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   790
    |   Fm         |      Cr          |           Added             |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   791
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   792
    |   Fm         |      Ca          |       Not possible (1)      |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   793
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   794
    |   Fa         |      Ca          |       Modified or clean     |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   795
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   796
    |   Fa         |      Cm          |       Not possible (2)      |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   797
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   798
    |   Fa         |      Cr          |       Not possible (2)      |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   799
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   800
    |   Fr         |      Cr          | File should be untracked (3)|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   801
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   802
    |   Fr         |      Ca          |       Not possible (4)      |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   803
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   804
    |   Fr         |      Cm          |           Removed           |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   805
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   806
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   807
    (1): File is modified in wdir, it means file was present in Pold, so
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   808
         addition of that file between Pold to Pnew is not possible
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   809
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   810
    (2): File was added in wdir, it means file was not present in Pold, so
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   811
         deletion or modification of that file from Pold to Pnew is not possible
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   812
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   813
    (3): File should be dropped from the dirstate, Pnew has it removed, so no
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   814
         need to mark that removed again
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   815
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   816
    (4): File was removed in wdir, it means file was present in Pold, so
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   817
         addition of that file between Pold to Pnew is not possible
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   818
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   819
    """
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   820
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   821
    # falling back to an existing function, in future we should have logic in
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   822
    # this function only
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   823
    cmdrewrite._uncommitdirstate(repo, oldparent, match, True)
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   824
3879
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   825
def mergehook(repo, base, divergent, other):
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   826
    """function which extensions can wrap and merge data introduced by them
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   827
    while resolving content-divergence"""
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   828
    pass
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   829
3829
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   830
def mergebranches(repo, divergent, other, base):
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   831
    """merges the branch information for content-divergent changesets and sets
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   832
    the dirstate branch accordingly
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   833
    If unable to merge, prompts user to select a branch
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   834
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   835
    If the branch name is different from the branch of divergent changeset, it
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   836
    sets the current branch using repo.dirstate.setbranch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   837
    """
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   838
    divbranch = divergent.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   839
    basebranch = base.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   840
    othbranch = other.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   841
    # content divergent changes were on different branches, ask user to
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   842
    # select one
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   843
    if divbranch != othbranch:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   844
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   845
        if basebranch == othbranch and basebranch != divbranch:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   846
            # we will be amending the divergent changeset so branch will be
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   847
            # preserved
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   848
            pass
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   849
        elif basebranch == divbranch and basebranch != othbranch:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   850
            repo.dirstate.setbranch(othbranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   851
        else:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   852
            # all the three branches are different
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   853
            index = repo.ui.promptchoice(_("content divergent changesets on "
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   854
                                           "different branches.\nchoose branch"
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   855
                                           " for the resolution changeset. (a) "
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   856
                                           "%s or (b) %s or (c) %s? $$ &a $$ &b"
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   857
                                           " $$ &c") %
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   858
                                         (basebranch, divbranch, othbranch), 0)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   859
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   860
            if index == 0:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   861
                repo.dirstate.setbranch(basebranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   862
            elif index == 1:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   863
                pass
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   864
            elif index == 2:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   865
                repo.dirstate.setbranch(othbranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   866
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   867
def mergecommitmessages(ui, basedesc, divdesc, othdesc):
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   868
    """merges the commit messages and return the new merged message and whether
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   869
    there were conflicts or not while merging the messages"""
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   870
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   871
    merger = simplemerge.Merge3Text(basedesc, divdesc, othdesc)
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   872
    mdesc = []
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   873
    kwargs = {}
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   874
    kwargs['name_base'] = 'base'
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   875
    kwargs['base_marker'] = '|||||||'
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   876
    for line in merger.merge_lines(name_a='divergent', name_b='other',
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   877
                                   **kwargs):
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   878
        mdesc.append(line)
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   879
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   880
    desc = ''.join(mdesc)
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   881
    if merger.conflicts:
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   882
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   883
        prefixes = ("HG: Conflicts while merging changeset description of"
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   884
                    " content-divergent changesets.\nHG: Resolve conflicts"
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   885
                    " in commit messages to continue.\n\n")
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   886
4257
4a8f59b69d37 compat: drop 4.3 compatiblity code for `ui.edit` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4249
diff changeset
   887
        resolveddesc = ui.edit(prefixes + desc, ui.username(), action='desc')
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   888
        # make sure we remove the prefixes part from final commit message
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   889
        if prefixes in resolveddesc:
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   890
            # hack, we should find something better
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   891
            resolveddesc = resolveddesc[len(prefixes):]
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   892
        desc = resolveddesc
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   893
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   894
    return desc
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   895
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   896
class MergeFailure(error.Abort):
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   897
    pass
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   898
3469
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   899
def _orderrevs(repo, revs):
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   900
    """Compute an ordering to solve instability for the given revs
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   901
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   902
    revs is a list of unstable revisions.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   903
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   904
    Returns the same revisions ordered to solve their instability from the
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   905
    bottom to the top of the stack that the stabilization process will produce
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   906
    eventually.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   907
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   908
    This ensures the minimal number of stabilizations, as we can stabilize each
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   909
    revision on its final stabilized destination.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   910
    """
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   911
    # Step 1: Build the dependency graph
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   912
    dependencies, rdependencies = utility.builddependencies(repo, revs)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   913
    # Step 2: Build the ordering
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   914
    # Remove the revisions with no dependency(A) and add them to the ordering.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   915
    # Removing these revisions leads to new revisions with no dependency (the
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   916
    # one depending on A) that we can remove from the dependency graph and add
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   917
    # to the ordering. We progress in a similar fashion until the ordering is
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   918
    # built
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   919
    solvablerevs = collections.deque([r for r in sorted(dependencies.keys())
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   920
                                      if not dependencies[r]])
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   921
    ordering = []
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   922
    while solvablerevs:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   923
        rev = solvablerevs.popleft()
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   924
        for dependent in rdependencies[rev]:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   925
            dependencies[dependent].remove(rev)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   926
            if not dependencies[dependent]:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   927
                solvablerevs.append(dependent)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   928
        del dependencies[rev]
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   929
        ordering.append(rev)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   930
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   931
    ordering.extend(sorted(dependencies))
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   932
    return ordering
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   933
3638
7bc4a72b8a0b evolve: add evolvestate as an argument to evolvecmd.relocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3636
diff changeset
   934
def relocate(repo, orig, dest, evolvestate, pctx=None, keepbranch=False,
7bc4a72b8a0b evolve: add evolvestate as an argument to evolvecmd.relocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3636
diff changeset
   935
             category=None):
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   936
    """rewrites the orig rev on dest rev
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   937
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   938
    returns the node of new commit which is formed
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   939
    """
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   940
    if orig.rev() == dest.rev():
4269
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   941
        msg = _('tried to relocate a node on top of itself')
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   942
        hint = _("This shouldn't happen. If you still need to move changesets, "
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   943
                 "please do so manually with nothing to rebase - working "
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   944
                 "directory parent is also destination")
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   945
        raise error.ProgrammingError(msg, hint=hint)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   946
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   947
    if pctx is None:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   948
        if len(orig.parents()) == 2:
4269
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   949
            msg = _("tried to relocate a merge commit without specifying which "
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   950
                    "parent should be moved")
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   951
            hint = _("Specify the parent by passing in pctx")
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   952
            raise error.ProgrammingError(msg, hint)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   953
        pctx = orig.p1()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   954
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   955
    commitmsg = orig.description()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   956
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   957
    cache = {}
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   958
    sha1s = re.findall(sha1re, commitmsg)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   959
    unfi = repo.unfiltered()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   960
    for sha1 in sha1s:
3676
cded30ad25e4 compat: rename resolvepartialhexnodeid to resolvehexnodeidprefix
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3674
diff changeset
   961
        if util.safehasattr(scmutil, 'resolvehexnodeidprefix'): # > hg-4.6
cded30ad25e4 compat: rename resolvepartialhexnodeid to resolvehexnodeidprefix
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3674
diff changeset
   962
            fullnode = scmutil.resolvehexnodeidprefix(unfi, sha1)
3674
51adc7e6a617 compat: fallback to compatible partial lookup prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3666
diff changeset
   963
        else:
51adc7e6a617 compat: fallback to compatible partial lookup prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3666
diff changeset
   964
            fullnode = unfi.changelog.index.partialmatch(sha1)
3665
0f0f31351d6d compat: avoid using partial node ID in lookup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3653
diff changeset
   965
        if fullnode is None:
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   966
            continue
3665
0f0f31351d6d compat: avoid using partial node ID in lookup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3653
diff changeset
   967
        ctx = unfi[fullnode]
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   968
        if not ctx.obsolete():
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   969
            continue
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   970
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
   971
        successors = obsutil.successorssets(repo, ctx.node(), cache)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   972
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   973
        # We can't make any assumptions about how to update the hash if the
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   974
        # cset in question was split or diverged.
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   975
        if len(successors) == 1 and len(successors[0]) == 1:
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
   976
            newsha1 = nodemod.hex(successors[0][0])
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   977
            commitmsg = commitmsg.replace(sha1, newsha1[:len(sha1)])
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   978
        else:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   979
            repo.ui.note(_('The stale commit message reference to %s could '
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   980
                           'not be updated\n') % sha1)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   981
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   982
    tr = repo.currenttransaction()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   983
    assert tr is not None
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   984
    try:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   985
        r = _evolvemerge(repo, orig, dest, pctx, keepbranch)
3616
f6d629514607 compat: use updateresult API if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3609
diff changeset
   986
        if compat.hasconflict(r): # some conflict
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   987
            raise error.Abort(_('unresolved merge conflicts '
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   988
                                '(see hg help resolve)'))
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   989
        nodenew = _relocatecommit(repo, orig, commitmsg)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   990
    except error.Abort as exc:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   991
        with repo.dirstate.parentchange():
3978
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
   992
            repo.setparents(dest.node(), orig.node())
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   993
            repo.dirstate.write(tr)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   994
            # fix up dirstate for copies and renames
3700
2577fdc3a458 compat: drop compatibility layer for duplicatecopies
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3699
diff changeset
   995
            copies.duplicatecopies(repo, repo[None], dest.rev(), orig.p1().rev())
4426
7d97e08d13a0 evolve: fix the dirstate after setting parents with dirty wdir (issue5930)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4420
diff changeset
   996
            dirstatedance(repo, dest, orig.node(), None)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   997
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   998
        class LocalMergeFailure(MergeFailure, exc.__class__):
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   999
            pass
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1000
        exc.__class__ = LocalMergeFailure
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1001
        tr.close() # to keep changes in this transaction (e.g. dirstate)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1002
        raise
3639
95a767b2769e evolve: add evolvestate as an argument to _finalizerelocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3638
diff changeset
  1003
    _finalizerelocate(repo, orig, dest, nodenew, tr, category, evolvestate)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1004
    return nodenew
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1005
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1006
def _relocatecommit(repo, orig, commitmsg):
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1007
    if commitmsg is None:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1008
        commitmsg = orig.description()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1009
    extra = dict(orig.extra())
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1010
    if 'branch' in extra:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1011
        del extra['branch']
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1012
    extra['rebase_source'] = orig.hex()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1013
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1014
    backup = repo.ui.backupconfig('phases', 'new-commit')
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1015
    try:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1016
        targetphase = max(orig.phase(), phases.draft)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1017
        repo.ui.setconfig('phases', 'new-commit', targetphase, 'evolve')
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1018
        # Commit might fail if unresolved files exist
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1019
        nodenew = repo.commit(text=commitmsg, user=orig.user(),
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1020
                              date=orig.date(), extra=extra)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1021
    finally:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1022
        repo.ui.restoreconfig(backup)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1023
    return nodenew
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1024
3639
95a767b2769e evolve: add evolvestate as an argument to _finalizerelocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3638
diff changeset
  1025
def _finalizerelocate(repo, orig, dest, nodenew, tr, category, evolvestate):
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1026
    destbookmarks = repo.nodebookmarks(dest.node())
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1027
    nodesrc = orig.node()
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1028
    oldbookmarks = repo.nodebookmarks(nodesrc)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1029
    bmchanges = []
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1030
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1031
    if nodenew is not None:
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
  1032
        obsolete.createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))],
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
  1033
                               operation='evolve')
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1034
        for book in oldbookmarks:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1035
            bmchanges.append((book, nodenew))
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1036
            evolvestate['bookmarkchanges'].append((book, nodesrc))
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1037
    else:
3636
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  1038
        if category == 'orphan':
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  1039
            repo.ui.status(_("evolution of %d:%s created no changes "
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  1040
                             "to commit\n") % (orig.rev(), orig))
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
  1041
        obsolete.createmarkers(repo, [(repo[nodesrc], ())], operation='evolve')
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1042
        # Behave like rebase, move bookmarks to dest
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1043
        for book in oldbookmarks:
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1044
            evolvestate['bookmarkchanges'].append((book, nodesrc))
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1045
            bmchanges.append((book, dest.node()))
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1046
    for book in destbookmarks: # restore bookmark that rebase move
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1047
        bmchanges.append((book, dest.node()))
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1048
    if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3698
diff changeset
  1049
        repo._bookmarks.applychanges(repo, tr, bmchanges)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1050
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1051
def _evolvemerge(repo, orig, dest, pctx, keepbranch):
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1052
    """Used by the evolve function to merge dest on top of pctx.
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1053
    return the same tuple as merge.graft"""
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1054
    if repo['.'].rev() != dest.rev():
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1055
        merge.update(repo,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1056
                     dest,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1057
                     branchmerge=False,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1058
                     force=True)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1059
    if repo._activebookmark:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1060
        repo.ui.status(_("(leaving bookmark %s)\n") % repo._activebookmark)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1061
    bookmarksmod.deactivate(repo)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1062
    if keepbranch:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1063
        repo.dirstate.setbranch(orig.branch())
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1064
    if util.safehasattr(repo, 'currenttopic'):
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1065
        # uurrgs
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1066
        # there no other topic setter yet
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1067
        if not orig.topic() and repo.vfs.exists('topic'):
4463
7d54a538dd1e evolve: unindent some lines caught by flake8
Anton Shestakov <av6@dwimlabs.net>
parents: 4427
diff changeset
  1068
            repo.vfs.unlink('topic')
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1069
        else:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1070
            with repo.vfs.open('topic', 'w') as f:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1071
                f.write(orig.topic())
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1072
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1073
    return merge.graft(repo, orig, pctx, ['destination', 'evolving'], True)
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1074
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1075
instabilities_map = {
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1076
    'contentdivergent': "content-divergent",
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1077
    'phasedivergent': "phase-divergent"
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1078
}
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1079
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1080
def _selectrevs(repo, allopt, revopt, anyopt, targetcat):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1081
    """select troubles in repo matching according to given options"""
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1082
    revs = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1083
    if allopt or revopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1084
        revs = repo.revs("%s()" % targetcat)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1085
        if revopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1086
            revs = scmutil.revrange(repo, revopt) & revs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1087
        elif not anyopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1088
            topic = getattr(repo, 'currenttopic', '')
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1089
            if topic:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1090
                revs = repo.revs('topic(%s)', topic) & revs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1091
            elif targetcat == 'orphan':
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1092
                revs = _aspiringdescendant(repo,
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1093
                                           repo.revs('(.::) - obsolete()::'))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1094
                revs = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1095
        if targetcat == 'contentdivergent':
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1096
            # Pick one divergent per group of divergents
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1097
            revs = _dedupedivergents(repo, revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1098
    elif anyopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1099
        revs = repo.revs('first(%s())' % (targetcat))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1100
    elif targetcat == 'orphan':
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1101
        revs = set(_aspiringchildren(repo, repo.revs('(.::) - obsolete()::')))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1102
        if 1 < len(revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1103
            msg = "multiple evolve candidates"
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1104
            hint = (_("select one of %s with --rev")
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1105
                    % ', '.join([str(repo[r]) for r in sorted(revs)]))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1106
            raise error.Abort(msg, hint=hint)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1107
    elif instabilities_map.get(targetcat, targetcat) in repo['.'].instabilities():
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1108
        revs = set([repo['.'].rev()])
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1109
    return revs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1110
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1111
def _dedupedivergents(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1112
    """Dedupe the divergents revs in revs to get one from each group with the
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1113
    lowest revision numbers
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1114
    """
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1115
    repo = repo.unfiltered()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1116
    res = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1117
    # To not reevaluate divergents of the same group once one is encountered
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1118
    discarded = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1119
    for rev in revs:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1120
        if rev in discarded:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1121
            continue
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1122
        divergent = repo[rev]
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1123
        base, others = divergentdata(divergent)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1124
        othersrevs = [o.rev() for o in others]
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1125
        res.add(min([divergent.rev()] + othersrevs))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1126
        discarded.update(othersrevs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1127
    return res
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1128
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1129
def divergentdata(ctx):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1130
    """return base, other part of a conflict
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1131
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1132
    This only return the first one.
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1133
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1134
    XXX this woobly function won't survive XXX
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1135
    """
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1136
    repo = ctx._repo.unfiltered()
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3503
diff changeset
  1137
    for base in repo.set('reverse(allprecursors(%d))', ctx.rev()):
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
  1138
        newer = obsutil.successorssets(ctx._repo, base.node())
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1139
        # drop filter and solution including the original ctx
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1140
        newer = [n for n in newer if n and ctx.node() not in n]
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1141
        if newer:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1142
            return base, tuple(ctx._repo[o] for o in newer[0])
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1143
    raise error.Abort(_("base of divergent changeset %s not found") % ctx,
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1144
                      hint=_('this case is not yet handled'))
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1145
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1146
def _aspiringdescendant(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1147
    """Return a list of changectx which can be stabilized on top of pctx or
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1148
    one of its descendants recursively. Empty list if none can be found."""
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1149
    target = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1150
    result = set(target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1151
    paths = collections.defaultdict(set)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1152
    for r in repo.revs('orphan() - %ld', revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1153
        for d in _possibledestination(repo, r):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1154
            paths[d].add(r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1155
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1156
    result = set(target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1157
    tovisit = list(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1158
    while tovisit:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1159
        base = tovisit.pop()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1160
        for unstable in paths[base]:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1161
            if unstable not in result:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1162
                tovisit.append(unstable)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1163
                result.add(unstable)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1164
    return sorted(result - target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1165
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1166
def _aspiringchildren(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1167
    """Return a list of changectx which can be stabilized on top of pctx or
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1168
    one of its descendants. Empty list if none can be found."""
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1169
    target = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1170
    result = []
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1171
    for r in repo.revs('orphan() - %ld', revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1172
        dest = _possibledestination(repo, r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1173
        if target & dest:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1174
            result.append(r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1175
    return result
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1176
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1177
def _possibledestination(repo, rev):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1178
    """return all changesets that may be a new parent for REV"""
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1179
    tonode = repo.changelog.node
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1180
    parents = repo.changelog.parentrevs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1181
    torev = repo.changelog.rev
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1182
    dest = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1183
    tovisit = list(parents(rev))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1184
    while tovisit:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1185
        r = tovisit.pop()
4230
e796835fe6b3 evolvecmd: _possibledestination() skip visiting empty parent
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4209
diff changeset
  1186
        if r == -1:
e796835fe6b3 evolvecmd: _possibledestination() skip visiting empty parent
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4209
diff changeset
  1187
            continue
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
  1188
        succsets = obsutil.successorssets(repo, tonode(r))
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1189
        if not succsets:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1190
            tovisit.extend(parents(r))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1191
        else:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1192
            # We should probably pick only one destination from split
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1193
            # (case where '1 < len(ss)'), This could be the currently tipmost
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1194
            # but logic is less clear when result of the split are now on
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1195
            # multiple branches.
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1196
            for ss in succsets:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1197
                for n in ss:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1198
                    dest.add(torev(n))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1199
    return dest
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1200
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1201
def _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1202
    """Used by the evolve function to display an error message when
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1203
    no troubles can be resolved"""
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1204
    troublecategories = ['phasedivergent', 'contentdivergent', 'orphan']
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1205
    unselectedcategories = [c for c in troublecategories if c != targetcat]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1206
    msg = None
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1207
    hint = None
3649
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1208
    retoverride = None
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1209
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1210
    troubled = {
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1211
        "orphan": repo.revs("orphan()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1212
        "contentdivergent": repo.revs("contentdivergent()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1213
        "phasedivergent": repo.revs("phasedivergent()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1214
        "all": repo.revs("troubled()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1215
    }
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1216
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1217
    hintmap = {
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1218
        'phasedivergent': _("do you want to use --phase-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1219
        'phasedivergent+contentdivergent': _("do you want to use "
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1220
                                             "--phase-divergent or"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1221
                                             " --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1222
        'phasedivergent+orphan': _("do you want to use --phase-divergent"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1223
                                   " or --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1224
        'contentdivergent': _("do you want to use --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1225
        'contentdivergent+orphan': _("do you want to use --content-divergent"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1226
                                     " or --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1227
        'orphan': _("do you want to use --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1228
        'any+phasedivergent': _("do you want to use --any (or --rev) and"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1229
                                " --phase-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1230
        'any+phasedivergent+contentdivergent': _("do you want to use --any"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1231
                                                 " (or --rev) and"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1232
                                                 " --phase-divergent or"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1233
                                                 " --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1234
        'any+phasedivergent+orphan': _("do you want to use --any (or --rev)"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1235
                                       " and --phase-divergent or --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1236
        'any+contentdivergent': _("do you want to use --any (or --rev) and"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1237
                                  " --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1238
        'any+contentdivergent+orphan': _("do you want to use --any (or --rev)"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1239
                                         " and --content-divergent or "
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1240
                                         "--orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1241
        'any+orphan': _("do you want to use --any (or --rev)"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1242
                        "and --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1243
    }
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1244
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1245
    if revopt:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1246
        revs = scmutil.revrange(repo, revopt)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1247
        if not revs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1248
            msg = _("set of specified revisions is empty")
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1249
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1250
            msg = _("no %s changesets in specified revisions") % targetcat
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1251
            othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1252
            for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1253
                if revs & troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1254
                    othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1255
            if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1256
                hint = hintmap['+'.join(othertroubles)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1257
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1258
    elif anyopt:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1259
        msg = _("no %s changesets to evolve") % targetcat
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1260
        othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1261
        for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1262
            if troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1263
                othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1264
        if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1265
            hint = hintmap['+'.join(othertroubles)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1266
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1267
    else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1268
        # evolve without any option = relative to the current wdir
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1269
        if targetcat == 'orphan':
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1270
            msg = _("nothing to evolve on current working copy parent")
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1271
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1272
            msg = _("current working copy parent is not %s") % targetcat
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1273
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1274
        p1 = repo['.'].rev()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1275
        othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1276
        for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1277
            if p1 in troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1278
                othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1279
        if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1280
            hint = hintmap['+'.join(othertroubles)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1281
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1282
            length = len(troubled[targetcat])
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1283
            if length:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1284
                hint = _("%d other %s in the repository, do you want --any "
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1285
                         "or --rev") % (length, targetcat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1286
            else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1287
                othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1288
                for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1289
                    if troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1290
                        othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1291
                if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1292
                    hint = hintmap['any+' + ('+'.join(othertroubles))]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1293
                else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1294
                    msg = _("no troubled changesets")
3649
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1295
                    # Exit with a 0 (success) status in this case.
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1296
                    retoverride = 0
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1297
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1298
    assert msg is not None
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1299
    ui.write_err("%s\n" % msg)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1300
    if hint:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1301
        ui.write_err("(%s)\n" % hint)
3649
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1302
        ret = 2
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1303
    else:
3649
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1304
        ret = 1
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1305
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1306
    if retoverride is not None:
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1307
        return retoverride
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1308
    return ret
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1309
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1310
def _preparelistctxs(items, condition):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1311
    return [item.hex() for item in items if condition(item)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1312
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1313
def _formatctx(fm, ctx):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1314
    fm.data(node=ctx.hex())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1315
    fm.data(desc=ctx.description())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1316
    fm.data(date=ctx.date())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1317
    fm.data(user=ctx.user())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1318
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1319
def listtroubles(ui, repo, troublecategories, **opts):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1320
    """Print all the troubles for the repo (or given revset)"""
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1321
    troublecategories = troublecategories or ['contentdivergent', 'orphan', 'phasedivergent']
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1322
    showunstable = 'orphan' in troublecategories
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1323
    showbumped = 'phasedivergent' in troublecategories
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1324
    showdivergent = 'contentdivergent' in troublecategories
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1325
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1326
    revs = repo.revs('+'.join("%s()" % t for t in troublecategories))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1327
    if opts.get('rev'):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1328
        revs = scmutil.revrange(repo, opts.get('rev'))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1329
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1330
    fm = ui.formatter('evolvelist', opts)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1331
    for rev in revs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1332
        ctx = repo[rev]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1333
        unpars = _preparelistctxs(ctx.parents(), lambda p: p.orphan())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1334
        obspars = _preparelistctxs(ctx.parents(), lambda p: p.obsolete())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1335
        imprecs = _preparelistctxs(repo.set("allprecursors(%n)", ctx.node()),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1336
                                   lambda p: not p.mutable())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1337
        dsets = divergentsets(repo, ctx)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1338
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1339
        fm.startitem()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1340
        # plain formatter section
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1341
        hashlen, desclen = 12, 60
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1342
        desc = ctx.description()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1343
        if desc:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1344
            desc = desc.splitlines()[0]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1345
        desc = (desc[:desclen] + '...') if len(desc) > desclen else desc
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1346
        fm.plain('%s: ' % ctx.hex()[:hashlen])
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1347
        fm.plain('%s\n' % desc)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1348
        fm.data(node=ctx.hex(), rev=ctx.rev(), desc=desc, phase=ctx.phasestr())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1349
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1350
        for unpar in unpars if showunstable else []:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1351
            fm.plain('  %s: %s (%s parent)\n' % (TROUBLES['ORPHAN'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1352
                                                 unpar[:hashlen],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1353
                                                 TROUBLES['ORPHAN']))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1354
        for obspar in obspars if showunstable else []:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1355
            fm.plain('  %s: %s (obsolete parent)\n' % (TROUBLES['ORPHAN'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1356
                                                       obspar[:hashlen]))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1357
        for imprec in imprecs if showbumped else []:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1358
            fm.plain('  %s: %s (immutable precursor)\n' %
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1359
                     (TROUBLES['PHASEDIVERGENT'], imprec[:hashlen]))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1360
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1361
        if dsets and showdivergent:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1362
            for dset in dsets:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1363
                fm.plain('  %s: ' % TROUBLES['CONTENTDIVERGENT'])
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1364
                first = True
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1365
                for n in dset['divergentnodes']:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1366
                    t = "%s (%s)" if first else " %s (%s)"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1367
                    first = False
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1368
                    fm.plain(t % (nodemod.hex(n)[:hashlen], repo[n].phasestr()))
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1369
                comprec = nodemod.hex(dset['commonprecursor'])[:hashlen]
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1370
                fm.plain(" (precursor %s)\n" % comprec)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1371
        fm.plain("\n")
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1372
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1373
        # templater-friendly section
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1374
        _formatctx(fm, ctx)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1375
        troubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1376
        for unpar in unpars:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1377
            troubles.append({'troubletype': TROUBLES['ORPHAN'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1378
                             'sourcenode': unpar, 'sourcetype': 'orphanparent'})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1379
        for obspar in obspars:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1380
            troubles.append({'troubletype': TROUBLES['ORPHAN'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1381
                             'sourcenode': obspar,
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1382
                             'sourcetype': 'obsoleteparent'})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1383
        for imprec in imprecs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1384
            troubles.append({'troubletype': TROUBLES['PHASEDIVERGENT'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1385
                             'sourcenode': imprec,
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1386
                             'sourcetype': 'immutableprecursor'})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1387
        for dset in dsets:
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1388
            divnodes = [{'node': nodemod.hex(n),
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1389
                         'phase': repo[n].phasestr(),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1390
                        } for n in dset['divergentnodes']]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1391
            troubles.append({'troubletype': TROUBLES['CONTENTDIVERGENT'],
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1392
                             'commonprecursor': nodemod.hex(dset['commonprecursor']),
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1393
                             'divergentnodes': divnodes})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1394
        fm.data(troubles=troubles)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1395
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1396
    fm.end()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1397
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1398
def _checkevolveopts(repo, opts):
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1399
    """ check the options passed to `hg evolve` and warn for deprecation warning
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1400
    if any """
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1401
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1402
    if opts['continue']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1403
        if opts['any']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1404
            raise error.Abort(_('cannot specify both "--any" and "--continue"'))
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1405
        if opts['all']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1406
            raise error.Abort(_('cannot specify both "--all" and "--continue"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1407
        if opts['rev']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1408
            raise error.Abort(_('cannot specify both "--rev" and "--continue"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1409
        if opts['stop']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1410
            raise error.Abort(_('cannot specify both "--stop" and'
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1411
                                ' "--continue"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1412
        if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1413
            raise error.Abort(_('cannot specify both "--abort" and'
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1414
                                ' "--continue"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1415
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1416
    if opts['stop']:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1417
        if opts['any']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1418
            raise error.Abort(_('cannot specify both "--any" and "--stop"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1419
        if opts['all']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1420
            raise error.Abort(_('cannot specify both "--all" and "--stop"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1421
        if opts['rev']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1422
            raise error.Abort(_('cannot specify both "--rev" and "--stop"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1423
        if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1424
            raise error.Abort(_('cannot specify both "--abort" and "--stop"'))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1425
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1426
    if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1427
        if opts['any']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1428
            raise error.Abort(_('cannot specify both "--any" and "--abort"'))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1429
        if opts['all']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1430
            raise error.Abort(_('cannot specify both "--all" and "--abort"'))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1431
        if opts['rev']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1432
            raise error.Abort(_('cannot specify both "--rev" and "--abort"'))
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1433
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1434
    if opts['rev']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1435
        if opts['any']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1436
            raise error.Abort(_('cannot specify both "--rev" and "--any"'))
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1437
        if opts['all']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1438
            raise error.Abort(_('cannot specify both "--rev" and "--all"'))
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1439
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1440
    # Backward compatibility
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1441
    if opts['unstable']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1442
        msg = ("'evolve --unstable' is deprecated, "
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1443
               "use 'evolve --orphan'")
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1444
        repo.ui.deprecwarn(msg, '4.4')
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1445
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1446
        opts['orphan'] = opts['divergent']
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1447
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1448
    if opts['divergent']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1449
        msg = ("'evolve --divergent' is deprecated, "
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1450
               "use 'evolve --content-divergent'")
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1451
        repo.ui.deprecwarn(msg, '4.4')
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1452
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1453
        opts['content_divergent'] = opts['divergent']
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1454
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1455
    if opts['bumped']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1456
        msg = ("'evolve --bumped' is deprecated, "
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1457
               "use 'evolve --phase-divergent'")
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1458
        repo.ui.deprecwarn(msg, '4.4')
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1459
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1460
        opts['phase_divergent'] = opts['bumped']
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1461
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1462
    return opts
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1463
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1464
def _cleanup(ui, repo, startnode, showprogress, shouldupdate):
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1465
    if showprogress:
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4320
diff changeset
  1466
        compat.progress(ui, _('evolve'), None)
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1467
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1468
    if not shouldupdate:
4377
c2f9de28415a evolve: document the "if not shouldupdate" block
Martin von Zweigbergk <martinvonz@google.com>
parents: 4376
diff changeset
  1469
        # Move back to startnode, or to its successor if the start node is
c2f9de28415a evolve: document the "if not shouldupdate" block
Martin von Zweigbergk <martinvonz@google.com>
parents: 4376
diff changeset
  1470
        # obsolete (perhaps made obsolete by the current `hg evolve`)
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1471
        unfi = repo.unfiltered()
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1472
        succ = utility._singlesuccessor(repo, unfi[startnode])
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1473
        hg.updaterepo(repo, repo[succ].node(), False)
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1474
    if repo['.'].node() != startnode:
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1475
        ui.status(_('working directory is now at %s\n') % repo['.'])
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1476
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1477
def divergentsets(repo, ctx):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1478
    """Compute sets of commits divergent with a given one"""
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1479
    cache = {}
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1480
    base = {}
4258
697ec7c2f325 compat: drop 4.3 compatiblity code for `obsutil.allprecursors` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4257
diff changeset
  1481
    for n in obsutil.allpredecessors(repo.obsstore, [ctx.node()]):
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1482
        if n == ctx.node():
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1483
            # a node can't be a base for divergence with itself
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1484
            continue
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
  1485
        nsuccsets = obsutil.successorssets(repo, n, cache)
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1486
        for nsuccset in nsuccsets:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1487
            if ctx.node() in nsuccset:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1488
                # we are only interested in *other* successor sets
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1489
                continue
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1490
            if tuple(nsuccset) in base:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1491
                # we already know the latest base for this divergency
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1492
                continue
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1493
            base[tuple(nsuccset)] = n
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1494
    divergence = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1495
    for divset, b in base.iteritems():
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1496
        divergence.append({
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1497
            'divergentnodes': divset,
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1498
            'commonprecursor': b
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1499
        })
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1500
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1501
    return divergence
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1502
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1503
@eh.command(
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4180
diff changeset
  1504
    'evolve|stabilize|solve',
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1505
    [('n', 'dry-run', False,
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1506
      _('do not perform actions, just print what would be done')),
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1507
     ('', 'confirm', False,
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1508
      _('ask for confirmation before performing the action')),
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1509
     ('A', 'any', False,
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1510
      _('also consider troubled changesets unrelated to current working '
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1511
        'directory')),
4183
536c67823962 commands: adjust metavariables as appropriate
Anton Shestakov <av6@dwimlabs.net>
parents: 4180
diff changeset
  1512
     ('r', 'rev', [], _('solves troubles of these revisions'), _('REV')),
4179
2020c254fe66 evolvecmd: mark flags with old instability names as deprecated
Anton Shestakov <av6@dwimlabs.net>
parents: 4155
diff changeset
  1513
     ('', 'bumped', False, _('solves only bumped changesets (DEPRECATED)')),
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1514
     ('', 'phase-divergent', False, _('solves only phase-divergent changesets')),
4179
2020c254fe66 evolvecmd: mark flags with old instability names as deprecated
Anton Shestakov <av6@dwimlabs.net>
parents: 4155
diff changeset
  1515
     ('', 'divergent', False, _('solves only divergent changesets (DEPRECATED)')),
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1516
     ('', 'content-divergent', False, _('solves only content-divergent changesets')),
4179
2020c254fe66 evolvecmd: mark flags with old instability names as deprecated
Anton Shestakov <av6@dwimlabs.net>
parents: 4155
diff changeset
  1517
     ('', 'unstable', False, _('solves only unstable changesets (DEPRECATED)')),
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1518
     ('', 'orphan', False, _('solves only orphan changesets (default)')),
4580
3ef96578da43 evolve: use --all by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4577
diff changeset
  1519
     ('a', 'all', None, _('evolve all troubled changesets related to the '
3ef96578da43 evolve: use --all by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4577
diff changeset
  1520
                          'current working directory and its descendants')),
4577
bcd52ce0916d evolve: don't update after instability resolution by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4563
diff changeset
  1521
     ('', 'update', False, _('update to the head of evolved changesets')),
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1522
     ('c', 'continue', False, _('continue an interrupted evolution')),
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1523
     ('', 'stop', False, _('stop the interrupted evolution')),
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1524
     ('', 'abort', False, _('abort the interrupted evolution')),
3640
5a127bc27419 evolve: internationalize the entry of --list in hg evolve help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3639
diff changeset
  1525
     ('l', 'list', False, _('provide details on troubled changesets'
5a127bc27419 evolve: internationalize the entry of --list in hg evolve help
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3639
diff changeset
  1526
                            ' in the repo')),
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1527
    ] + mergetoolopts,
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4180
diff changeset
  1528
    _('[OPTIONS]...'),
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4180
diff changeset
  1529
    helpbasic=True
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1530
)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1531
def evolve(ui, repo, **opts):
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1532
    """solve troubled changesets in your repository
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1533
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1534
    Modifying history can lead to various types of troubled changesets:
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1535
    orphan, phase-divergent, or content-divergent. The evolve command resolves
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1536
    your troubles by executing one of the following actions:
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1537
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1538
    - update working copy to a successor
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1539
    - rebase an orphan changeset
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1540
    - extract the desired changes from a phase-divergent changeset
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1541
    - fuse content-divergent changesets back together
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1542
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1543
    If you pass no arguments, evolve works in automatic mode: it will execute a
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1544
    single action to reduce instability related to your working copy. There are
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1545
    two cases for this action. First, if the parent of your working copy is
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1546
    obsolete, evolve updates to the parent's successor. Second, if the working
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1547
    copy parent is not obsolete but has obsolete predecessors, then evolve
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1548
    determines if there is an orphan changeset that can be rebased onto the
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1549
    working copy parent in order to reduce instability.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1550
    If so, evolve rebases that changeset. If not, evolve refuses to guess your
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1551
    intention, and gives a hint about what you might want to do next.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1552
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1553
    Any time evolve creates a changeset, it updates the working copy to the new
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1554
    changeset. (Currently, every successful evolve operation involves an update
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1555
    as well; this may change in future.)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1556
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1557
    Automatic mode only handles common use cases. For example, it avoids taking
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1558
    action in the case of ambiguity, and it ignores orphan changesets that are
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1559
    not related to your working copy.
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1560
    It also refuses to solve phase-divergent or content-divergent changesets
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1561
    unless you explicitly request such behavior (see below).
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1562
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1563
    Eliminating all instability around your working copy may require multiple
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1564
    invocations of :hg:`evolve`. Alternately, use ``--all`` to recursively
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1565
    select and evolve all orphan changesets that can be rebased onto the
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1566
    working copy parent.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1567
    This is more powerful than successive invocations, since ``--all`` handles
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1568
    ambiguous cases (e.g. orphan changesets with multiple children) by evolving
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1569
    all branches.
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1570
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1571
    When your repository cannot be handled by automatic mode, you might need to
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1572
    use ``--rev`` to specify a changeset to evolve. For example, if you have
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1573
    an orphan changeset that is not related to the working copy parent,
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1574
    you could use ``--rev`` to evolve it. Or, if some changeset has multiple
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1575
    orphan children, evolve in automatic mode refuses to guess which one to
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1576
    evolve; you have to use ``--rev`` in that case.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1577
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1578
    Alternately, ``--any`` makes evolve search for the next evolvable changeset
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1579
    regardless of whether it is related to the working copy parent.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1580
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1581
    You can supply multiple revisions to evolve multiple troubled changesets
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1582
    in a single invocation. In revset terms, ``--any`` is equivalent to ``--rev
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1583
    first(orphan())``. ``--rev`` and ``--all`` are mutually exclusive, as are
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1584
    ``--rev`` and ``--any``.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1585
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1586
    ``hg evolve --any --all`` is useful for cleaning up instability across all
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1587
    branches, letting evolve figure out the appropriate order and destination.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1588
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1589
    When you have troubled changesets that are not orphan, :hg:`evolve` refuses
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1590
    to consider them unless you specify the category of trouble you
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1591
    wish to resolve, with ``--phase-divergent`` or ``--content-divergent``.
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1592
    These options are currently mutually exclusive with each other and with
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1593
    ``--orphan`` (the default). You can combine ``--phase-divergent`` or
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1594
    ``--content-divergent`` with ``--rev``, ``--all``, or ``--any``.
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1595
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1596
    You can also use the evolve command to list the troubles affecting your
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1597
    repository by using the --list flag. You can choose to display only some
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1598
    categories of troubles with the --orphan, --content-divergent or
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1599
    --phase-divergent flags.
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1600
3821
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
  1601
    Interrupted
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
  1602
    ===========
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1603
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1604
    The `hg evolve` command is an all purpose tool that solve all kind of
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1605
    instabilities in your repository. Sometimes, instability resolution will lead
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1606
    to merge conflict that cannot be solved without a human intervention (same as
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1607
    `hg merge`). This can lead to an "interrupted state" where human assistance is
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1608
    requested. There are three things which you can do when you face a similar
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1609
    situation:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1610
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1611
      - `hg evolve --continue`:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1612
         fix all the conflicts using `hg resolve` and then run this to continue the
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1613
         interrupted evolve
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1614
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1615
      - `hg evolve --stop`:
4265
4d62095d9fe6 evolve: fix a documentation typo
Eric Spishak-Thomas <spishak@google.com>
parents: 4235
diff changeset
  1616
         stops the current interrupted evolve, keeping all the successful steps,
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1617
         but delaying to resolution of the remaining step for later.
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1618
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1619
      - `hg evolve --abort`:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1620
         aborts the interrupted evolve and undoes all the resolution which have
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1621
         happened
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1622
    """
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1623
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1624
    opts = _checkevolveopts(repo, opts)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1625
    # Options
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1626
    contopt = opts['continue']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1627
    anyopt = opts['any']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1628
    allopt = opts['all']
4580
3ef96578da43 evolve: use --all by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4577
diff changeset
  1629
    if allopt is None:
3ef96578da43 evolve: use --all by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4577
diff changeset
  1630
        allopt = True
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1631
    startnode = repo['.'].node()
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1632
    dryrunopt = opts['dry_run']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1633
    confirmopt = opts['confirm']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1634
    revopt = opts['rev']
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1635
    stopopt = opts['stop']
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1636
    abortopt = opts['abort']
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1637
    shouldupdate = opts['update']
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1638
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1639
    troublecategories = ['phase_divergent', 'content_divergent', 'orphan']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1640
    specifiedcategories = [t.replace('_', '')
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1641
                           for t in troublecategories
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1642
                           if opts[t]]
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1643
    if opts['list']:
3701
29c413a7dfb5 compat: drop compatibility layer for pager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3700
diff changeset
  1644
        ui.pager('evolve')
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1645
        listtroubles(ui, repo, specifiedcategories, **opts)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1646
        return
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1647
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1648
    targetcat = 'orphan'
4420
6a20e0e9b957 evolve: make sure user can recover from conflict (issue6053)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4348
diff changeset
  1649
    has_some_opts = bool(revopt or anyopt or allopt or contopt or stopopt or abortopt)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1650
    if 1 < len(specifiedcategories):
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1651
        msg = _('cannot specify more than one trouble category to solve (yet)')
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1652
        raise error.Abort(msg)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1653
    elif len(specifiedcategories) == 1:
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1654
        targetcat = specifiedcategories[0]
4420
6a20e0e9b957 evolve: make sure user can recover from conflict (issue6053)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4348
diff changeset
  1655
    elif repo['.'].obsolete() and not has_some_opts:
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1656
        # if no args and parent is obsolete, update to successors
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1657
        return solveobswdp(ui, repo, opts)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1658
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1659
    ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), 'evolve')
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1660
    troubled = set(repo.revs('troubled()'))
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1661
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1662
    # Progress handling
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1663
    seen = 1
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1664
    count = allopt and len(troubled) or 1
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1665
    showprogress = allopt
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1666
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1667
    def progresscb():
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1668
        if revopt or allopt:
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4320
diff changeset
  1669
            compat.progress(ui, _('evolve'), seen, unit=_('changesets'), total=count)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1670
3477
713e26a647f5 evolve: create a state object in all case
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3470
diff changeset
  1671
    evolvestate = state.cmdstate(repo)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1672
    # Continuation handling
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1673
    if contopt:
3556
b0438c9101ad evolve: load evolvestate before passing to continueevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3555
diff changeset
  1674
        if not evolvestate:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1675
            raise error.Abort(_('no interrupted evolve to continue'))
3556
b0438c9101ad evolve: load evolvestate before passing to continueevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3555
diff changeset
  1676
        evolvestate.load()
3557
77a400149758 evolve: move deletion of evolvestate out of continueevolve() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3556
diff changeset
  1677
        continueevolve(ui, repo, evolvestate, progresscb)
3558
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1678
        if evolvestate['command'] != 'evolve':
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1679
            evolvestate.delete()
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1680
            return
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1681
        startnode = repo.unfiltered()[evolvestate['startnode']]
4505
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1682
        if 'update' in evolvestate:
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1683
            shouldupdate = evolvestate['update']
3557
77a400149758 evolve: move deletion of evolvestate out of continueevolve() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3556
diff changeset
  1684
        evolvestate.delete()
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1685
    elif stopopt:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1686
        if not evolvestate:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1687
            raise error.Abort(_('no interrupted evolve to stop'))
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1688
        evolvestate.load()
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1689
        stopevolve(ui, repo, evolvestate)
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1690
        evolvestate.delete()
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1691
        return
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1692
    elif abortopt:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1693
        if not evolvestate:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1694
            raise error.Abort(_('no interrupted evolve to stop'))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1695
        evolvestate.load()
3776
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1696
        # `hg next --evolve` in play
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1697
        if evolvestate['command'] != 'evolve':
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1698
            pctx = repo['.']
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1699
            hg.updaterepo(repo, pctx.node(), True)
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1700
            ui.status(_('evolve aborted\n'))
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1701
            ui.status(_('working directory is now at %s\n')
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1702
                      % pctx.hex()[:12])
3981
b4d0245c7f40 evolve: delete evolvestate after aborting interrupted `next --evolve`
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3978
diff changeset
  1703
            evolvestate.delete()
3776
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1704
            return 0
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1705
        return abortevolve(ui, repo, evolvestate)
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1706
    else:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1707
        cmdutil.bailifchanged(repo)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1708
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1709
        revs = _selectrevs(repo, allopt, revopt, anyopt, targetcat)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1710
4348
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1711
        # Case: when wdir parent is obsolete and args passed.
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1712
        # Handling it here otherwise `revs` set would change, after
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1713
        # performing update to successor of obsolete wdir parent.
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1714
        # (in case when user passes a revset related to wdir parent '.::')
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1715
        if repo['.'].obsolete():
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1716
            result = solveobswdp(ui, repo, opts)
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1717
            if result != 0 or result is True:
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1718
                return result
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1719
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1720
        if not revs:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1721
            return _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1722
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1723
        # For the progress bar to show
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1724
        count = len(revs)
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1725
        # Order the revisions
3845
5c964ebe4d4b evolve: always order the revs to be evolved
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3843
diff changeset
  1726
        revs = _orderrevs(repo, revs)
3480
1799fc777f30 evolve: store the target category in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3479
diff changeset
  1727
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1728
        # cbor does not know how to serialize sets, using list for skippedrevs
3627
31569df48c82 evolve: explicitly turn revs to list before storing into evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3624
diff changeset
  1729
        stateopts = {'category': targetcat, 'replacements': {},
31569df48c82 evolve: explicitly turn revs to list before storing into evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3624
diff changeset
  1730
                     'revs': list(revs), 'confirm': confirmopt,
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1731
                     'startnode': startnode, 'skippedrevs': [],
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1732
                     'command': 'evolve', 'orphanmerge': False,
4505
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1733
                     'bookmarkchanges': [], 'temprevs': [], 'obsmarkers': [],
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1734
                     'update': shouldupdate}
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1735
        evolvestate.addopts(stateopts)
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1736
        # lastsolved: keep track of successor of last troubled cset we evolved
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1737
        # to confirm that if atop msg should be suppressed to remove redundancy
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1738
        lastsolved = None
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1739
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1740
        activetopic = getattr(repo, 'currenttopic', '')
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1741
        for rev in revs:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1742
            curctx = repo[rev]
4209
aa9f33078157 evolve: check if we should use stack template for each item in the stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4191
diff changeset
  1743
            revtopic = getattr(curctx, 'topic', lambda: '')()
aa9f33078157 evolve: check if we should use stack template for each item in the stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4191
diff changeset
  1744
            topicidx = getattr(curctx, 'topicidx', lambda: None)()
aa9f33078157 evolve: check if we should use stack template for each item in the stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4191
diff changeset
  1745
            stacktmplt = False
4249
0d9697367fff evolve: modify and move the comment to appropriate position
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4243
diff changeset
  1746
            # check if revision being evolved is in active topic to make sure
0d9697367fff evolve: modify and move the comment to appropriate position
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4243
diff changeset
  1747
            # that we can use stack aliases s# in evolve msgs.
4209
aa9f33078157 evolve: check if we should use stack template for each item in the stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4191
diff changeset
  1748
            if activetopic and (activetopic == revtopic) and topicidx is not None:
aa9f33078157 evolve: check if we should use stack template for each item in the stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4191
diff changeset
  1749
                stacktmplt = True
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1750
            progresscb()
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1751
            ret = _solveone(ui, repo, curctx, evolvestate, dryrunopt,
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1752
                            confirmopt, progresscb, targetcat,
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1753
                            lastsolved=lastsolved, stacktmplt=stacktmplt)
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1754
            seen += 1
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1755
            if ret[0]:
3753
a558c8adc5af evolve: don't make values of replacements dict lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3742
diff changeset
  1756
                evolvestate['replacements'][curctx.node()] = ret[1]
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1757
                lastsolved = ret[1]
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1758
            else:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1759
                evolvestate['skippedrevs'].append(curctx.node())
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1760
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1761
            if evolvestate['orphanmerge']:
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1762
                # we were processing an orphan merge with both parents obsolete,
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1763
                # stabilized for second parent, re-stabilize for the first parent
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1764
                ret = _solveone(ui, repo, repo[ret[1]], evolvestate, dryrunopt,
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1765
                                confirmopt, progresscb, targetcat,
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1766
                                stacktmplt=stacktmplt)
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1767
                if ret[0]:
3753
a558c8adc5af evolve: don't make values of replacements dict lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3742
diff changeset
  1768
                    evolvestate['replacements'][curctx.node()] = ret[1]
4344
e5282131a78d evolve: cover the orphanmerge part missed by lastsolved
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4341
diff changeset
  1769
                    lastsolved = ret[1]
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1770
                else:
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1771
                    evolvestate['skippedrevs'].append(curctx.node())
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1772
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1773
                evolvestate['orphanmerge'] = False
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1774
3558
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1775
    progresscb()
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1776
    _cleanup(ui, repo, startnode, showprogress, shouldupdate)
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1777
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1778
def solveobswdp(ui, repo, opts):
4378
0b97d4bea7e0 evolve: add description of function solveobswdp
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4377
diff changeset
  1779
    """this function updates to the successor of obsolete wdir parent"""
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1780
    oldid = repo['.'].node()
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1781
    startctx = repo['.']
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1782
    dryrunopt = opts.get('dry_run', False)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1783
    displayer = compat.changesetdisplayer(ui, repo,
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1784
                                          {'template': shorttemplate})
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1785
    try:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1786
        ctx = repo[utility._singlesuccessor(repo, repo['.'])]
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1787
    except utility.MultipleSuccessorsError as exc:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1788
        repo.ui.write_err(_('parent is obsolete with multiple'
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1789
                            ' successors:\n'))
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1790
        for ln in exc.successorssets:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1791
            for n in ln:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1792
                displayer.show(repo[n])
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1793
        return 2
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1794
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1795
    ui.status(_('update:'))
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1796
    if not ui.quiet:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1797
        displayer.show(ctx)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1798
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1799
    if dryrunopt:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1800
        return 0
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1801
    res = hg.update(repo, ctx.rev())
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1802
    newid = ctx.node()
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1803
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1804
    if ctx != startctx:
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1805
        with repo.wlock(), repo.lock(), repo.transaction('evolve') as tr:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1806
            bmupdater = rewriteutil.bookmarksupdater(repo, oldid, tr)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1807
            bmupdater(newid)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1808
        ui.status(_('working directory is now at %s\n') % ctx)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1809
    return res
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1810
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1811
def stopevolve(ui, repo, evolvestate):
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1812
    """logic for handling of `hg evolve --stop`"""
3826
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1813
    updated = False
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1814
    pctx = None
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1815
    if (evolvestate['command'] == 'evolve'
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1816
        and evolvestate['category'] == 'contentdivergent'
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1817
        and evolvestate['relocated']):
3827
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1818
        oldother = evolvestate['old-other']
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1819
        if oldother:
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1820
            with repo.wlock(), repo.lock():
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1821
                repo = repo.unfiltered()
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1822
                hg.updaterepo(repo, oldother, True)
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1823
                strips = [evolvestate['relocated']]
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1824
                repair.strip(ui, repo, strips, False)
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1825
                updated = True
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1826
                pctx = repo[oldother]
3826
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1827
    if not updated:
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1828
        pctx = repo['.']
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1829
        hg.updaterepo(repo, pctx.node(), True)
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1830
    ui.status(_('stopped the interrupted evolve\n'))
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1831
    ui.status(_('working directory is now at %s\n') % pctx)
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1832
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1833
def abortevolve(ui, repo, evolvestate):
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1834
    """ logic for handling of `hg evolve --abort`"""
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1835
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1836
    with repo.wlock(), repo.lock():
3757
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1837
        repo = repo.unfiltered()
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1838
        evolvedctx = []
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1839
        # boolean value to say whether we should strip or not
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1840
        cleanup = True
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1841
        startnode = evolvestate['startnode']
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1842
        for old, new in evolvestate['replacements'].iteritems():
3755
a19703c6d2bb evolve: check for None before adding in set of revisions to strip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3754
diff changeset
  1843
            if new:
a19703c6d2bb evolve: check for None before adding in set of revisions to strip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3754
diff changeset
  1844
                evolvedctx.append(repo[new])
3757
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1845
        for temp in evolvestate['temprevs']:
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1846
            if temp:
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1847
                evolvedctx.append(repo[temp])
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1848
        evolvedrevs = [c.rev() for c in evolvedctx]
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1849
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1850
        # checking if phase changed of any of the evolved rev
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1851
        immutable = [c for c in evolvedctx if not c.mutable()]
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1852
        if immutable:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1853
            repo.ui.warn(_("cannot clean up public changesets: %s\n")
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1854
                         % ', '.join(str(c) for c in immutable),
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1855
                         hint=_("see 'hg help phases' for details"))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1856
            cleanup = False
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1857
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1858
        # checking no new changesets are created on evolved revs
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1859
        descendants = set()
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1860
        if evolvedrevs:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1861
            descendants = set(repo.changelog.descendants(evolvedrevs))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1862
        if descendants - set(evolvedrevs):
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1863
            repo.ui.warn(_("warning: new changesets detected on destination "
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1864
                           "branch\n"))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1865
            cleanup = False
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1866
3832
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1867
        # finding the indices of the obsmarkers to be stripped and stripping
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1868
        # them
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1869
        if evolvestate['obsmarkers']:
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1870
            stripmarkers = set()
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1871
            for m in evolvestate['obsmarkers']:
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1872
                m = (m[0], m[1])
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1873
                stripmarkers.add(m)
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1874
            indices = []
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1875
            allmarkers = obsutil.getmarkers(repo)
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1876
            for i, m in enumerate(allmarkers):
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1877
                marker = (m.prednode(), m.succnodes()[0])
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1878
                if marker in stripmarkers:
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1879
                    indices.append(i)
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1880
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1881
            repair.deleteobsmarkers(repo.obsstore, indices)
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1882
            repo.ui.debug('deleted %d obsmarkers\n' % len(indices))
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1883
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1884
        if cleanup:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1885
            if evolvedrevs:
3643
01108d67523f style: fix a couple of pyflakes complains
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3642
diff changeset
  1886
                strippoints = [c.node()
01108d67523f style: fix a couple of pyflakes complains
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3642
diff changeset
  1887
                               for c in repo.set('roots(%ld)', evolvedrevs)]
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1888
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1889
            # updating the working directory
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1890
            hg.updaterepo(repo, startnode, True)
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1891
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1892
            # Strip from the first evolved revision
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1893
            if evolvedrevs:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1894
                # no backup of evolved cset versions needed
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1895
                repair.strip(repo.ui, repo, strippoints, False)
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1896
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1897
            tr = None
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1898
            try:
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1899
                tr = repo.transaction('evolve')
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1900
                # restoring bookmarks at there original place
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1901
                bmchanges = evolvestate['bookmarkchanges']
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1902
                if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3698
diff changeset
  1903
                    repo._bookmarks.applychanges(repo, tr, bmchanges)
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1904
                tr.close()
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1905
            finally:
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1906
                tr.release()
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1907
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1908
            evolvestate.delete()
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1909
            ui.status(_('evolve aborted\n'))
3643
01108d67523f style: fix a couple of pyflakes complains
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3642
diff changeset
  1910
            ui.status(_('working directory is now at %s\n')
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1911
                      % nodemod.hex(startnode)[:12])
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1912
        else:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1913
            raise error.Abort(_("unable to abort interrupted evolve, use 'hg "
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1914
                                "evolve --stop' to stop evolve"))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1915
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1916
def continueevolve(ui, repo, evolvestate, progresscb):
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1917
    """logic for handling of `hg evolve --continue`"""
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1918
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1919
    with repo.wlock(), repo.lock():
4311
8aa28e68ac44 evolve: detect unresolved conflict during evolve --continue (issue5966)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4297
diff changeset
  1920
        ms = merge.mergestate.read(repo)
8aa28e68ac44 evolve: detect unresolved conflict during evolve --continue (issue5966)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4297
diff changeset
  1921
        mergeutil.checkunresolved(ms)
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1922
        if (evolvestate['command'] == 'next'
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1923
            or evolvestate['category'] == 'orphan'):
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1924
            _completeorphan(ui, repo, evolvestate)
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1925
        elif evolvestate['category'] == 'phasedivergent':
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1926
            _completephasedivergent(ui, repo, evolvestate)
3737
5b0bd82ea914 evolve: add logic to continue interrupted content-divergence resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3736
diff changeset
  1927
        elif evolvestate['category'] == 'contentdivergent':
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1928
            _continuecontentdivergent(ui, repo, evolvestate, progresscb)
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1929
        else:
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1930
            repo.ui.status(_("continuing interrupted '%s' resolution is not yet"
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1931
                             " supported\n") % evolvestate['category'])
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1932
            return
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1933
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1934
        # make sure we are continuing evolve and not `hg next --evolve`
4589
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1935
        if evolvestate['command'] != 'evolve':
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1936
            return
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1937
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1938
        category = evolvestate['category']
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1939
        confirm = evolvestate['confirm']
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1940
        unfi = repo.unfiltered()
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1941
        # lastsolved: keep track of successor of last troubled cset we
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1942
        # evolved to confirm that if atop msg should be suppressed to remove
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1943
        # redundancy
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1944
        lastsolved = None
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1945
        activetopic = getattr(repo, 'currenttopic', '')
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1946
        for rev in evolvestate['revs']:
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1947
            # XXX: prevent this lookup by storing nodes instead of revnums
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1948
            curctx = unfi[rev]
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1949
4589
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1950
            # check if we can use stack template
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1951
            revtopic = getattr(curctx, 'topic', lambda: '')()
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1952
            topicidx = getattr(curctx, 'topicidx', lambda: None)()
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1953
            stacktmplt = False
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1954
            if (activetopic and (activetopic == revtopic)
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1955
                and topicidx is not None):
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1956
                stacktmplt = True
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1957
4589
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1958
            if (curctx.node() not in evolvestate['replacements']
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1959
                and curctx.node() not in evolvestate['skippedrevs']):
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1960
                newnode = _solveone(ui, repo, curctx, evolvestate, False,
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1961
                                    confirm, progresscb, category,
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1962
                                    lastsolved=lastsolved,
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1963
                                    stacktmplt=stacktmplt)
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1964
                if newnode[0]:
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1965
                    evolvestate['replacements'][curctx.node()] = newnode[1]
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1966
                    lastsolved = newnode[1]
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1967
                else:
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1968
                    evolvestate['skippedrevs'].append(curctx.node())
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1969
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1970
def _continuecontentdivergent(ui, repo, evolvestate, progresscb):
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1971
    """function to continue the interrupted content-divergence resolution."""
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1972
    tr = None
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1973
    try:
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1974
        tr = repo.transaction('evolve')
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1975
        divergent = evolvestate['divergent']
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1976
        base = evolvestate['base']
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1977
        repo = repo.unfiltered()
3881
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1978
        if evolvestate['relocating']:
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1979
            newother = _completerelocation(ui, repo, evolvestate)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1980
            current = repo[evolvestate['current']]
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1981
            obsolete.createmarkers(repo, [(current, (repo[newother],))],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1982
                                   operation='evolve')
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1983
            evolvestate['relocating'] = False
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1984
            evolvestate['relocated'] = newother
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1985
            evolvestate['temprevs'].append(newother)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1986
            evolvestate['other-divergent'] = newother
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1987
            # continue the resolution by merging the content-divergence
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1988
            _mergecontentdivergents(repo, progresscb,
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1989
                                    repo[divergent],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1990
                                    repo[newother],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1991
                                    repo[base],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1992
                                    evolvestate)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1993
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1994
        other = evolvestate['other-divergent']
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1995
        ret = _completecontentdivergent(ui, repo, progresscb,
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1996
                                        repo[divergent],
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1997
                                        repo[other],
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1998
                                        repo[base],
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1999
                                        evolvestate)
4408
02ece0e5865e evolve: fix the broken behaviour on div resolution in relocation case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4403
diff changeset
  2000
        origdivergent = evolvestate['orig-divergent']
02ece0e5865e evolve: fix the broken behaviour on div resolution in relocation case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4403
diff changeset
  2001
        evolvestate['replacements'][origdivergent] = ret[1]
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2002
        # logic to continue the public content-divergent
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  2003
        publicnode = evolvestate.get('public-divergent')
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  2004
        if publicnode:
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2005
            res, newnode = ret
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2006
            if not res:
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2007
                # no need to proceed for phase divergence resolution step
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2008
                pass
4417
b86413cfca4a evolve: cover continue case in pubdiv when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4416
diff changeset
  2009
            elif newnode == publicnode:
b86413cfca4a evolve: cover continue case in pubdiv when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4416
diff changeset
  2010
                # merging had the same changes as public changeset and
b86413cfca4a evolve: cover continue case in pubdiv when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4416
diff changeset
  2011
                # divergence has been resolved by creating markers
b86413cfca4a evolve: cover continue case in pubdiv when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4416
diff changeset
  2012
                pass
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2013
            else:
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  2014
                prec = repo[publicnode]
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2015
                bumped = repo[newnode]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
  2016
                ret = _resolvephasedivergent(ui, repo, prec=prec, bumped=bumped)
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  2017
        tr.close()
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2018
        return ret
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  2019
    finally:
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  2020
        tr.release()
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  2021
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2022
def _completephasedivergent(ui, repo, evolvestate):
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2023
    """function to complete the interrupted phase-divergence resolution.
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2024
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2025
    First completes the relocation of the commit and then process resolving
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2026
    phase-divergence"""
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2027
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2028
    tr = None
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2029
    try:
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2030
        # need to start transaction for bookmark changes
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2031
        tr = repo.transaction('evolve')
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2032
        node = _completerelocation(ui, repo, evolvestate)
3772
6240579fd0c0 evolve: fix storage of replacements and temprevs node in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3760
diff changeset
  2033
        evolvestate['temprevs'].append(node)
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2034
        # resolving conflicts can lead to empty wdir and node can be None in
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2035
        # those cases
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2036
        ctx = repo[evolvestate['current']]
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2037
        newctx = repo[node] if node is not None else repo['.']
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
  2038
        obsolete.createmarkers(repo, [(ctx, (newctx,))], operation='evolve')
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2039
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2040
        # now continuing the phase-divergence resolution part
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2041
        prec = repo[evolvestate['precursor']]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
  2042
        retvalue = _resolvephasedivergent(ui, repo, prec, newctx)
3772
6240579fd0c0 evolve: fix storage of replacements and temprevs node in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3760
diff changeset
  2043
        evolvestate['replacements'][ctx.node()] = retvalue[1]
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2044
        tr.close()
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2045
    finally:
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2046
        tr.release()
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2047
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2048
def _completeorphan(ui, repo, evolvestate):
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2049
    """function to complete the interrupted orphan resolution"""
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2050
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2051
    node = _completerelocation(ui, repo, evolvestate)
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2052
    # resolving conflicts can lead to empty wdir and node can be None in
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2053
    # those cases
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2054
    ctx = repo[evolvestate['current']]
3636
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  2055
    if node is None:
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  2056
        repo.ui.status(_("evolution of %d:%s created no changes"
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  2057
                         " to commit\n") % (ctx.rev(), ctx))
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2058
    newctx = repo[node] if node is not None else repo['.']
3694
c0d5e0929f8b compat: from compatibility layer for createmarkers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3676
diff changeset
  2059
    obsolete.createmarkers(repo, [(ctx, (newctx,))], operation='evolve')
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2060
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2061
    # make sure we are continuing evolve and not `hg next --evolve`
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2062
    if evolvestate['command'] == 'evolve':
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2063
        evolvestate['replacements'][ctx.node()] = node
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2064
        if evolvestate['orphanmerge']:
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2065
            # processing a merge changeset with both parents obsoleted,
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2066
            # stabilized on second parent, insert in front of list to
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2067
            # re-process to stabilize on first parent
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2068
            evolvestate['revs'].insert(0, repo[node].rev())
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2069
            evolvestate['orphanmerge'] = False
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2070
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2071
def _completerelocation(ui, repo, evolvestate):
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2072
    """function to complete the interrupted relocation of a commit
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2073
    return the new node formed
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2074
    """
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2075
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2076
    orig = repo[evolvestate['current']]
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2077
    ctx = orig
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2078
    source = ctx.extra().get('source')
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2079
    extra = {}
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2080
    if source:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2081
        extra['source'] = source
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2082
        extra['intermediate-source'] = ctx.hex()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2083
    else:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2084
        extra['source'] = ctx.hex()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2085
    user = ctx.user()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2086
    date = ctx.date()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2087
    message = ctx.description()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2088
    ui.status(_('evolving %d:%s "%s"\n') % (ctx.rev(), ctx,
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2089
                                            message.split('\n', 1)[0]))
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2090
    targetphase = max(ctx.phase(), phases.draft)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2091
    overrides = {('phases', 'new-commit'): targetphase}
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2092
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2093
    ctxparents = orig.parents()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2094
    if len(ctxparents) == 2:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2095
        currentp1 = repo.dirstate.parents()[0]
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2096
        p1obs = ctxparents[0].obsolete()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2097
        p2obs = ctxparents[1].obsolete()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2098
        # asumming that the parent of current wdir is successor of one
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2099
        # of p1 or p2 of the original changeset
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2100
        if p1obs and not p2obs:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2101
            # p1 is obsolete and p2 is not obsolete, current working
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2102
            # directory parent should be successor of p1, so we should
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2103
            # set dirstate parents to (succ of p1, p2)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2104
            with repo.dirstate.parentchange():
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2105
                repo.dirstate.setparents(currentp1,
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2106
                                         ctxparents[1].node())
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2107
        elif p2obs and not p1obs:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2108
            # p2 is obsolete and p1 is not obsolete, current working
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2109
            # directory parent should be successor of p2, so we should
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2110
            # set dirstate parents to (succ of p2, p1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2111
            with repo.dirstate.parentchange():
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2112
                repo.dirstate.setparents(ctxparents[0].node(),
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2113
                                         currentp1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2114
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2115
        else:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2116
            # both the parents were obsoleted, if orphanmerge is set, we
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2117
            # are processing the second parent first (to keep parent order)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2118
            if evolvestate.get('orphanmerge'):
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2119
                with repo.dirstate.parentchange():
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2120
                    repo.dirstate.setparents(ctxparents[0].node(),
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2121
                                             currentp1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2122
            pass
3978
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  2123
    else:
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  2124
        with repo.dirstate.parentchange():
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  2125
            repo.dirstate.setparents(repo.dirstate.parents()[0], nodemod.nullid)
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2126
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2127
    with repo.ui.configoverride(overrides, 'evolve-continue'):
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2128
        node = repo.commit(text=message, user=user,
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2129
                           date=date, extra=extra)
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2130
    return node