hgext3rd/topic/destination.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 22 Jun 2017 10:13:29 +0200
changeset 2653 13313d0cab71
parent 2017 dd1055f38397
child 2891 b18d2b2f18a6
permissions -rw-r--r--
topicmap: massive rework Massively rework the way we build and use topicmap. This bring massive performance benefit. Topic map use to be a fully independant thing that we would switch on and off globaly. The caching on disk was broken so the performance were atrocious. Intead, now the topic are inherited from the 'immutable' map. We gave up on storing them on disk for now since the mutable set is usually small enough. The activation is done by hacking new "filter" on the repository and detection when they are one. This is hacky but core is hard to wrap here. Overall this whole wrapping is really scary and we should massage core API to help it.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1933
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     1
from __future__ import absolute_import
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     2
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
     3
from mercurial.i18n import _
1933
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     4
from mercurial import (
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     5
    bookmarks,
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     6
    destutil,
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     7
    error,
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     8
    extensions,
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
     9
    util,
ca8674a8fce4 destination: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1912
diff changeset
    10
)
1986
042356d5ba59 ngtip: rely on topicmap for 'ngtip'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1984
diff changeset
    11
from . import topicmap
1983
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    12
from .evolvebits import builddependencies
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    13
1962
c00815786813 compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1941
diff changeset
    14
def _destmergebranch(orig, repo, action='merge', sourceset=None,
c00815786813 compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1941
diff changeset
    15
                     onheadcheck=True, destspace=None):
1967
c5d4e856ad0e destination: add an XXX about handling destspace in destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1964
diff changeset
    16
    # XXX: take destspace into account
1984
2a07df823588 destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1983
diff changeset
    17
    if sourceset is None:
2006
c817efec4afc flake8: fix E111 style
Sean Farley <sean@farley.io>
parents: 2005
diff changeset
    18
        p1 = repo['.']
1984
2a07df823588 destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1983
diff changeset
    19
    else:
2a07df823588 destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1983
diff changeset
    20
        # XXX: using only the max here is flacky. That code should eventually
2a07df823588 destination: honor the sourceset argument of _destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1983
diff changeset
    21
        # be updated to take care of the whole sourceset.
2006
c817efec4afc flake8: fix E111 style
Sean Farley <sean@farley.io>
parents: 2005
diff changeset
    22
        p1 = repo[max(sourceset)]
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    23
    top = p1.topic()
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    24
    if top:
1983
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    25
        revs = repo.revs('topic(%s) - obsolete()', top)
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    26
        deps, rdeps = builddependencies(repo, revs)
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    27
        heads = [r for r in revs if not rdeps[r]]
1981
b467fe430404 destmerge: honor the 'onheadcheck' argument
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1980
diff changeset
    28
        if onheadcheck and p1.rev() not in heads:
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    29
            raise error.Abort(_("not at topic head, update or explicit"))
1983
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    30
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    31
        # prune heads above the source
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    32
        otherheads = set(heads)
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    33
        pool = set([p1.rev()])
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    34
        while pool:
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    35
            current = pool.pop()
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    36
            otherheads.discard(current)
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    37
            pool.update(rdeps[current])
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    38
        if not otherheads:
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    39
            # nothing to do at the topic level
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    40
            bhead = ngtip(repo, p1.branch(), all=True)
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    41
            if not bhead:
1980
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    42
                raise error.NoMergeDestAbort(_("nothing to merge"))
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    43
            elif 1 == len(bhead):
1986
042356d5ba59 ngtip: rely on topicmap for 'ngtip'
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1984
diff changeset
    44
                return bhead[0]
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    45
            else:
1980
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    46
                msg = _("branch '%s' has %d heads "
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    47
                        "- please merge with an explicit rev")
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    48
                hint = _("run 'hg heads .' to see heads")
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    49
                raise error.ManyMergeDestAbort(msg % (p1.branch(), len(bhead)),
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    50
                                               hint=hint)
1983
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    51
        elif len(otherheads) == 1:
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    52
            return otherheads.pop()
4864ddc4c6d9 destmerge: improve topic head computation and handling
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1981
diff changeset
    53
        else:
1980
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    54
            msg = _("topic '%s' has %d heads "
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    55
                    "- please merge with an explicit rev") % (top, len(heads))
