hgext3rd/evolve/rewriteutil.py
author Sushil khanchi <sushilkhanchi97@gmail.com>
Mon, 04 Nov 2019 00:18:55 +0530
changeset 5083 e50f4fc6cc6d
parent 5079 1f92a6aa40d6
child 5135 731b5a89a784
child 5243 e08900cf4b8b
permissions -rw-r--r--
evolve: remove a check which is already done by rewriteutil.precheck() We have tests to check if fold is being performed on public cset. There is no changes in test files because testing that never touched the part this patch removes, and already caught in rewriteutil.precheck()
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     1
# Module dedicated to host utility code dedicated to changeset rewrite
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     2
#
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     3
# Copyright 2017 Octobus <contact@octobus.net>
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     4
#
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     7
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     8
# Status: Stabilization of the API in progress
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
     9
#
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    10
#   The content of this module should move into core incrementally once we are
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    11
#   happy one piece of it (and hopefully, able to reuse it in other core
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    12
#   commands).
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    13
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    14
from mercurial import (
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
    15
    cmdutil,
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
    16
    commands,
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
    17
    context,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
    18
    copies,
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
    19
    error,
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
    20
    hg,
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
    21
    lock as lockmod,
2780
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    22
    node,
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    23
    obsolete,
5038
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
    24
    obsutil,
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    25
    revset,
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3298
diff changeset
    26
    util,
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    27
)
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    28
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
    29
from mercurial.i18n import _
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
    30
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    31
from . import (
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
    compat,
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
)
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
2780
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    35
def _formatrevs(repo, revs, maxrevs=4):
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    36
    """return a string summarising revision in a descent size
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    37
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    38
    If there is few enough revision, we list them otherwise we display a
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    39
    summary in the form:
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    40
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    41
        1ea73414a91b and 5 others
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    42
    """
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    43
    tonode = repo.changelog.node
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    44
    numrevs = len(revs)
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    45
    if numrevs < maxrevs:
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    46
        shorts = [node.short(tonode(r)) for r in revs]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    47
        summary = b', '.join(shorts)
2780
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    48
    else:
3151
41c72b6e8568 compat: drop compat code for smartrevs.first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2785
diff changeset
    49
        first = revs.first()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    50
        summary = _(b'%s and %d others')
2780
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    51
        summary %= (node.short(tonode(first)), numrevs - 1)
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    52
    return summary
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    53
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    54
def precheck(repo, revs, action=b'rewrite'):
2777
7d86d88b2fa8 rewriteutil: add a precheck function to validate rewrite beforehand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2765
diff changeset
    55
    """check if <revs> can be rewritten
7d86d88b2fa8 rewriteutil: add a precheck function to validate rewrite beforehand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2765
diff changeset
    56
7d86d88b2fa8 rewriteutil: add a precheck function to validate rewrite beforehand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2765
diff changeset
    57
    <action> can be used to control the commit message.
7d86d88b2fa8 rewriteutil: add a precheck function to validate rewrite beforehand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2765
diff changeset
    58
    """
2785
b5a48e4aeec6 precheck: handle rewrite attempt of nullrev
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2784
diff changeset
    59
    if node.nullrev in revs:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    60
        msg = _(b"cannot %s the null revision") % (action)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    61
        hint = _(b"no changeset checked out")
2785
b5a48e4aeec6 precheck: handle rewrite attempt of nullrev
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2784
diff changeset
    62
        raise error.Abort(msg, hint=hint)
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3298
diff changeset
    63
    if any(util.safehasattr(r, 'rev') for r in revs):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    64
        msg = b"rewriteutil.precheck called with ctx not revs"
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3298
diff changeset
    65
        repo.ui.develwarn(msg)
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3298
diff changeset
    66
        revs = (r.rev() for r in revs)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    67
    publicrevs = repo.revs(b'%ld and public()', revs)
2780
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    68
    if publicrevs:
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    69
        summary = _formatrevs(repo, publicrevs)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    70
        msg = _(b"cannot %s public changesets: %s") % (action, summary)
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    71
        hint = _(b"see 'hg help phases' for details")
2779
f51efb2bb8c9 precheck: point to 'phase' help when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2778
diff changeset
    72
        raise error.Abort(msg, hint=hint)
2781
78b0c6053139 precheck: also check for unstability creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2780
diff changeset
    73
    newunstable = disallowednewunstable(repo, revs)
