hgext3rd/evolve/evolvecmd.py
author Martin von Zweigbergk <martinvonz@google.com>
Mon, 11 Mar 2019 23:57:12 -0700
changeset 4558 63148e999562
parent 4554 093df66127ec
child 4563 8b3781d9a616
permissions -rw-r--r--
evolve: use merge.update() for resolving phase divergence Iterating over the manifest when tree manifests and narrowness is in play produces entries for paths outside the narrowspec that represent trees. For example, if the tests/ directory of the hg repo was not in the narrowspec (and the hg repo was using tree manifests, which it doesn't), then there would be a "tests/" entry in the manifest. The merge code deals with some of these cases. For example, it's valid to do a merge if only the local side changes directories outside the narrowspec. That allows rebasing a local commit onto a public commit that had changes to the excluded paths to work. However, _resolvephasedivergent() was iterating of the manifests, which resulted in crashes for some of our users when they tried to resolve phase-divergent commits (actually content-divergent commits that became phase-divergent after the intermediate rebase). We can fix that by relying on merge.update(), since that already handles this case. [This re-install a changeset backed out for compatibility reason]
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:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   536
        # when we have content-divergence with a public cset: after completing
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   537
        # content divergence resolution the resulting node will be phase
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   538
        # divergent with that same public cset.
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   539
        # here newnode is phase divergent, lets resolve this divergence.
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   540
        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
   541
            # 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
   542
            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
   543
        if newnode == publicdiv.node():
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   544
            # no changes were found that are different from public cset
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
            return (res, newnode)
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   546
        prec = publicdiv
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   547
        bumped = repo[newnode]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   548
        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
   549
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   550
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
   551
                            evolvestate):
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   552
    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
   553
        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
   554
                       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
   555
        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
   556
    # 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
   557
    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
   558
                   (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
   559
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   560
        progresscb()
4473
14437b18b024 evolve: fix divergence resolution when not merging a descendant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4467
diff changeset
   561
    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
   562
    stats = merge.update(repo,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   563
                         other.node(),
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   564
                         branchmerge=True,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   565
                         force=False,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   566
                         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
   567
                         mergeancestor=mergeancestor)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   568
    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
   569
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   570
    # 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
   571
    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
   572
        tr = repo.currenttransaction()
03ccdc753582 evolve: commit the transaction if conflicts occur while merging content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3805
diff changeset
   573
        tr.close()
3736
4b8c63d14f18 evolve: store the evolvestate file when encountering conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3735
diff changeset
   574
        evolvestate.save()
3852
629558d09898 evolve: raise error.InterventionRequired instead of Abort when conflicts
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3850
diff changeset
   575
        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
   576
                                           "evolve.interrupted`"))
3735
bdf7fb6af7b8 evolve: take out logic to complete phase-divergence in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3734
diff changeset
   577
3737
5b0bd82ea914 evolve: add logic to continue interrupted content-divergence resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3736
diff changeset
   578
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
   579
                              base, evolvestate):
3735
bdf7fb6af7b8 evolve: take out logic to complete phase-divergence in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3734
diff changeset
   580
    """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
   581
    # 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
   582
    # resume resolution
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   583
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   584
        progresscb()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   585
    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
   586
    tr = repo.currenttransaction()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   587
    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
   588
    # 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
   589
    storemarker = False
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   590
    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
   591
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   592
    # 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
   593
    haspubdiv = False
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   594
    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
   595
        haspubdiv = True
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
   596
        publicnode = evolvestate['public-divergent']
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
   597
        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
   598
        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
   599
        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
   600
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   601
        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
   602
            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
   603
            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
   604
        # 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
   605
        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
   606
        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
   607
            # warn user if metadata is being lost
a6bdb02a1902 evolve: warn user if cset desc is being lost
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4431
diff changeset
   608
            if otherdiv.description() != publicdiv.description():
a6bdb02a1902 evolve: warn user if cset desc is being lost
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4431
diff changeset
   609
                msg = _('content-divergent changesets differ by descriptions '
a6bdb02a1902 evolve: warn user if cset desc is being lost
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4431
diff changeset
   610
                        'only, discarding %s\n') % str(otherdiv)
a6bdb02a1902 evolve: warn user if cset desc is being lost
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4431
diff changeset
   611
                repo.ui.warn(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
   612
            # 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
   613
            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
   614
                                   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
   615
            return (True, publicnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   616
    try:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   617
        with repo.dirstate.parentchange():
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
   618
            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
   619
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   620
        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
   621
3829
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   622
        # merge the branches
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   623
        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
   624
        # 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
   625
        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
   626
                                   divergent.description(),
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   627
                                   other.description())
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   628
3792
bb7d1616407f evolve: return the new node formed only as the replacement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3790
diff changeset
   629
        # 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
   630
        newnode = None
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   631
3879
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   632
        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
   633
4483
7978230faa32 evolve: make sure div resolution don't replace the initial author (issue6113)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4463
diff changeset
   634
        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
   635
        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
   636
            # no changes
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   637
            new = divergent
3831
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   638
            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
   639
            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
   640
            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
   641
        else:
3846
f9dad99a90d5 evolve: create a new commit instead of amending one of the divergents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3845
diff changeset
   642
            new = repo[newnode]
3792
bb7d1616407f evolve: return the new node formed only as the replacement
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3790
diff changeset
   643
            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
   644
            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
   645
            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
   646
                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
   647
            else:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   648
                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
   649
                                       operation='evolve')
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   650
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   651
        # 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
   652
        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
   653
            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
   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, [(other, (new,))], operation='evolve')
3831
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   656
        if storemarker:
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   657
            # 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
   658
            # 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
   659
            # 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
   660
            # future
987e335dbe11 evolve: store the obsmarkers to be deleted in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3830
diff changeset
   661
            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
   662
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   663
        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
   664
        return (True, newnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   665
    finally:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   666
        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
   667
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   668
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
   669
    """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
   670
    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
   671
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   672
    # prepare metadata
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   673
    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
   674
        metadata = {}
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   675
    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
   676
        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
   677
        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
   678
    # 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
   679
    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
   680
                                      '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
   681
    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
   682
        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
   683
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   684
    # 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
   685
    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
   686
                                        '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
   687
    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
   688
        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
   689
        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
   690
        npare = None
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   691
        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
   692
        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
   693
            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
   694
        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
   695
            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
   696
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   697
        if saveeffectflag:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   698
            # 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
   699
            # future evolution
