annotate hgext3rd/topic/__init__.py @ 1977:137f8b04901e

topic: list the number of changesets when --verbose is used Displaying more information in the topic list is useful, we start with the most obvious: number of non-obsolete changeset in the topic.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Fri, 12 Aug 2016 23:59:37 +0200
parents ebdc2a6a9a25
children e42dd4523c0d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
1 # __init__.py - topic extension
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
2 #
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
3 # This software may be used and distributed according to the terms of the
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
4 # GNU General Public License version 2 or any later version.
1846
0b5b757ca812 docs: fix format of extension docstring
Matt Mackall <mpm@selenic.com>
parents: 1845
diff changeset
5 """support for topic branches
0b5b757ca812 docs: fix format of extension docstring
Matt Mackall <mpm@selenic.com>
parents: 1845
diff changeset
6
0b5b757ca812 docs: fix format of extension docstring
Matt Mackall <mpm@selenic.com>
parents: 1845
diff changeset
7 Topic branches are lightweight branches which
0b5b757ca812 docs: fix format of extension docstring
Matt Mackall <mpm@selenic.com>
parents: 1845
diff changeset
8 disappear when changes are finalized.
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
9
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
10 This is sort of similar to a bookmark, but it applies to a whole
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
11 series instead of a single revision.
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
12 """
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
13 from __future__ import absolute_import
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
14
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
15 import re
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
16
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
17 from mercurial.i18n import _
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
18 from mercurial import (
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
19 branchmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
20 cmdutil,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
21 commands,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
22 context,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
23 error,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
24 extensions,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
25 localrepo,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
26 lock,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
27 merge,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
28 namespaces,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
29 node,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
30 obsolete,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
31 patch,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
32 phases,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
33 util,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
34 )
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
35
1932
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
36 from . import (
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
37 constants,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
38 revset as topicrevset,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
39 destination,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
40 stack,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
41 topicmap,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
42 discovery,
880aac9dbfa6 init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1918
diff changeset
43 )
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
44
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
45 cmdtable = {}
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
46 command = cmdutil.command(cmdtable)
1976
ebdc2a6a9a25 topic: add color for the active topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1975
diff changeset
47 colortable = {'topic.active': 'green',
ebdc2a6a9a25 topic: add color for the active topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1975
diff changeset
48 'topic.stack.index': 'yellow',
1909
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1908
diff changeset
49 'topic.stack.state.base': 'dim',
36112e361ee4 stack: display the base of the stack
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1908
diff changeset
50 'topic.stack.state.clean': 'green',
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
51 'topic.stack.index.current': 'cyan', # random pick
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
52 'topic.stack.state.current': 'cyan bold', # random pick
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
53 'topic.stack.desc.current': 'cyan', # random pick
1908
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
54 'topic.stack.state.unstable': 'red',
dbd6d51e63f1 stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1907
diff changeset
55 }
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
56
1972
04ce84b7b9d1 testedwith: update to 3.9
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1971
diff changeset
57 testedwith = '3.9'
1884
8a53f99d9061 testedwith: declare compatibility with Mercurial 3.7
Augie Fackler <raf@durin42.com>
parents: 1877
diff changeset
58
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
59 def _contexttopic(self):
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
60 return self.extra().get(constants.extrakey, '')
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
61 context.basectx.topic = _contexttopic
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
62
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
63 topicrev = re.compile(r'^t\d+$')
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
64
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
65 def _namemap(repo, name):
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
66 if topicrev.match(name):
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
67 idx = int(name[1:])
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
68 topic = repo.currenttopic
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
69 if not topic:
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
70 raise error.Abort(_('cannot resolve "%s": no active topic') % name)
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
71 revs = list(stack.getstack(repo, topic))
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
72 try:
1958
62d5d4206840 stack: also change the indexing of the t# reference
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1952
diff changeset
73 r = revs[idx - 1]
1904
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
74 except IndexError:
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
75 msg = _('cannot resolve "%s": topic "%s" has only %d changesets')
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
76 raise error.Abort(msg % (name, topic, len(revs)))
f52c02bf47b7 stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1903
diff changeset
77 return [repo[r].node()]
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
78 return [ctx.node() for ctx in
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
79 repo.set('not public() and extra(topic, %s)', name)]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
80
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
81 def _nodemap(repo, node):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
82 ctx = repo[node]
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
83 t = ctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
84 if t and ctx.phase() > phases.public:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
85 return [t]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
86 return []
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
87
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
88 def uisetup(ui):
1941
7eb737b7a902 destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1939
diff changeset
89 destination.modsetup(ui)
1943
cd56f4d8b5a3 revset: add a ui argument to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1942
diff changeset
90 topicrevset.modsetup(ui)
1944
daad8249d5cf discovery: move all setup into a 'modsetup' function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1943
diff changeset
91 discovery.modsetup(ui)
1952
665d6322994e uisetup: add call to 'topicmap.modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1951
diff changeset
92 topicmap.modsetup(ui)
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
93 setupimportexport(ui)
1871
58ef5699fb35 merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1867
diff changeset
94
1951
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
95 extensions.afterloaded('rebase', _fixrebase)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
96
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
97 entry = extensions.wrapcommand(commands.table, 'commit', commitwrap)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
98 entry[1].append(('t', 'topic', '',
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
99 _("use specified topic"), _('TOPIC')))
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
100
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
101 extensions.wrapfunction(cmdutil, 'buildcommittext', committextwrap)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
102 extensions.wrapfunction(merge, 'update', mergeupdatewrap)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
103 cmdutil.summaryhooks.add('topic', summaryhook)
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
104
0309cac5d91d uisetup: move all remaining wrapping into uisetup
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1950
diff changeset
105
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
106 def reposetup(ui, repo):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
107 orig = repo.__class__
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
108 if not isinstance(repo, localrepo.localrepository):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
109 return # this can be a peer in the ssh case (puzzling)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
110 class topicrepo(repo.__class__):
1903
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
111
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
112 def _restrictcapabilities(self, caps):
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
113 caps = super(topicrepo, self)._restrictcapabilities(caps)
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
114 caps.add('topics')
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
115 return caps
58cdf061d49a topic: don't take topic into account when pushing to non-topic repo
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1901
diff changeset
116
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
117 def commit(self, *args, **kwargs):
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
118 backup = self.ui.backupconfig('ui', 'allowemptycommit')
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
119 try:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
120 if repo.currenttopic != repo['.'].topic():
1858
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
121 # bypass the core "nothing changed" logic
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
122 self.ui.setconfig('ui', 'allowemptycommit', True)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
123 return orig.commit(self, *args, **kwargs)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
124 finally:
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
125 self.ui.restoreconfig(backup)
4ab1b854ce4e topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents: 1857
diff changeset
126
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
127 def commitctx(self, ctx, error=None):
1855
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
128 if isinstance(ctx, context.workingcommitctx):
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
129 current = self.currenttopic
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
130 if current:
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
131 ctx.extra()[constants.extrakey] = current
1862
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
132 if (isinstance(ctx, context.memctx) and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
133 ctx.extra().get('amend_source') and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
134 ctx.topic() and
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
135 not self.currenttopic):
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
136 # we are amending and need to remove a topic
565f057bdc08 amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents: 1861
diff changeset
137 del ctx.extra()[constants.extrakey]
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1948
diff changeset
138 with topicmap.usetopicmap(self):
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
139 return orig.commitctx(self, ctx, error=error)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
140
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
141 @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
142 def topics(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
143 topics = set(['', self.currenttopic])
1841
72a58a5bfb62 topic: use repo.set() where we need a changectx anyway
Augie Fackler <augie@google.com>
parents: 1839
diff changeset
144 for c in self.set('not public()'):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
145 topics.add(c.topic())
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
146 topics.remove('')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
147 return topics
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
148
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
149 @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
150 def currenttopic(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
151 return self.vfs.tryread('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
152
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
153 def branchmap(self, topic=True):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
154 if not topic:
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
155 super(topicrepo, self).branchmap()
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1948
diff changeset
156 with topicmap.usetopicmap(self):
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
157 branchmap.updatecache(self)
1888
dfaf0de6f4d8 topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1887
diff changeset
158 return self._topiccaches[self.filtername]
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
159
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
160 def destroyed(self, *args, **kwargs):
1949
79c08d17a3d7 topicmap: move the 'usetopicmap' context manager into the topicmap module
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1948
diff changeset
161 with topicmap.usetopicmap(self):
1889
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
162 return super(topicrepo, self).destroyed(*args, **kwargs)
d9b929bcc3ad topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1888
diff changeset
163
1885
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
164 def invalidatecaches(self):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
165 super(topicrepo, self).invalidatecaches()
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
166 if '_topiccaches' in vars(self.unfiltered()):
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
167 self.unfiltered()._topiccaches.clear()
d49f75eab6a3 topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1884
diff changeset
168
1886
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
169 def peer(self):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
170 peer = super(topicrepo, self).peer()
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
171 if getattr(peer, '_repo', None) is not None: # localpeer
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
172 class topicpeer(peer.__class__):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
173 def branchmap(self):
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
174 usetopic = not self._repo.publishing()
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
175 return self._repo.branchmap(topic=usetopic)
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
176 peer.__class__ = topicpeer
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
177 return peer
0504e76bfbd9 push: allow pushing new topic to non-publishing server by default
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1885
diff changeset
178
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
179 repo.__class__ = topicrepo
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
180 if util.safehasattr(repo, 'names'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
181 repo.names.addnamespace(namespaces.namespace(
1857
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
182 'topics', 'topic', namemap=_namemap, nodemap=_nodemap,
a506ed8ab8da topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents: 1856
diff changeset
183 listnames=lambda repo: repo.topics))
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
184
1847
9fa5b8f4e98e topics: add command summary
Matt Mackall <mpm@selenic.com>
parents: 1846
diff changeset
185 @command('topics [TOPIC]', [
1963
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
186 ('', 'clear', False, 'clear active topic if any'),
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
187 ('', 'change', '', 'revset of existing revisions to change topic'),
7b7f073ed05e style: update __init__.py
Sean Farley <sean@farley.io>
parents: 1958
diff changeset
188 ('l', 'list', False, 'show the stack of changeset in the topic'),
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1904
diff changeset
189 ] + commands.formatteropts)
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1904
diff changeset
190 def topics(ui, repo, topic='', clear=False, change=None, list=False, **opts):
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
191 """View current topic, set current topic, or see all topics."""
1895
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
192 if list:
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
193 if clear or change:
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
194 raise error.Abort(_("cannot use --clear or --change with --list"))
1907
95874e8fc5f2 stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1904
diff changeset
195 return stack.showstack(ui, repo, topic, opts)
1895
c8e4c6e03957 stack: add a very first version of stack display with 'hg topic --list'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1894
diff changeset
196
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
197 if change:
1851
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
198 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
199 raise error.Abort(_('must have obsolete enabled to use --change'))
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
200 if not topic and not clear:
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
201 raise error.Abort('changing topic requires a topic name or --clear')
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
202 if any(not c.mutable() for c in repo.set('%r and public()', change)):
1894
f8ee36489d3c topic: get 'Abort' from error, not 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1890
diff changeset
203 raise error.Abort("can't change topic of a public change")
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
204 rewrote = 0
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
205 needevolve = False
1856
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
206 l = repo.lock()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
207 txn = repo.transaction('rewrite-topics')
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
208 try:
1918
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
209 for c in repo.set('%r', change):
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
210 def filectxfn(repo, ctx, path):
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
211 try:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
212 return c[path]
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
213 except error.ManifestLookupError:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
214 return None
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
215 fixedextra = dict(c.extra())
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
216 ui.debug('old node id is %s\n' % node.hex(c.node()))
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
217 ui.debug('origextra: %r\n' % fixedextra)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
218 newtopic = None if clear else topic
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
219 oldtopic = fixedextra.get(constants.extrakey, None)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
220 if oldtopic == newtopic:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
221 continue
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
222 if clear:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
223 del fixedextra[constants.extrakey]
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
224 else:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
225 fixedextra[constants.extrakey] = topic
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
226 if 'amend_source' in fixedextra:
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
227 # TODO: right now the commitctx wrapper in
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
228 # topicrepo overwrites the topic in extra if
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
229 # amend_source is set to support 'hg commit
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
230 # --amend'. Support for amend should be adjusted
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
231 # to not be so invasive.
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
232 del fixedextra['amend_source']
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
233 ui.debug('changing topic of %s from %s to %s\n' % (
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
234 c, oldtopic, newtopic))
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
235 ui.debug('fixedextra: %r\n' % fixedextra)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
236 mc = context.memctx(
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
237 repo, (c.p1().node(), c.p2().node()), c.description(),
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
238 c.files(), filectxfn,
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
239 user=c.user(), date=c.date(), extra=fixedextra)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
240 newnode = repo.commitctx(mc)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
241 ui.debug('new node id is %s\n' % node.hex(newnode))
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
242 needevolve = needevolve or (len(c.children()) > 0)
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
243 obsolete.createmarkers(repo, [(c, (repo[newnode],))])
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
244 rewrote += 1
a840c5b5bbaf init: indent correctly
Sean Farley <sean@farley.io>
parents: 1917
diff changeset
245 txn.close()
1856
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
246 except:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
247 try:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
248 txn.abort()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
249 finally:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
250 repo.invalidate()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
251 raise
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
252 finally:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
253 lock.release(txn, l)
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
254 ui.status('changed topic on %d changes\n' % rewrote)
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
255 if needevolve:
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
256 evolvetarget = 'topic(%s)' % topic if topic else 'not topic()'
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
257 ui.status('please run hg evolve --rev "%s" now\n' % evolvetarget)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
258 if clear:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
259 if repo.vfs.exists('topic'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
260 repo.vfs.unlink('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
261 return
1860
b7b9e5028c2a topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents: 1859
diff changeset
262 if topic:
1971
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
263 with repo.wlock():
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
264 with repo.vfs.open('topic', 'w') as f:
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
265 f.write(topic)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
266 return
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
267 _listtopics(ui, repo, opts)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
268
1973
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
269 @command('stack [TOPIC]', [] + commands.formatteropts)
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
270 def cmdstack(ui, repo, topic='', **opts):
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
271 """list all changesets in a topic
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
272
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
273 List the current topic by default."""
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
274 return stack.showstack(ui, repo, topic, opts)
e97458bf53be stack: introduce and explicite command to display the stack
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1972
diff changeset
275
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
276 def _listtopics(ui, repo, opts):
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
277 fm = ui.formatter('bookmarks', opts)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
278 activetopic = repo.currenttopic
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
279 for topic in sorted(repo.topics):
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
280 fm.startitem()
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
281 marker = ' '
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
282 label = 'topic'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
283 active = (topic == activetopic)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
284 if active:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
285 marker = '*'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
286 label = 'topic.active'
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
287 if not ui.quiet:
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
288 # registering the active data is made explicitly later
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
289 fm.plain(' %s ' % marker, label=label)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
290 fm.write('topic', '%s', topic, label=label)
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
291 fm.data(active=active)
1977
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
292 if ui.verbose:
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
293 # XXX we should include the data even when not verbose
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
294 data = stack.stackdata(repo, topic)
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
295 fm.plain('\t(')
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
296 fm.write('changesetcount', '%d changesets', data['changesetcount'],
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
297 label='topic.list.changesetcount')
137f8b04901e topic: list the number of changesets when --verbose is used
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1976
diff changeset
298 fm.plain(')')
1975
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
299 fm.plain('\n')
acbbf7f0751e topic: add formatter support
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1974
diff changeset
300 fm.end()
1974
20fb4195bfc4 topic: extract the code listing all topics
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1973
diff changeset
301
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
302 def summaryhook(ui, repo):
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
303 t = repo.currenttopic
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
304 if not t:
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
305 return
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
306 # i18n: column positioning for "hg summary"
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
307 ui.write(_("topic: %s\n") % t)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
308
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
309 def commitwrap(orig, ui, repo, *args, **opts):
1971
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
310 with repo.wlock():
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
311 if opts.get('topic'):
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
312 t = opts['topic']
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
313 with repo.vfs.open('topic', 'w') as f:
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
314 f.write(t)
ec4924ea8bc6 topic: make sure we have the 'wlock' when setting topic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1969
diff changeset
315 return orig(ui, repo, *args, **opts)
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
316
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
317 def committextwrap(orig, repo, ctx, subs, extramsg):
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
318 ret = orig(repo, ctx, subs, extramsg)
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
319 t = repo.currenttopic
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
320 if t:
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
321 ret = ret.replace("\nHG: branch",
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
322 "\nHG: topic '%s'\nHG: branch" % t)
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
323 return ret
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
324
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
325 def mergeupdatewrap(orig, repo, node, branchmerge, force, *args, **kwargs):
1966
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
326 matcher = kwargs.get('matcher')
e67c526c0a25 update: calculate 'partial' as core does
Sean Farley <sean@farley.io>
parents: 1963
diff changeset
327 partial = not (matcher is None or matcher.always())
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
328 wlock = repo.wlock()
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
329 try:
1877
69077c65919d topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents: 1874
diff changeset
330 ret = orig(repo, node, branchmerge, force, *args, **kwargs)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
331 if not partial and not branchmerge:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
332 ot = repo.currenttopic
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
333 t = ''
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
334 pctx = repo[node]
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
335 if pctx.phase() > phases.public:
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
336 t = pctx.topic()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
337 with repo.vfs.open('topic', 'w') as f:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
338 f.write(t)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
339 if t and t != ot:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
340 repo.ui.status(_("switching to topic %s\n") % t)
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
341 return ret
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
342 finally:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
343 wlock.release()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
344
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
345 def _fixrebase(loaded):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
346 if not loaded:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
347 return
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
348
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
349 def savetopic(ctx, extra):
1861
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
350 if ctx.topic():
972d4e0c3d44 changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents: 1860
diff changeset
351 extra[constants.extrakey] = ctx.topic()
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
352
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
353 def newmakeextrafn(orig, copiers):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
354 return orig(copiers + [savetopic])
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
355
1969
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
356 try:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
357 rebase = extensions.find("rebase")
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
358 extensions.wrapfunction(rebase, '_makeextrafn', newmakeextrafn)
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
359 except KeyError:
a604423c1500 compat: tolerate missing rebase extension
timeless@gmail.com
parents: 1966
diff changeset
360 pass
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
361
1946
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
362 ## preserve topic during import/export
72246b13bd72 patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1945
diff changeset
363
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
364 def _exporttopic(seq, ctx):
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
365 topic = ctx.topic()
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
366 if topic:
1917
ea4675c7a028 init: whitespace fixups
Sean Farley <sean@farley.io>
parents: 1916
diff changeset
367 return 'EXP-Topic %s' % topic
1866
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
368 return None
13fc93fb7fbe patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1863
diff changeset
369
1867
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
370 def _importtopic(repo, patchdata, extra, opts):
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
371 if 'topic' in patchdata:
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
372 extra['topic'] = patchdata['topic']
c9cacc62fa17 patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1866
diff changeset
373
1948
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
374 def setupimportexport(ui):
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
375 """run at ui setup time to install import/export logic"""
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
376 cmdutil.extraexport.append('topic')
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
377 cmdutil.extraexportmap['topic'] = _exporttopic
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
378 cmdutil.extrapreimport.append('topic')
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
379 cmdutil.extrapreimportmap['topic'] = _importtopic
54810b543bf4 patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 1947
diff changeset
380 patch.patchheadermap.append(('EXP-Topic', 'topic'))