hgext3rd/evolve/rewriteutil.py
author Sushil khanchi <sushilkhanchi97@gmail.com>
Mon, 04 Nov 2019 01:30:50 +0530
changeset 5230 39d282fd04e0
parent 5038 f583d9eedbce
child 5231 9d05eb69cd05
permissions -rw-r--r--
evolve: add pre-check logic for content-divergence in rewriteutil.precheck() For now, pre-check will abort if rewriting a rev create divergence (and config experimental.evolution.allowdivergence is not set to True). But this behaviour can be improved where instead of abort maybe we can confirm the user to either proceed with divergence or some other options depends on what command user is running. Changes in test file are used to overrides the pre-check for testing purpose (using experimental.evolution.allowdivergence=yes).
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,
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
    25
    phases,
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    26
    revset,
3506
6b4272bbb65d evolve: update code for not implicitly converting ctx to revision
Boris Feld <boris.feld@octobus.net>
parents: 3298
diff changeset
    27
    util,
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    28
)
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
    29
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
    30
from mercurial.i18n import _
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
    31
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    32
from . import (
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    33
    compat,
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    34
)
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    35
2780
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    36
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
    37
    """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
    38
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    39
    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
    40
    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
    41
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    42
        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
    43
    """
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    44
    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
    45
    numrevs = len(revs)
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    46
    if numrevs < maxrevs:
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    47
        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
    48
        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
    49
    else:
3151
41c72b6e8568 compat: drop compat code for smartrevs.first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2785
diff changeset
    50
        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
    51
        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
    52
        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
    53
    return summary
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    54
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    55
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
    56
    """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
    57
7d86d88b2fa8 rewriteutil: add a precheck function to validate rewrite beforehand
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2765
diff changeset
    58
    <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
    59
    """
2785
b5a48e4aeec6 precheck: handle rewrite attempt of nullrev
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2784
diff changeset
    60
    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
    61
        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
    62
        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
    63
        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
    64
    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
    65
        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
    66
        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
    67
        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
    68
    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
    69
    if publicrevs:
58e4b51ee902 prefetc: point at the offending changeset when aborting
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2779
diff changeset
    70
        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
    71
        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
    72
        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
    73
        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
    74
    newunstable = disallowednewunstable(repo, revs)
78b0c6053139 precheck: also check for unstability creation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2780
diff changeset
    75
    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
    76
        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
    77
        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
    78
        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
    79
        raise error.Abort(msg, hint=hint)
5230
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    80
    divrisk = revs_hascontentdivrisk(repo, revs)
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    81
    allowdivergence = repo.ui.configbool(b'experimental',
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    82
                                         b'evolution.allowdivergence')
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    83
    if divrisk and not allowdivergence:
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    84
        msg = _(b"revision being rewritten or one of its precursor was "
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    85
                b"rewritten as %s, performing '%s' will create "
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    86
                b"content-divergence") % (repo[divrisk[0]], action)
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    87
        hint = _(b"For more, see 'hg help evolution.instability'")
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
    88
        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
    89
2756
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    90
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
    91
    """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
    92
    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
    93
    """
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    94
    def updatebookmarks(newid):
f4dd6e6d4c73 rewriteutil: create a rewriteutil module to host utility function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
diff changeset
    95
        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
    96
        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
    97
        if bmchanges:
3699
67d6cc7e0979 compat: drop compatibility layer for bookmark.applychanges
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3506
diff changeset
    98
            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
    99
    return updatebookmarks
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   100
5230
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   101
def revs_hascontentdivrisk(repo, revs):
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   102
    obsrevs = repo.revs(b'%ld and obsolete()', revs)
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   103
    for r in obsrevs:
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   104
        div = contentdivrisk(repo, repo[r])
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   105
        if div:
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   106
            return div
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   107
    return []
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   108
2757
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   109
def disallowednewunstable(repo, revs):
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   110
    """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
   111
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   112
    (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
   113
    """
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   114
    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
   115
    if allowunstable:
