hgext3rd/evolve/evolvecmd.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 30 Apr 2020 10:05:14 -0700
changeset 5341 13376ca93fa3
parent 5333 299d86c15b55
child 5343 ebfd0d875600
permissions -rw-r--r--
evolve: always create commit when resolving divergence When resolving content-divergence, the final commit we create may end up empty (which means that Mercurial won't even create it). We've had code for handling that in evolve ever since 41bf6c27a122 (evolve: stabilize now handle conflicting changeset, 2012-08-23). However, that resolved the issue by marking on the divergent commits as successor. As Pierre-Yves has pointed out (in other code reviews), we should instead be creating a new successor. So that's what this patch does. It does that by setting `ui.allowemptycommit` while creating the final commit. However, that is not enough, because we may end up creating the same nodeid as already existed (we'd then end up trying to mark the "new" commit a successor of itself). To solve that, we add some salt to the commit extras. That salt affects lots of tests.
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,
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
    19
    encoding,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    20
    error,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    21
    hg,
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
    22
    logcmdutil,
3462
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,
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
    29
    pycompat,
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
    30
    repair,
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
    31
    scmutil,
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
    32
    simplemerge,
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
    33
    util,
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    34
)
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    35
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    36
from mercurial.i18n import _
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    37
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    38
from . import (
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    39
    cmdrewrite,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    40
    compat,
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
    41
    exthelper,
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    42
    rewriteutil,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    43
    state,
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    44
    utility,
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
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    47
TROUBLES = compat.TROUBLES
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    48
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
    49
stacktemplate = utility.stacktemplate
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    50
_bookmarksupdater = rewriteutil.bookmarksupdater
4801
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4798
diff changeset
    51
sha1re = re.compile(br'\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
    52
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
    53
eh = exthelper.exthelper()
3579
3a4552b30ba8 compat: use mergetoolopts from commands.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3577
diff changeset
    54
mergetoolopts = commands.mergetoolopts
3461
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    55
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
    56
abortmessage = _(b"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
    57
3478
4a1ccae58323 evolvecmd: pass evolvestate object to _solve* functions
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3477
diff changeset
    58
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
    59
              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
    60
    """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
    61
6475d2046f87 evolvecmd: introduce a new module to handle `hg evolve` related code
Pulkit Goyal <7895pulkit@gmail.com>
parents:
diff changeset
    62
    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
    63
        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
    64
        newnode: if bool is True, then the newnode of the resultant commit
5022
95af630d913a evolvecmd: fix a typo node->None
Martin von Zweigbergk <martinvonz@google.com>
parents: 5021
diff changeset
    65
                 formed. newnode can be None, 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
    66
                 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
    67
    """
4610
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    68
    tr = repo.currenttransaction()
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    69
    assert tr is not None
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    70
    displayer = None
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    71
    if stacktmplt:
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
    72
        displayer = logcmdutil.changesetdisplayer(ui, repo,
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
    73
                                                  {b'template': stacktemplate})
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
    74
    else:
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
    75
        displayer = logcmdutil.changesetdisplayer(ui, repo,
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
    76
                                                  {b'template': shorttemplate})
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
    77
    if b'orphan' == category:
4610
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    78
        result = _solveunstable(ui, repo, ctx, evolvestate, displayer,
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    79
                                dryrun, confirm, progresscb,
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    80
                                lastsolved=lastsolved)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
    81
    elif b'phasedivergent' == category:
4610
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    82
        result = _solvephasedivergence(ui, repo, ctx, evolvestate,
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    83
                                       displayer, dryrun, confirm,
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    84
                                       progresscb)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
    85
    elif b'contentdivergent' == category:
4610
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    86
        result = _solvedivergent(ui, repo, ctx, evolvestate, displayer,
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    87
                                 dryrun, confirm, progresscb)
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    88
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
    89
        assert False, b"unknown trouble category: %s" % (category)
4610
c54d4c2c2846 evolve: drop nested locks and transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4608
diff changeset
    90
    return result
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    91
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    92
def _solveunstable(ui, repo, orig, evolvestate, displayer, dryrun=False,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
    93
                   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
    94
    """ 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
    95
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
    96
    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
    97
        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
    98
        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
    99
                 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
   100
                 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
   101
    """
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   102
    pctx = orig.p1()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   103
    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
   104
    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
   105
        p1obs = orig.p1().obsolete()
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   106
        p2obs = orig.p2().obsolete()
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   107
        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
   108
            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
   109
            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
   110
        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
   111
            pass
6aff754c2457 evolve: make sure we consider all cases in if-else
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3543
diff changeset
   112
        else:
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   113
            # 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
   114
            # obsolete and proceed with first parent
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   115
            evolvestate[b'orphanmerge'] = True
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   116
            # 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
   117
            # 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
   118
            # first parent
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   119
            pctx = orig.p2()
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
   120
            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
   121
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   122
    if not pctx.obsolete():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   123
        ui.warn(_(b"cannot solve instability of %s, skipping\n") % orig)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   124
        return (False, b".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   125
    obs = pctx
5050
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   126
    try:
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   127
        newer = utility._singlesuccessor(repo, obs)
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   128
        # search of a parent which isn't the orig
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   129
        while repo[newer].node() == orig.node():
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   130
            obs = obs.parents()[0]
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   131
            newer = utility._singlesuccessor(repo, obs)
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   132
    except utility.MultipleSuccessorsError as exc:
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   133
        if exc.divergenceflag:
5049
1b393870c6b9 evolve: preliminary indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5033
diff changeset
   134
            msg = _(b"skipping %s: divergent rewriting. can't choose "
1b393870c6b9 evolve: preliminary indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5033
diff changeset
   135
                    b"destination\n") % obs
1b393870c6b9 evolve: preliminary indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5033
diff changeset
   136
            ui.write_err(msg)
1b393870c6b9 evolve: preliminary indentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5033
diff changeset
   137
            return (False, b".")
5050
f29bd1c7e457 evolve: use utility._singlesuccessor() in _solveunstable()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5049
diff changeset
   138
        if exc.splitflag:
5075
fbe614cae40c evolve: add a new method picksplitsuccessor() in utility.py
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5064
diff changeset
   139
            splitsucc = utility.picksplitsuccessor(ui, repo, obs, orig)
fbe614cae40c evolve: add a new method picksplitsuccessor() in utility.py
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5064
diff changeset
   140
            if not splitsucc[0]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   141
                msg = _(b"could not solve instability, "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   142
                        b"ambiguous destination: "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   143
                        b"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
   144
                ui.write_err(msg)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   145
                return (False, b".")
5075
fbe614cae40c evolve: add a new method picksplitsuccessor() in utility.py
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5064
diff changeset
   146
            newer = splitsucc[1]
fbe614cae40c evolve: add a new method picksplitsuccessor() in utility.py
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5064
diff changeset
   147
    target = repo[newer]
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   148
    if not ui.quiet or confirm:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   149
        repo.ui.write(_(b'move:'), label=b'evolve.operation')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   150
        displayer.show(orig)
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
   151
        if lastsolved is None or target != repo[lastsolved]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   152
            repo.ui.write(_(b'atop:'))
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
   153
            displayer.show(target)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   154
    if confirm and ui.prompt(b'perform evolve? [Ny]', b'n') != b'y':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   155
        raise error.Abort(_(b'evolve aborted by user'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   156
    todo = b'hg rebase -r %s -d %s\n' % (orig, target)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   157
    if dryrun:
4599
93ffedae6ec6 evolve: _solveunstable() update progress only once
Martin von Zweigbergk <martinvonz@google.com>
parents: 4598
diff changeset
   158
        if progresscb:
93ffedae6ec6 evolve: _solveunstable() update progress only once
Martin von Zweigbergk <martinvonz@google.com>
parents: 4598
diff changeset
   159
            progresscb()
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   160
        repo.ui.write(todo)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   161
        return (False, b".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   162
    else:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   163
        repo.ui.note(todo)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   164
        if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   165
            progresscb()
4848
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   166
        with state.saver(evolvestate, {b'current': orig.node()}):
5020
8f6095e88d1c evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com>
parents: 5019
diff changeset
   167
            newid = _relocate(repo, orig, target, evolvestate, pctx,
8f6095e88d1c evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com>
parents: 5019
diff changeset
   168
                              keepbranch, b'orphan')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   169
            return (True, newid)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   170
4154
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
   171
def _solvephasedivergence(ui, repo, bumped, evolvestate, displayer,
dd81d7f43857 evolve: extract displayer to _solveone()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4153
diff changeset
   172
                          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
   173
    """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
   174
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   175
    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
   176
        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
   177
        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
   178
                 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
   179
                 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
   180
    """
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   181
    repo = repo.unfiltered()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   182
    bumped = repo[bumped.rev()]
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   183
    # 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
   184
    if len(bumped.parents()) > 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   185
        msg = _(b'skipping %s : we do not handle merge yet\n') % bumped
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   186
        ui.write_err(msg)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   187
        return (False, b".")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   188
    prec = next(repo.set(b'last(allpredecessors(%d) and public())', bumped.rev()))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   189
    # 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
   190
    if len(prec.parents()) > 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   191
        msg = _(b'skipping: %s: public version is a merge, '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   192
                b'this is not handled yet\n') % prec
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   193
        ui.write_err(msg)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   194
        return (False, b".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   195
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   196
    if not ui.quiet or confirm:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   197
        repo.ui.write(_(b'recreate:'), label=b'evolve.operation')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   198
        displayer.show(bumped)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   199
        repo.ui.write(_(b'atop:'))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   200
        displayer.show(prec)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   201
    if confirm and ui.prompt(_(b'perform evolve? [Ny]'), b'n') != b'y':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   202
        raise error.Abort(_(b'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
   203
    if dryrun:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   204
        todo = b'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   205
        repo.ui.write(todo)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   206
        repo.ui.write((b'hg update %s;\n' % prec))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   207
        repo.ui.write((b'hg revert --all --rev %s;\n' % bumped))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   208
        repo.ui.write((b'hg commit --msg "%s update to %s"\n' %
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   209
                       (TROUBLES['PHASEDIVERGENT'], bumped)))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   210
        return (False, b".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   211
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   212
        progresscb()
3622
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   213
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   214
    # 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
   215
    # 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
   216
    # 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
   217
    # 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
   218
    # 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
   219
    # parent or precursor and then perform later steps
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   220
    if not list(repo.set(b'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
   221
        # 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
   222
        repo.ui.status(
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   223
            _(b'rebasing to destination parent: %s\n') % prec.p1())
4848
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   224
        with state.saver(evolvestate, {b'current': bumped.hex(),
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   225
                                       b'precursor': prec.hex()}):
5020
8f6095e88d1c evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com>
parents: 5019
diff changeset
   226
            newnode = _relocate(repo, bumped, prec.p1(), evolvestate,
8f6095e88d1c evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com>
parents: 5019
diff changeset
   227
                                category=b'phasedivergent')
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   228
            if newnode is not None:
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   229
                new = repo[newnode]
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   230
                obsolete.createmarkers(repo, [(bumped, (new,))],
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   231
                                       operation=b'evolve')
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   232
                bumped = new
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   233
                evolvestate[b'temprevs'].append(newnode)
3622
534af64b0107 evolvecmd: add a detailed comment and some newlines
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3616
diff changeset
   234
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   235
    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
   236
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   237
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
   238
    """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
   239
4465
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   240
    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
   241
    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
   242
    """
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   243
    tr = repo.currenttransaction()
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   244
    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
   245
4465
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   246
    cl = repo.changelog
6feeaf00db44 doc: clarify _resolvephasedivergent role and constraint
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4464
diff changeset
   247
    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
   248
    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
   249
    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
   250
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   251
    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
   252
    newid = None
3754
73ee40cbfb53 evolve: return the new replacement node to be stored in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3753
diff changeset
   253
    replacementnode = None
3632
8d38b88233cb evolve: move logic to resolve phase-divergence in a new function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3631
diff changeset
   254
4558
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   255
    # 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
   256
    # 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
   257
    # 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
   258
    wctx = context.overlayworkingctx(repo)
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   259
    wctx.setbase(prec)
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   260
    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
   261
                 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
   262
    if not wctx.isempty():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   263
        text = b'%s update to %s:\n\n' % (TROUBLES['PHASEDIVERGENT'], prec)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   264
        text += bumped.description()
4558
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   265
        memctx = wctx.tomemctx(text,
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   266
                               parents=(prec.node(), nodemod.nullid),
5095
2fcaee044a8c evolve: provide branch argument to overlayworkingctx.tomemctx()
Anton Shestakov <av6@dwimlabs.net>
parents: 5094
diff changeset
   267
                               branch=bumped.branch(),
4558
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   268
                               date=bumped.date(),
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   269
                               extra=bumped.extra(),
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   270
                               user=bumped.user())
63148e999562 evolve: use merge.update() for resolving phase divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 4554
diff changeset
   271
        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
   272
        replacementnode = newid
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   273
    if newid is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   274
        repo.ui.status(_(b'no changes to commit\n'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   275
        obsolete.createmarkers(repo, [(bumped, ())], operation=b'evolve')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   276
        newid = prec.node()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   277
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   278
        repo.ui.status(_(b'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
   279
        phases.retractboundary(repo, tr, bumped.phase(), [newid])
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   280
        obsolete.createmarkers(repo, [(bumped, (repo[newid],))],
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   281
                               flag=obsolete.bumpedfix, operation=b'evolve')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   282
    bmupdate(newid)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   283
    # reroute the working copy parent to the new changeset
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
   284
    with repo.dirstate.parentchange(), compat.parentchange(repo):
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
   285
        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
   286
    return (True, replacementnode)
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   287
5033
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   288
def _prepcontentdivresolution(ui, repo, divergent, other, evolvestate):
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   289
    """ if relocation required, decide which divergent cset will be relocated
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   290
    to the other side"""
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   291
    divergent = repo[divergent.rev()]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   292
    evolvestate[b'divergent'] = divergent.node()
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   293
    evolvestate[b'orig-divergent'] = divergent.node()
3809
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   294
    # 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
   295
    # 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
   296
    # 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
   297
    # 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
   298
    # 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
   299
    # below.
5014
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
   300
    evolvestate[b'relocated-other'] = None
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
   301
    evolvestate[b'relocating-other'] = False
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   302
    evolvestate[b'relocated-div'] = None
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   303
    evolvestate[b'relocating-div'] = False
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   304
    evolvestate[b'relocation-req'] = False
3825
b5dfa78073b9 evolve: store the old other divergent node after relocation in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3824
diff changeset
   305
    # 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
   306
    # other for purposes like `--abort` or `--stop`
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   307
    evolvestate[b'old-other'] = None
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
   308
    evolvestate[b'old-divergent'] = None
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   309
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   310
    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
   311
        div, other = other, div
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   312
        evolvestate[b'divergent'] = div.node()
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   313
        evolvestate[b'other-divergent'] = other.node()
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   314
        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
   315
    # 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
   316
    haspubdiv = False
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   317
    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
   318
        haspubdiv = True
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   319
        # 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
   320
        # (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
   321
        if divergent.mutable():
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   322
            publicdiv = other
4467
6fc5e162ea84 evolve: refactor the code which swap two nodes (in divergence resolution)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4466
diff changeset
   323
            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
   324
        else:
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   325
            publicdiv = divergent
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   326
        evolvestate[b'public-divergent'] = publicdiv.node()
5033
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   327
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   328
    # 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
   329
    if len(other.parents()) > 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   330
        msg = _(b"skipping %s: %s changeset can't be "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   331
                b"a merge (yet)\n") % (divergent, TROUBLES['CONTENTDIVERGENT'])
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   332
        ui.write_err(msg)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   333
        hint = _(b"You have to fallback to solving this by hand...\n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   334
                 b"| This probably means redoing the merge and using \n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   335
                 b"| `hg prune` to kill older version.\n")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   336
        ui.write_err(hint)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   337
        return (False, b".")
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   338
5031
ef1978a0fcc0 evolve: simplify some conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5030
diff changeset
   339
    otherp1 = succsotherp1 = other.p1().rev()
ef1978a0fcc0 evolve: simplify some conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5030
diff changeset
   340
    divp1 = succsdivp1 = divergent.p1().rev()
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   341
3850
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   342
    # 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
   343
    try:
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   344
        succsotherp1 = utility._singlesuccessor(repo, other.p1())
3850
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   345
    except utility.MultipleSuccessorsError:
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   346
        pass
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   347
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   348
    try:
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   349
        succsdivp1 = utility._singlesuccessor(repo, divergent.p1())
3850
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   350
    except utility.MultipleSuccessorsError:
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   351
        pass
340cf6fbe9e9 evolve: create resolved cset on successors of current parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3848
diff changeset
   352
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   353
    # the changeset on which resolution changeset will be based on
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   354
    resolutionparent = repo[succsdivp1].node()
3848
90f1a64875ad evolve: introduce a resolutionparent variable and store it in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3847
diff changeset
   355
4984
b779b40f996e evolve: fix content-divergence resolution when p1 is null (issue6201)
Manuel Jacob <me@manueljacob.de>
parents: 4857
diff changeset
   356
    # the nullrev has to be handled specially because -1 is overloaded to both
b779b40f996e evolve: fix content-divergence resolution when p1 is null (issue6201)
Manuel Jacob <me@manueljacob.de>
parents: 4857
diff changeset
   357
    # mean nullrev (this meaning is used for the result of changectx.rev(), as
b779b40f996e evolve: fix content-divergence resolution when p1 is null (issue6201)
Manuel Jacob <me@manueljacob.de>
parents: 4857
diff changeset
   358
    # called above) and the tipmost revision (this meaning is used for the %d
b779b40f996e evolve: fix content-divergence resolution when p1 is null (issue6201)
Manuel Jacob <me@manueljacob.de>
parents: 4857
diff changeset
   359
    # format specifier, as used below)
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   360
    if nodemod.nullrev in (succsotherp1, succsdivp1):
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   361
        # nullrev is the only possible ancestor if succsotherp1 or succsdivp1 is nullrev
4984
b779b40f996e evolve: fix content-divergence resolution when p1 is null (issue6201)
Manuel Jacob <me@manueljacob.de>
parents: 4857
diff changeset
   362
        gca = [nodemod.nullrev]
b779b40f996e evolve: fix content-divergence resolution when p1 is null (issue6201)
Manuel Jacob <me@manueljacob.de>
parents: 4857
diff changeset
   363
    else:
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   364
        gca = repo.revs(b"ancestor(%d, %d)" % (succsotherp1, succsdivp1))
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   365
    # 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
   366
    # but not "other"
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   367
    divonly = repo.revs(b"only(%d, %d) - obsolete()" % (divergent.rev(),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   368
                                                        other.rev()))
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   369
    # 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
   370
    # but not "div"
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   371
    otheronly = repo.revs(b"only(%d, %d) - obsolete()" % (other.rev(),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   372
                                                          divergent.rev()))
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   373
    # 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
   374
    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
   375
    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
   376
    # 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
   377
    relocatereq = False
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   378
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   379
    # 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
   380
    # possible cases here:
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   381
    #
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   382
    # 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
   383
    # 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
   384
    #    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
   385
    # 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
   386
    # 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
   387
    #
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   388
    # 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
   389
    # 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
   390
    # 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
   391
    # for 3) and 4), we still have to decide
5032
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   392
    if otherp1 == divp1:
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   393
        # both are on the same parents
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   394
        pass
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   395
    elif succsotherp1 in gca and succsdivp1 in gca:
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   396
        # both are not on the same parent but have same parents's succs.
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   397
        if otheronly and divonly:
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   398
            # case: we have visible csets on both side diverging from
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   399
            # tca of "divergent" and "other". We still need to decide what
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   400
            # to do in this case
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   401
            pass
5032
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   402
        if otheronly:
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   403
            relocatereq = True
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   404
            if not haspubdiv:
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   405
                # can't swap when public divergence, as public can't move
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   406
                divergent, other = swapnodes(divergent, other)
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   407
                resolutionparent = repo[succsotherp1].node()
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   408
        elif divonly:
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   409
            relocatereq = True
4442
819bad275701 evolve: add logic to handle a particular case in divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4438
diff changeset
   410
        else:
5032
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   411
            # no extra cset on either side; so not considering relocation
31b0b29245bb evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5031
diff changeset
   412
            pass
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   413
    elif succsotherp1 in gca and succsdivp1 not in gca:
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   414
        relocatereq = True
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   415
        pass
5030
1403cc7c2cee evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5029
diff changeset
   416
    elif succsdivp1 in gca and succsotherp1 not in gca:
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   417
        relocatereq = True
4444
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   418
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   419
        # 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
   420
        # 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
   421
        #
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   422
        # 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
   423
        # 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
   424
        #
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   425
        # 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
   426
        # brancmap level.
ea336a6592cc evolve: test a common case of public divergence
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4443
diff changeset
   427
        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
   428
            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
   429
            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
   430
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   431
        msg = _(b"skipping %s: have a different parent than %s "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   432
                b"(not handled yet)\n") % (divergent, other)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   433
        hint = _(b"| %(d)s, %(o)s are not based on the same changeset.\n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   434
                 b"| With the current state of its implementation, \n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   435
                 b"| evolve does not work in that case.\n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   436
                 b"| rebase one of them next to the other and run \n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   437
                 b"| this command again.\n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   438
                 b"| - either: hg rebase --dest 'p1(%(d)s)' -r %(o)s\n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   439
                 b"| - or:     hg rebase --dest 'p1(%(o)s)' -r %(d)s\n"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   440
                 ) % {b'd': divergent, b'o': other}
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   441
        ui.write_err(msg)
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   442
        ui.write_err(hint)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   443
        return (False, b".")
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   444
5033
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   445
    return (True, divergent, other, resolutionparent, relocatereq)
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   446
5333
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   447
def _relocatedivergent(repo, orig, dest, evolvestate):
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   448
    """relocates a divergent commit and saves the evolve state"""
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   449
    with state.saver(evolvestate, {b'current': orig.node()}):
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   450
        return _relocate(repo, orig, dest, evolvestate, keepbranch=True)
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   451
5033
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   452
def _solvedivergent(ui, repo, divergent, evolvestate, displayer, dryrun=False,
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   453
                    confirm=False, progresscb=None):
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   454
    """tries to solve content-divergence of a changeset
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   455
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   456
    returns a tuple (bool, newnode) where,
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   457
        bool: a boolean value indicating whether the instability was solved
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   458
        newnode: if bool is True, then the newnode of the resultant commit
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   459
                 formed. newnode can be node, when resolution led to no new
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   460
                 commit. If bool is False, this is ".".
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   461
    """
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   462
    repo = repo.unfiltered()
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   463
    base, others = divergentdata(divergent)
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   464
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   465
    # we don't handle split in content-divergence yet
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   466
    if len(others) > 1:
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   467
        othersstr = b"[%s]" % (b','.join([bytes(i) for i in others]))
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   468
        msg = _(b"skipping %s: %s with a changeset that got split"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   469
                b" into multiple ones:\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   470
                b"|[%s]\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   471
                b"| This is not handled by automatic evolution yet\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   472
                b"| You have to fallback to manual handling with commands "
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   473
                b"such as:\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   474
                b"| - hg touch -D\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   475
                b"| - hg prune\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   476
                b"| \n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   477
                b"| You should contact your local evolution Guru for help.\n"
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   478
                ) % (divergent, TROUBLES['CONTENTDIVERGENT'], othersstr)
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   479
        ui.write_err(msg)
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   480
        return (False, b".")
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   481
    other = others[0]
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   482
    evolvestate[b'other-divergent'] = other.node()
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   483
    evolvestate[b'base'] = base.node()
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   484
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   485
    # setup everything before merging two content-divergent csets
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   486
    datatoproceed = _prepcontentdivresolution(ui, repo, divergent, other,
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   487
                                              evolvestate)
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   488
    if not datatoproceed[0]:
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   489
        return (False, b".")
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   490
    divergent, other, resolutionparent, relocatereq = datatoproceed[1:]
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   491
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   492
    if relocatereq:
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   493
        evolvestate['relocation-req'] = True
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   494
    evolvestate[b'resolutionparent'] = resolutionparent
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   495
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   496
    if not ui.quiet or confirm:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   497
        ui.write(_(b'merge:'), label=b'evolve.operation')
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   498
        displayer.show(divergent)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   499
        ui.write(_(b'with: '))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   500
        displayer.show(other)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   501
        ui.write(_(b'base: '))
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   502
        displayer.show(base)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   503
    if confirm and ui.prompt(_(b'perform evolve? [Ny]'), b'n') != b'y':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   504
        raise error.Abort(_(b'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
   505
    if dryrun:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   506
        ui.write((b'hg update -c %s &&\n' % divergent))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   507
        ui.write((b'hg merge %s &&\n' % other))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   508
        ui.write((b'hg commit -m "auto merge resolving conflict between '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   509
                  b'%s and %s"&&\n' % (divergent, other)))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   510
        ui.write((b'hg up -C %s &&\n' % base))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   511
        ui.write((b'hg revert --all --rev tip &&\n'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   512
        ui.write((b'hg commit -m "`hg log -r %s --template={desc}`";\n'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   513
                  % divergent))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   514
        return (False, b".")
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   515
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   516
    if relocatereq:
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   517
        evolvestate[b'relocation-req'] = True
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   518
    evolvestate[b'resolutionparent'] = resolutionparent
4991
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   519
    try:
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   520
        succsdivp1 = utility._singlesuccessor(repo, divergent.p1())
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   521
    except utility.MultipleSuccessorsError:
5003
ad1ea34335cb evolve: fix a typo
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5000
diff changeset
   522
        msg = _(b"ambiguous orphan resolution parent for %s")
4992
1eab41625dee evolve: abort if deciding resolution parent is ambiguous
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4991
diff changeset
   523
        raise error.Abort(msg % divergent.hex()[:12])
4991
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   524
    # relocate divergent cset to its obsolete parent's successsor
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   525
    if succsdivp1 != divergent.p1().rev():
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   526
        evolvestate[b'relocating-div'] = True
4991
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   527
        ui.status(_(b'rebasing "divergent" content-divergent changeset %s on'
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   528
                    b' %s\n' % (divergent, repo[succsdivp1])))
5333
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   529
        newdivergent = _relocatedivergent(repo, divergent, repo[succsdivp1],
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   530
                                          evolvestate)
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
   531
        evolvestate[b'old-divergent'] = divergent.node()
4991
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   532
        divergent = repo[newdivergent]
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   533
        evolvestate[b'relocating-div'] = False
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
   534
        evolvestate[b'relocated-div'] = divergent.node()
4991
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   535
        evolvestate[b'temprevs'].append(divergent.node())
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   536
        evolvestate[b'divergent'] = divergent.node()
2928f35023a1 evolve: make sure divergence resolution doesn't undo changes (issue6203)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4984
diff changeset
   537
4850
6d898fa6e5c3 evolve: check that relocating makes sense in _solvedivergent() (issue5958)
Anton Shestakov <av6@dwimlabs.net>
parents: 4825
diff changeset
   538
    # Sometimes we already have the other cset where we want it
6d898fa6e5c3 evolve: check that relocating makes sense in _solvedivergent() (issue5958)
Anton Shestakov <av6@dwimlabs.net>
parents: 4825
diff changeset
   539
    if relocatereq and other == divergent.p1():
6d898fa6e5c3 evolve: check that relocating makes sense in _solvedivergent() (issue5958)
Anton Shestakov <av6@dwimlabs.net>
parents: 4825
diff changeset
   540
        relocatereq = False
6d898fa6e5c3 evolve: check that relocating makes sense in _solvedivergent() (issue5958)
Anton Shestakov <av6@dwimlabs.net>
parents: 4825
diff changeset
   541
3805
2410e7063692 evolve: implement resolution of content-divergence when on differet parents
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3802
diff changeset
   542
    # 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
   543
    if relocatereq:
3809
f06ff8fee2f6 evolvestate: store info about relocation while resolving content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3808
diff changeset
   544
        # 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
   545
        # 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
   546
        # content divergent changesets
5014
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
   547
        evolvestate[b'relocating-other'] = True
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   548
        ui.status(_(b'rebasing "other" content-divergent changeset %s on'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   549
                    b' %s\n' % (other, divergent.p1())))
5333
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
   550
        newother = _relocatedivergent(repo, other, divergent.p1(), evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   551
        evolvestate[b'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
   552
        other = repo[newother]
5014
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
   553
        evolvestate[b'relocating-other'] = False
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
   554
        evolvestate[b'relocated-other'] = other.node()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   555
        evolvestate[b'temprevs'].append(other.node())
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   556
        evolvestate[b'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
   557
3808
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   558
    _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
   559
                            evolvestate)
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   560
    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
   561
                                             other, base, evolvestate)
5033
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   562
    haspubdiv = 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
   563
    if not haspubdiv:
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   564
        return (res, newnode)
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   565
    else:
5033
7cc3d96eb589 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5032
diff changeset
   566
        publicdiv = repo[evolvestate[b'public-divergent']]
4529
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   567
        # we have content-divergence with a public cset:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   568
        # after performing content divergence resolution steps, possbile cases:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   569
        # 1) merging results in a new node:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   570
        #       we need to perform phase divergence resolution
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   571
        # 2) merging leads to same content as public cset:
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   572
        #       divergence has been resolved by creating markers
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   573
        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
   574
            # 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
   575
            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
   576
        if newnode == publicdiv.node():
4529
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   577
            # case 2)
4747
fa6aafa2857d py3: replace str(ctx) by bytes(ctx)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4738
diff changeset
   578
            pubstr = bytes(publicdiv)
fa6aafa2857d py3: replace str(ctx) by bytes(ctx)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4738
diff changeset
   579
            othstr = bytes(other)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   580
            msg = _(b'content divergence resolution between %s '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   581
                    b'(public) and %s has same content as %s, '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   582
                    b'discarding %s\n')
4583
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   583
            msg %= (pubstr, othstr, pubstr, othstr)
4fcf9a71befc evolve: show a status message when merging leads to public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4580
diff changeset
   584
            repo.ui.status(msg)
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   585
            return (res, newnode)
4529
e0eaa33a1f8a evolve: improve inline documentation for the public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4505
diff changeset
   586
        # case 1)
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   587
        prec = publicdiv
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   588
        bumped = repo[newnode]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
   589
        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
   590
e6c0f45d51ed evolve: factor out logic to merge content divergent csets in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3807
diff changeset
   591
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
   592
                            evolvestate):
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   593
    if divergent not in repo[None].parents():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   594
        repo.ui.note(_(b"updating to \"local\" side of the conflict: %s\n") %
4633
61c2518cd6d2 evolve: move status msg to verbose mode in content-divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4624
diff changeset
   595
                     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
   596
        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
   597
    # merging the two content-divergent changesets
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   598
    repo.ui.note(_(b"merging \"other\" %s changeset '%s'\n") %
4633
61c2518cd6d2 evolve: move status msg to verbose mode in content-divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4624
diff changeset
   599
                 (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
   600
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   601
        progresscb()
4848
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   602
    with state.saver(evolvestate):
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   603
        mergeancestor = repo.changelog.isancestor(divergent.node(),
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   604
                                                  other.node())
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   605
        stats = merge.update(repo,
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   606
                             other.node(),
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   607
                             branchmerge=True,
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   608
                             force=False,
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   609
                             ancestor=base.node(),
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   610
                             mergeancestor=mergeancestor)
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   611
        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
   612
4848
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   613
        # conflicts while merging content-divergent changesets
5179
7c41a1ebcf7f compat: directly use status attribute instead of the compat layer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
   614
        if stats.unresolvedcount:
4848
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   615
            hint = _(b"see 'hg help evolve.interrupted'")
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   616
            raise error.InterventionRequired(_(b"unresolved merge conflicts"),
535ab2609e45 cmdstate: introduce a "saver" contextmanager and use it in place of save()
Kyle Lippincott <spectral@google.com>
parents: 4827
diff changeset
   617
                                             hint=hint)
3735
bdf7fb6af7b8 evolve: take out logic to complete phase-divergence in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3734
diff changeset
   618
3737
5b0bd82ea914 evolve: add logic to continue interrupted content-divergence resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3736
diff changeset
   619
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
   620
                              base, evolvestate):
3735
bdf7fb6af7b8 evolve: take out logic to complete phase-divergence in separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3734
diff changeset
   621
    """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
   622
    # 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
   623
    # resume resolution
3462
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   624
    if progresscb:
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   625
        progresscb()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   626
    tr = repo.currenttransaction()
e147c18ed064 evolvecmd: move more functions from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3461
diff changeset
   627
    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
   628
    # 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
   629
    storemarker = False
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   630
    resparent = evolvestate[b'resolutionparent']
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   631
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   632
    # 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
   633
    haspubdiv = False
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   634
    if evolvestate.get(b'public-divergent'):
4383
3343eac099ec evolve: add logic to resolve content-divergence with a public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4382
diff changeset
   635
        haspubdiv = True
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   636
        publicnode = evolvestate[b'public-divergent']
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
   637
        publicdiv = repo[publicnode]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   638
        othernode = evolvestate[b'other-divergent']
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
   639
        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
   640
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
   641
        with repo.dirstate.parentchange(), compat.parentchange(repo):
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
   642
            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
   643
            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
   644
        # 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
   645
        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
   646
        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
   647
            # warn user if metadata is being lost
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   648
            warnmetadataloss(repo, publicdiv, otherdiv)
4416
b2a8e67b0933 evolve: handle a case in pubic-div when merging results in same as public
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4415
diff changeset
   649
            # 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
   650
            obsolete.createmarkers(repo, [(otherdiv, (publicdiv,))],
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   651
                                   operation=b'evolve')
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
   652
            return (True, publicnode)
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   653
5111
1fe3f7ffb462 branching
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5075 5096
diff changeset
   654
    with repo.dirstate.parentchange(), compat.parentchange(repo):
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   655
        repo.dirstate.setparents(resparent, nodemod.nullid)
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   656
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   657
    dirstatedance(repo, divergent, resparent, None)
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   658
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   659
    # merge the branches
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   660
    mergebranches(repo, divergent, other, base)
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   661
    # merge the commit messages
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   662
    desc = mergecommitmessages(ui, base.description(),
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   663
                               divergent.description(),
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   664
                               other.description())
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   665
    user = utility.mergeusers(ui, base, divergent, other)
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   666
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   667
    mergehook(repo, base, divergent, other)
3879
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   668
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   669
    date = divergent.date()
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   670
    if other.date() != divergent.date():
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   671
        basedate = base.date()
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   672
        if other.date() == basedate:
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   673
            date = divergent.date()
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   674
        elif divergent.date() == basedate:
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   675
            date = other.date()
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   676
        else:
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   677
            date = max(divergent.date(), other.date())
4998
88b816a9d990 evolve: preserve date when resolving content-divergence (issue6202)
Manuel Jacob <me@manueljacob.de>
parents: 4992
diff changeset
   678
5341
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   679
    # We really want a new commit in order to avoid obsmarker cycles (otherwise
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   680
    # divergence resolutions done in separate repos may create markers in the
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   681
    # opposite directions). For that reason, we set ui.allowemptycommit and
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   682
    # also add also add some salt to the commit extras to make sure we don't
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   683
    # reuse an existing nodeid.
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   684
    with repo.ui.configoverride(
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   685
        {(b'ui', b'allowemptycommit'): b'true'}, b'evolve'
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   686
    ):
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   687
        extra = {
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   688
            b'evolve_source_local': divergent.hex(),
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   689
            b'evolve_source_other': other.hex()
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   690
        }
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   691
        newnode = repo.commit(text=desc, user=user, date=date, extra=extra)
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   692
    new = repo[newnode]
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   693
    hg.updaterepo(repo, new.rev(), False)
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   694
    if haspubdiv and publicdiv == divergent:
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   695
        bypassphase(repo, (divergent, new), operation=b'evolve')
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   696
    else:
5341
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   697
        obsolete.createmarkers(repo, [(divergent, (new,))],
13376ca93fa3 evolve: always create commit when resolving divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 5333
diff changeset
   698
                               operation=b'evolve')
3742
d577cef1f044 evolvecmd: add comments and new lines in content-divergence handling logic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3741
diff changeset
   699
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   700
    # creating markers and moving phases post-resolution
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   701
    if haspubdiv and publicdiv == other:
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   702
        bypassphase(repo, (other, new), operation=b'evolve')
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   703
    else:
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   704
        obsolete.createmarkers(repo, [(other, (new,))], operation=b'evolve')
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   705
    if storemarker:
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   706
        # storing the marker in the evolvestate
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   707
        # we just store the precursors and successor pair for now, we might
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   708
        # want to store more data and serialize obsmarker in a better way in
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   709
        # future
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   710
        evolvestate[b'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
   711
5005
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   712
    phases.retractboundary(repo, tr, other.phase(), [new.node()])
e66ba12e5db3 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com>
parents: 5004
diff changeset
   713
    return (True, newnode)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   714
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   715
def warnmetadataloss(repo, local, other):
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   716
    """warn the user for the metadata being lost while resolving
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   717
    public content-divergence"""
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   718
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   719
    # needtowarn: aspects where we need to warn user
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   720
    needtowarn = [b'branch', b'topic', b'close']
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   721
    aspects = set()
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   722
    localextra = local.extra()
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   723
    otherextra = other.extra()
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   724
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   725
    for asp in needtowarn:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   726
        otherasp = otherextra.get(asp)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   727
        localasp = localextra.get(asp)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   728
        if otherasp and otherasp != localasp:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   729
            aspects.add(asp)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   730
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   731
    if other.description() != local.description():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   732
        aspects.add(b'description')
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   733
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   734
    if aspects:
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   735
        # warn user
4747
fa6aafa2857d py3: replace str(ctx) by bytes(ctx)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4738
diff changeset
   736
        locstr = bytes(local)
fa6aafa2857d py3: replace str(ctx) by bytes(ctx)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4738
diff changeset
   737
        othstr = bytes(other)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   738
        if b'close' in aspects:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   739
            filteredasp = aspects - {b'close'}
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   740
            if filteredasp:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   741
                msg = _(b'other divergent changeset %s is a closed branch head '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   742
                        b'and differs from local %s by "%s" only,' %
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   743
                        (othstr, locstr, b', '.join(sorted(filteredasp))))
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   744
            else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   745
                msg = _(b'other divergent changeset %s is a closed branch head '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   746
                        b'and has same content as local %s,' % (othstr, locstr))
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   747
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   748
            msg = _(b'other divergent changeset %s has same content as local %s'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   749
                    b' and differs by "%s" only,' %
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   750
                    (othstr, locstr, b', '.join(sorted(aspects))))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   751
        msg += _(b' discarding %s\n' % othstr)
4584
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   752
        repo.ui.warn(msg)
fd8dada76730 evolve: warn user for the metadata being lost in public divergence resolution
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4583
diff changeset
   753
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   754
def bypassphase(repo, relation, flag=0, metadata=None, operation=b'evolve'):
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   755
    """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
   756
    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
   757
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   758
    # prepare metadata
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   759
    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
   760
        metadata = {}
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   761
    if b'user' not in metadata:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   762
        luser = repo.ui.config(b'devel', b'user.obsmarker') or repo.ui.username()
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   763
        metadata[b'user'] = encoding.fromlocal(luser)
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   764
    # Operation metadata handling
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   765
    useoperation = repo.ui.configbool(b'experimental',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   766
                                      b'evolution.track-operation')
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   767
    if useoperation and operation:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   768
        metadata[b'operation'] = operation
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   769
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   770
    # Effect flag metadata handling
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   771
    saveeffectflag = repo.ui.configbool(b'experimental',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   772
                                        b'evolution.effect-flags')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   773
    with repo.transaction(b'add-obsolescence-marker') as tr:
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   774
        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
   775
        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
   776
        npare = None
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   777
        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
   778
        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
   779
            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
   780
        if nprec in nsucs:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   781
            raise error.Abort(_(b"changeset %s cannot obsolete itself") % prec)
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   782
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   783
        if saveeffectflag:
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   784
            # 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
   785
            # future evolution
4431
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   786
            try:
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   787
                effectflag = obsutil.geteffectflag(prec, (succ,))
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   788
            except TypeError:
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 5187
diff changeset
   789
                # hg <= 4.7 (bae6f1418a95)
4431
f109917f5c28 evolvecmd: compatibility with older geteffectflag() that took a tuple
Anton Shestakov <av6@dwimlabs.net>
parents: 4428
diff changeset
   790
                effectflag = obsutil.geteffectflag((prec, (succ,)))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   791
            metadata[obsutil.EFFECTFLAGFIELD] = b"%d" % effectflag
4382
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   792
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   793
        # create markers
e6ba7e324015 evolve: introduce function to create a obsmarker relation even for public cset
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4378
diff changeset
   794
        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
   795
                             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
   796
        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
   797
3847
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   798
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
   799
    """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
   800
    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
   801
    repo.dirstate.setparents()
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   802
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   803
    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
   804
               newparent as Pnew
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   805
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   806
    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
   807
    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
   808
    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
   809
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   810
    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
   811
               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
   812
               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
   813
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   814
    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
   815
    can be removed.
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   816
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   817
    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
   818
               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
   819
               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
   820
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   821
    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
   822
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   823
    |---------------------------------------------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   824
    | 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
   825
    |   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
   826
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   827
    |              |                  |                             |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   828
    |   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
   829
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   830
    |   Fm         |      Cr          |           Added             |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   831
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   832
    |   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
   833
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   834
    |   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
   835
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   836
    |   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
   837
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   838
    |   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
   839
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   840
    |   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
   841
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   842
    |   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
   843
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   844
    |   Fr         |      Cm          |           Removed           |
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   845
    |--------------|------------------|-----------------------------|
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   846
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   847
    (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
   848
         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
   849
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   850
    (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
   851
         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
   852
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   853
    (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
   854
         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
   855
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   856
    (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
   857
         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
   858
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   859
    """
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   860
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   861
    # 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
   862
    # this function only
8bad32e1e6c1 evolve: introduce a dirstatedance() fn to fix dirstate after parent change
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3846
diff changeset
   863
    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
   864
3879
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   865
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
   866
    """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
   867
    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
   868
    pass
1fa3bf6e9e93 evolvecmd: introduce fn to be wrapped by extensions resolving content-div
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3878
diff changeset
   869
3829
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   870
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
   871
    """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
   872
    the dirstate branch accordingly
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   873
    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
   874
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   875
    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
   876
    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
   877
    """
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   878
    divbranch = divergent.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   879
    basebranch = base.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   880
    othbranch = other.branch()
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   881
    # 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
   882
    # select one
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   883
    if divbranch != othbranch:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   884
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   885
        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
   886
            # 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
   887
            # preserved
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   888
            pass
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   889
        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
   890
            repo.dirstate.setbranch(othbranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   891
        else:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   892
            # all the three branches are different
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   893
            index = repo.ui.promptchoice(_(b"content divergent changesets on "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   894
                                           b"different branches.\nchoose branch"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   895
                                           b" for the resolution changeset. (a) "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   896
                                           b"%s or (b) %s or (c) %s? $$ &a $$ &b"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   897
                                           b" $$ &c") %
3829
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   898
                                         (basebranch, divbranch, othbranch), 0)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   899
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   900
            if index == 0:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   901
                repo.dirstate.setbranch(basebranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   902
            elif index == 1:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   903
                pass
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   904
            elif index == 2:
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   905
                repo.dirstate.setbranch(othbranch)
cb45a7173e5b evolve: factor out logic to merge branches in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3827
diff changeset
   906
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   907
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
   908
    """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
   909
    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
   910
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   911
    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
   912
    mdesc = []
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   913
    kwargs = {}
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   914
    kwargs['name_base'] = b'base'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   915
    kwargs['base_marker'] = b'|||||||'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   916
    for line in merger.merge_lines(name_a=b'divergent', name_b=b'other',
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   917
                                   **kwargs):
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   918
        mdesc.append(line)
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   919
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   920
    desc = b''.join(mdesc)
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   921
    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
   922
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   923
        prefixes = (b"HG: Conflicts while merging changeset description of"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   924
                    b" content-divergent changesets.\nHG: Resolve conflicts"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   925
                    b" in commit messages to continue.\n\n")
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   926
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   927
        resolveddesc = ui.edit(prefixes + desc, ui.username(), action=b'desc')
3878
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   928
        # 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
   929
        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
   930
            # 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
   931
            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
   932
        desc = resolveddesc
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   933
dc2b53b3573f evolvecmd: move remaining logic to merge commit desc to existing utility fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3856
diff changeset
   934
    return desc
3801
ee78135b2f45 evolve: merge commit messages while resolving content-divergence (issue5877)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3800
diff changeset
   935
3469
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   936
def _orderrevs(repo, revs):
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   937
    """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
   938
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   939
    revs is a list of unstable revisions.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   940
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   941
    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
   942
    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
   943
    eventually.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   944
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   945
    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
   946
    revision on its final stabilized destination.
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   947
    """
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   948
    # Step 1: Build the dependency graph
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   949
    dependencies, rdependencies = utility.builddependencies(repo, revs)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   950
    # Step 2: Build the ordering
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   951
    # 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
   952
    # 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
   953
    # 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
   954
    # 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
   955
    # built
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   956
    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
   957
                                      if not dependencies[r]])
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   958
    ordering = []
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   959
    while solvablerevs:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   960
        rev = solvablerevs.popleft()
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   961
        for dependent in rdependencies[rev]:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   962
            dependencies[dependent].remove(rev)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   963
            if not dependencies[dependent]:
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   964
                solvablerevs.append(dependent)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   965
        del dependencies[rev]
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   966
        ordering.append(rev)
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   967
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   968
    ordering.extend(sorted(dependencies))
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   969
    return ordering
e97bfd529e72 evolve: move _orderrevs() function evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3466
diff changeset
   970
5020
8f6095e88d1c evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com>
parents: 5019
diff changeset
   971
def _relocate(repo, orig, dest, evolvestate, pctx=None, keepbranch=False,
8f6095e88d1c evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com>
parents: 5019
diff changeset
   972
              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
   973
    """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
   974
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   975
    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
   976
    """
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   977
    if orig.rev() == dest.rev():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   978
        msg = _(b'tried to relocate a node on top of itself')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   979
        hint = _(b"This shouldn't happen. If you still need to move changesets, "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   980
                 b"please do so manually with nothing to rebase - working "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   981
                 b"directory parent is also destination")
4269
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   982
        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
   983
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   984
    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
   985
        if len(orig.parents()) == 2:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   986
            msg = _(b"tried to relocate a merge commit without specifying which "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   987
                    b"parent should be moved")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
   988
            hint = _(b"Specify the parent by passing in pctx")
4269
d2599da04bb5 evolve: update the abort to a ProgrammingError
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4265
diff changeset
   989
            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
   990
        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
   991
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   992
    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
   993
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   994
    cache = {}
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
   995
    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
   996
    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
   997
    for sha1 in sha1s:
5187
4230f046ddb9 evolve: drop 4.5 compat for scmutil.resolvehexnodeidprefix()
Anton Shestakov <av6@dwimlabs.net>
parents: 5181
diff changeset
   998
        fullnode = scmutil.resolvehexnodeidprefix(unfi, sha1)
3665
0f0f31351d6d compat: avoid using partial node ID in lookup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3653
diff changeset
   999
        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
  1000
            continue
3665
0f0f31351d6d compat: avoid using partial node ID in lookup
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3653
diff changeset
  1001
        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
  1002
        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
  1003
            continue
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1004
5048
3947964a4ce7 evolve: provide cache argument to obsutil.successorssets() correctly
Anton Shestakov <av6@dwimlabs.net>
parents: 4998
diff changeset
  1005
        successors = obsutil.successorssets(repo, ctx.node(), cache=cache)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1006
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1007
        # 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
  1008
        # 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
  1009
        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
  1010
            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
  1011
            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
  1012
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1013
            repo.ui.note(_(b'The stale commit message reference to %s could '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1014
                           b'not be updated\n') % sha1)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1015
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1016
    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
  1017
    assert tr is not None
4590
784ad6f60571 evolve: don't use exception for local flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 4589
diff changeset
  1018
    r = _evolvemerge(repo, orig, dest, pctx, keepbranch)
5179
7c41a1ebcf7f compat: directly use status attribute instead of the compat layer
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5111
diff changeset
  1019
    if r.unresolvedcount: # some conflict
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
  1020
        with repo.dirstate.parentchange(), compat.parentchange(repo):
3978
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  1021
            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
  1022
            repo.dirstate.write(tr)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1023
        hint = _(b"see 'hg help evolve.interrupted'")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1024
        raise error.InterventionRequired(_(b"unresolved merge conflicts"),
4676
b6c819facbe8 evolvecmd: the proper way to deal with conflicts is to resolve them
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  1025
                                         hint=hint)
4590
784ad6f60571 evolve: don't use exception for local flow control
Martin von Zweigbergk <martinvonz@google.com>
parents: 4589
diff changeset
  1026
    nodenew = _relocatecommit(repo, orig, commitmsg)
3639
95a767b2769e evolve: add evolvestate as an argument to _finalizerelocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3638
diff changeset
  1027
    _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
  1028
    return nodenew
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1029
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1030
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
  1031
    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
  1032
        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
  1033
    extra = dict(orig.extra())
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1034
    if b'branch' in extra:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1035
        del extra[b'branch']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1036
    extra[b'rebase_source'] = orig.hex()
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1037
5006
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1038
    targetphase = max(orig.phase(), phases.draft)
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1039
    configoverride = repo.ui.configoverride({
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1040
        (b'phases', b'new-commit'): targetphase
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1041
    }, source=b'evolve')
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1042
    with configoverride:
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1043
        # Commit might fail if unresolved files exist
5006
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1044
        return repo.commit(text=commitmsg, user=orig.user(),
93014d9726d5 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5005
diff changeset
  1045
                           date=orig.date(), extra=extra)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1046
3639
95a767b2769e evolve: add evolvestate as an argument to _finalizerelocate()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3638
diff changeset
  1047
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
  1048
    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
  1049
    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
  1050
    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
  1051
    bmchanges = []
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1052
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1053
    if nodenew is not None:
5021
edcff79a3192 evolvecmd: avoid a ctx->node->ctx conversion
Martin von Zweigbergk <martinvonz@google.com>
parents: 5020
diff changeset
  1054
        obsolete.createmarkers(repo, [(orig, (repo[nodenew],))],
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1055
                               operation=b'evolve')
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1056
        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
  1057
            bmchanges.append((book, nodenew))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1058
            evolvestate[b'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
  1059
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1060
        if category == b'orphan':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1061
            repo.ui.status(_(b"evolution of %d:%s created no changes "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1062
                             b"to commit\n") % (orig.rev(), orig))
5021
edcff79a3192 evolvecmd: avoid a ctx->node->ctx conversion
Martin von Zweigbergk <martinvonz@google.com>
parents: 5020
diff changeset
  1063
        obsolete.createmarkers(repo, [(orig, ())], operation=b'evolve')
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1064
        # 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
  1065
        for book in oldbookmarks:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1066
            evolvestate[b'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
  1067
            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
  1068
    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
  1069
        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
  1070
    if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3698
diff changeset
  1071
        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
  1072
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1073
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
  1074
    """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
  1075
    return the same tuple as merge.graft"""
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1076
    if repo[b'.'].rev() != dest.rev():
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1077
        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
  1078
                     dest,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1079
                     branchmerge=False,
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1080
                     force=True)
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1081
    if repo._activebookmark:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1082
        repo.ui.status(_(b"(leaving bookmark %s)\n") % repo._activebookmark)
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1083
    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
  1084
    if keepbranch:
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1085
        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
  1086
    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
  1087
        # uurrgs
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1088
        # there no other topic setter yet
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1089
        if not orig.topic() and repo.vfs.exists(b'topic'):
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1090
            repo.vfs.unlink(b'topic')
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1091
        else:
4812
67567d7f1174 python3: enforce byte prefix for vfs.open()
Raphaël Gomès <rgomes@octobus.net>
parents: 4807
diff changeset
  1092
            with repo.vfs.open(b'topic', b'w') as f:
3463
f994c480cea9 evolvecmd: move more chunks of code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3462
diff changeset
  1093
                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
  1094
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1095
    return merge.graft(repo, orig, pctx, [b'destination', b'evolving'], True)
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1096
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1097
instabilities_map = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1098
    b'contentdivergent': b"content-divergent",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1099
    b'phasedivergent': b"phase-divergent"
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1100
}
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1101
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1102
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
  1103
    """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
  1104
    revs = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1105
    if allopt or revopt:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1106
        revs = repo.revs(b"%s()" % targetcat)
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1107
        if revopt:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1108
            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
  1109
        elif not anyopt:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1110
            topic = getattr(repo, 'currenttopic', b'')
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1111
            if topic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1112
                revs = repo.revs(b'topic(%s)', topic) & revs
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1113
            elif targetcat == b'orphan':
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1114
                revs = _aspiringdescendant(repo,
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1115
                                           repo.revs(b'(.::) - obsolete()::'))
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1116
                revs = set(revs)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1117
        if targetcat == b'contentdivergent':
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1118
            # 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
  1119
            revs = _dedupedivergents(repo, revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1120
    elif anyopt:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1121
        revs = repo.revs(b'first(%s())' % (targetcat))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1122
    elif targetcat == b'orphan':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1123
        revs = set(_aspiringchildren(repo, repo.revs(b'(.::) - obsolete()::')))
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1124
        if 1 < len(revs):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1125
            msg = b"multiple evolve candidates"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1126
            hint = (_(b"select one of %s with --rev")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1127
                    % b', '.join([bytes(repo[r]) for r in sorted(revs)]))
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1128
            raise error.Abort(msg, hint=hint)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1129
    elif instabilities_map.get(targetcat, targetcat) in repo[b'.'].instabilities():
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1130
        revs = set([repo[b'.'].rev()])
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1131
    return revs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1132
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1133
def _dedupedivergents(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1134
    """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
  1135
    lowest revision numbers
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1136
    """
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1137
    repo = repo.unfiltered()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1138
    res = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1139
    # 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
  1140
    discarded = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1141
    for rev in revs:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1142
        if rev in discarded:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1143
            continue
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1144
        divergent = repo[rev]
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1145
        base, others = divergentdata(divergent)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1146
        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
  1147
        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
  1148
        discarded.update(othersrevs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1149
    return res
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1150
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1151
def divergentdata(ctx):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1152
    """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
  1153
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1154
    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
  1155
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1156
    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
  1157
    """
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1158
    repo = ctx._repo.unfiltered()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1159
    for base in repo.set(b'reverse(allpredecessors(%d))', ctx.rev()):
3697
6aff4bb3970d compat: drop compatibility layer for successorssets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3694
diff changeset
  1160
        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
  1161
        # 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
  1162
        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
  1163
        if newer:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1164
            return base, tuple(ctx._repo[o] for o in newer[0])
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1165
    raise error.Abort(_(b"base of divergent changeset %s not found") % ctx,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1166
                      hint=_(b'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
  1167
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1168
def _aspiringdescendant(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1169
    """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
  1170
    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
  1171
    target = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1172
    result = set(target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1173
    paths = collections.defaultdict(set)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1174
    for r in repo.revs(b'orphan() - %ld', revs):
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1175
        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
  1176
            paths[d].add(r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1177
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1178
    result = set(target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1179
    tovisit = list(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1180
    while tovisit:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1181
        base = tovisit.pop()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1182
        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
  1183
            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
  1184
                tovisit.append(unstable)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1185
                result.add(unstable)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1186
    return sorted(result - target)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1187
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1188
def _aspiringchildren(repo, revs):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1189
    """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
  1190
    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
  1191
    target = set(revs)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1192
    result = []
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1193
    for r in repo.revs(b'orphan() - %ld', revs):
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1194
        dest = _possibledestination(repo, r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1195
        if target & dest:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1196
            result.append(r)
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1197
    return result
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1198
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1199
def _possibledestination(repo, rev):
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1200
    """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
  1201
    tonode = repo.changelog.node
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1202
    parents = repo.changelog.parentrevs
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1203
    torev = repo.changelog.rev
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1204
    dest = set()
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1205
    tovisit = list(parents(rev))
5310
6d0d9ba04a1d evolve: provide cache to successorssets() in _possibledestination()
Anton Shestakov <av6@dwimlabs.net>
parents: 5212
diff changeset
  1206
    cache = {}
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1207
    while tovisit:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1208
        r = tovisit.pop()
4230
e796835fe6b3 evolvecmd: _possibledestination() skip visiting empty parent
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4209
diff changeset
  1209
        if r == -1:
e796835fe6b3 evolvecmd: _possibledestination() skip visiting empty parent
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4209
diff changeset
  1210
            continue
5310
6d0d9ba04a1d evolve: provide cache to successorssets() in _possibledestination()
Anton Shestakov <av6@dwimlabs.net>
parents: 5212
diff changeset
  1211
        succsets = obsutil.successorssets(repo, tonode(r), cache=cache)
3464
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1212
        if not succsets:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1213
            tovisit.extend(parents(r))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1214
        else:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1215
            # 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
  1216
            # (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
  1217
            # 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
  1218
            # multiple branches.
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1219
            for ss in succsets:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1220
                for n in ss:
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1221
                    dest.add(torev(n))
908d2b5dfa7e evolvecmd: move more code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3463
diff changeset
  1222
    return dest
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1223
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1224
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
  1225
    """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
  1226
    no troubles can be resolved"""
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1227
    troublecategories = [b'phasedivergent', b'contentdivergent', b'orphan']
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1228
    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
  1229
    msg = None
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1230
    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
  1231
    retoverride = None
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1232
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1233
    troubled = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1234
        b"orphan": repo.revs(b"orphan()"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1235
        b"contentdivergent": repo.revs(b"contentdivergent()"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1236
        b"phasedivergent": repo.revs(b"phasedivergent()"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1237
        b"all": repo.revs(b"unstable()"),
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1238
    }
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1239
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1240
    hintmap = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1241
        b'phasedivergent': _(b"do you want to use --phase-divergent"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1242
        b'phasedivergent+contentdivergent': _(b"do you want to use "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1243
                                              b"--phase-divergent or"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1244
                                              b" --content-divergent"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1245
        b'phasedivergent+orphan': _(b"do you want to use --phase-divergent"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1246
                                    b" or --orphan"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1247
        b'contentdivergent': _(b"do you want to use --content-divergent"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1248
        b'contentdivergent+orphan': _(b"do you want to use --content-divergent"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1249
                                      b" or --orphan"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1250
        b'orphan': _(b"do you want to use --orphan"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1251
        b'any+phasedivergent': _(b"do you want to use --any (or --rev) and"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1252
                                 b" --phase-divergent"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1253
        b'any+phasedivergent+contentdivergent': _(b"do you want to use --any"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1254
                                                  b" (or --rev) and"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1255
                                                  b" --phase-divergent or"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1256
                                                  b" --content-divergent"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1257
        b'any+phasedivergent+orphan': _(b"do you want to use --any (or --rev)"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1258
                                        b" and --phase-divergent or --orphan"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1259
        b'any+contentdivergent': _(b"do you want to use --any (or --rev) and"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1260
                                   b" --content-divergent"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1261
        b'any+contentdivergent+orphan': _(b"do you want to use --any (or --rev)"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1262
                                          b" and --content-divergent or "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1263
                                          b"--orphan"),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1264
        b'any+orphan': _(b"do you want to use --any (or --rev)"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1265
                         b"and --orphan"),
3465
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
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1268
    if revopt:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1269
        revs = scmutil.revrange(repo, revopt)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1270
        if not revs:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1271
            msg = _(b"set of specified revisions is empty")
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1272
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1273
            msg = _(b"no %s changesets in specified revisions") % targetcat
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1274
            othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1275
            for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1276
                if revs & troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1277
                    othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1278
            if othertroubles:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1279
                hint = hintmap[b'+'.join(othertroubles)]
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1280
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1281
    elif anyopt:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1282
        msg = _(b"no %s changesets to evolve") % targetcat
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1283
        othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1284
        for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1285
            if troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1286
                othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1287
        if othertroubles:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1288
            hint = hintmap[b'+'.join(othertroubles)]
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1289
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1290
    else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1291
        # evolve without any option = relative to the current wdir
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1292
        if targetcat == b'orphan':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1293
            msg = _(b"nothing to evolve on current working copy parent")
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1294
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1295
            msg = _(b"current working copy parent is not %s") % targetcat
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1296
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1297
        p1 = repo[b'.'].rev()
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1298
        othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1299
        for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1300
            if p1 in troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1301
                othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1302
        if othertroubles:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1303
            hint = hintmap[b'+'.join(othertroubles)]
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1304
        else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1305
            length = len(troubled[targetcat])
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1306
            if length:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1307
                hint = _(b"%d other %s in the repository, do you want --any "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1308
                         b"or --rev") % (length, targetcat)
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1309
            else:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1310
                othertroubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1311
                for cat in unselectedcategories:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1312
                    if troubled[cat]:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1313
                        othertroubles.append(cat)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1314
                if othertroubles:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1315
                    hint = hintmap[b'any+' + (b'+'.join(othertroubles))]
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1316
                else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1317
                    msg = _(b"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
  1318
                    # 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
  1319
                    retoverride = 0
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1320
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1321
    assert msg is not None
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1322
    ui.write_err(b"%s\n" % msg)
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1323
    if hint:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1324
        ui.write_err(b"(%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
  1325
        ret = 2
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1326
    else:
3649
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1327
        ret = 1
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1328
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1329
    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
  1330
        return retoverride
4fcf815916f5 evolve: do not exit 1 when there are no troubled changesets (issue5823)
Kyle Lippincott <spectral@google.com>
parents: 3643
diff changeset
  1331
    return ret
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1332
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1333
def _preparelistctxs(items, condition):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1334
    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
  1335
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1336
def _formatctx(fm, ctx):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1337
    fm.data(node=ctx.hex())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1338
    fm.data(desc=ctx.description())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1339
    fm.data(date=ctx.date())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1340
    fm.data(user=ctx.user())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1341
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1342
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
  1343
    """Print all the troubles for the repo (or given revset)"""
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1344
    troublecategories = troublecategories or [b'contentdivergent', b'orphan', b'phasedivergent']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1345
    showunstable = b'orphan' in troublecategories
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1346
    showbumped = b'phasedivergent' in troublecategories
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1347
    showdivergent = b'contentdivergent' in troublecategories
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1348
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1349
    revs = repo.revs(b'+'.join(b"%s()" % t for t in troublecategories))
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1350
    if opts.get('rev'):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1351
        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
  1352
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1353
    fm = ui.formatter(b'evolvelist', pycompat.byteskwargs(opts))
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1354
    for rev in revs:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1355
        ctx = repo[rev]
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1356
        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
  1357
        obspars = _preparelistctxs(ctx.parents(), lambda p: p.obsolete())
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1358
        imprecs = _preparelistctxs(repo.set(b"allpredecessors(%n)", ctx.node()),
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1359
                                   lambda p: not p.mutable())
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1360
        dsets = divergentsets(repo, ctx)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1361
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1362
        fm.startitem()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1363
        # plain formatter section
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1364
        hashlen, desclen = 12, 60
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1365
        desc = ctx.description()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1366
        if desc:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1367
            desc = desc.splitlines()[0]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1368
        desc = (desc[:desclen] + b'...') if len(desc) > desclen else desc
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1369
        fm.plain(b'%s: ' % ctx.hex()[:hashlen])
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1370
        fm.plain(b'%s\n' % desc)
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1371
        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
  1372
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1373
        for unpar in unpars if showunstable else []:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1374
            fm.plain(b'  %s: %s (%s parent)\n' % (TROUBLES['ORPHAN'],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1375
                                                  unpar[:hashlen],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1376
                                                  TROUBLES['ORPHAN']))
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1377
        for obspar in obspars if showunstable else []:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1378
            fm.plain(b'  %s: %s (obsolete parent)\n' % (TROUBLES['ORPHAN'],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1379
                                                        obspar[:hashlen]))
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1380
        for imprec in imprecs if showbumped else []:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1381
            fm.plain(b'  %s: %s (immutable precursor)\n' %
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1382
                     (TROUBLES['PHASEDIVERGENT'], imprec[:hashlen]))
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1383
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1384
        if dsets and showdivergent:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1385
            for dset in dsets:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1386
                fm.plain(b'  %s: ' % TROUBLES['CONTENTDIVERGENT'])
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1387
                first = True
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1388
                for n in dset[b'divergentnodes']:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1389
                    t = b"%s (%s)" if first else b" %s (%s)"
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1390
                    first = False
3977
a0a4f4de9ea3 evolvecmd: import mercurial.node module as nodemod
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3927
diff changeset
  1391
                    fm.plain(t % (nodemod.hex(n)[:hashlen], repo[n].phasestr()))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1392
                comprec = nodemod.hex(dset[b'commonprecursor'])[:hashlen]
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1393
                fm.plain(b" (precursor %s)\n" % comprec)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1394
        fm.plain(b"\n")
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1395
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1396
        # templater-friendly section
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1397
        _formatctx(fm, ctx)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1398
        troubles = []
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1399
        for unpar in unpars:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1400
            troubles.append({b'troubletype': TROUBLES['ORPHAN'],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1401
                             b'sourcenode': unpar, b'sourcetype': b'orphanparent'})
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1402
        for obspar in obspars:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1403
            troubles.append({b'troubletype': TROUBLES['ORPHAN'],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1404
                             b'sourcenode': obspar,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1405
                             b'sourcetype': b'obsoleteparent'})
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1406
        for imprec in imprecs:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1407
            troubles.append({b'troubletype': TROUBLES['PHASEDIVERGENT'],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1408
                             b'sourcenode': imprec,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1409
                             b'sourcetype': b'immutableprecursor'})
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1410
        for dset in dsets:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1411
            divnodes = [{b'node': nodemod.hex(n),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1412
                         b'phase': repo[n].phasestr(),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1413
                         } for n in dset[b'divergentnodes']]
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1414
            troubles.append({b'troubletype': TROUBLES['CONTENTDIVERGENT'],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1415
                             b'commonprecursor': nodemod.hex(dset[b'commonprecursor']),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1416
                             b'divergentnodes': divnodes})
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1417
        fm.data(troubles=troubles)
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1418
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1419
    fm.end()
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1420
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1421
def _checkevolveopts(repo, opts):
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1422
    """ 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
  1423
    if any """
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1424
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1425
    if opts['continue']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1426
        if opts['any']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1427
            raise error.Abort(_(b'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
  1428
        if opts['all']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1429
            raise error.Abort(_(b'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
  1430
        if opts['rev']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1431
            raise error.Abort(_(b'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
  1432
        if opts['stop']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1433
            raise error.Abort(_(b'cannot specify both "--stop" and'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1434
                                b' "--continue"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1435
        if opts['abort']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1436
            raise error.Abort(_(b'cannot specify both "--abort" and'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1437
                                b' "--continue"'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1438
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1439
    if opts['stop']:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1440
        if opts['any']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1441
            raise error.Abort(_(b'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
  1442
        if opts['all']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1443
            raise error.Abort(_(b'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
  1444
        if opts['rev']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1445
            raise error.Abort(_(b'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
  1446
        if opts['abort']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1447
            raise error.Abort(_(b'cannot specify both "--abort" and "--stop"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1448
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1449
    if opts['abort']:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1450
        if opts['any']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1451
            raise error.Abort(_(b'cannot specify both "--any" and "--abort"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1452
        if opts['all']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1453
            raise error.Abort(_(b'cannot specify both "--all" and "--abort"'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1454
        if opts['rev']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1455
            raise error.Abort(_(b'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
  1456
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1457
    if opts['rev']:
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1458
        if opts['any']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1459
            raise error.Abort(_(b'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
  1460
        if opts['all']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1461
            raise error.Abort(_(b'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
  1462
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1463
    # Backward compatibility
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1464
    if opts['unstable']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1465
        msg = (b"'evolve --unstable' is deprecated, "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1466
               b"use 'evolve --orphan'")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1467
        repo.ui.deprecwarn(msg, b'4.4')
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1468
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1469
        opts['orphan'] = opts['divergent']
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1470
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1471
    if opts['divergent']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1472
        msg = (b"'evolve --divergent' is deprecated, "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1473
               b"use 'evolve --content-divergent'")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1474
        repo.ui.deprecwarn(msg, b'4.4')
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1475
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1476
        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
  1477
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1478
    if opts['bumped']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1479
        msg = (b"'evolve --bumped' is deprecated, "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1480
               b"use 'evolve --phase-divergent'")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1481
        repo.ui.deprecwarn(msg, b'4.4')
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1482
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1483
        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
  1484
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1485
    return opts
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1486
4601
e5aa1e23d146 evolve: move progress-clearing out of _cleanup()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4600
diff changeset
  1487
def _cleanup(ui, repo, startnode, shouldupdate):
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1488
    if not shouldupdate:
4377
c2f9de28415a evolve: document the "if not shouldupdate" block
Martin von Zweigbergk <martinvonz@google.com>
parents: 4376
diff changeset
  1489
        # 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
  1490
        # 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
  1491
        unfi = repo.unfiltered()
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1492
        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
  1493
        hg.updaterepo(repo, repo[succ].node(), False)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1494
    if repo[b'.'].node() != startnode:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1495
        ui.status(_(b'working directory is now at %s\n') % repo[b'.'])
3466
0a8e3130ad00 evolvecmd: move more core from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3465
diff changeset
  1496
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1497
def divergentsets(repo, ctx):
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1498
    """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
  1499
    cache = {}
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1500
    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
  1501
    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
  1502
        if n == ctx.node():
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1503
            # 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
  1504
            continue
5048
3947964a4ce7 evolve: provide cache argument to obsutil.successorssets() correctly
Anton Shestakov <av6@dwimlabs.net>
parents: 4998
diff changeset
  1505
        nsuccsets = obsutil.successorssets(repo, n, cache=cache)
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1506
        for nsuccset in nsuccsets:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1507
            if ctx.node() in nsuccset:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1508
                # 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
  1509
                continue
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1510
            if tuple(nsuccset) in base:
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1511
                # 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
  1512
                continue
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1513
            base[tuple(nsuccset)] = n
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1514
    divergence = []
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4706
diff changeset
  1515
    for divset, b in base.items():
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1516
        divergence.append({
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1517
            b'divergentnodes': divset,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1518
            b'commonprecursor': b
3465
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1519
        })
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1520
ffe566999920 evolvecmd: move code from __init__.py to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3464
diff changeset
  1521
    return divergence
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1522
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1523
@eh.command(
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1524
    b'evolve|stabilize|solve',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1525
    [(b'n', b'dry-run', False,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1526
      _(b'do not perform actions, just print what would be done')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1527
     (b'', b'confirm', False,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1528
      _(b'ask for confirmation before performing the action')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1529
     (b'A', b'any', False,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1530
      _(b'also consider troubled changesets unrelated to current working '
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1531
        b'directory')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1532
     (b'r', b'rev', [], _(b'solves troubles of these revisions'), _(b'REV')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1533
     (b'', b'bumped', False, _(b'solves only bumped changesets (DEPRECATED)')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1534
     (b'', b'phase-divergent', False, _(b'solves only phase-divergent changesets')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1535
     (b'', b'divergent', False, _(b'solves only divergent changesets (DEPRECATED)')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1536
     (b'', b'content-divergent', False, _(b'solves only content-divergent changesets')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1537
     (b'', b'unstable', False, _(b'solves only unstable changesets (DEPRECATED)')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1538
     (b'', b'orphan', False, _(b'solves only orphan changesets (default)')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1539
     (b'a', b'all', None, _(b'evolve all troubled changesets related to the current'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1540
                            b' working directory and its descendants (default)')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1541
     (b'', b'update', False, _(b'update to the head of evolved changesets')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1542
     (b'c', b'continue', False, _(b'continue an interrupted evolution')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1543
     (b'', b'stop', False, _(b'stop the interrupted evolution')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1544
     (b'', b'abort', False, _(b'abort the interrupted evolution')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1545
     (b'l', b'list', False, _(b'provide details on troubled changesets'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1546
                              b' in the repo')),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1547
     ] + mergetoolopts,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1548
    _(b'[OPTIONS]...'),
4894
f9743b13de6d help: categorizing evolve and topic commands
Rodrigo Damazio <rdamazio@google.com>
parents: 4857
diff changeset
  1549
    helpbasic=True,
f9743b13de6d help: categorizing evolve and topic commands
Rodrigo Damazio <rdamazio@google.com>
parents: 4857
diff changeset
  1550
    **compat.helpcategorykwargs('CATEGORY_CHANGE_MANAGEMENT')
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1551
)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1552
def evolve(ui, repo, **opts):
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1553
    """solve troubled changesets in your repository
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1554
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1555
    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
  1556
    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
  1557
    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
  1558
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1559
    - 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
  1560
    - rebase an orphan changeset
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1561
    - 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
  1562
    - 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
  1563
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1564
    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
  1565
    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
  1566
    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
  1567
    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
  1568
    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
  1569
    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
  1570
    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
  1571
    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
  1572
    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
  1573
4751
d0965c5c5335 evolve: further clarify when update is performed
kevpeng@google.com
parents: 4708
diff changeset
  1574
    When ``--update`` is used, successful evolve operations update the working
d0965c5c5335 evolve: further clarify when update is performed
kevpeng@google.com
parents: 4708
diff changeset
  1575
    directory to the newly created changesets. Moreover, an update will always
d0965c5c5335 evolve: further clarify when update is performed
kevpeng@google.com
parents: 4708
diff changeset
  1576
    be performed if the current working directory parent is obsolete.
3470
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
    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
  1579
    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
  1580
    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
  1581
    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
  1582
    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
  1583
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1584
    Eliminating all instability around your working copy may require multiple
4605
f8790714b741 evolve: mention that --all is the default behavior now
Anton Shestakov <av6@dwimlabs.net>
parents: 4604
diff changeset
  1585
    invocations of :hg:`evolve` if you use ``--rev`` or ``--no-all``. Use
f8790714b741 evolve: mention that --all is the default behavior now
Anton Shestakov <av6@dwimlabs.net>
parents: 4604
diff changeset
  1586
    ``--all`` (which is the default behavior) to recursively select and evolve
f8790714b741 evolve: mention that --all is the default behavior now
Anton Shestakov <av6@dwimlabs.net>
parents: 4604
diff changeset
  1587
    all orphan changesets that can be rebased onto the working copy parent.
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1588
    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
  1589
    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
  1590
    all branches.
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1591
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1592
    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
  1593
    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
  1594
    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
  1595
    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
  1596
    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
  1597
    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
  1598
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1599
    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
  1600
    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
  1601
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1602
    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
  1603
    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
  1604
    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
  1605
    ``--rev`` and ``--any``.
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1606
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1607
    ``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
  1608
    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
  1609
4180
96525b95d083 evolvecmd: use modern vocabulary in help text for evolve
Anton Shestakov <av6@dwimlabs.net>
parents: 4179
diff changeset
  1610
    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
  1611
    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
  1612
    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
  1613
    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
  1614
    ``--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
  1615
    ``--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
  1616
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1617
    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
  1618
    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
  1619
    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
  1620
    --phase-divergent flags.
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1621
3821
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
  1622
    Interrupted
f67ac33c07d2 evolve: rename help topic evolve.interrupted-evolve to evolve.interrupted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3811
diff changeset
  1623
    ===========
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1624
5210
b9b71fdea693 evolve: fix some documentation grammar/typos
Eric Spishak-Thomas <emspishak@gmail.com>
parents: 5111
diff changeset
  1625
    The `hg evolve` command is an all purpose tool that solves all kinds of
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1626
    instabilities in your repository. Sometimes, instability resolution will lead
5210
b9b71fdea693 evolve: fix some documentation grammar/typos
Eric Spishak-Thomas <emspishak@gmail.com>
parents: 5111
diff changeset
  1627
    to merge conflicts that cannot be solved without human intervention (same as
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1628
    `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
  1629
    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
  1630
    situation:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1631
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1632
      - `hg evolve --continue`:
4676
b6c819facbe8 evolvecmd: the proper way to deal with conflicts is to resolve them
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  1633
         resolve all the conflicts using `hg resolve` and then run this to
b6c819facbe8 evolvecmd: the proper way to deal with conflicts is to resolve them
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  1634
         continue the interrupted evolve
3795
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1635
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1636
      - `hg evolve --stop`:
4265
4d62095d9fe6 evolve: fix a documentation typo
Eric Spishak-Thomas <spishak@google.com>
parents: 4235
diff changeset
  1637
         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
  1638
         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
  1639
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1640
      - `hg evolve --abort`:
b8b4ff86feb8 evolve: add a help topic `Interrupted-Evolve`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3794
diff changeset
  1641
         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
  1642
         happened
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1643
    """
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1644
    with repo.wlock(), repo.lock():
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1645
        return _performevolve(ui, repo, **opts)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1646
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1647
def _performevolve(ui, repo, **opts):
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1648
    opts = _checkevolveopts(repo, opts)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1649
    # Options
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1650
    contopt = opts['continue']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1651
    anyopt = opts['any']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1652
    allopt = opts['all']
4580
3ef96578da43 evolve: use --all by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4577
diff changeset
  1653
    if allopt is None:
3ef96578da43 evolve: use --all by default (BC)
Anton Shestakov <av6@dwimlabs.net>
parents: 4577
diff changeset
  1654
        allopt = True
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1655
    startnode = repo[b'.'].node()
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1656
    dryrunopt = opts['dry_run']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1657
    confirmopt = opts['confirm']
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1658
    revopt = opts['rev']
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1659
    stopopt = opts['stop']
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1660
    abortopt = opts['abort']
3774
4736d0bb81bf evolve: add an `--update` flag to `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3772
diff changeset
  1661
    shouldupdate = opts['update']
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1662
4762
75bc0a51809a py3: redefine "troublecategories" in evolve as a dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
  1663
    troublecategories = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1664
        b'phasedivergent': r'phase_divergent',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1665
        b'contentdivergent': r'content_divergent',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1666
        b'orphan': r'orphan',
4762
75bc0a51809a py3: redefine "troublecategories" in evolve as a dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
  1667
    }
75bc0a51809a py3: redefine "troublecategories" in evolve as a dict
Martin von Zweigbergk <martinvonz@google.com>
parents: 4752
diff changeset
  1668
    specifiedcategories = [k for k, v in troublecategories.items() if opts[v]]
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1669
    if opts['list']:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1670
        ui.pager(b'evolve')
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1671
        listtroubles(ui, repo, specifiedcategories, **opts)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1672
        return
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1673
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1674
    targetcat = b'orphan'
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1675
    if 1 < len(specifiedcategories):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1676
        msg = _(b'cannot specify more than one trouble category to solve (yet)')
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1677
        raise error.Abort(msg)
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1678
    elif len(specifiedcategories) == 1:
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1679
        targetcat = specifiedcategories[0]
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1680
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1681
    ui.setconfig(b'ui', b'forcemerge', opts.get('tool', r''), b'evolve')
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1682
3477
713e26a647f5 evolve: create a state object in all case
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3470
diff changeset
  1683
    evolvestate = state.cmdstate(repo)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1684
    # Continuation handling
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1685
    if contopt:
3556
b0438c9101ad evolve: load evolvestate before passing to continueevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3555
diff changeset
  1686
        if not evolvestate:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1687
            raise error.Abort(_(b'no interrupted evolve to continue'))
3556
b0438c9101ad evolve: load evolvestate before passing to continueevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3555
diff changeset
  1688
        evolvestate.load()
4603
8cc329d705f9 evolve: add progress support for --continue
Martin von Zweigbergk <martinvonz@google.com>
parents: 4602
diff changeset
  1689
        continueevolve(ui, repo, evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1690
        if evolvestate[b'command'] != b'evolve':
3558
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1691
            evolvestate.delete()
cec6e21b3bcf evolve: de-duplicate some function calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3557
diff changeset
  1692
            return
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1693
        startnode = repo.unfiltered()[evolvestate[b'startnode']]
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1694
        if b'update' in evolvestate:
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1695
            shouldupdate = evolvestate[b'update']
3557
77a400149758 evolve: move deletion of evolvestate out of continueevolve() function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3556
diff changeset
  1696
        evolvestate.delete()
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1697
    elif stopopt:
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1698
        if not evolvestate:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1699
            raise error.Abort(_(b'no interrupted evolve to stop'))
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1700
        evolvestate.load()
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1701
        stopevolve(ui, repo, evolvestate)
3577
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1702
        evolvestate.delete()
279d8b610ac5 evolve: add a `--stop` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3573
diff changeset
  1703
        return
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1704
    elif abortopt:
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1705
        if not evolvestate:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1706
            raise error.Abort(_(b'no interrupted evolve to abort'))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1707
        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
  1708
        # `hg next --evolve` in play
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1709
        if evolvestate[b'command'] != b'evolve':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1710
            pctx = repo[b'.']
3776
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1711
            hg.updaterepo(repo, pctx.node(), True)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1712
            ui.status(_(b'evolve aborted\n'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1713
            ui.status(_(b'working directory is now at %s\n')
3776
2d450974bb1c evolve: fix `hg abort` when hg next --evolve leads to conflicts (issue5897)
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3707
diff changeset
  1714
                      % pctx.hex()[:12])
3981
b4d0245c7f40 evolve: delete evolvestate after aborting interrupted `next --evolve`
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3978
diff changeset
  1715
            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
  1716
            return 0
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1717
        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
  1718
    else:
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1719
        cmdutil.bailifchanged(repo)
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1720
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1721
        obswdir = repo[b'.'].obsolete()
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1722
        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
  1723
4695
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1724
        if not (revs or obswdir):
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1725
            return _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1726
        obswdironly = not revs and obswdir
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1727
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1728
        if obswdir:
4348
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1729
            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
  1730
            if result != 0 or result is True:
4682
8195452be71d evolve: clarify why returning by adding inline doc
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4681
diff changeset
  1731
                # return as solving obswdp wasn't successful
4348
398c33b17d76 evolve: make sure we don't stop after evolution of obsparent (issue5881)
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4347
diff changeset
  1732
                return result
4695
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1733
        if obswdironly:
4c9f9dac8977 evolve: fix the code flow pattern of solving obswdir par and troubled revs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4694
diff changeset
  1734
            return 0
3470
ece5cd58147d evolve: move the evolve command to evolvecmd.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3469
diff changeset
  1735
4612
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1736
        # Progress handling
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1737
        seen = 1
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1738
        showprogress = allopt or revopt
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1739
        count = len(revs)
4612
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1740
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1741
        def progresscb():
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1742
            if showprogress:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1743
                compat.progress(ui, _(b'evolve'), seen, unit=_(b'changesets'),
4612
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1744
                                total=count)
c289f06028d0 evolve: move more of the progress-related variables together
Martin von Zweigbergk <martinvonz@google.com>
parents: 4611
diff changeset
  1745
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1746
        # Order the revisions
3845
5c964ebe4d4b evolve: always order the revs to be evolved
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3843
diff changeset
  1747
        revs = _orderrevs(repo, revs)
3480
1799fc777f30 evolve: store the target category in evolvestate
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3479
diff changeset
  1748
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1749
        # cbor does not know how to serialize sets, using list for skippedrevs
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1750
        stateopts = {b'category': targetcat, b'replacements': {},
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1751
                     b'revs': list(revs), b'confirm': confirmopt,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1752
                     b'startnode': startnode, b'skippedrevs': [],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1753
                     b'command': b'evolve', b'orphanmerge': False,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1754
                     b'bookmarkchanges': [], b'temprevs': [], b'obsmarkers': [],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1755
                     b'update': shouldupdate}
3555
60e132e20b14 evolve: move the handling for non-continue part in else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3554
diff changeset
  1756
        evolvestate.addopts(stateopts)
4122
4eb3877540f1 evovle: remove redundancy in evolve output
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4090
diff changeset
  1757
        # 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
  1758
        # 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
  1759
        lastsolved = None
4155
cc3a0b13ae57 evolve: use stack alias s# in `hg evolve` msgs
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4154
diff changeset
  1760
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1761
        activetopic = getattr(repo, 'currenttopic', b'')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1762
        tr = repo.transaction(b"evolve")
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1763
        with util.acceptintervention(tr):
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1764
            for rev in revs:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1765
                lastsolved = _solveonerev(ui, repo, rev, evolvestate,
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1766
                                          activetopic, dryrunopt,
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1767
                                          confirmopt, progresscb,
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1768
                                          targetcat, lastsolved)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1769
                seen += 1
3573
d53277cdc1e7 evolve: handle stabilization of merge changeset with both parents obsoleted
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3571
diff changeset
  1770
4601
e5aa1e23d146 evolve: move progress-clearing out of _cleanup()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4600
diff changeset
  1771
        if showprogress:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1772
            compat.progress(ui, _(b'evolve'), None)
4601
e5aa1e23d146 evolve: move progress-clearing out of _cleanup()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4600
diff changeset
  1773
e5aa1e23d146 evolve: move progress-clearing out of _cleanup()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4600
diff changeset
  1774
    _cleanup(ui, repo, startnode, 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
  1775
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1776
def _solveonerev(ui, repo, rev, evolvestate, activetopic, dryrunopt, confirmopt,
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1777
                 progresscb, targetcat, lastsolved):
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1778
    """solves one trouble, including orphan merges
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1779
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1780
    Like _solveone(), this solves one trouble. Unlike _solveone(), it
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1781
    stabilizes for both parents of orphan merges.
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1782
    """
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1783
    curctx = repo[rev]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1784
    revtopic = getattr(curctx, 'topic', lambda: b'')()
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1785
    topicidx = getattr(curctx, 'topicidx', lambda: None)()
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1786
    stacktmplt = False
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1787
    # check if revision being evolved is in active topic to make sure
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1788
    # that we can use stack aliases s# in evolve msgs.
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1789
    if activetopic and (activetopic == revtopic) and topicidx is not None:
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1790
        stacktmplt = True
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1791
    progresscb()
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1792
    ret = _solveone(ui, repo, curctx, evolvestate, dryrunopt,
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1793
                    confirmopt, progresscb, targetcat,
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1794
                    lastsolved=lastsolved, stacktmplt=stacktmplt)
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1795
    if ret[0]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1796
        evolvestate[b'replacements'][curctx.node()] = ret[1]
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1797
        lastsolved = ret[1]
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1798
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1799
        evolvestate[b'skippedrevs'].append(curctx.node())
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1800
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1801
    if evolvestate[b'orphanmerge']:
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1802
        # we were processing an orphan merge with both parents obsolete,
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1803
        # stabilized for second parent, re-stabilize for the first parent
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1804
        ret = _solveone(ui, repo, repo[ret[1]], evolvestate, dryrunopt,
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1805
                        confirmopt, progresscb, targetcat,
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1806
                        stacktmplt=stacktmplt)
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1807
        if ret[0]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1808
            evolvestate[b'replacements'][curctx.node()] = ret[1]
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1809
            lastsolved = ret[1]
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1810
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1811
            evolvestate[b'skippedrevs'].append(curctx.node())
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1812
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1813
        evolvestate[b'orphanmerge'] = False
4606
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1814
    return lastsolved
6c3f4cfa582e evolve: extract function for solving one revision, including merges
Martin von Zweigbergk <martinvonz@google.com>
parents: 4605
diff changeset
  1815
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1816
def solveobswdp(ui, repo, opts):
4378
0b97d4bea7e0 evolve: add description of function solveobswdp
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4377
diff changeset
  1817
    """this function updates to the successor of obsolete wdir parent"""
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1818
    oldid = repo[b'.'].node()
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1819
    startctx = repo[b'.']
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1820
    dryrunopt = opts.get('dry_run', False)
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
  1821
    displayer = logcmdutil.changesetdisplayer(ui, repo,
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5179
diff changeset
  1822
                                              {b'template': shorttemplate})
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1823
    try:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1824
        ctx = repo[utility._singlesuccessor(repo, repo[b'.'])]
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1825
    except utility.MultipleSuccessorsError as exc:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1826
        repo.ui.write_err(_(b'parent is obsolete with multiple'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1827
                            b' successors:\n'))
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1828
        for ln in exc.successorssets:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1829
            for n in ln:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1830
                displayer.show(repo[n])
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1831
        return 2
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1832
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1833
    ui.status(_(b'update:'))
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1834
    if not ui.quiet:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1835
        displayer.show(ctx)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1836
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1837
    if dryrunopt:
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1838
        return 0
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1839
    res = hg.update(repo, ctx.rev())
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1840
    newid = ctx.node()
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1841
4376
0fbf895ce160 evolve: make "startnode" consistently be a node, not a context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4375
diff changeset
  1842
    if ctx != startctx:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1843
        with repo.wlock(), repo.lock(), repo.transaction(b'evolve') as tr:
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1844
            bmupdater = rewriteutil.bookmarksupdater(repo, oldid, tr)
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1845
            bmupdater(newid)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1846
        ui.status(_(b'working directory is now at %s\n') % ctx)
4347
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1847
    return res
59745d6d626d evolve: extract "update" code into its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4344
diff changeset
  1848
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1849
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
  1850
    """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
  1851
    updated = False
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1852
    pctx = None
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1853
    divrelocated = evolvestate.get(b'relocated-div')
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1854
    otherrelocated = evolvestate.get(b'relocated-other')
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1855
    strips = []
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1856
    if divrelocated:
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1857
        strips.append(divrelocated)
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1858
    if otherrelocated:
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1859
        strips.append(otherrelocated)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1860
    if (evolvestate[b'command'] == b'evolve'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1861
        and evolvestate[b'category'] == b'contentdivergent'
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1862
        and strips):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1863
        oldother = evolvestate[b'old-other']
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1864
        olddiv = evolvestate[b'old-divergent']
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1865
        if olddiv:
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1866
            with repo.wlock(), repo.lock():
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1867
                repo = repo.unfiltered()
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1868
                hg.updaterepo(repo, olddiv, True)
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1869
                repair.strip(ui, repo, strips, False)
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1870
                updated = True
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1871
                pctx = repo[olddiv]
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  1872
        elif oldother:
3827
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1873
            with repo.wlock(), repo.lock():
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1874
                repo = repo.unfiltered()
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1875
                hg.updaterepo(repo, oldother, True)
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1876
                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
  1877
                updated = True
82c72eb37f85 evolve: strip the relocation commit on `hg evolve --stop`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3826
diff changeset
  1878
                pctx = repo[oldother]
3826
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1879
    if not updated:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1880
        pctx = repo[b'.']
3826
8e8bd5bb2f90 evolve: declare updated and pctx variables in stopevolve()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3825
diff changeset
  1881
        hg.updaterepo(repo, pctx.node(), True)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1882
    ui.status(_(b'stopped the interrupted evolve\n'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1883
    ui.status(_(b'working directory is now at %s\n') % pctx)
3824
a8f509981d30 evolve: factor out logic for --stop flag in separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3822
diff changeset
  1884
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1885
def abortevolve(ui, repo, evolvestate):
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1886
    """ 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
  1887
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1888
    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
  1889
        repo = repo.unfiltered()
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1890
        evolvedctx = []
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1891
        # 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
  1892
        cleanup = True
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1893
        startnode = evolvestate[b'startnode']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1894
        for old, new in evolvestate[b'replacements'].items():
3755
a19703c6d2bb evolve: check for None before adding in set of revisions to strip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3754
diff changeset
  1895
            if new:
a19703c6d2bb evolve: check for None before adding in set of revisions to strip
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3754
diff changeset
  1896
                evolvedctx.append(repo[new])
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1897
        for temp in evolvestate[b'temprevs']:
3757
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1898
            if temp:
2bc60fcac354 evolve: make `--abort` strip the temporary revs created during resolution
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3756
diff changeset
  1899
                evolvedctx.append(repo[temp])
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1900
        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
  1901
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1902
        # 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
  1903
        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
  1904
        if immutable:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1905
            repo.ui.warn(_(b"cannot clean up public changesets: %s\n")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1906
                         % b', '.join(bytes(c) for c in immutable),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1907
                         hint=_(b"see 'hg help phases' for details"))
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1908
            cleanup = False
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1909
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1910
    # checking no new changesets are created on evolved revs
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1911
    descendants = set()
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1912
    if evolvedrevs:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1913
        descendants = set(repo.changelog.descendants(evolvedrevs))
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1914
    if descendants - set(evolvedrevs):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1915
        repo.ui.warn(_(b"warning: new changesets detected on destination "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1916
                       b"branch\n"))
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1917
        cleanup = False
3832
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1918
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1919
    # finding the indices of the obsmarkers to be stripped and stripping
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1920
    # them
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1921
    if evolvestate[b'obsmarkers']:
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1922
        stripmarkers = set()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1923
        for m in evolvestate[b'obsmarkers']:
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1924
            m = (m[0], m[1])
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1925
            stripmarkers.add(m)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1926
        indices = []
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1927
        allmarkers = obsutil.getmarkers(repo)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1928
        for i, m in enumerate(allmarkers):
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1929
            marker = (m.prednode(), m.succnodes()[0])
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1930
            if marker in stripmarkers:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1931
                indices.append(i)
3832
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1932
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1933
        repair.deleteobsmarkers(repo.obsstore, indices)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1934
        repo.ui.debug(b'deleted %d obsmarkers\n' % len(indices))
3832
fb821ed44f86 evolve: strip the extra obsmarkers if any on `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3831
diff changeset
  1935
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1936
    if cleanup:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1937
        if evolvedrevs:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1938
            strippoints = [c.node()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1939
                           for c in repo.set(b'roots(%ld)', evolvedrevs)]
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1940
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1941
        # updating the working directory
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1942
        hg.updaterepo(repo, startnode, True)
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1943
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1944
        # Strip from the first evolved revision
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1945
        if evolvedrevs:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1946
            # no backup of evolved cset versions needed
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1947
            repair.strip(repo.ui, repo, strippoints, False)
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1948
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1949
        with repo.transaction(b'evolve') as tr:
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1950
            # restoring bookmarks at there original place
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1951
            bmchanges = evolvestate[b'bookmarkchanges']
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1952
            if bmchanges:
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1953
                repo._bookmarks.applychanges(repo, tr, bmchanges)
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1954
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1955
        evolvestate.delete()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1956
        ui.status(_(b'evolve aborted\n'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1957
        ui.status(_(b'working directory is now at %s\n')
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1958
                  % nodemod.hex(startnode)[:12])
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1959
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1960
        raise error.Abort(_(b"unable to abort interrupted evolve, use 'hg "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1961
                            b"evolve --stop' to stop evolve"))
3653
d9682c41ea2f evolve: restore bookmarks correctly after `hg evolve --abort`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3649
diff changeset
  1962
4798
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1963
def hgabortevolve(ui, repo):
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1964
    """logic for aborting evolve using 'hg abort'"""
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1965
    with repo.wlock(), repo.lock():
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1966
        evolvestate = state.cmdstate(repo)
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1967
        evolvestate.load()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1968
        if evolvestate[b'command'] != b'evolve':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1969
            pctx = repo[b'.']
4798
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1970
            hg.updaterepo(repo, pctx.node(), True)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1971
            ui.status(_(b'evolve aborted\n'))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1972
            ui.status(_(b'working directory is now at %s\n')
4798
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1973
                      % pctx.hex()[:12])
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1974
            evolvestate.delete()
4798
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1975
            return 0
2e14a9386316 abort: added support for evolve to hg abort
Taapas Agrawal <taapas2897@gmail.com>
parents: 4797
diff changeset
  1976
        return abortevolve(ui, repo, evolvestate)
3642
319b1f0f4de2 evolve: add a `--abort` flag for `hg evolve` command
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3640
diff changeset
  1977
4603
8cc329d705f9 evolve: add progress support for --continue
Martin von Zweigbergk <martinvonz@google.com>
parents: 4602
diff changeset
  1978
def continueevolve(ui, repo, evolvestate):
3554
f045fafd3484 evolve: move the logic of continuation handling of `hg evolve` in own fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3545
diff changeset
  1979
    """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
  1980
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1981
    ms = merge.mergestate.read(repo)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1982
    mergeutil.checkunresolved(ms)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1983
    if (evolvestate[b'command'] == b'next'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1984
        or evolvestate[b'category'] == b'orphan'):
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1985
        _completeorphan(ui, repo, evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1986
    elif evolvestate[b'category'] == b'phasedivergent':
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1987
        _completephasedivergent(ui, repo, evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1988
    elif evolvestate[b'category'] == b'contentdivergent':
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1989
        _continuecontentdivergent(ui, repo, evolvestate, None)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1990
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1991
        repo.ui.status(_(b"continuing interrupted '%s' resolution is not yet"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1992
                         b" supported\n") % evolvestate[b'category'])
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1993
        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
  1994
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1995
    # make sure we are continuing evolve and not `hg next --evolve`
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  1996
    if evolvestate[b'command'] != b'evolve':
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1997
        return
4589
5ba885e2ef5e evolve: reduce indentation with an early return statement
Martin von Zweigbergk <martinvonz@google.com>
parents: 4588
diff changeset
  1998
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  1999
    # Progress handling
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2000
    seen = 1
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2001
    count = len(evolvestate[b'revs'])
4603
8cc329d705f9 evolve: add progress support for --continue
Martin von Zweigbergk <martinvonz@google.com>
parents: 4602
diff changeset
  2002
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2003
    def progresscb():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2004
        compat.progress(ui, _(b'evolve'), seen, unit=_(b'changesets'),
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2005
                        total=count)
4603
8cc329d705f9 evolve: add progress support for --continue
Martin von Zweigbergk <martinvonz@google.com>
parents: 4602
diff changeset
  2006
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2007
    category = evolvestate[b'category']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2008
    confirm = evolvestate[b'confirm']
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2009
    unfi = repo.unfiltered()
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2010
    # lastsolved: keep track of successor of last troubled cset we
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2011
    # evolved to confirm that if atop msg should be suppressed to remove
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2012
    # redundancy
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2013
    lastsolved = None
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2014
    activetopic = getattr(repo, 'currenttopic', b'')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2015
    tr = repo.transaction(b"evolve")
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2016
    with util.acceptintervention(tr):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2017
        for rev in evolvestate[b'revs']:
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2018
            # XXX: prevent this lookup by storing nodes instead of revnums
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2019
            curctx = unfi[rev]
4221
db70de7c1698 evolve: use stack template in --continue case also
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4219
diff changeset
  2020
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2021
            # check if we can use stack template
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2022
            revtopic = getattr(curctx, 'topic', lambda: b'')()
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2023
            topicidx = getattr(curctx, 'topicidx', lambda: None)()
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2024
            stacktmplt = False
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2025
            if (activetopic and (activetopic == revtopic)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2026
                and topicidx is not None):
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2027
                stacktmplt = True
4608
fe22c36b5563 evolve: use single transaction also when continuing
Martin von Zweigbergk <martinvonz@google.com>
parents: 4607
diff changeset
  2028
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2029
            if (curctx.node() not in evolvestate[b'replacements']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2030
                and curctx.node() not in evolvestate[b'skippedrevs']):
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2031
                newnode = _solveone(ui, repo, curctx, evolvestate, False,
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2032
                                    confirm, progresscb, category,
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2033
                                    lastsolved=lastsolved,
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2034
                                    stacktmplt=stacktmplt)
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2035
                if newnode[0]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2036
                    evolvestate[b'replacements'][curctx.node()] = newnode[1]
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2037
                    lastsolved = newnode[1]
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2038
                else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2039
                    evolvestate[b'skippedrevs'].append(curctx.node())
4797
8c780c3eb116 evolve: fixed lock acquire before checking state
Taapas Agrawal <taapas2897@gmail.com>
parents: 4774
diff changeset
  2040
            seen += 1
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2041
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  2042
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
  2043
    """function to continue the interrupted content-divergence resolution."""
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2044
    tr = repo.transaction(b'evolve')
4594
fed1435757ba evolve: use util.acceptintervention() for closing transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4593
diff changeset
  2045
    with util.acceptintervention(tr):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2046
        divergent = evolvestate[b'divergent']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2047
        base = evolvestate[b'base']
3822
cb060c408b41 evolve: move logic to continue interrupted content-div resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3821
diff changeset
  2048
        repo = repo.unfiltered()
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2049
        if evolvestate[b'relocating-div']:
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2050
            newdiv = _completerelocation(ui, repo, evolvestate)
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2051
            current = repo[evolvestate[b'current']]
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2052
            obsolete.createmarkers(repo, [(current, (repo[newdiv],))],
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2053
                                   operation=b'evolve')
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  2054
            evolvestate[b'old-divergent'] = repo[divergent].node()
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2055
            evolvestate[b'relocating-div'] = False
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2056
            evolvestate[b'relocated-div'] = newdiv
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2057
            evolvestate[b'temprevs'].append(newdiv)
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2058
            evolvestate[b'divergent'] = newdiv
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2059
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2060
            relocatereq = evolvestate[b'relocation-req']
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2061
            if relocatereq:
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2062
                divergent = repo[evolvestate[b'divergent']]
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2063
                other = repo[evolvestate[b'other-divergent']]
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2064
                evolvestate[b'relocating-other'] = True
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2065
                ui.status(_(b'rebasing "other" content-divergent changeset %s on'
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2066
                            b' %s\n' % (other, divergent.p1())))
5333
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
  2067
                newother = _relocatedivergent(repo, other, divergent.p1(),
299d86c15b55 evolve: extract function for relocating divergent commit
Martin von Zweigbergk <martinvonz@google.com>
parents: 5310
diff changeset
  2068
                                              evolvestate)
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2069
                evolvestate[b'old-other'] = other.node()
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2070
                other = repo[newother]
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2071
                evolvestate[b'relocating-other'] = False
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2072
                evolvestate[b'relocated-other'] = other.node()
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2073
                evolvestate[b'temprevs'].append(other.node())
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2074
                evolvestate[b'other-divergent'] = other.node()
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2075
                # continue the resolution by merging the content-divergence
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2076
                _mergecontentdivergents(repo, progresscb,
5029
421b295e32b4 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5022
diff changeset
  2077
                                        divergent,
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2078
                                        repo[newother],
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2079
                                        repo[base],
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2080
                                        evolvestate)
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2081
5014
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
  2082
        if evolvestate[b'relocating-other']:
3881
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2083
            newother = _completerelocation(ui, repo, evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2084
            current = repo[evolvestate[b'current']]
3881
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2085
            obsolete.createmarkers(repo, [(current, (repo[newother],))],
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2086
                                   operation=b'evolve')
5014
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
  2087
            evolvestate[b'relocating-other'] = False
35870ce163ee evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5012
diff changeset
  2088
            evolvestate[b'relocated-other'] = newother
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2089
            evolvestate[b'temprevs'].append(newother)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2090
            evolvestate[b'other-divergent'] = newother
3881
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2091
            # continue the resolution by merging the content-divergence
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2092
            _mergecontentdivergents(repo, progresscb,
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2093
                                    repo[divergent],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2094
                                    repo[newother],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2095
                                    repo[base],
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2096
                                    evolvestate)
9cf45b94f977 evolve: continue conflicted relocation content-divergence
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3879
diff changeset
  2097
5016
64868b7dc112 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5014
diff changeset
  2098
        divergent = evolvestate[b'divergent']
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2099
        other = evolvestate[b'other-divergent']
5017
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2100
        res, newnode = _completecontentdivergent(ui, repo, progresscb,
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2101
                                                 repo[divergent],
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2102
                                                 repo[other],
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2103
                                                 repo[base],
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2104
                                                 evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2105
        origdivergent = evolvestate[b'orig-divergent']
5017
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2106
        evolvestate[b'replacements'][origdivergent] = newnode
b302066725c3 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5016
diff changeset
  2107
        ret = (res, newnode)
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2108
        # logic to continue the public content-divergent
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2109
        publicnode = evolvestate.get(b'public-divergent')
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  2110
        if publicnode:
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2111
            if not res:
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2112
                # 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
  2113
                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
  2114
            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
  2115
                # 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
  2116
                # 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
  2117
                pass
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2118
            else:
4415
29733c2b0fd3 evolve: rename npublicdiv to publicnode
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4414
diff changeset
  2119
                prec = repo[publicnode]
4414
29645d5ba3d9 evolve: in pubdiv resolution make sure that transaction get closed
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4413
diff changeset
  2120
                bumped = repo[newnode]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
  2121
                ret = _resolvephasedivergent(ui, repo, prec=prec, bumped=bumped)
4384
8993fd4805d0 evolve: update the public divergence resolution logic to cover --continue case
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4383
diff changeset
  2122
        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
  2123
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2124
def _completephasedivergent(ui, repo, evolvestate):
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2125
    """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
  2126
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2127
    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
  2128
    phase-divergence"""
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2129
4593
f6b9c409c12e evolve: use context manager for transactions
Martin von Zweigbergk <martinvonz@google.com>
parents: 4592
diff changeset
  2130
    # need to start transaction for bookmark changes
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2131
    with repo.transaction(b'evolve'):
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2132
        node = _completerelocation(ui, repo, evolvestate)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2133
        evolvestate[b'temprevs'].append(node)
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2134
        # 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
  2135
        # those cases
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2136
        ctx = repo[evolvestate[b'current']]
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2137
        newctx = repo[node] if node is not None else repo[b'.']
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2138
        obsolete.createmarkers(repo, [(ctx, (newctx,))], operation=b'evolve')
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2139
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2140
        # now continuing the phase-divergence resolution part
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2141
        prec = repo[evolvestate[b'precursor']]
4466
cc4506838589 evolve: remove tmpctx arg from _resolvephasedivergent()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4465
diff changeset
  2142
        retvalue = _resolvephasedivergent(ui, repo, prec, newctx)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2143
        evolvestate[b'replacements'][ctx.node()] = retvalue[1]
3633
ed3032ee53eb evolve: handle interrupted phase-divergence resolution gracefully
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3632
diff changeset
  2144
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2145
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
  2146
    """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
  2147
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2148
    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
  2149
    # 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
  2150
    # those cases
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2151
    ctx = repo[evolvestate[b'current']]
3636
92a2d3217de9 evolve: show a message when evolution leads to no changes to commit
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3635
diff changeset
  2152
    if node is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2153
        repo.ui.status(_(b"evolution of %d:%s created no changes"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2154
                         b" to commit\n") % (ctx.rev(), ctx))
4689
27947b17cfaf evolve: orphans that evolve into nothing don't need successors (issue5967)
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  2155
        replacement = ()
27947b17cfaf evolve: orphans that evolve into nothing don't need successors (issue5967)
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  2156
    else:
27947b17cfaf evolve: orphans that evolve into nothing don't need successors (issue5967)
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  2157
        replacement = (repo[node],)
27947b17cfaf evolve: orphans that evolve into nothing don't need successors (issue5967)
Anton Shestakov <av6@dwimlabs.net>
parents: 4641
diff changeset
  2158
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2159
    obsolete.createmarkers(repo, [(ctx, replacement)], operation=b'evolve')
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2160
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2161
    # make sure we are continuing evolve and not `hg next --evolve`
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2162
    if evolvestate[b'command'] == b'evolve':
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2163
        evolvestate[b'replacements'][ctx.node()] = node
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2164
        if evolvestate[b'orphanmerge']:
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2165
            # 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
  2166
            # 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
  2167
            # re-process to stabilize on first parent
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2168
            evolvestate[b'revs'].insert(0, repo[node].rev())
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2169
            evolvestate[b'orphanmerge'] = False
3630
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2170
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2171
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
  2172
    """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
  2173
    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
  2174
    """
2789c0ec2ad7 evolve: move logic to complete interrupted relocation to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3629
diff changeset
  2175
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2176
    orig = repo[evolvestate[b'current']]
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2177
    ctx = orig
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2178
    source = ctx.extra().get(b'source')
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2179
    extra = {}
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2180
    if source:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2181
        extra[b'source'] = source
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2182
        extra[b'intermediate-source'] = ctx.hex()
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2183
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2184
        extra[b'source'] = ctx.hex()
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2185
    user = ctx.user()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2186
    date = ctx.date()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2187
    message = ctx.description()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2188
    ui.status(_(b'evolving %d:%s "%s"\n') % (ctx.rev(), ctx,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2189
                                             message.split(b'\n', 1)[0]))
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2190
    targetphase = max(ctx.phase(), phases.draft)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2191
    overrides = {(b'phases', b'new-commit'): targetphase}
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2192
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2193
    ctxparents = orig.parents()
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2194
    if len(ctxparents) == 2:
5019
967e9a87e82d cleanup: replace .parents()[0] by .p1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5017
diff changeset
  2195
        currentp1 = repo.dirstate.p1()
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2196
        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
  2197
        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
  2198
        # 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
  2199
        # 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
  2200
        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
  2201
            # 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
  2202
            # 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
  2203
            # set dirstate parents to (succ of p1, p2)
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
  2204
            with repo.dirstate.parentchange(), compat.parentchange(repo):
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2205
                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
  2206
                                         ctxparents[1].node())
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2207
        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
  2208
            # 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
  2209
            # 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
  2210
            # set dirstate parents to (succ of p2, p1)
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
  2211
            with repo.dirstate.parentchange(), compat.parentchange(repo):
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2212
                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
  2213
                                         currentp1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2214
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2215
        else:
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2216
            # 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
  2217
            # are processing the second parent first (to keep parent order)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2218
            if evolvestate.get(b'orphanmerge'):
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
  2219
                with repo.dirstate.parentchange(), compat.parentchange(repo):
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2220
                    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
  2221
                                             currentp1)
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2222
            pass
3978
fb8e44c70798 evolve: set the second parent if we get conflicts while evolving
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 3977
diff changeset
  2223
    else:
5096
6742ce189373 compat: add a context manager that calls _quick_access_changeid_invalidate()
Anton Shestakov <av6@dwimlabs.net>
parents: 5095
diff changeset
  2224
        with repo.dirstate.parentchange(), compat.parentchange(repo):
5019
967e9a87e82d cleanup: replace .parents()[0] by .p1()
Martin von Zweigbergk <martinvonz@google.com>
parents: 5017
diff changeset
  2225
            repo.dirstate.setparents(repo.dirstate.p1(), nodemod.nullid)
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2226
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4812
diff changeset
  2227
    with repo.ui.configoverride(overrides, b'evolve-continue'):
3629
f23946bf6625 evolve: move logic to complete interrupted orphan resolution to new fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3628
diff changeset
  2228
        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
  2229
                           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
  2230
    return node