78b0c6053139 precheck: also check for unstability creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2780
diff changeset
    74
    if newunstable:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    75
        msg = _(b"%s will orphan %i descendants")
2784
d17d193c4145 precheck: update the orphan message to something me generic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2783
diff changeset
    76
        msg %= (action, len(newunstable))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    77
        hint = _(b"see 'hg help evolution.instability'")
2781
78b0c6053139 precheck: also check for unstability creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2780
diff changeset
    78
        raise error.Abort(msg, hint=hint)
5079
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    79
    divrisk = revs_hascontentdivrisk(repo, revs)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    80
    allowdivergence = repo.ui.configbool(b'experimental',
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    81
                                         b'evolution.allowdivergence')
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    82
    if divrisk and not allowdivergence:
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    83
        localdiv = repo[divrisk[0]]
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    84
        otherdiv, base = repo[divrisk[1][0]], repo[divrisk[1][1]]
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    85
        msg = _(b"%s of %s creates content-divergence "
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    86
                b"with %s") % (action, localdiv, otherdiv)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    87
        if localdiv.rev() != base.rev():
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    88
            msg += _(b', from %s') % base
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    89
        hint = _(b"add --verbose for details or see "
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    90
                 b"'hg help evolution.instability'")
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    91
        if repo.ui.verbose:
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    92
            if localdiv.rev() != base.rev():
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    93
                msg += _(b'\n    changeset %s is an evolution of '
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    94
                         b'changeset %s') % (localdiv, base)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    95
            msg += _(b'\n    changeset %s already have a successors as '
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    96
                     b'changeset %s\n'
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    97
                     b'    rewriting changeset %s would create '
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    98
                     b'"content-divergence"\n'
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
    99
                     b'    set experimental.evolution.allowdivergence=True to '
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   100
                     b'overwrite this check') % (base, otherdiv, localdiv)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   101
            hint = _(b"see 'hg help evolution.instability' for details "
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   102
                     b"on content-divergence")
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   103
        raise error.Abort(msg, hint=hint)
2777
7d86d88b2fa8 rewriteutil: add a precheck function to validate rewrite beforehand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2765
diff changeset
   104
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   105
def bookmarksupdater(repo, oldid, tr):
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   106
    """Return a callable update(newid) updating the current bookmark
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   107
    and bookmarks bound to oldid to newid.
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   108
    """
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   109
    def updatebookmarks(newid):
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   110
        oldbookmarks = repo.nodebookmarks(oldid)
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   111
        bmchanges = [(b, newid) for b in oldbookmarks]
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   112
        if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3506
diff changeset
   113
            repo._bookmarks.applychanges(repo, tr, bmchanges)
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
   114
    return updatebookmarks
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   115
5079
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   116
def revs_hascontentdivrisk(repo, revs):
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   117
    obsrevs = repo.revs(b'%ld and obsolete()', revs)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   118
    for r in obsrevs:
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   119
        div = precheck_contentdiv(repo, repo[r])
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   120
        if div:
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   121
            return [r, div]
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   122
    return []
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   123
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   124
def disallowednewunstable(repo, revs):
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   125
    """Check that editing <revs> will not create disallowed unstable
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   126
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   127
    (unstable creation is controled by some special config).
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   128
    """
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   129
    allowunstable = obsolete.isenabled(repo, obsolete.allowunstableopt)
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   130
    if allowunstable:
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   131
        return revset.baseset()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   132
    return repo.revs(b"(%ld::) - %ld", revs, revs)
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   133
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   134
def foldcheck(repo, revs):
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   135
    """check that <revs> can be folded"""
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   136
    precheck(repo, revs, action=b'fold')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   137
    roots = repo.revs(b'roots(%ld)', revs)
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   138
    if len(roots) > 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   139
        raise error.Abort(_(b"cannot fold non-linear revisions "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   140
                            b"(multiple roots given)"))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   141
    heads = repo.revs(b'heads(%ld)', revs)
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   142
    if len(heads) > 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   143
        raise error.Abort(_(b"cannot fold non-linear revisions "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   144
                            b"(multiple heads given)"))
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   145
    head = repo[heads.first()]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   146
    baseparents = repo.revs(b'parents(%ld) - %ld', revs, revs)
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   147
    if len(baseparents) > 2:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   148
        raise error.Abort(_(b"cannot fold revisions that merge with more than "
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   149
                            b"one external changeset (not in revisions)"))
