hgext3rd/topic/stack.py
author Anton Shestakov <av6@dwimlabs.net>
Sat, 06 Apr 2019 15:49:22 +0200
changeset 4477 faf99d48eda9
parent 4474 931c8f6f4b1b
child 4478 94743877e50b
permissions -rw-r--r--
stack: fix phasecache._phasesets check logic When _phasesets is not None, it's a list, and it contains set()s of revisions in a specific phase, starting from public, draft, secret and so on. But since repos are supposed to have the majority of revisions in public phase, the first element of this list is not a (potentially huge) set, but None. Previously this code tried to check if there's any element that is None, and was always finding None at index 0, so the short path was executed every time and the rest of the function was never used.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1895
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     1
# stack.py - code related to stack workflow
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     2
#
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     3
# This software may be used and distributed according to the terms of the
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
     4
# GNU General Public License version 2 or any later version.
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
     5
from mercurial.i18n import _
1936
31583ddda6d9 stack: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1925
diff changeset
     6
from mercurial import (
1985
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1982
diff changeset
     7
    destutil,
1936
31583ddda6d9 stack: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1925
diff changeset
     8
    error,
1961
d9c7fced94fc stack: prevent crash when topic is rooted on nullid
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1957
diff changeset
     9
    node,
2919
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    10
    phases,
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    11
    obsolete,
2838
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
    12
    util,
1936
31583ddda6d9 stack: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1925
diff changeset
    13
)
3278
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    14
from .evolvebits import (
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    15
    _singlesuccessor,
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    16
    MultipleSuccessorsError,
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    17
    builddependencies,
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    18
)
1895
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
diff changeset
    19
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
    20
short = node.short
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
    21
3371
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    22
def parseusername(user):
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    23
    """parses the ctx user and returns the username without email ID if
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    24
    possible, otherwise returns the mail address from that"""
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    25
    username = None
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    26
    if user:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    27
        # user is of form "abc <abc@xyz.com>"
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    28
        username = user.split('<')[0]
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    29
        if not username:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    30
            # assuming user is of form "<abc@xyz.com>"
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    31
            if len(user) > 1:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    32
                username = user[1:-1]
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    33
            else:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    34
                username = user
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    35
        username = username.strip()
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    36
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    37
    return username
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    38
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    39
def _stackcandidates(repo):
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    40
    """build the smaller set of revs that might be part of a stack.
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    41
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    42
    The intend is to build something more efficient than what revsets do in
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    43
    this area.
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    44
    """
4477
faf99d48eda9 stack: fix phasecache._phasesets check logic
Anton Shestakov <av6@dwimlabs.net>
parents: 4474
diff changeset
    45
    phasesets = repo._phasecache._phasesets
faf99d48eda9 stack: fix phasecache._phasesets check logic
Anton Shestakov <av6@dwimlabs.net>
parents: 4474
diff changeset
    46
    if not phasesets or None in phasesets[phases.draft:]:
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    47
        return repo.revs('(not public()) - obsolete()')
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    48
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    49
    result = set()
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    50
    for s in phasecache._phasesets[phases.draft:]:
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    51
        result |= s
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    52
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    53
    result -= obsolete.getrevs(repo, 'obsolete')
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    54
    return result
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    55
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    56
class stack(object):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    57
    """object represent a stack and common logic associated to it."""
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    58
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    59
    def __init__(self, repo, branch=None, topic=None):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    60
        self._repo = repo
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    61
        self.branch = branch
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    62
        self.topic = topic
2939
7759d040d48d topic: provide more information when behind count cannot be computed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2938
diff changeset
    63
        self.behinderror = None
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    64
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    65
        subset = _stackcandidates(repo)
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    66
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    67
        if topic is not None and branch is not None:
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    68
            raise error.ProgrammingError('both branch and topic specified (not defined yet)')
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    69
        elif topic is not None:
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    70
            trevs = repo.revs("%ld and topic(%s)", subset, topic)
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    71
        elif branch is not None:
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    72
            trevs = repo.revs("%ld and branch(%s) - topic()", subset, branch)
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    73
        else:
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    74
            raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    75
        self._revs = trevs
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    76
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    77
    def __iter__(self):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    78
        return iter(self.revs)
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    79
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    80
    def __getitem__(self, index):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    81
        return self.revs[index]
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    82
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    83
    def index(self, item):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    84
        return self.revs.index(item)
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    85
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    86
    @util.propertycache
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
    87
    def _dependencies(self):
