hgext3rd/topic/stack.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 07 Nov 2019 23:17:34 -0800
changeset 4949 eb9bcef7cc5f
parent 4839 485a9f3490c9
child 5220 76dc63c4131c
permissions -rw-r--r--
obslog: redefine default output as a template, unless -f was given This was easier than I expected to do without affecting any test output at all. `hg obslog -f` is pretty broken with templating. For example, it inserts a single "date" field, but it provides two values for it if the dates are different. That results in a traceback when running e.g. `hg obslog -f -Tfoo` with non-local obsmarkers with different dates. We need to figure out what we want to put in the template for the filtered case. I've just left it out for now.
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,
4759
f30c1fab7155 py3: convert exceptions to bytes using pycompat.bytestr()
Martin von Zweigbergk <martinvonz@google.com>
parents: 4658
diff changeset
    11
    pycompat,
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    12
    obsolete,
2838
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
    13
    util,
1936
31583ddda6d9 stack: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1925
diff changeset
    14
)
3278
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    15
from .evolvebits import (
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    16
    _singlesuccessor,
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    17
    MultipleSuccessorsError,
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    18
    builddependencies,
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
    19
)
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
    20
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
    21
short = node.short
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
    22
3371
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    23
def parseusername(user):
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    24
    """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
    25
    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
    26
    username = None
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    27
    if user:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    28
        # user is of form "abc <abc@xyz.com>"
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    29
        username = user.split(b'<')[0]
3371
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    30
        if not username:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    31
            # 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
    32
            if len(user) > 1:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    33
                username = user[1:-1]
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    34
            else:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    35
                username = user
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    36
        username = username.strip()
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    37
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    38
    return username
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
    39
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    40
def _stackcandidates(repo):
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    41
    """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
    42
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    43
    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
    44
    this area.
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    45
    """
4477
faf99d48eda9 stack: fix phasecache._phasesets check logic
Anton Shestakov <av6@dwimlabs.net>
parents: 4474
diff changeset
    46
    phasesets = repo._phasecache._phasesets
faf99d48eda9 stack: fix phasecache._phasesets check logic
Anton Shestakov <av6@dwimlabs.net>
parents: 4474
diff changeset
    47
    if not phasesets or None in phasesets[phases.draft:]:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    48
        return repo.revs(b'(not public()) - obsolete()')
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    49
4478
94743877e50b stack: improve set combination logic
Anton Shestakov <av6@dwimlabs.net>
parents: 4477
diff changeset
    50
    result = set.union(*phasesets[phases.draft:])
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    51
    result -= obsolete.getrevs(repo, b'obsolete')
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    52
    return result
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    53
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    54
class stack(object):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    55
    """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
    56
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    57
    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
    58
        self._repo = repo
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    59
        self.branch = branch
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    60
        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
    61
        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
    62
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    63
        subset = _stackcandidates(repo)
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
    64
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    65
        if topic is not None and branch is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    66
            raise error.ProgrammingError(b'both branch and topic specified (not defined yet)')
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    67
        elif topic is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    68
            trevs = repo.revs(b"%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
    69
        elif branch is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    70
            trevs = repo.revs(b"%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
    71
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
    72
            raise error.ProgrammingError(b'neither branch and topic specified (not defined yet)')
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    73
        self._revs = trevs
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    74
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    75
    def __iter__(self):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    76
        return iter(self.revs)
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    77
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    78
    def __getitem__(self, index):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    79
        return self.revs[index]
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    80
4651
55c347b4874f stack: implement __bool__ and __nonzero__
Anton Shestakov <av6@dwimlabs.net>
parents: 4650
diff changeset
    81
    def __nonzero__(self):
55c347b4874f stack: implement __bool__ and __nonzero__
Anton Shestakov <av6@dwimlabs.net>
parents: 4650
diff changeset
    82
        return bool(self._revs)
55c347b4874f stack: implement __bool__ and __nonzero__
Anton Shestakov <av6@dwimlabs.net>
parents: 4650
diff changeset
    83
55c347b4874f stack: implement __bool__ and __nonzero__
Anton Shestakov <av6@dwimlabs.net>
parents: 4650
diff changeset
    84
    __bool__ = __nonzero__
55c347b4874f stack: implement __bool__ and __nonzero__
Anton Shestakov <av6@dwimlabs.net>
parents: 4650
diff changeset
    85
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    86
    def index(self, item):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    87
        return self.revs.index(item)
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    88
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
    89
    @util.propertycache
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
    90
    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
    91
        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
    92
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    93
        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
    94
        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
    95
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    96
        ### 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
    97
        #
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
    98
        # 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
    99
        # 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
   100
        #
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   101
        #  o t3
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   102
        #  |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   103
        #  o other
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   104
        #  |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   105
        #  o t2
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   106
        #  |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   107
        #  o t1
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   108
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   109
        pmap = {}
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   110
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   111
        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
   112
            """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
   113
            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
   114
            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
   115
                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
   116
                           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
   117
                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
   118
            return parents
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   119
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   120
        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
   121
        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
   122
        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
   123
            seen = set()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   124
            stack = [root]
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   125
            while stack:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   126
                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
   127
                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
   128
                    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
   129
                        continue
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   130
                    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
   131
                    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
   132
                        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
   133
                        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
   134
                    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
   135
                        # 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
   136
                        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
   137
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   138
        return deps, rdeps
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   139
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   140
    @util.propertycache
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   141
    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
   142
        # 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
   143
        # 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
   144
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   145
        # Step 1: compute relation of revision with each other
4829
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   146
        origdeps, rdependencies = self._dependencies
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   147
        dependencies = {}
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   148
        # Making a deep copy of origdeps because we modify contents of values
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   149
        # later on. Checking for list here only because right now
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   150
        # builddependencies in evolvebits.py can return a list of _succs()
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   151
        # objects. When that will be dealt with, this deep copy code can be
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   152
        # simplified a lot.
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   153
        for k, v in origdeps.items():
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   154
            if isinstance(v, list):
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   155
                dependencies[k] = [i.copy() for i in v]
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   156
            else:
6b82b4f72347 stack: make a deep copy of `dependencies` before modifying its items
Anton Shestakov <av6@dwimlabs.net>
parents: 4828
diff changeset
   157
                dependencies[k] = v.copy()
2919
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   158
        # 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
   159
        # 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
   160
        # 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
   161
        # 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
   162
        # 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
   163
        # built
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   164
        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
   165
                        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
   166
        revs = []
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   167
        while solvablerevs:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   168
            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
   169
            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
   170
                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
   171
                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
   172
                    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
   173
            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
   174
            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
   175
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
   176
        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
   177
        # step 3: add t0
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   178
        if revs:
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   179
            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
   180
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   181
            pt1 = self._repo[b'.']
2938
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   182
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   183
        if pt1.obsolete():
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
   184
            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
   185
        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
   186
        return revs
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
   187
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   188
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   189
    def changesetcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   190
        return len(self._revs)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   191
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   192
    @util.propertycache
4581
48521a49a07e stack: rename troubledcount to unstablecount
Anton Shestakov <av6@dwimlabs.net>
parents: 4478
diff changeset
   193
    def unstablecount(self):
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   194
        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
   195
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   196
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   197
    def heads(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   198
        revs = self.revs[1:]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   199
        deps, rdeps = self._dependencies
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   200
        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
   201
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   202
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   203
    def behindcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   204
        revs = self.revs[1:]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   205
        deps, rdeps = self._dependencies
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   206
        if revs:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   207
            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
   208
            try:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   209
                dest = destutil.destmerge(self._repo, action=b'rebase',
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   210
                                          sourceset=minroot,
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   211
                                          onheadcheck=False)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   212
                return len(self._repo.revs(b"only(%d, %ld)", dest, minroot))
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   213
            except error.NoMergeDestAbort:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   214
                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
   215
            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
   216
                # XXX we should make it easier for upstream to provide the information
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   217
                self.behinderror = pycompat.bytestr(exc).split(b'-', 1)[0].rstrip()
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   218
                return -1
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   219
        return 0
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   220
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   221
    @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   222
    def branches(self):
2936
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
   223
        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
   224
        if not branches:
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
   225
            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
   226
        return branches
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
   227
4653
fd4f422b0b57 stack: leverage labelsgen() to produce all needed labels for fm.write()
Anton Shestakov <av6@dwimlabs.net>
parents: 4652
diff changeset
   228
def labelsgen(prefix, parts):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   229
    fmt = prefix + b'.%s'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   230
    return prefix + b' ' + b' '.join(fmt % p.replace(b' ', b'-') for p in parts)
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
   231
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
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
   233
    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
   234
        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
   235
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
    if topic is not None and branch is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   237
        msg = b'both branch and topic specified [%s]{%s}(not defined yet)'
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
   238
        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
   239
        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
   240
    elif topic is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   241
        prefix = b'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
   242
        if topic not in repo.topics:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   243
            raise error.Abort(_(b'cannot resolve "%s": no such topic found') % topic)
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
   244
    elif branch is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   245
        prefix = b'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
   246
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   247
        raise error.ProgrammingError(b'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
   248
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   249
    fm = ui.formatter(b'topicstack', opts)
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   250
    prev = None
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   251
    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
   252
    idxmap = {}
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   253
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   254
    label = b'topic'
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   255
    if topic == repo.currenttopic:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   256
        label = b'topic.active'
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   257
4650
7c05b1625921 stack: get stack data directly from stack and remove stackdata()
Anton Shestakov <av6@dwimlabs.net>
parents: 4649
diff changeset
   258
    st = stack(repo, branch, topic)
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
   259
    if topic is not None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   260
        fm.plain(_(b'### topic: %s')
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
   261
                 % ui.label(topic, label),
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   262
                 label=b'stack.summary.topic')
1998
302be26a3fd8 stack: add warning about multiple heads
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1997
diff changeset
   263
4650
7c05b1625921 stack: get stack data directly from stack and remove stackdata()
Anton Shestakov <av6@dwimlabs.net>
parents: 4649
diff changeset
   264
        if 1 < len(st.heads):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   265
            fm.plain(b' (')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   266
            fm.plain(b'%d heads' % len(st.heads),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   267
                     label=b'stack.summary.headcount.multiple')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   268
            fm.plain(b')')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   269
        fm.plain(b'\n')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   270
    fm.plain(_(b'### target: %s (branch)')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   271
             % b'+'.join(st.branches), # XXX handle multi branches
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   272
             label=b'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
   273
    if topic is None:
4650
7c05b1625921 stack: get stack data directly from stack and remove stackdata()
Anton Shestakov <av6@dwimlabs.net>
parents: 4649
diff changeset
   274
        if 1 < len(st.heads):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   275
            fm.plain(b' (')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   276
            fm.plain(b'%d heads' % len(st.heads),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   277
                     label=b'stack.summary.headcount.multiple')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   278
            fm.plain(b')')
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
   279
    else:
4650
7c05b1625921 stack: get stack data directly from stack and remove stackdata()
Anton Shestakov <av6@dwimlabs.net>
parents: 4649
diff changeset
   280
        if st.behindcount == -1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   281
            fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   282
            fm.plain(b'ambiguous rebase destination - %s' % st.behinderror,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   283
                     label=b'stack.summary.behinderror')
4650
7c05b1625921 stack: get stack data directly from stack and remove stackdata()
Anton Shestakov <av6@dwimlabs.net>
parents: 4649
diff changeset
   284
        elif st.behindcount:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   285
            fm.plain(b', ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   286
            fm.plain(b'%d behind' % st.behindcount, label=b'stack.summary.behindcount')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   287
    fm.plain(b'\n')
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
   288
4652
b72cd597a887 stack: check if stack is empty more pythonically
Anton Shestakov <av6@dwimlabs.net>
parents: 4651
diff changeset
   289
    if not st:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   290
        fm.plain(_(b"(stack is empty)\n"))
2937
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
   291
4433
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   292
    st = stack(repo, branch=branch, topic=topic)
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   293
    for idx, r in enumerate(st, 0):
1925
8f8a48a2e97d stack: whitespace
Sean Farley <sean@farley.io>
parents: 1924
diff changeset
   294
        ctx = repo[r]
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   295
        # 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
   296
        if idx == 0:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   297
            # t0, b0 can be None
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   298
            if r == -1:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   299
                continue
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   300
            entries.append((idx, False, ctx))
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   301
            prev = ctx.rev()
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
   302
            continue
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   303
        p1 = ctx.p1()
2918
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   304
        p2 = ctx.p2()
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
   305
        if p1.obsolete():
3278
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   306
            try:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   307
                p1 = repo[_singlesuccessor(repo, p1)]
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   308
            except MultipleSuccessorsError as e:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   309
                successors = e.successorssets
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   310
                if len(successors) > 1:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   311
                    # 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
   312
                    raise
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   313
                p1 = repo[successors[0][-1]]
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
   314
2918
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
   315
        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
   316
            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
   317
            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
   318
        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
   319
            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
   320
        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
   321
        idxmap[ctx.rev()] = idx
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   322
        prev = r
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   323
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   324
    # 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
   325
    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
   326
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   327
        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
   328
        states = []
4803
88472e743c64 python3: add byte prefix for objects that look like kwargs but aren't
Raphaël Gomès <rgomes@octobus.net>
parents: 4759
diff changeset
   329
        if opts.get(b'children'):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   330
            expr = b'children(%d) and merge() - %ld'
4649
6b7ad4b50d00 stack: use stack._revs instead of stack.revs[1:] in external children revset
Anton Shestakov <av6@dwimlabs.net>
parents: 4581
diff changeset
   331
            revisions = repo.revs(expr, ctx.rev(), st._revs)
4433
a19d8196b0c9 stack: optimize revset used for stack --children
Anton Shestakov <av6@dwimlabs.net>
parents: 4432
diff changeset
   332
            if len(revisions) > 0:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   333
                states.append(b'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
   334
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   335
        if ctx.orphan():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   336
            symbol = b'$'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   337
            states.append(b'orphan')
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   338
4435
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   339
        if ctx.contentdivergent():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   340
            symbol = b'$'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   341
            states.append(b'content divergent')
4435
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   342
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   343
        if ctx.phasedivergent():
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   344
            symbol = b'$'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   345
            states.append(b'phase divergent')
4435
7915aef191ff stack: show content and phase divergent state and symbol
Anton Shestakov <av6@dwimlabs.net>
parents: 4434
diff changeset
   346
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   347
        iscurrentrevision = repo.revs(b'%d and parents()', ctx.rev())
4436
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   348
        if iscurrentrevision:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   349
            symbol = b'@'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   350
            states.append(b'current')
4436
ef155f624670 stack: make @ (current) more important than $ (some sort of unstable)
Anton Shestakov <av6@dwimlabs.net>
parents: 4435
diff changeset
   351
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   352
        if not isentry:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   353
            symbol = b'^'
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
   354
            # "base" is kind of a "ghost" entry
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   355
            states.append(b'base')
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   356
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
   357
        # 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
   358
        if not symbol:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   359
            symbol = b':'
4434
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   360
432f2155d106 stack: handle external-children just like other states
Anton Shestakov <av6@dwimlabs.net>
parents: 4433
diff changeset
   361
        if not states:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   362
            states.append(b'clean')
3085
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
   363
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
   364
        states.sort()
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
   365
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
   366
        fm.startitem()
4654
0d05dcb8dd37 stack: provide context to formatter with non-default --template
Anton Shestakov <av6@dwimlabs.net>
parents: 4653
diff changeset
   367
        fm.context(ctx=ctx)
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
   368
        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
   369
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   370
        if idx is None:
4657
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   371
            spacewidth = 0
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   372
            if ui.verbose:
4657
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   373
                # parentheses plus short node hash
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   374
                spacewidth = 2 + 12
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   375
            if ui.debugflag:
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   376
                # parentheses plus full node hash
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   377
                spacewidth = 2 + 40
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   378
            # s# alias width
c24dabf8e848 stack: handle hash sizes when --debug flag is provided
Anton Shestakov <av6@dwimlabs.net>
parents: 4656
diff changeset
   379
            spacewidth += 2
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   380
            fm.plain(b' ' * spacewidth)
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
   381
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   382
            fm.write(b'stack_index', b'%s%%d' % prefix, idx,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   383
                     label=labelsgen(b'stack.index', states))
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
   384
            if ui.verbose:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   385
                fm.write(b'node', b'(%s)', fm.hexfunc(ctx.node()),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   386
                         label=labelsgen(b'stack.shortnode', states))
4656
dbf676c86244 stack: always provide (full) node hash to non-default --template
Anton Shestakov <av6@dwimlabs.net>
parents: 4655
diff changeset
   387
            else:
dbf676c86244 stack: always provide (full) node hash to non-default --template
Anton Shestakov <av6@dwimlabs.net>
parents: 4655
diff changeset
   388
                fm.data(node=fm.hexfunc(ctx.node()))
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   389
        fm.write(b'symbol', b'%s', symbol,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   390
                 label=labelsgen(b'stack.state', states))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   391
        fm.plain(b' ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   392
        fm.write(b'desc', b'%s', ctx.description().splitlines()[0],
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   393
                 label=labelsgen(b'stack.desc', states))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   394
        fm.condwrite(states != [b'clean'] and idx is not None, b'state',
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   395
                     b' (%s)', fm.formatlist(states, b'stack.state'),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   396
                     label=labelsgen(b'stack.state', states))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4803
diff changeset
   397
        fm.plain(b'\n')
2341
a5117a5becf8 ui: Fix hg stack json output
Boris Feld <boris.feld@octobus.net>
parents: 2003
diff changeset
   398
    fm.end()