4845
6f5d3f58fbe4 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4841
diff changeset
   150
    if not repo.ui.configbool(b'experimental', b'evolution.allowdivergence'):
6f5d3f58fbe4 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4841
diff changeset
   151
        obsolete = repo.revs(b'%ld and obsolete()', revs)
4841
95d2b5440731 rewriteutil: move allowdivergence check to foldcheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   152
        if obsolete:
4845
6f5d3f58fbe4 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4841
diff changeset
   153
            msg = _(b'folding obsolete revisions may cause divergence')
6f5d3f58fbe4 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4841
diff changeset
   154
            hint = _(b'set experimental.evolution.allowdivergence=yes'
6f5d3f58fbe4 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4841
diff changeset
   155
                     b' to allow folding them')
4841
95d2b5440731 rewriteutil: move allowdivergence check to foldcheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   156
            raise error.Abort(msg, hint=hint)
5083
e50f4fc6cc6d evolve: remove a check which is already done by rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5079
diff changeset
   157
    root = repo[roots.first()]
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   158
    # root's p1 is already used as the target ctx p1
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   159
    baseparents -= {root.p1().rev()}
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   160
    p2 = repo[baseparents.first()]
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   161
    return root, head, p2
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   162
2765
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   163
def deletebookmark(repo, repomarks, bookmarks):
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   164
    wlock = lock = tr = None
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   165
    try:
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   166
        wlock = repo.wlock()
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   167
        lock = repo.lock()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   168
        tr = repo.transaction(b'prune')
2765
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   169
        bmchanges = []
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   170
        for bookmark in bookmarks:
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   171
            bmchanges.append((bookmark, None))
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3506
diff changeset
   172
        repo._bookmarks.applychanges(repo, tr, bmchanges)
2765
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   173
        tr.close()
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   174
        for bookmark in sorted(bookmarks):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   175
            repo.ui.write(_(b"bookmark '%s' deleted\n") % bookmark)
2765
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   176
    finally:
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   177
        lockmod.release(tr, lock, wlock)
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   178
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   179
def presplitupdate(repo, ui, prev, ctx):
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   180
    """prepare the working directory for a split (for topic hooking)
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   181
    """
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   182
    hg.update(repo, prev)
3751
a1a0cfbffd30 evolve: pass revisions as strings to commands.*()
Martin von Zweigbergk <martinvonz@google.com>
parents: 3699
diff changeset
   183
    commands.revert(ui, repo, rev=ctx.hex(), all=True)
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   184
2764
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   185
def reachablefrombookmark(repo, revs, bookmarks):
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   186
    """filter revisions and bookmarks reachable from the given bookmark
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   187
    yoinked from mq.py
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   188
    """
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   189
    repomarks = repo._bookmarks
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   190
    if not bookmarks.issubset(repomarks):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   191
        raise error.Abort(_(b"bookmark '%s' not found") %
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   192
                          b','.join(sorted(bookmarks - set(repomarks.keys()))))
2764
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   193
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   194
    # If the requested bookmark is not the only one pointing to a
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   195
    # a revision we have to only delete the bookmark and not strip
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   196
    # anything. revsets cannot detect that case.
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   197
    nodetobookmarks = {}
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4710
diff changeset
   198
    for mark, bnode in repomarks.items():
2764
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   199
        nodetobookmarks.setdefault(bnode, []).append(mark)
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   200
    for marks in nodetobookmarks.values():
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   201
        if bookmarks.issuperset(marks):
3767
115caa4e5278 evolve: add compat for repair.stripbmrevset which is moved to scmutil
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3751
diff changeset
   202
            rsrevs = compat.bmrevset(repo, marks[0])