2919
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    88
        deps, rdeps = builddependencies(self._repo, self._revs)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    89
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    90
        repo = self._repo
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    91
        srcpfunc = repo.changelog.parentrevs
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    92
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    93
        ### post process to skip over possible gaps in the stack
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    94
        #
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    95
        # For example in the following situation, we need to detect that "t3"
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    96
        # indirectly depends on t2.
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    97
        #
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    98
        #  o t3
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    99
        #  |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   100
        #  o other
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   101
        #  |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   102
        #  o t2
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   103
        #  |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   104
        #  o t1
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   105
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   106
        pmap = {}
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   107
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   108
        def pfuncrev(repo, rev):
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   109
            """a special "parent func" that also consider successors"""
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   110
            parents = pmap.get(rev)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   111
            if parents is None:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   112
                parents = [repo[_singlesuccessor(repo, repo[p])].rev()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   113
                           for p in srcpfunc(rev) if 0 <= p]
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   114
                pmap[rev] = parents
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   115
            return parents
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   116
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   117
        revs = self._revs
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   118
        stackrevs = set(self._revs)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   119
        for root in [r for r in revs if not deps[r]]:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   120
            seen = set()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   121
            stack = [root]
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   122
            while stack:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   123
                current = stack.pop()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   124
                for p in pfuncrev(repo, current):
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   125
                    if p in seen:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   126
                        continue
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   127
                    seen.add(p)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   128
                    if p in stackrevs:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   129
                        rdeps[p].add(root)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   130
                        deps[root].add(p)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   131
                    elif phases.public < repo[p].phase():
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   132
                        # traverse only if we did not found a proper candidate
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   133
                        stack.append(p)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   134
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   135
        return deps, rdeps
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   136
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   137
    @util.propertycache
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   138
    def revs(self):
2919
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   139
        # some duplication/change from _orderrevs because we use a post
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   140
        # processed dependency graph.
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   141
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   142
        # Step 1: compute relation of revision with each other
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   143
        dependencies, rdependencies = self._dependencies
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   144
        dependencies = dependencies.copy()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   145
        rdependencies = rdependencies.copy()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   146
        # Step 2: Build the ordering
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   147
        # Remove the revisions with no dependency(A) and add them to the ordering.
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   148
        # Removing these revisions leads to new revisions with no dependency (the
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   149
        # one depending on A) that we can remove from the dependency graph and add
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   150
        # to the ordering. We progress in a similar fashion until the ordering is
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   151
        # built
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   152
        solvablerevs = [r for r in sorted(dependencies.keys())
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   153
                        if not dependencies[r]]
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   154
        revs = []
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   155
        while solvablerevs:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   156
            rev = solvablerevs.pop()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   157
            for dependent in rdependencies[rev]:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   158
                dependencies[dependent].remove(rev)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   159
                if not dependencies[dependent]:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   160
                    solvablerevs.append(dependent)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   161
            del dependencies[rev]
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   162
            revs.append(rev)
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   163
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   164
        revs.extend(sorted(dependencies))
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   165
        # step 3: add t0
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   166
        if revs:
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   167
            pt1 = self._repo[revs[0]].p1()