3c4a20244771 destination: use the correct abort class for error
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
    56
            raise error.ManyMergeDestAbort(msg)
1962
c00815786813 compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1941
diff changeset
    57
    if len(getattr(orig, 'func_defaults', ())) == 3: # version hg-3.7
1878
c44f161575ba compat: adapt to change in mercurial core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1871
diff changeset
    58
        return orig(repo, action, sourceset, onheadcheck)
1962
c00815786813 compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1941
diff changeset
    59
    if 3 < len(getattr(orig, 'func_defaults', ())): # version hg-3.8 and above
c00815786813 compat: adapt to the new destspace argument of destmerge
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1941
diff changeset
    60
        return orig(repo, action, sourceset, onheadcheck, destspace=destspace)
1878
c44f161575ba compat: adapt to change in mercurial core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1871
diff changeset
    61
    else:
c44f161575ba compat: adapt to change in mercurial core
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1871
diff changeset
    62
        return orig(repo)
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1870
diff changeset
    63
2017
dd1055f38397 compat: handle difference of signature for update destination hooks
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2006
diff changeset
    64
def _destupdatetopic(repo, clean, check=None):
1892
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    65
    """decide on an update destination from current topic"""
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    66
    movemark = node = None
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    67
    topic = repo.currenttopic
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    68
    revs = repo.revs('.::topic("%s")' % topic)
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    69
    if not revs:
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    70
        return None, None, None
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    71
    node = revs.last()
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    72
    if bookmarks.isactivewdirparent(repo):
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    73
        movemark = repo['.'].node()
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    74
    return node, movemark, None
b1fadc089b82 update: change default update destination to take topic in account
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1891
diff changeset
    75
1911
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    76
def desthistedit(orig, ui, repo):
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    77
    if not (ui.config('histedit', 'defaultrev', None) is None
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    78
            and repo.currenttopic):
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    79
        return orig(ui, repo)
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    80
    revs = repo.revs('::. and stack()')
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    81
    if revs:
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    82
        return revs.min()
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    83
    return None
442a7cb8404e histedit: restrict default edited set to current topic when possible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1902
diff changeset
    84
1870
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    85
def ngtip(repo, branch, all=False):
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    86
    """tip new generation"""
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    87
    ## search for untopiced heads of branch
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    88
    # could be heads((::branch(x) - topic()))
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    89
    # but that is expensive
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    90
    #
8dd5200b4086 topic: introduce a 'ngtip' concept
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    91
    # we should write plain code instead
2653
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    92
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    93
    tmap = topicmap.gettopicrepo(repo).branchmap()
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    94
    if branch not in tmap:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    95
        return []
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    96
    elif all:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    97
        return tmap.branchheads(branch)
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    98
    else:
13313d0cab71 topicmap: massive rework
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2017
diff changeset
    99
        return [tmap.branchtip(branch)]
1938
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   100
1941
7eb737b7a902 destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1940
diff changeset
   101
def modsetup(ui):
1940
6d53f81d3b64 destination: document 'setupdest'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1939
diff changeset
   102
    """run a uisetup time to install all destinations wrapping"""
1938
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   103
    if util.safehasattr(destutil, '_destmergebranch'):
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   104
        extensions.wrapfunction(destutil, '_destmergebranch', _destmergebranch)
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1967
diff changeset
   105
    try:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1967
diff changeset
   106
        rebase = extensions.find('rebase')
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1967
diff changeset
   107
    except KeyError:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1967
diff changeset
   108
        rebase = None
1938
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   109
    if (util.safehasattr(rebase, '_destrebase')
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   110
            # logic not shared with merge yet < hg-3.8
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   111
            and not util.safehasattr(rebase, '_definesets')):
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   112
        extensions.wrapfunction(rebase, '_destrebase', _destmergebranch)
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   113
    if util.safehasattr(destutil, 'destupdatesteps'):
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   114
        bridx = destutil.destupdatesteps.index('branch')
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   115
        destutil.destupdatesteps.insert(bridx, 'topic')
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   116
        destutil.destupdatestepmap['topic'] = _destupdatetopic
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   117
    if util.safehasattr(destutil, 'desthistedit'):
7e31d3e79806 destination: make sure 'setupdest' is the latest function in the module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1933
diff changeset
   118
        extensions.wrapfunction(destutil, 'desthistedit', desthistedit)