2764
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   203
            revs = set(revs)
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   204
            revs.update(set(rsrevs))
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   205
            revs = sorted(revs)
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   206
    return repomarks, revs
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   207
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   208
def rewrite(repo, old, updates, head, newbases, commitopts):
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   209
    """Return (nodeid, created) where nodeid is the identifier of the
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   210
    changeset generated by the rewrite process, and created is True if
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   211
    nodeid was actually created. If created is False, nodeid
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   212
    references a changeset existing before the rewrite call.
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   213
    """
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   214
    wlock = lock = tr = None
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   215
    try:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   216
        wlock = repo.wlock()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   217
        lock = repo.lock()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   218
        tr = repo.transaction(b'rewrite')
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   219
        base = old.p1()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   220
        updatebookmarks = bookmarksupdater(repo, old.node(), tr)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   221
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   222
        # commit a new version of the old changeset, including the update
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   223
        # collect all files which might be affected
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   224
        files = set(old.files())
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   225
        for u in updates:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   226
            files.update(u.files())
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   227
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   228
        # Recompute copies (avoid recording a -> b -> a)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   229
        copied = copies.pathcopies(base, head)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   230
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   231
        # prune files which were reverted by the updates
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   232
        def samefile(f):
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   233
            if f in head.manifest():
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   234
                a = head.filectx(f)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   235
                if f in base.manifest():
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   236
                    b = base.filectx(f)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   237
                    return (a.data() == b.data()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   238
                            and a.flags() == b.flags())
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   239
                else:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   240
                    return False
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   241
            else:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   242
                return f not in base.manifest()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   243
        files = [f for f in files if not samefile(f)]
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   244
        # commit version of these files as defined by head
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   245
        headmf = head.manifest()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   246
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   247
        def filectxfn(repo, ctx, path):
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   248
            if path in headmf:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   249
                fctx = head[path]
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   250
                flags = fctx.flags()
3298
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3151
diff changeset
   251
                mctx = compat.memfilectx(repo, ctx, fctx, flags, copied, path)
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   252
                return mctx
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   253
            return None
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   254
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   255
        message = cmdutil.logmessage(repo.ui, commitopts)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   256
        if not message:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   257
            message = old.description()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   258
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4723
diff changeset
   259
        user = commitopts.get(b'user') or old.user()
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   260
        # TODO: In case not date is given, we should take the old commit date
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   261
        # if we are working one one changeset or mimic the fold behavior about
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   262
        # date
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4723
diff changeset
   263
        date = commitopts.get(b'date') or None
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4723
diff changeset
   264
        extra = dict(commitopts.get(b'extra', old.extra()))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   265
        extra[b'branch'] = head.branch()
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   266
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   267
        new = context.memctx(repo,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   268
                             parents=newbases,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   269
                             text=message,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   270
                             files=files,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   271
                             filectxfn=filectxfn,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   272
                             user=user,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   273
                             date=date,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   274
                             extra=extra)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   275
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4723
diff changeset
   276
        if commitopts.get(b'edit'):
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   277
            new._text = cmdutil.commitforceeditor(repo, new, [])
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   278
        revcount = len(repo)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   279
        newid = repo.commitctx(new)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   280
        new = repo[newid]
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   281
        created = len(repo) != revcount
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   282
        updatebookmarks(newid)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   283
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   284
        tr.close()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   285
        return newid, created
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   286
    finally:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   287
        lockmod.release(tr, lock, wlock)
5038
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   288
5078
66f01dd79f5d evolve: rename a function to make it explicit
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   289
def precheck_contentdiv(repo, ctx):
5079
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   290
    """return divergent revision if rewriting an obsolete cset (ctx) will
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   291
    create divergence"""
5038
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   292
    # We need to check two cases that can cause divergence:
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   293
    # case 1: the rev being rewritten has a non-obsolete successor (easily
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   294
    #     detected by successorssets)
5079
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   295
    divergent = [] # contains [divergent_cset, common_precursor]
5038
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   296
    sset = obsutil.successorssets(repo, ctx.node())
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   297
    nodivergencerisk = (len(sset) == 0
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   298
                        or (len(sset) == 1
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   299
                            and len(sset[0]) == 1
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   300
                            and repo[sset[0][0]].rev() == ctx.rev()
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   301
                        ))
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   302
    if nodivergencerisk:
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   303
        # case 2: one of the precursors of the rev being revived has a
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   304
        #     non-obsolete successor (we need divergentsets for this)
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   305
        from . import evolvecmd
5079
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   306
        divsets = evolvecmd.divergentsets(repo, ctx)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   307
        if divsets:
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   308
            nsuccset = divsets[0][b'divergentnodes']
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   309
            divergent.append(nsuccset[0])
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   310
            prec = divsets[0][b'commonprecursor']
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   311
            divergent.append(prec)
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   312
    else:
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   313
        divergent.append(sset[0][0])
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   314
        divergent.append(ctx.node())
1f92a6aa40d6 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5078
diff changeset
   315
    return divergent