2938
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   168
        else:
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   169
            pt1 = self._repo['.']
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   170
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   171
        if pt1.obsolete():
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   172
            pt1 = self._repo[_singlesuccessor(self._repo, pt1)]
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   173
        revs.insert(0, pt1.rev())
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   174
        return revs
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   175
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   176
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   177
    def changesetcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   178
        return len(self._revs)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   179
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   180
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   181
    def troubledcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   182
        return len([r for r in self._revs if self._repo[r].isunstable()])
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   183
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   184
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   185
    def heads(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   186
        revs = self.revs[1:]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   187
        deps, rdeps = self._dependencies
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   188
        return [r for r in revs if not rdeps[r]]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   189
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   190
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   191
    def behindcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   192
        revs = self.revs[1:]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   193
        deps, rdeps = self._dependencies
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   194
        if revs:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   195
            minroot = [min(r for r in revs if not deps[r])]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   196
            try:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   197
                dest = destutil.destmerge(self._repo, action='rebase',
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   198
                                          sourceset=minroot,
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   199
                                          onheadcheck=False)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   200
                return len(self._repo.revs("only(%d, %ld)", dest, minroot))
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   201
            except error.NoMergeDestAbort:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   202
                return 0
2939
7759d040d48d topic: provide more information when behind count cannot be computed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2938
diff changeset
   203
            except error.ManyMergeDestAbort as exc:
7759d040d48d topic: provide more information when behind count cannot be computed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2938
diff changeset
   204
                # XXX we should make it easier for upstream to provide the information
7759d040d48d topic: provide more information when behind count cannot be computed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2938
diff changeset
   205
                self.behinderror = str(exc).split('-', 1)[0].rstrip()
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   206
                return -1
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   207
        return 0
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   208
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   209
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   210
    def branches(self):
2936
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
   211
        branches = sorted(set(self._repo[r].branch() for r in self._revs))
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
   212
        if not branches:
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
   213
            branches = set([self._repo[None].branch()])
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
   214
        return branches
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   215
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   216
def labelsgen(prefix, labelssuffix):
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   217
    """ Takes a label prefix and a list of suffixes. Returns a string of the prefix
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   218
    formatted with each suffix separated with a space.
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   219
    """
4435
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   220
    return ' '.join(prefix % suffix.replace(' ', '-') for suffix in labelssuffix)
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   221
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   222
def showstack(ui, repo, branch=None, topic=None, opts=None):
2668
1d2c66dc4ee3 topic: explicitly pass topic as a keyword argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2632
diff changeset
   223
    if opts is None:
1d2c66dc4ee3 topic: explicitly pass topic as a keyword argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2632
diff changeset
   224
        opts = {}
2627
42abd3bd30ee topics: abort if user wants to show the stack of a non-existent topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2626
diff changeset
   225
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   226
    if topic is not None and branch is not None:
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   227
        msg = 'both branch and topic specified [%s]{%s}(not defined yet)'
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   228
        msg %= (branch, topic)
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   229
        raise error.ProgrammingError(msg)
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   230
    elif topic is not None:
4067
fb4801478d5d stack: display 's#' instead of 't#' and 'b#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3371
diff changeset
   231
        prefix = 's'
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   232
        if topic not in repo.topics:
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   233
            raise error.Abort(_('cannot resolve "%s": no such topic found') % topic)
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   234
    elif branch is not None:
4067
fb4801478d5d stack: display 's#' instead of 't#' and 'b#'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3371
diff changeset
   235
        prefix = 's'
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   236
    else:
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   237
        raise error.ProgrammingError('neither branch and topic specified (not defined yet)')
2627
42abd3bd30ee topics: abort if user wants to show the stack of a non-existent topic
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2626
diff changeset
   238
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
   239
    fm = ui.formatter('topicstack', opts)
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   240
    prev = None
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   241
    entries = []
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   242
    idxmap = {}
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   243
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   244
    label = 'topic'
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   245
    if topic == repo.currenttopic:
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   246
        label = 'topic.active'
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   247
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   248
    data = stackdata(repo, branch=branch, topic=topic)
2937
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   249
    empty = False
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   250
    if data['changesetcount'] == 0:
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   251
        empty = True
2670
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   252
    if topic is not None:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   253
        fm.plain(_('### topic: %s')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   254
                 % ui.label(topic, label),
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   255
                 label='topic.stack.summary.topic')
1998
302be26a3fd8 stack: add warning about multiple heads
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1997
diff changeset
   256
2670
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   257
        if 1 < data['headcount']:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   258
            fm.plain(' (')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   259
            fm.plain('%d heads' % data['headcount'],
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   260
                     label='topic.stack.summary.headcount.multiple')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   261
            fm.plain(')')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   262
        fm.plain('\n')
2997
a61634f52742 topic: try to clarify the "branch" part in stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2939
diff changeset
   263
    fm.plain(_('### target: %s (branch)')
1996
5c40dd2cf131 stack: add some basic branch information
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1995
diff changeset
   264
             % '+'.join(data['branches']), # XXX handle multi branches
5c40dd2cf131 stack: add some basic branch information
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1995
diff changeset
   265
             label='topic.stack.summary.branches')
2670
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   266
    if topic is None:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   267
        if 1 < data['headcount']:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   268
            fm.plain(' (')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   269
            fm.plain('%d heads' % data['headcount'],
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   270
                     label='topic.stack.summary.headcount.multiple')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   271
            fm.plain(')')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   272
    else:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   273
        if data['behindcount'] == -1:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   274
            fm.plain(', ')
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3123
diff changeset
   275
            fm.plain('ambiguous rebase destination - %s' % data['behinderror'],
2939
7759d040d48d topic: provide more information when behind count cannot be computed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2938
diff changeset
   276
                     label='topic.stack.summary.behinderror')
2670
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   277
        elif data['behindcount']:
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   278
            fm.plain(', ')
f5d52fa1cd55 topic: move the heads data to the branch line when appropriates
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2669
diff changeset
   279
            fm.plain('%d behind' % data['behindcount'], label='topic.stack.summary.behindcount')
1997
ce86f7bb4b7b stack: add some behind information
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1996
diff changeset
   280
    fm.plain('\n')
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   281
2937
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   282
    if empty:
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   283
        fm.plain(_("(stack is empty)\n"))
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   284
4433
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   285
    st = stack(repo, branch=branch, topic=topic)
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   286
    for idx, r in enumerate(st, 0):
1925
8f8a48a2e97d stack: whitespace
Sean Farley <sean@farley.io>
parents: 1924
diff changeset
   287
        ctx = repo[r]
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   288
        # special case for t0, b0 as it's hard to plugin into rest of the logic
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   289
        if idx == 0:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   290
            # t0, b0 can be None
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   291
            if r == -1:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   292
                continue
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   293
            entries.append((idx, False, ctx))
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   294
            prev = ctx.rev()
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   295
            continue
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   296
        p1 = ctx.p1()
2918
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   297
        p2 = ctx.p2()
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   298
        if p1.obsolete():
3278
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   299
            try:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   300
                p1 = repo[_singlesuccessor(repo, p1)]
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   301
            except MultipleSuccessorsError as e:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   302
                successors = e.successorssets
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   303
                if len(successors) > 1:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   304
                    # case of divergence which we don't handle yet
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   305
                    raise
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   306
                p1 = repo[successors[0][-1]]
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   307
2918
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   308
        if p2.node() != node.nullid:
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   309
            entries.append((idxmap.get(p1.rev()), False, p1))
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   310
            entries.append((idxmap.get(p2.rev()), False, p2))
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   311
        elif p1.rev() != prev and p1.node() != node.nullid:
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   312
            entries.append((idxmap.get(p1.rev()), False, p1))
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   313
        entries.append((idx, True, ctx))
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   314
        idxmap[ctx.rev()] = idx
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   315
        prev = r
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   316
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   317
    # super crude initial version
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   318
    for idx, isentry, ctx in entries[::-1]:
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   319
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   320
        symbol = None
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   321
        states = []
4285
69fb9e41ce2b stack: add a --children flag to stack
James Reynolds <jreynolds@backstage.com>
parents: 4067
diff changeset
   322
        if opts.get('children'):
4433
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   323
            expr = 'children(%d) and merge() - %ld'
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   324
            revisions = repo.revs(expr, ctx.rev(), st.revs[1:])
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   325
            if len(revisions) > 0:
4434
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   326
                states.append('external-children')
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   327
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   328
        if ctx.orphan():
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   329
            symbol = '$'
4434
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   330
            states.append('orphan')
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   331
4435
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   332
        if ctx.contentdivergent():
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   333
            symbol = '$'
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   334
            states.append('content divergent')
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   335
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   336
        if ctx.phasedivergent():
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   337
            symbol = '$'
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   338
            states.append('phase divergent')
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   339
4436
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   340
        iscurrentrevision = repo.revs('%d and parents()', ctx.rev())
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   341
        if iscurrentrevision:
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   342
            symbol = '@'
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   343
            states.append('current')
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   344
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   345
        if not isentry:
1957
ea5553e47027 stack: change the ascii symbold for base
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1956
diff changeset
   346
            symbol = '^'
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   347
            # "base" is kind of a "ghost" entry
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   348
            states.append('base')
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   349
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   350
        # none of the above if statments get executed
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   351
        if not symbol:
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   352
            symbol = ':'
4434
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   353
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   354
        if not states:
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   355
            states.append('clean')
3085
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
   356
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
   357
        states.sort()
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
   358
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
   359
        fm.startitem()
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   360
        fm.data(isentry=isentry)
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   361
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   362
        if idx is None:
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   363
            fm.plain('  ')
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   364
            if ui.verbose:
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   365
                fm.plain('              ')
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   366
        else:
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   367
            fm.write('topic.stack.index', '%s%%d' % prefix, idx,
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   368
                     label='topic.stack.index ' + labelsgen('topic.stack.index.%s', states))
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   369
            if ui.verbose:
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   370
                fm.write('topic.stack.shortnode', '(%s)', short(ctx.node()),
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   371
                         label='topic.stack.shortnode ' + labelsgen('topic.stack.shortnode.%s', states))
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
   372
        fm.write('topic.stack.state.symbol', '%s', symbol,
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   373
                 label='topic.stack.state ' + labelsgen('topic.stack.state.%s', states))
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
   374
        fm.plain(' ')
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   375
        fm.write('topic.stack.desc', '%s', ctx.description().splitlines()[0],
2348
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   376
                 label='topic.stack.desc ' + labelsgen('topic.stack.desc.%s', states))
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   377
        fm.condwrite(states != ['clean'] and idx is not None, 'topic.stack.state',
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   378
                     ' (%s)', fm.formatlist(states, 'topic.stack.state'),
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
   379
                     label='topic.stack.state ' + labelsgen('topic.stack.state.%s', states))
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
   380
        fm.plain('\n')
2341
a5117a5becf8 ui: Fix hg stack json output
Boris Feld <boris.feld@octobus.net>
parents: 2003
diff changeset
   381
    fm.end()
1897
38570c53b1cf stack: fix printing order in case of unstability
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1896
diff changeset
   382
2669
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
   383
def stackdata(repo, branch=None, topic=None):
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
   384
    """get various data about a stack
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
   385
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
   386
    :changesetcount: number of non-obsolete changesets in the stack
1978
e42dd4523c0d topic: list the number of troubled changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1977
diff changeset
   387
    :troubledcount: number on troubled changesets
1979
bee7a1ef8ba8 topic: list the number of head when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1978
diff changeset
   388
    :headcount: number of heads on the topic
1985
03d6b685c16a topic: list the number of 'behind' changeset when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1982
diff changeset
   389
    :behindcount: number of changeset on rebase destination
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
   390
    """
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
   391
    data = {}
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   392
    current = stack(repo, branch, topic)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   393
    data['changesetcount'] = current.changesetcount
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   394
    data['troubledcount'] = current.troubledcount
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   395
    data['headcount'] = len(current.heads)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   396
    data['behindcount'] = current.behindcount
2939
7759d040d48d topic: provide more information when behind count cannot be computed
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2938
diff changeset
   397
    data['behinderror'] = current.behinderror
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   398
    data['branches'] = current.branches
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
   399
    return data