annotate hgext3rd/topic/stack.py @ 3827:82c72eb37f85

evolve: strip the relocation commit on `hg evolve --stop` While resolving content-divergence on multiple parents, we relocate one of the commit on the parent of another one and then merge the divergent changesets. Merging can leads to conflicts, and if user does `hg evolve --stop`, we need to strip that relocated changeset too! This patch does that. Test changes demonstrates the fix.
author Pulkit Goyal <7895pulkit@gmail.com>
date Mon, 11 Jun 2018 00:47:28 +0530
parents 753e5ebabe7d
children fb4801478d5d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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,
2838
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
8 context,
1936
31583ddda6d9 stack: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1925
diff changeset
9 error,
1961
d9c7fced94fc stack: prevent crash when topic is rooted on nullid
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1957
diff changeset
10 node,
2919
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
11 phases,
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
2838
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
23 # TODO: compat
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
24
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
25 if not util.safehasattr(context.basectx, 'orphan'):
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
26 context.basectx.orphan = context.basectx.unstable
1c9150e30b28 context: unstable was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2750
diff changeset
27
2839
f9c8c754a528 context: troubled was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2838
diff changeset
28 if not util.safehasattr(context.basectx, 'isunstable'):
f9c8c754a528 context: troubled was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2838
diff changeset
29 context.basectx.isunstable = context.basectx.troubled
f9c8c754a528 context: troubled was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2838
diff changeset
30
3371
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
31 def parseusername(user):
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
32 """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
33 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
34 username = None
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
35 if user:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
36 # 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
37 username = user.split('<')[0]
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
38 if not username:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
39 # 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
40 if len(user) > 1:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
41 username = user[1:-1]
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
42 else:
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
43 username = user
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
44 username = username.strip()
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
45
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
46 return username
753e5ebabe7d topics: take logic to parse username to a separate function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3278
diff changeset
47
3123
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
48 def _stackcandidates(repo):
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
49 """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
50
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
51 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
52 this area.
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
53 """
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
54 phasecache = repo._phasecache
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
55 if not phasecache._phasesets:
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
56 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
57 if any(s is None for s in phasecache._phasesets):
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
58 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
59
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
60 result = set()
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
61 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
62 result |= s
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
63
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
64 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
65 return result
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 class stack(object):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
68 """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
69
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
70 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
71 self._repo = repo
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
72 self.branch = branch
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
73 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
74 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
75
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
76 subset = _stackcandidates(repo)
237b39bf7e6b topic: instroduce a fast path when computing stack
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3085
diff changeset
77
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
78 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
79 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
80 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
81 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
82 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
83 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
84 else:
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
85 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
86 self._revs = trevs
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
87
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
88 def __iter__(self):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
89 return iter(self.revs)
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
90
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
91 def __getitem__(self, index):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
92 return self.revs[index]
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
93
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
94 def index(self, item):
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
95 return self.revs.index(item)
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
96
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
97 @util.propertycache
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
98 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
99 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
100
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
101 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
102 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
103
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
104 ### 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
105 #
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
106 # 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
107 # 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
108 #
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
109 # o t3
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 # o other
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
112 # |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
113 # o t2
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
114 # |
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
115 # o t1
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 pmap = {}
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
118
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
119 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
120 """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
121 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
122 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
123 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
124 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
125 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
126 return parents
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
127
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
128 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
129 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
130 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
131 seen = set()
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
132 stack = [root]
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
133 while stack:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
134 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
135 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
136 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
137 continue
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
138 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
139 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
140 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
141 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
142 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
143 # 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
144 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
145
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
146 return deps, rdeps
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
147
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
148 @util.propertycache
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
149 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
150 # 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
151 # 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
152
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
153 # 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
154 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
155 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
156 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
157 # 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
158 # 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
159 # 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
160 # 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
161 # 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
162 # built
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
163 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
164 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
165 revs = []
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
166 while solvablerevs:
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
167 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
168 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
169 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
170 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
171 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
172 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
173 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
174
5b514ab2ab4e stack: properly order stack when gaps existing inside it
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2918
diff changeset
175 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
176 # step 3: add t0
2914
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
177 if revs:
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
178 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
179 else:
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
180 pt1 = self._repo['.']
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
181
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
182 if pt1.obsolete():
9872526fc39f topic: show the t0 even if topic is not yet touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2937
diff changeset
183 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
184 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
185 return revs
9897babc1fb5 stack: introduce a rich stack object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2839
diff changeset
186
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
187 @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
188 def changesetcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
189 return len(self._revs)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
190
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
191 @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
192 def troubledcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
193 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
194
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
195 @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
196 def heads(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
197 revs = self.revs[1:]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
198 deps, rdeps = self._dependencies
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
199 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
200
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
201 @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
202 def behindcount(self):
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
203 revs = self.revs[1:]
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
204 deps, rdeps = self._dependencies
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
205 if revs:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
206 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
207 try:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
208 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
209 sourceset=minroot,
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
210 onheadcheck=False)
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
211 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
212 except error.NoMergeDestAbort:
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
213 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
214 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
215 # 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
216 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
217 return -1
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
218 return 0
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
219
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
220 @util.propertycache
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
221 def branches(self):
2936
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
222 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
223 if not branches:
3a9303b7b648 topics: show working directory branch when topic is empty
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2919
diff changeset
224 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
225 return branches
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
226
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
227 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
228 """ 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
229 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
230 """
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 return ' '.join(prefix % suffix for suffix in 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
232
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
233 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
234 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
235 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
236
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
237 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
238 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
239 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
240 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
241 elif topic 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
242 prefix = 't'
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
243 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
244 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
245 elif 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
246 prefix = 'b'
b933a8068c17 topic: add some initial support for using stack on named branch
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2668
diff changeset
247 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
248 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
249
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
250 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
251 prev = None
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
252 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
253 idxmap = {}
1995
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
254
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
255 label = 'topic'
54d6dff699f0 stack: add some header with the topic name
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1991
diff changeset
256 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
257 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
258
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
259 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
260 empty = False
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
261 if data['changesetcount'] == 0:
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
262 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
263 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
264 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
265 % 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
266 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
267
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
268 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
269 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
270 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
271 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
272 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
273 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
274 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
275 % '+'.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
276 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
277 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
278 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
279 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
280 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
281 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
282 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
283 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
284 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
285 fm.plain(', ')
3225
28fb347a5bf8 typos: fix typos in several locations
Kyle Lippincott <spectral@google.com>
parents: 3123
diff changeset
286 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
287 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
288 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
289 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
290 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
291 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
292
2937
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
293 if empty:
b54abc7e80e2 topics: improve the description if topic is not touched
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2936
diff changeset
294 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
295
2915
b3abdb3d819e stack: replace 'getstack' with direct call to 'stack'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2914
diff changeset
296 for idx, r in enumerate(stack(repo, branch=branch, topic=topic), 0):
1925
8f8a48a2e97d stack: whitespace
Sean Farley <sean@farley.io>
parents: 1924
diff changeset
297 ctx = repo[r]
2712
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
298 # 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
299 if idx == 0:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
300 # t0, b0 can be None
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
301 if r == -1:
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
302 continue
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
303 entries.append((idx, False, ctx))
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
304 prev = ctx.rev()
f19b314d8475 topics: add t0 and b0 to the stack
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2684
diff changeset
305 continue
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
306 p1 = ctx.p1()
2918
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
307 p2 = ctx.p2()
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
308 if p1.obsolete():
3278
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
309 try:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
310 p1 = repo[_singlesuccessor(repo, p1)]
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
311 except MultipleSuccessorsError as e:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
312 successors = e.successorssets
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
313 if len(successors) > 1:
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
314 # 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
315 raise
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
316 p1 = repo[successors[0][-1]]
e4c0332ecee4 topics: fix `hg stack` in case of split
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3225
diff changeset
317
2918
0437158e0ed6 stack: display both parent with displaying merge
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2916
diff changeset
318 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
319 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
320 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
321 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
322 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
323 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
324 idxmap[ctx.rev()] = idx
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
325 prev = r
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
326
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
327 # 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
328 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
329
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
330 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
331 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
332 iscurrentrevision = repo.revs('%d and parents()', ctx.rev())
5737e0680f10 ui: hg topic now display if current revision is in bad state (issue5533)
Boris Feld <boris.feld@octobus.net>
parents: 2341
diff changeset
333
3084
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
334 if iscurrentrevision:
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
335 states.append('current')
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
336 symbol = '@'
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
337
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
338 if ctx.orphan():
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
339 symbol = '$'
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
340 states.append('unstable')
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
341
1991
ba79d23594d6 stack: reusing the index number in base when applicable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1990
diff changeset
342 if not isentry:
1957
ea5553e47027 stack: change the ascii symbold for base
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1956
diff changeset
343 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
344 # "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
345 states.append('base')
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
346
144989dabe93 stack: show current and unstable also for t0 and bases
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3061
diff changeset
347 # 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
348 if not symbol:
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
349 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
350 states.append('clean')
3085
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
351
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
352 states.sort()
3eca2cbdc498 stack: order the adjective of changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3084
diff changeset
353
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1906
diff changeset
354 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
355 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
356
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
357 if idx is None:
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
358 fm.plain(' ')
2750
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
359 if ui.verbose:
bd3824d1b795 stack: show short node of changesets in `hg stack -v`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2712
diff changeset
360 fm.plain(' ')
1955
5452a575b4e5 topic: extract display from entry computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1954
diff changeset
361 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
362 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
363 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
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.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
366 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
367 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
368 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
369 fm.plain(' ')
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
370 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
371 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
372 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
373 ' (%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
374 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
375 fm.plain('\n')
2341
a5117a5becf8 ui: Fix hg stack json output
Boris Feld <boris.feld@octobus.net>
parents: 2003
diff changeset
376 fm.end()
1897
38570c53b1cf stack: fix printing order in case of unstability
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1896
diff changeset
377
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
378 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
379 """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
380
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1961
diff changeset
381 :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
382 :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
383 :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
384 :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
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 data = {}
2916
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
387 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
388 data['changesetcount'] = current.changesetcount
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
389 data['troubledcount'] = current.troubledcount
17749d9d3968 stack: move data computation on the object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2915
diff changeset
390 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
391 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
392 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
393 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
394 return data