4431
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   700
            try:
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   701
                effectflag = obsutil.geteffectflag(prec, (succ,))
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   702
            except TypeError:
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   703
                # hg <= 4.7
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   704
                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
   705
            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
   706
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   707
        # create markers
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   708
        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
   709
                             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
   710
        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
   711
3847
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   712
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
   713
    """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
   714
    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
   715
    repo.dirstate.setparents()
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   716
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   717
    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
   718
               newparent as Pnew
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   719
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   720
    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
   721
    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
   722
    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
   723
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   724
    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
   725
               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
   726
               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
   727
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   728
    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
   729
    can be removed.
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   730
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   731
    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
   732
               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
   733
               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
   734
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   735
    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
   736
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   737
    |---------------------------------------------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   738
    | 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
   739
    |   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
   740
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   741
    |              |                  |                             |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   742
    |   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
   743
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   744
    |   Fm         |      Cr          |           Added             |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   745
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   746
    |   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
   747
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   748
    |   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
   749
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   750
    |   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
   751
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   752
    |   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
   753
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   754
    |   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
   755
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   756
    |   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
   757
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   758
    |   Fr         |      Cm          |           Removed           |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   759
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   760
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   761
    (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
   762
         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
   763
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   764
    (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
   765
         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
   766
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   767
    (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
   768
         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
   769
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   770
    (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
   771
         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
   772
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
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   775
    # 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
   776
    # this function only
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   777
    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
   778
3879
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   779
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
   780
    """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
   781
    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
   782
    pass
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   783
3829
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   784
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
   785
    """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
   786
    the dirstate branch accordingly
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   787
    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
   788
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   789
    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
   790
    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
   791
    """
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   792
    divbranch = divergent.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   793
    basebranch = base.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   794
    othbranch = other.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   795
    # 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
   796
    # select one
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   797
    if divbranch != othbranch:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   798
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   799
        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
   800
            # 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
   801
            # preserved
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   802
            pass
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   803
        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
   804
            repo.dirstate.setbranch(othbranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   805
        else:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   806
            # 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
   807
            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
   808
                                           "different branches.\nchoose branch"
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   809
                                           " 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
   810
                                           "%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
   811
                                           " $$ &c") %
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   812
                                         (basebranch, divbranch, othbranch), 0)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   813
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   814
            if index == 0:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   815
                repo.dirstate.setbranch(basebranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   816
            elif index == 1:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   817
                pass
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   818
            elif index == 2:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   819
                repo.dirstate.setbranch(othbranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   820
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   821
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
   822
    """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
   823
    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
   824
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   825
    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
   826
    mdesc = []
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   827
    kwargs = {}
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   828
    kwargs['name_base'] = 'base'
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   829
    kwargs['base_marker'] = '|||||||'
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   830
    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
   831
                                   **kwargs):
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   832
        mdesc.append(line)
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   833
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   834
    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
   835
    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
   836
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   837
        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
   838
                    " 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
   839
                    " 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
   840
4257
4a8f59b69d37 compat: drop 4.3 compatiblity code for `ui.edit` method
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4249
diff changeset
   841
        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
   842
        # 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
   843
        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
   844
            # 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
   845
            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
   846
        desc = resolveddesc
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   847
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   848
    return desc
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   849
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   850
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
   851
    pass
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   852
3469
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   853
def _orderrevs(repo, revs):
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   854
    """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
   855
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   856
    revs is a list of unstable revisions.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   857
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   858
    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
   859
    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
   860
    eventually.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   861
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   862
    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
   863
    revision on its final stabilized destination.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   864
    """
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   865
    # Step 1: Build the dependency graph
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   866
    dependencies, rdependencies = utility.builddependencies(repo, revs)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   867
    # Step 2: Build the ordering
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   868
    # 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
   869
    # 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
   870
    # 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
   871
    # 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
   872
    # built
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   873
    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
   874
                                      if not dependencies[r]])
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   875
    ordering = []
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   876
    while solvablerevs:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   877
        rev = solvablerevs.popleft()
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   878
        for dependent in rdependencies[rev]:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   879
            dependencies[dependent].remove(rev)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   880
            if not dependencies[dependent]:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   881
                solvablerevs.append(dependent)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   882
        del dependencies[rev]
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   883
        ordering.append(rev)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   884
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   885
    ordering.extend(sorted(dependencies))
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   886
    return ordering
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   887
3638
7bc4a72b8a0b evolve: add evolvestate as an argument to evolvecmd.relocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3636
diff changeset
   888
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
   889
             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
   890
    """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
   891
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   892
    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
   893
    """
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   894
    if orig.rev() == dest.rev():
4269
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   895
        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
   896
        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
   897
                 "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
   898
                 "directory parent is also destination")
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   899
        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
   900
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   901
    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
   902
        if len(orig.parents()) == 2:
4269
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   903
            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
   904
                    "parent should be moved")
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   905
            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
   906
            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
   907
        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
   908
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   909
    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
   910
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   911
    cache = {}
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   912
    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
   913
    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
   914
    for sha1 in sha1s:
3676
cded30ad25e4 compat: rename resolvepartialhexnodeid to resolvehexnodeidprefix
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3674
diff changeset
   915
        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
   916
            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
   917
        else:
51adc7e6a617 compat: fallback to compatible partial lookup prior to 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3666
diff changeset
   918
            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
   919
        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
   920
            continue
3665
0f0f31351d6d compat: avoid using partial node ID in lookup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3653
diff changeset
   921
        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
   922
        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
   923
            continue
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   924
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
   925
        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
   926
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   927
        # 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
   928
        # 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
   929
        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
   930
            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
   931
            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
   932
        else:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   933
            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
   934
                           '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
   935
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   936
    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
   937
    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
   938
    try:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   939
        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
   940
        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
   941
            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
   942
                                '(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
   943
        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
   944
    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
   945
        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
   946
            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
   947
            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
   948
            # 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
   949
            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
   950
            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
   951
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   952
        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
   953
            pass
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   954
        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
   955
        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
   956
        raise
3639
95a767b2769e evolve: add evolvestate as an argument to _finalizerelocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3638
diff changeset
   957
    _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
   958
    return nodenew
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   959
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   960
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
   961
    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
   962
        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
   963
    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
   964
    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
   965
        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
   966
    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
   967
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   968
    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
   969
    try:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   970
        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
   971
        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
   972
        # 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
   973
        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
   974
                              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
   975
    finally:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   976
        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
   977
    return nodenew
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   978
3639
95a767b2769e evolve: add evolvestate as an argument to _finalizerelocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3638
diff changeset
   979
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
   980
    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
   981
    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
   982
    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
   983
    bmchanges = []
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   984
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   985
    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
   986
        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
   987
                               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
   988
        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
   989
            bmchanges.append((book, nodenew))
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
   990
            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
   991
    else:
3636
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
   992
        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
   993
            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
   994
                             "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
   995
        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
   996
        # 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
   997
        for book in oldbookmarks:
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
   998
            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
   999
            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
  1000
    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
  1001
        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
  1002
    if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3698
diff changeset
  1003
        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
  1004
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1005
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
  1006
    """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
  1007
    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
  1008
    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
  1009
        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
  1010
                     dest,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1011
                     branchmerge=False,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1012
                     force=True)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1013
    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
  1014
        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
  1015
    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
  1016
    if keepbranch:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1017
        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
  1018
    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
  1019
        # uurrgs
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1020
        # 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
  1021
        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
  1022
            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
  1023
        else:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1024
            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
  1025
                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
  1026
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1027
    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
  1028
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1029
instabilities_map = {
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1030
    'contentdivergent': "content-divergent",
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1031
    'phasedivergent': "phase-divergent"
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1032
}
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1033
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1034
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
  1035
    """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
  1036
    revs = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1037
    if allopt or revopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1038
        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
  1039
        if revopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1040
            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
  1041
        elif not anyopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1042
            topic = getattr(repo, 'currenttopic', '')
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1043
            if topic:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1044
                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
  1045
            elif targetcat == 'orphan':
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1046
                revs = _aspiringdescendant(repo,
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1047
                                           repo.revs('(.::) - obsolete()::'))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1048
                revs = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1049
        if targetcat == 'contentdivergent':
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1050
            # 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
  1051
            revs = _dedupedivergents(repo, revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1052
    elif anyopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1053
        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
  1054
    elif targetcat == 'orphan':
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1055
        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
  1056
        if 1 < len(revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1057
            msg = "multiple evolve candidates"
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1058
            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
  1059
                    % ', '.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
  1060
            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
  1061
    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
  1062
        revs = set([repo['.'].rev()])
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1063
    return revs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1064
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1065
def _dedupedivergents(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1066
    """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
  1067
    lowest revision numbers
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1068
    """
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1069
    repo = repo.unfiltered()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1070
    res = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1071
    # 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
  1072
    discarded = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1073
    for rev in revs:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1074
        if rev in discarded:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1075
            continue
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1076
        divergent = repo[rev]
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1077
        base, others = divergentdata(divergent)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1078
        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
  1079
        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
  1080
        discarded.update(othersrevs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1081
    return res
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1082
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1083
def divergentdata(ctx):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1084
    """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
  1085
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1086
    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
  1087
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1088
    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
  1089
    """
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1090
    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
  1091
    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
  1092
        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
  1093
        # 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
  1094
        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
  1095
        if newer:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1096
            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
  1097
    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
  1098
                      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
  1099
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1100
def _aspiringdescendant(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1101
    """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
  1102
    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
  1103
    target = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1104
    result = set(target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1105
    paths = collections.defaultdict(set)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1106
    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
  1107
        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
  1108
            paths[d].add(r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1109
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1110
    result = set(target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1111
    tovisit = list(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1112
    while tovisit:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1113
        base = tovisit.pop()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1114
        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
  1115
            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
  1116
                tovisit.append(unstable)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1117
                result.add(unstable)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1118
    return sorted(result - target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1119
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1120
def _aspiringchildren(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1121
    """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
  1122
    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
  1123
    target = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1124
    result = []
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1125
    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
  1126
        dest = _possibledestination(repo, r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1127
        if target & dest:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1128
            result.append(r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1129
    return result
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1130
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1131
def _possibledestination(repo, rev):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1132
    """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
  1133
    tonode = repo.changelog.node
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1134
    parents = repo.changelog.parentrevs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1135
    torev = repo.changelog.rev
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1136
    dest = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1137
    tovisit = list(parents(rev))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1138
    while tovisit:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1139
        r = tovisit.pop()
4230
e796835fe6b3 evolvecmd: _possibledestination() skip visiting empty parent
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4209
diff changeset
  1140
        if r == -1:
e796835fe6b3 evolvecmd: _possibledestination() skip visiting empty parent
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4209
diff changeset
  1141
            continue
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
  1142
        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
  1143
        if not succsets:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1144
            tovisit.extend(parents(r))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1145
        else:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1146
            # 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
  1147
            # (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
  1148
            # 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
  1149
            # multiple branches.
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1150
            for ss in succsets:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1151
                for n in ss:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1152
                    dest.add(torev(n))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1153
    return dest
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1154
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1155
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
  1156
    """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
  1157
    no troubles can be resolved"""
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1158
    troublecategories = ['phasedivergent', 'contentdivergent', 'orphan']
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1159
    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
  1160
    msg = None
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1161
    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
  1162
    retoverride = None
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1163
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1164
    troubled = {
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1165
        "orphan": repo.revs("orphan()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1166
        "contentdivergent": repo.revs("contentdivergent()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1167
        "phasedivergent": repo.revs("phasedivergent()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1168
        "all": repo.revs("troubled()"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1169
    }
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1170
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1171
    hintmap = {
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1172
        '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
  1173
        '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
  1174
                                             "--phase-divergent or"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1175
                                             " --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1176
        '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
  1177
                                   " or --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1178
        '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
  1179
        '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
  1180
                                     " or --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1181
        '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
  1182
        '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
  1183
                                " --phase-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1184
        '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
  1185
                                                 " (or --rev) and"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1186
                                                 " --phase-divergent or"
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1187
                                                 " --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1188
        '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
  1189
                                       " and --phase-divergent or --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1190
        '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
  1191
                                  " --content-divergent"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1192
        '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
  1193
                                         " and --content-divergent or "
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1194
                                         "--orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1195
        '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
  1196
                        "and --orphan"),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1197
    }
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1198
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1199
    if revopt:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1200
        revs = scmutil.revrange(repo, revopt)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1201
        if not revs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1202
            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
  1203
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1204
            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
  1205
            othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1206
            for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1207
                if revs & troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1208
                    othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1209
            if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1210
                hint = hintmap['+'.join(othertroubles)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1211
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1212
    elif anyopt:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1213
        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
  1214
        othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1215
        for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1216
            if troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1217
                othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1218
        if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1219
            hint = hintmap['+'.join(othertroubles)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1220
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1221
    else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1222
        # 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
  1223
        if targetcat == 'orphan':
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1224
            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
  1225
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1226
            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
  1227
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1228
        p1 = repo['.'].rev()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1229
        othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1230
        for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1231
            if p1 in troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1232
                othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1233
        if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1234
            hint = hintmap['+'.join(othertroubles)]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1235
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1236
            length = len(troubled[targetcat])
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1237
            if length:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1238
                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
  1239
                         "or --rev") % (length, targetcat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1240
            else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1241
                othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1242
                for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1243
                    if troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1244
                        othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1245
                if othertroubles:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1246
                    hint = hintmap['any+' + ('+'.join(othertroubles))]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1247
                else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1248
                    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
  1249
                    # 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
  1250
                    retoverride = 0
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1251
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1252
    assert msg is not None
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1253
    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
  1254
    if hint:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1255
        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
  1256
        ret = 2
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1257
    else:
3649
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1258
        ret = 1
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1259
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1260
    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
  1261
        return retoverride
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1262
    return ret
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1263
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1264
def _preparelistctxs(items, condition):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1265
    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
  1266
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1267
def _formatctx(fm, ctx):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1268
    fm.data(node=ctx.hex())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1269
    fm.data(desc=ctx.description())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1270
    fm.data(date=ctx.date())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1271
    fm.data(user=ctx.user())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1272
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1273
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
  1274
    """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
  1275
    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
  1276
    showunstable = 'orphan' in troublecategories
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1277
    showbumped = 'phasedivergent' in troublecategories
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1278
    showdivergent = 'contentdivergent' in troublecategories
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1279
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1280
    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
  1281
    if opts.get('rev'):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1282
        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
  1283
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1284
    fm = ui.formatter('evolvelist', opts)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1285
    for rev in revs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1286
        ctx = repo[rev]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1287
        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
  1288
        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
  1289
        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
  1290
                                   lambda p: not p.mutable())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1291
        dsets = divergentsets(repo, ctx)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1292
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1293
        fm.startitem()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1294
        # plain formatter section
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1295
        hashlen, desclen = 12, 60
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1296
        desc = ctx.description()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1297
        if desc:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1298
            desc = desc.splitlines()[0]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1299
        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
  1300
        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
  1301
        fm.plain('%s\n' % desc)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1302
        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
  1303
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1304
        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
  1305
            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
  1306
                                                 unpar[:hashlen],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1307
                                                 TROUBLES['ORPHAN']))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1308
        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
  1309
            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
  1310
                                                       obspar[:hashlen]))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1311
        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
  1312
            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
  1313
                     (TROUBLES['PHASEDIVERGENT'], imprec[:hashlen]))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1314
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1315
        if dsets and showdivergent:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1316
            for dset in dsets:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1317
                fm.plain('  %s: ' % TROUBLES['CONTENTDIVERGENT'])
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1318
                first = True
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1319
                for n in dset['divergentnodes']:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1320
                    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
  1321
                    first = False
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1322
                    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
  1323
                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
  1324
                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
  1325
        fm.plain("\n")
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1326
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1327
        # templater-friendly section
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1328
        _formatctx(fm, ctx)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1329
        troubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1330
        for unpar in unpars:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1331
            troubles.append({'troubletype': TROUBLES['ORPHAN'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1332
                             'sourcenode': unpar, 'sourcetype': 'orphanparent'})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1333
        for obspar in obspars:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1334
            troubles.append({'troubletype': TROUBLES['ORPHAN'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1335
                             'sourcenode': obspar,
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1336
                             'sourcetype': 'obsoleteparent'})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1337
        for imprec in imprecs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1338
            troubles.append({'troubletype': TROUBLES['PHASEDIVERGENT'],
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1339
                             'sourcenode': imprec,
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1340
                             'sourcetype': 'immutableprecursor'})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1341
        for dset in dsets:
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1342
            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
  1343
                         'phase': repo[n].phasestr(),
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1344
                        } for n in dset['divergentnodes']]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1345
            troubles.append({'troubletype': TROUBLES['CONTENTDIVERGENT'],
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1346
                             '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
  1347
                             'divergentnodes': divnodes})
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1348
        fm.data(troubles=troubles)
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
    fm.end()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1351
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1352
def _checkevolveopts(repo, opts):
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1353
    """ 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
  1354
    if any """
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1355
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1356
    if opts['continue']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1357
        if opts['any']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1358
            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
  1359
        if opts['all']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1360
            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
  1361
        if opts['rev']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1362
            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
  1363
        if opts['stop']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1364
            raise error.Abort(_('cannot specify both "--stop" and'
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1365
                                ' "--continue"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1366
        if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1367
            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
  1368
                                ' "--continue"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1369
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1370
    if opts['stop']:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1371
        if opts['any']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1372
            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
  1373
        if opts['all']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1374
            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
  1375
        if opts['rev']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1376
            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
  1377
        if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1378
            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
  1379
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1380
    if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1381
        if opts['any']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1382
            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
  1383
        if opts['all']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1384
            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
  1385
        if opts['rev']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1386
            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
  1387
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1388
    if opts['rev']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1389
        if opts['any']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1390
            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
  1391
        if opts['all']:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1392
            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
  1393
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1394
    # Backward compatibility
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1395
    if opts['unstable']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1396
        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
  1397
               "use 'evolve --orphan'")
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1398
        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
  1399
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1400
        opts['orphan'] = opts['divergent']
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['divergent']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1403
        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
  1404
               "use 'evolve --content-divergent'")
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1405
        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
  1406
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1407
        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
  1408
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1409
    if opts['bumped']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1410
        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
  1411
               "use 'evolve --phase-divergent'")
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1412
        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
  1413
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1414
        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
  1415
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1416
    return opts
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1417
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1418
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
  1419
    if showprogress:
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4320
diff changeset
  1420
        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
  1421
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1422
    if not shouldupdate:
4377
c2f9de28415a evolve: document the "if not shouldupdate" block
Martin von Zweigbergk <martinvonz@google.com>
parents: 4376
diff changeset
  1423
        # 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
  1424
        # 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
  1425
        unfi = repo.unfiltered()
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1426
        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
  1427
        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
  1428
    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
  1429
        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
  1430
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1431
def divergentsets(repo, ctx):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1432
    """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
  1433
    cache = {}
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1434
    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
  1435
    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
  1436
        if n == ctx.node():
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1437
            # 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
  1438
            continue
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
  1439
        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
  1440
        for nsuccset in nsuccsets:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1441
            if ctx.node() in nsuccset:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1442
                # 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
  1443
                continue
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1444
            if tuple(nsuccset) in base:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1445
                # 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
  1446
                continue
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1447
            base[tuple(nsuccset)] = n
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1448
    divergence = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1449
    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
  1450
        divergence.append({
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1451
            'divergentnodes': divset,
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1452
            'commonprecursor': b
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1453
        })
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1454
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1455
    return divergence
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1456
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1457
@eh.command(
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4180
diff changeset
  1458
    'evolve|stabilize|solve',
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1459
    [('n', 'dry-run', False,
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1460
      _('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
  1461
     ('', 'confirm', False,
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1462
      _('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
  1463
     ('A', 'any', False,
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1464
      _('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
  1465
        'directory')),
4183
536c67823962 commands: adjust metavariables as appropriate
Anton Shestakov <av6@dwimlabs.net>
parents: 4180
diff changeset
  1466
     ('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
  1467
     ('', '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
  1468
     ('', '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
  1469
     ('', '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
  1470
     ('', '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
  1471
     ('', '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
  1472
     ('', 'orphan', False, _('solves only orphan changesets (default)')),
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1473
     ('a', 'all', False, _('evolve all troubled changesets related to the '
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1474
                           'current  working directory and its descendants')),
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1475
     ('', 'update', True, _('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
  1476
     ('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
  1477
     ('', '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
  1478
     ('', '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
  1479
     ('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
  1480
                            ' in the repo')),
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1481
    ] + mergetoolopts,
4191
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4180
diff changeset
  1482
    _('[OPTIONS]...'),
5c734be63c3e evolve: adapt for changed @command decorator
Martin von Zweigbergk <martinvonz@google.com>
parents: 4180
diff changeset
  1483
    helpbasic=True
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1484
)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1485
def evolve(ui, repo, **opts):
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1486
    """solve troubled changesets in your repository
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1487
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1488
    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
  1489
    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
  1490
    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
  1491
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1492
    - 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
  1493
    - rebase an orphan changeset
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1494
    - 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
  1495
    - 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
  1496
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1497
    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
  1498
    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
  1499
    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
  1500
    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
  1501
    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
  1502
    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
  1503
    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
  1504
    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
  1505
    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
  1506
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1507
    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
  1508
    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
  1509
    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
  1510
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1511
    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
  1512
    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
  1513
    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
  1514
    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
  1515
    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
  1516
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1517
    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
  1518
    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
  1519
    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
  1520
    working copy parent.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1521
    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
  1522
    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
  1523
    all branches.
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1524
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1525
    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
  1526
    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
  1527
    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
  1528
    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
  1529
    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
  1530
    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
  1531
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1532
    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
  1533
    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
  1534
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1535
    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
  1536
    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
  1537
    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
  1538
    ``--rev`` and ``--any``.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1539
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1540
    ``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
  1541
    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
  1542
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1543
    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
  1544
    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
  1545
    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
  1546
    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
  1547
    ``--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
  1548
    ``--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
  1549
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1550
    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
  1551
    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
  1552
    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
  1553
    --phase-divergent flags.
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1554
3821
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
  1555
    Interrupted
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
  1556
    ===========
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1557
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1558
    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
  1559
    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
  1560
    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
  1561
    `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
  1562
    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
  1563
    situation:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1564
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1565
      - `hg evolve --continue`:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1566
         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
  1567
         interrupted evolve
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1568
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1569
      - `hg evolve --stop`:
4265
4d62095d9fe6 evolve: fix a documentation typo
Eric Spishak-Thomas <spishak@google.com>
parents: 4235
diff changeset
  1570
         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
  1571
         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
  1572
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1573
      - `hg evolve --abort`:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1574
         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
  1575
         happened
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1576
    """
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
    opts = _checkevolveopts(repo, opts)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1579
    # Options
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1580
    contopt = opts['continue']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1581
    anyopt = opts['any']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1582
    allopt = opts['all']
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1583
    startnode = repo['.'].node()
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1584
    dryrunopt = opts['dry_run']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1585
    confirmopt = opts['confirm']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1586
    revopt = opts['rev']
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1587
    stopopt = opts['stop']
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1588
    abortopt = opts['abort']
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1589
    shouldupdate = opts['update']
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1590
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1591
    troublecategories = ['phase_divergent', 'content_divergent', 'orphan']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1592
    specifiedcategories = [t.replace('_', '')
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1593
                           for t in troublecategories
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1594
                           if opts[t]]
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1595
    if opts['list']:
3701
29c413a7dfb5 compat: drop compatibility layer for pager
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3700
diff changeset
  1596
        ui.pager('evolve')
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1597
        listtroubles(ui, repo, specifiedcategories, **opts)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1598
        return
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1599
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1600
    targetcat = 'orphan'
4420
6a20e0e9b957 evolve: make sure user can recover from conflict (issue6053)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4348
diff changeset
  1601
    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
  1602
    if 1 < len(specifiedcategories):
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1603
        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
  1604
        raise error.Abort(msg)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1605
    elif len(specifiedcategories) == 1:
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1606
        targetcat = specifiedcategories[0]
4420
6a20e0e9b957 evolve: make sure user can recover from conflict (issue6053)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4348
diff changeset
  1607
    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
  1608
        # 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
  1609
        return solveobswdp(ui, repo, opts)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1610
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1611
    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
  1612
    troubled = set(repo.revs('troubled()'))
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1613
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1614
    # Progress handling
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1615
    seen = 1
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1616
    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
  1617
    showprogress = allopt
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1618
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1619
    def progresscb():
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1620
        if revopt or allopt:
4341
d1aab9d82f5b evolve: adapt for deprecated ui.progress()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4320
diff changeset
  1621
            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
  1622
3477
713e26a647f5 evolve: create a state object in all case
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3470
diff changeset
  1623
    evolvestate = state.cmdstate(repo)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1624
    # Continuation handling
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1625
    if contopt:
3556
b0438c9101ad evolve: load evolvestate before passing to continueevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3555
diff changeset
  1626
        if not evolvestate:
3582
8d93f76aa04d evolvecmd: show some internationalization love
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3579
diff changeset
  1627
            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
  1628
        evolvestate.load()
3557
77a400149758 evolve: move deletion of evolvestate out of continueevolve() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3556
diff changeset
  1629
        continueevolve(ui, repo, evolvestate, progresscb)
3558
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1630
        if evolvestate['command'] != 'evolve':
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1631
            evolvestate.delete()
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1632
            return
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1633
        startnode = repo.unfiltered()[evolvestate['startnode']]
4505
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1634
        if 'update' in evolvestate:
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1635
            shouldupdate = evolvestate['update']
3557
77a400149758 evolve: move deletion of evolvestate out of continueevolve() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3556
diff changeset
  1636
        evolvestate.delete()
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1637
    elif stopopt:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1638
        if not evolvestate:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1639
            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
  1640
        evolvestate.load()
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1641
        stopevolve(ui, repo, evolvestate)
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1642
        evolvestate.delete()
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1643
        return
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1644
    elif abortopt:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1645
        if not evolvestate:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1646
            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
  1647
        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
  1648
        # `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
  1649
        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
  1650
            pctx = repo['.']
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1651
            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
  1652
            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
  1653
            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
  1654
                      % pctx.hex()[:12])
3981
b4d0245c7f40 evolve: delete evolvestate after aborting interrupted `next --evolve`
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3978
diff changeset
  1655
            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
  1656
            return 0
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1657
        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
  1658
    else:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1659
        cmdutil.bailifchanged(repo)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1660
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1661
        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
  1662
4348
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1663
        # 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
  1664
        # 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
  1665
        # 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
  1666
        # (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
  1667
        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
  1668
            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
  1669
            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
  1670
                return result
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1671
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1672
        if not revs:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1673
            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
  1674
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1675
        # 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
  1676
        count = len(revs)
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1677
        # Order the revisions
3845
5c964ebe4d4b evolve: always order the revs to be evolved
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3843
diff changeset
  1678
        revs = _orderrevs(repo, revs)
3480
1799fc777f30 evolve: store the target category in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3479
diff changeset
  1679
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1680
        # 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
  1681
        stateopts = {'category': targetcat, 'replacements': {},
31569df48c82 evolve: explicitly turn revs to list before storing into evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3624
diff changeset
  1682
                     '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
  1683
                     'startnode': startnode, 'skippedrevs': [],
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1684
                     'command': 'evolve', 'orphanmerge': False,
4505
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1685
                     'bookmarkchanges': [], 'temprevs': [], 'obsmarkers': [],
cc2bbe2701a3 evolve: store --update flag state in evolvestate file
Anton Shestakov <av6@dwimlabs.net>
parents: 4500
diff changeset
  1686
                     'update': shouldupdate}
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1687
        evolvestate.addopts(stateopts)
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1688
        # 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
  1689
        # 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
  1690
        lastsolved = None
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1691
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1692
        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
  1693
        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
  1694
            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
  1695
            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
  1696
            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
  1697
            stacktmplt = False
4249
0d9697367fff evolve: modify and move the comment to appropriate position
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4243
diff changeset
  1698
            # 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
  1699
            # 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
  1700
            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
  1701
                stacktmplt = True
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1702
            progresscb()
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1703
            ret = _solveone(ui, repo, curctx, evolvestate, dryrunopt,
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1704
                            confirmopt, progresscb, targetcat,
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1705
                            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
  1706
            seen += 1
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1707
            if ret[0]:
3753
a558c8adc5af evolve: don't make values of replacements dict lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3742
diff changeset
  1708
                evolvestate['replacements'][curctx.node()] = ret[1]
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1709
                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
  1710
            else:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1711
                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
  1712
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1713
            if evolvestate['orphanmerge']:
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1714
                # 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
  1715
                # 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
  1716
                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
  1717
                                confirmopt, progresscb, targetcat,
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1718
                                stacktmplt=stacktmplt)
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1719
                if ret[0]:
3753
a558c8adc5af evolve: don't make values of replacements dict lists
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3742
diff changeset
  1720
                    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
  1721
                    lastsolved = ret[1]
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1722
                else:
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1723
                    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
  1724
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1725
                evolvestate['orphanmerge'] = False
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1726
3558
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1727
    progresscb()
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1728
    _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
  1729
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1730
def solveobswdp(ui, repo, opts):
4378
0b97d4bea7e0 evolve: add description of function solveobswdp
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4377
diff changeset
  1731
    """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
  1732
    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
  1733
    startctx = repo['.']
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1734
    dryrunopt = opts.get('dry_run', False)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1735
    displayer = compat.changesetdisplayer(ui, repo,
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1736
                                          {'template': shorttemplate})
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1737
    try:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1738
        ctx = repo[utility._singlesuccessor(repo, repo['.'])]
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1739
    except utility.MultipleSuccessorsError as exc:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1740
        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
  1741
                            ' successors:\n'))
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1742
        for ln in exc.successorssets:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1743
            for n in ln:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1744
                displayer.show(repo[n])
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1745
        return 2
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1746
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1747
    ui.status(_('update:'))
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1748
    if not ui.quiet:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1749
        displayer.show(ctx)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1750
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1751
    if dryrunopt:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1752
        return 0
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1753
    res = hg.update(repo, ctx.rev())
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1754
    newid = ctx.node()
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1755
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1756
    if ctx != startctx:
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1757
        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
  1758
            bmupdater = rewriteutil.bookmarksupdater(repo, oldid, tr)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1759
            bmupdater(newid)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1760
        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
  1761
    return res
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1762
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1763
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
  1764
    """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
  1765
    updated = False
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1766
    pctx = None
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1767
    if (evolvestate['command'] == 'evolve'
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1768
        and evolvestate['category'] == 'contentdivergent'
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1769
        and evolvestate['relocated']):
3827
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1770
        oldother = evolvestate['old-other']
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1771
        if oldother:
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1772
            with repo.wlock(), repo.lock():
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1773
                repo = repo.unfiltered()
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1774
                hg.updaterepo(repo, oldother, True)
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1775
                strips = [evolvestate['relocated']]
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1776
                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
  1777
                updated = True
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1778
                pctx = repo[oldother]
3826
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1779
    if not updated:
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1780
        pctx = repo['.']
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1781
        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
  1782
    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
  1783
    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
  1784
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1785
def abortevolve(ui, repo, evolvestate):
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1786
    """ 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
  1787
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1788
    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
  1789
        repo = repo.unfiltered()
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1790
        evolvedctx = []
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1791
        # 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
  1792
        cleanup = True
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1793
        startnode = evolvestate['startnode']
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1794
        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
  1795
            if new:
a19703c6d2bb evolve: check for None before adding in set of revisions to strip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3754
diff changeset
  1796
                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
  1797
        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
  1798
            if temp:
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1799
                evolvedctx.append(repo[temp])
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1800
        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
  1801
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1802
        # 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
  1803
        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
  1804
        if immutable:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1805
            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
  1806
                         % ', '.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
  1807
                         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
  1808
            cleanup = False
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1809
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1810
        # 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
  1811
        descendants = set()
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1812
        if evolvedrevs:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1813
            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
  1814
        if descendants - set(evolvedrevs):
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1815
            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
  1816
                           "branch\n"))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1817
            cleanup = False
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1818
3832
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1819
        # 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
  1820
        # them
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1821
        if evolvestate['obsmarkers']:
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1822
            stripmarkers = set()
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1823
            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
  1824
                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
  1825
                stripmarkers.add(m)
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1826
            indices = []
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1827
            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
  1828
            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
  1829
                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
  1830
                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
  1831
                    indices.append(i)
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1832
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1833
            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
  1834
            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
  1835
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1836
        if cleanup:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1837
            if evolvedrevs:
3643
01108d67523f style: fix a couple of pyflakes complains
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3642
diff changeset
  1838
                strippoints = [c.node()
01108d67523f style: fix a couple of pyflakes complains
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3642
diff changeset
  1839
                               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
  1840
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1841
            # updating the working directory
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1842
            hg.updaterepo(repo, startnode, True)
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1843
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1844
            # 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
  1845
            if evolvedrevs:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1846
                # 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
  1847
                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
  1848
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1849
            tr = None
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1850
            try:
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1851
                tr = repo.transaction('evolve')
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1852
                # restoring bookmarks at there original place
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1853
                bmchanges = evolvestate['bookmarkchanges']
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1854
                if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3698
diff changeset
  1855
                    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
  1856
                tr.close()
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1857
            finally:
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1858
                tr.release()
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1859
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1860
            evolvestate.delete()
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1861
            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
  1862
            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
  1863
                      % nodemod.hex(startnode)[:12])
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1864
        else:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1865
            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
  1866
                                "evolve --stop' to stop evolve"))
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1867
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1868
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
  1869
    """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
  1870
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1871
    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
  1872
        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
  1873
        mergeutil.checkunresolved(ms)
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1874
        if (evolvestate['command'] == 'next'
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1875
            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
  1876
            _completeorphan(ui, repo, evolvestate)
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1877
        elif evolvestate['category'] == 'phasedivergent':
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1878
            _completephasedivergent(ui, repo, evolvestate)
3737
5b0bd82ea914 evolve: add logic to continue interrupted content-divergence resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3736
diff changeset
  1879
        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
  1880
            _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
  1881
        else:
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1882
            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
  1883
                             " 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
  1884
            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
  1885
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1886
        # make sure we are continuing evolve and not `hg next --evolve`
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1887
        if evolvestate['command'] == 'evolve':
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1888
            category = evolvestate['category']
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1889
            confirm = evolvestate['confirm']
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1890
            unfi = repo.unfiltered()
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1891
            # lastsolved: keep track of successor of last troubled cset we
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1892
            # evolved to confirm that if atop msg should be suppressed to remove
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1893
            # redundancy
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1894
            lastsolved = None
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1895
            activetopic = getattr(repo, 'currenttopic', '')
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1896
            for rev in evolvestate['revs']:
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1897
                # XXX: prevent this lookup by storing nodes instead of revnums
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1898
                curctx = unfi[rev]
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1899
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1900
                # check if we can use stack template
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1901
                revtopic = getattr(curctx, 'topic', lambda: '')()
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1902
                topicidx = getattr(curctx, 'topicidx', lambda: None)()
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1903
                stacktmplt = False
4236
259d57b906a4 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4232 4235
diff changeset
  1904
                if (activetopic and (activetopic == revtopic)
259d57b906a4 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4232 4235
diff changeset
  1905
                    and topicidx is not None):
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1906
                    stacktmplt = True
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1907
4235
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1908
                if (curctx.node() not in evolvestate['replacements']
e30119dfd626 style: fix various flake8 warning
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4230
diff changeset
  1909
                    and curctx.node() not in evolvestate['skippedrevs']):
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1910
                    newnode = _solveone(ui, repo, curctx, evolvestate, False,
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1911
                                        confirm, progresscb, category,
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1912
                                        lastsolved=lastsolved,
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  1913
                                        stacktmplt=stacktmplt)
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1914
                    if newnode[0]:
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1915
                        evolvestate['replacements'][curctx.node()] = newnode[1]
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1916
                        lastsolved = newnode[1]
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1917
                    else:
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1918
                        evolvestate['skippedrevs'].append(curctx.node())
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1919
        return
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1920
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1921
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
  1922
    """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
  1923
    tr = None
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1924
    try:
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1925
        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
  1926
        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
  1927
        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
  1928
        repo = repo.unfiltered()
3881
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1929
        if evolvestate['relocating']:
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1930
            newother = _completerelocation(ui, repo, evolvestate)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1931
            current = repo[evolvestate['current']]
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1932
            obsolete.createmarkers(repo, [(current, (repo[newother],))],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1933
                                   operation='evolve')
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1934
            evolvestate['relocating'] = False
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1935
            evolvestate['relocated'] = newother
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1936
            evolvestate['temprevs'].append(newother)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1937
            evolvestate['other-divergent'] = newother
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1938
            # continue the resolution by merging the content-divergence
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1939
            _mergecontentdivergents(repo, progresscb,
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1940
                                    repo[divergent],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1941
                                    repo[newother],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1942
                                    repo[base],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1943
                                    evolvestate)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1944
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  1945
        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
  1946
        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
  1947
                                        repo[divergent],
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1948
                                        repo[other],
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1949
                                        repo[base],
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1950
                                        evolvestate)
4408
02ece0e5865e evolve: fix the broken behaviour on div resolution in relocation case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4403
diff changeset
  1951
        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
  1952
        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
  1953
        # logic to continue the public content-divergent
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  1954
        publicnode = evolvestate.get('public-divergent')
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  1955
        if publicnode:
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  1956
            res, newnode = ret
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  1957
            if not res:
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  1958
                # 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
  1959
                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
  1960
            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
  1961
                # 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
  1962
                # 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
  1963
                pass
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  1964
            else:
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  1965
                prec = repo[publicnode]
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  1966
                bumped = repo[newnode]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
  1967
                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
  1968
        tr.close()
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  1969
        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
  1970
    finally:
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1971
        tr.release()
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  1972
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1973
def _completephasedivergent(ui, repo, evolvestate):
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1974
    """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
  1975
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1976
    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
  1977
    phase-divergence"""
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1978
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1979
    tr = None
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1980
    try:
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1981
        # need to start transaction for bookmark changes
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1982
        tr = repo.transaction('evolve')
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1983
        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
  1984
        evolvestate['temprevs'].append(node)
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1985
        # 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
  1986
        # those cases
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1987
        ctx = repo[evolvestate['current']]
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1988
        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
  1989
        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
  1990
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1991
        # now continuing the phase-divergence resolution part
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1992
        prec = repo[evolvestate['precursor']]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
  1993
        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
  1994
        evolvestate['replacements'][ctx.node()] = retvalue[1]
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1995
        tr.close()
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1996
    finally:
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1997
        tr.release()
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  1998
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  1999
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
  2000
    """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
  2001
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2002
    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
  2003
    # 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
  2004
    # those cases
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2005
    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
  2006
    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
  2007
        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
  2008
                         " 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
  2009
    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
  2010
    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
  2011
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2012
    # 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
  2013
    if evolvestate['command'] == 'evolve':
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2014
        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
  2015
        if evolvestate['orphanmerge']:
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2016
            # 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
  2017
            # 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
  2018
            # 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
  2019
            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
  2020
            evolvestate['orphanmerge'] = False
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2021
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2022
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
  2023
    """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
  2024
    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
  2025
    """
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2026
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2027
    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
  2028
    ctx = orig
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2029
    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
  2030
    extra = {}
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2031
    if source:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2032
        extra['source'] = source
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2033
        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
  2034
    else:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2035
        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
  2036
    user = ctx.user()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2037
    date = ctx.date()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2038
    message = ctx.description()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2039
    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
  2040
                                            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
  2041
    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
  2042
    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
  2043
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2044
    ctxparents = orig.parents()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2045
    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
  2046
        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
  2047
        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
  2048
        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
  2049
        # 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
  2050
        # 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
  2051
        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
  2052
            # 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
  2053
            # 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
  2054
            # 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
  2055
            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
  2056
                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
  2057
                                         ctxparents[1].node())
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2058
        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
  2059
            # 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
  2060
            # 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
  2061
            # 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
  2062
            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
  2063
                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
  2064
                                         currentp1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2065
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2066
        else:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2067
            # 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
  2068
            # 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
  2069
            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
  2070
                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
  2071
                    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
  2072
                                             currentp1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2073
            pass
3978
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  2074
    else:
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  2075
        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
  2076
            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
  2077
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2078
    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
  2079
        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
  2080
                           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
  2081
    return node