2878c8a686ab rewriteutil: move disallowednewunstable in the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2756
diff changeset
   116
        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
   117
    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
   118
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   119
def foldcheck(repo, revs):
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   120
    """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
   121
    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
   122
    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
   123
    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
   124
        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
   125
                            b"(multiple roots given)"))
2758
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   126
    root = repo[roots.first()]
684feae20be5 rewriteutil: move 'foldcheck' to the new module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2757
diff changeset
   127
    if root.phase() <= phases.public:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   128
        raise error.Abort(_(b"cannot fold public revisions"))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   129
    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
   130
    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
   131
        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
   132
                            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
   133
    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
   134
    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
   135
    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
   136
        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
   137
                            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
   138
    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
   139
        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
   140
        if obsolete:
4845
6f5d3f58fbe4 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4841
diff changeset
   141
            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
   142
            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
   143
                     b' to allow folding them')
4841
95d2b5440731 rewriteutil: move allowdivergence check to foldcheck()
Anton Shestakov <av6@dwimlabs.net>
parents: 4723
diff changeset
   144
            raise error.Abort(msg, hint=hint)
4723
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   145
    # 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
   146
    baseparents -= {root.p1().rev()}
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   147
    p2 = repo[baseparents.first()]
41885988921e fold: allow operations on merge commits with some conditions
Anton Shestakov <av6@dwimlabs.net>
parents: 4714
diff changeset
   148
    return root, head, p2
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   149
2765
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   150
def deletebookmark(repo, repomarks, bookmarks):
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   151
    wlock = lock = tr = None
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   152
    try:
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   153
        wlock = repo.wlock()
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   154
        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
   155
        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
   156
        bmchanges = []
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   157
        for bookmark in bookmarks:
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   158
            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
   159
        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
   160
        tr.close()
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   161
        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
   162
            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
   163
    finally:
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   164
        lockmod.release(tr, lock, wlock)
8a2e1aac6b41 rewriteutil: move 'deletebookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2764
diff changeset
   165
2762
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   166
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
   167
    """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
   168
    """
610581a2fb74 commands: move split to the 'evocommands' module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2759
diff changeset
   169
    hg.update(repo, prev)
3751
a1a0cfbffd30 evolve: pass revisions as strings to commands.*()
Martin von Zweigbergk <martinvonz@google.com>
parents: 3699
diff changeset
   170
    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
   171
2764
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   172
def reachablefrombookmark(repo, revs, bookmarks):
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   173
    """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
   174
    yoinked from mq.py
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   175
    """
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   176
    repomarks = repo._bookmarks
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   177
    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
   178
        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
   179
                          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
   180
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   181
    # 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
   182
    # 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
   183
    # 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
   184
    nodetobookmarks = {}
4714
c51fc0ae7a7e py3: switch from iteritems() to items()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4710
diff changeset
   185
    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
   186
        nodetobookmarks.setdefault(bnode, []).append(mark)
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   187
    for marks in nodetobookmarks.values():
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   188
        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
   189
            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
   190
            revs = set(revs)
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   191
            revs.update(set(rsrevs))
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   192
            revs = sorted(revs)
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   193
    return repomarks, revs
a4a6f4128be5 rewriteutil: move 'reachablefrombookmark' to the module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2762
diff changeset
   194
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   195
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
   196
    """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
   197
    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
   198
    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
   199
    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
   200
    """
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   201
    wlock = lock = tr = None
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   202
    try:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   203
        wlock = repo.wlock()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   204
        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
   205
        tr = repo.transaction(b'rewrite')
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   206
        base = old.p1()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   207
        updatebookmarks = bookmarksupdater(repo, old.node(), tr)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   208
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   209
        # 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
   210
        # 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
   211
        files = set(old.files())
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   212
        for u in updates:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   213
            files.update(u.files())
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   214
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   215
        # 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
   216
        copied = copies.pathcopies(base, head)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   217
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   218
        # 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
   219
        def samefile(f):
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   220
            if f in head.manifest():
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   221
                a = head.filectx(f)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   222
                if f in base.manifest():
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   223
                    b = base.filectx(f)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   224
                    return (a.data() == b.data()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   225
                            and a.flags() == b.flags())
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   226
                else:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   227
                    return False
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   228
            else:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   229
                return f not in base.manifest()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   230
        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
   231
        # 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
   232
        headmf = head.manifest()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   233
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   234
        def filectxfn(repo, ctx, path):
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   235
            if path in headmf:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   236
                fctx = head[path]
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   237
                flags = fctx.flags()
3298
f4b06f44d274 memfilectx: changectx argument is not mandatory
Boris Feld <boris.feld@octobus.net>
parents: 3151
diff changeset
   238
                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
   239
                return mctx
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   240
            return None
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   241
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   242
        message = cmdutil.logmessage(repo.ui, commitopts)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   243
        if not message:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   244
            message = old.description()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   245
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
   246
        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
   247
        # 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
   248
        # 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
   249
        # 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
   250
        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
   251
        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
   252
        extra[b'branch'] = head.branch()
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   253
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   254
        new = context.memctx(repo,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   255
                             parents=newbases,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   256
                             text=message,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   257
                             files=files,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   258
                             filectxfn=filectxfn,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   259
                             user=user,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   260
                             date=date,
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   261
                             extra=extra)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   262
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
        if commitopts.get(b'edit'):
2759
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   264
            new._text = cmdutil.commitforceeditor(repo, new, [])
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   265
        revcount = len(repo)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   266
        newid = repo.commitctx(new)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   267
        new = repo[newid]
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   268
        created = len(repo) != revcount
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   269
        updatebookmarks(newid)
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   270
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   271
        tr.close()
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   272
        return newid, created
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   273
    finally:
3137185b1bfe rewriteutil: move the 'rewrite' function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2758
diff changeset
   274
        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
   275
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   276
def contentdivrisk(repo, ctx):
5230
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   277
    """return divergent revision if rewriting an obsolete cset (ctx) will
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   278
    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
   279
    # 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
   280
    # 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
   281
    #     detected by successorssets)
5230
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   282
    divergent = []
5038
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   283
    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
   284
    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
   285
                        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
   286
                            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
   287
                            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
   288
                        ))
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   289
    if nodivergencerisk:
f583d9eedbce evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 4845
diff changeset
   290
        # 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
   291
        #     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
   292
        from . import evolvecmd
5230
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   293
        divsets = evolvecmd.divergentsets(repo, ctx)
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   294
        if divsets:
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   295
            nsuccset = divsets[0][b'divergentnodes']
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   296
            divergent.append(nsuccset[0][0])
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   297
    else:
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   298
        divergent.append(sset[0][0])
39d282fd04e0 evolve: add pre-check logic for content-divergence in rewriteutil.precheck()
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 5038
diff changeset
   299
    return divergent