Mercurial > evolve
annotate hgext3rd/topic/__init__.py @ 1948:54810b543bf4
patch: move setup of import/export logic into a function
The function is now called during uisetup.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Wed, 30 Mar 2016 22:05:49 -0700 |
parents | 3458aa1027e6 |
children | 79c08d17a3d7 |
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 |
1888
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
15 import contextlib |
1904
f52c02bf47b7
stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1903
diff
changeset
|
16 import re |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 |
1848
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
18 from mercurial.i18n import _ |
1932
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
19 from mercurial import ( |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
20 branchmap, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
21 changegroup, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
22 cmdutil, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
23 commands, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
24 context, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
25 error, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
26 extensions, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
27 localrepo, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
28 lock, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
29 merge, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
30 namespaces, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
31 node, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
32 obsolete, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
33 patch, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
34 phases, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
35 util, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
36 ) |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 |
1932
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
38 from . import ( |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
39 constants, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
40 revset as topicrevset, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
41 destination, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
42 stack, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
43 topicmap, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
44 discovery, |
880aac9dbfa6
init: move to new style import
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1918
diff
changeset
|
45 ) |
1843
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
1842
diff
changeset
|
46 |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 cmdtable = {} |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 command = cmdutil.command(cmdtable) |
1908
dbd6d51e63f1
stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1907
diff
changeset
|
49 colortable = {'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
|
50 '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
|
51 'topic.stack.state.clean': 'green', |
1908
dbd6d51e63f1
stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1907
diff
changeset
|
52 'topic.stack.index.current': 'cyan', # random pick |
dbd6d51e63f1
stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1907
diff
changeset
|
53 'topic.stack.state.current': 'cyan bold', # random pick |
dbd6d51e63f1
stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1907
diff
changeset
|
54 'topic.stack.desc.current': 'cyan', # random pick |
dbd6d51e63f1
stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1907
diff
changeset
|
55 'topic.stack.state.unstable': 'red', |
dbd6d51e63f1
stack: add some default color configuration
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1907
diff
changeset
|
56 } |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
57 |
1884
8a53f99d9061
testedwith: declare compatibility with Mercurial 3.7
Augie Fackler <raf@durin42.com>
parents:
1877
diff
changeset
|
58 testedwith = '3.7' |
8a53f99d9061
testedwith: declare compatibility with Mercurial 3.7
Augie Fackler <raf@durin42.com>
parents:
1877
diff
changeset
|
59 |
1861
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
60 def _contexttopic(self): |
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
61 return self.extra().get(constants.extrakey, '') |
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
62 context.basectx.topic = _contexttopic |
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
63 |
1904
f52c02bf47b7
stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1903
diff
changeset
|
64 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
|
65 |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
66 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
|
67 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
|
68 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
|
69 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
|
70 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
|
71 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
|
72 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
|
73 try: |
f52c02bf47b7
stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1903
diff
changeset
|
74 r = revs[idx] |
f52c02bf47b7
stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1903
diff
changeset
|
75 except IndexError: |
f52c02bf47b7
stack: allow to refer to changeset using "t2" form
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1903
diff
changeset
|
76 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
|
77 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
|
78 return [repo[r].node()] |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
79 return [ctx.node() for ctx in |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
80 repo.set('not public() and extra(topic, %s)', name)] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
81 |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
82 def _nodemap(repo, node): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
83 ctx = repo[node] |
1861
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
84 t = ctx.topic() |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
85 if t and ctx.phase() > phases.public: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
86 return [t] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
87 return [] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
88 |
1871
58ef5699fb35
merge: use topic to pick default destination
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1867
diff
changeset
|
89 def uisetup(ui): |
1941
7eb737b7a902
destination: rename 'setupdest' to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1939
diff
changeset
|
90 destination.modsetup(ui) |
1943
cd56f4d8b5a3
revset: add a ui argument to 'modsetup'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1942
diff
changeset
|
91 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
|
92 discovery.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 |
1888
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
95 @contextlib.contextmanager |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
96 def usetopicmap(repo): |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
97 """use awful monkey patching to update the topic cache""" |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
98 oldbranchcache = branchmap.branchcache |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
99 oldfilename = branchmap._filename |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1889
diff
changeset
|
100 oldread = branchmap.read |
1917 | 101 oldcaches = getattr(repo, '_branchcaches', {}) |
1888
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
102 try: |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
103 branchmap.branchcache = topicmap.topiccache |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
104 branchmap._filename = topicmap._filename |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1889
diff
changeset
|
105 branchmap.read = topicmap.readtopicmap |
1888
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
106 repo._branchcaches = getattr(repo, '_topiccaches', {}) |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
107 yield |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
108 repo._topiccaches = repo._branchcaches |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
109 finally: |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
110 repo._branchcaches = oldcaches |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
111 branchmap.branchcache = oldbranchcache |
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
112 branchmap._filename = oldfilename |
1890
e846b8f402d0
topicmap: write and read format from disc
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1889
diff
changeset
|
113 branchmap.read = oldread |
1888
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
114 |
1889
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
115 def cgapply(orig, repo, *args, **kwargs): |
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
116 with usetopicmap(repo): |
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
117 return orig(repo, *args, **kwargs) |
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
118 |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
119 def reposetup(ui, repo): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
120 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
|
121 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
|
122 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
|
123 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
|
124 |
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
|
125 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
|
126 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
|
127 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
|
128 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
|
129 |
1858
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
130 def commit(self, *args, **kwargs): |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
131 backup = self.ui.backupconfig('ui', 'allowemptycommit') |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
132 try: |
1861
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
133 if repo.currenttopic != repo['.'].topic(): |
1858
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
134 # bypass the core "nothing changed" logic |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
135 self.ui.setconfig('ui', 'allowemptycommit', True) |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
136 return orig.commit(self, *args, **kwargs) |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
137 finally: |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
138 self.ui.restoreconfig(backup) |
4ab1b854ce4e
topics: allow commits that only change topic (issue4725)
Matt Mackall <mpm@selenic.com>
parents:
1857
diff
changeset
|
139 |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
140 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
|
141 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
|
142 current = self.currenttopic |
f241a00e93a7
topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents:
1854
diff
changeset
|
143 if current: |
f241a00e93a7
topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents:
1854
diff
changeset
|
144 ctx.extra()[constants.extrakey] = current |
1862
565f057bdc08
amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents:
1861
diff
changeset
|
145 if (isinstance(ctx, context.memctx) and |
565f057bdc08
amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents:
1861
diff
changeset
|
146 ctx.extra().get('amend_source') and |
565f057bdc08
amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents:
1861
diff
changeset
|
147 ctx.topic() and |
565f057bdc08
amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents:
1861
diff
changeset
|
148 not self.currenttopic): |
565f057bdc08
amend: allow clearing topics on amend
Matt Mackall <mpm@selenic.com>
parents:
1861
diff
changeset
|
149 # 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
|
150 del ctx.extra()[constants.extrakey] |
1889
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
151 with usetopicmap(self): |
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
152 return orig.commitctx(self, ctx, error=error) |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
153 |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
154 @property |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
155 def topics(self): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
156 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
|
157 for c in self.set('not public()'): |
1861
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
158 topics.add(c.topic()) |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
159 topics.remove('') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
160 return topics |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
161 |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
162 @property |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
163 def currenttopic(self): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
164 return self.vfs.tryread('topic') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
165 |
1885
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1884
diff
changeset
|
166 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
|
167 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
|
168 super(topicrepo, self).branchmap() |
1888
dfaf0de6f4d8
topicmap: move the monkey patching into a context manager
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1887
diff
changeset
|
169 with 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
|
170 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
|
171 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
|
172 |
1889
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
173 def destroyed(self, *args, **kwargs): |
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
174 with usetopicmap(self): |
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
175 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
|
176 |
1885
d49f75eab6a3
topic: take topic in account for all branch head computation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1884
diff
changeset
|
177 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
|
178 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
|
179 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
|
180 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
|
181 |
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
|
182 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
|
183 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
|
184 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
|
185 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
|
186 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
|
187 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
|
188 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
|
189 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
|
190 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
|
191 |
1857
a506ed8ab8da
topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents:
1856
diff
changeset
|
192 repo.__class__ = topicrepo |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
193 if util.safehasattr(repo, 'names'): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
194 repo.names.addnamespace(namespaces.namespace( |
1857
a506ed8ab8da
topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents:
1856
diff
changeset
|
195 'topics', 'topic', namemap=_namemap, nodemap=_nodemap, |
a506ed8ab8da
topics: add listnames hook so completion works
Matt Mackall <mpm@selenic.com>
parents:
1856
diff
changeset
|
196 listnames=lambda repo: repo.topics)) |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
197 |
1847
9fa5b8f4e98e
topics: add command summary
Matt Mackall <mpm@selenic.com>
parents:
1846
diff
changeset
|
198 @command('topics [TOPIC]', [ |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
199 ('', 'clear', False, 'clear active topic if any'), |
1844
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
200 ('', 'change', '', 'revset of existing revisions to change topic'), |
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
|
201 ('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
|
202 ] + commands.formatteropts) |
95874e8fc5f2
stack: add basic formatter and label support
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1904
diff
changeset
|
203 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
|
204 """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
|
205 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
|
206 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
|
207 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
|
208 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
|
209 |
1844
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
210 if change: |
1851
67d53e8e0c1a
topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents:
1850
diff
changeset
|
211 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
|
212 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
|
213 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
|
214 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
|
215 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
|
216 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
|
217 rewrote = 0 |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
218 needevolve = False |
1856
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
219 l = repo.lock() |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
220 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
|
221 try: |
1918 | 222 for c in repo.set('%r', change): |
223 def filectxfn(repo, ctx, path): | |
224 try: | |
225 return c[path] | |
226 except error.ManifestLookupError: | |
227 return None | |
228 fixedextra = dict(c.extra()) | |
229 ui.debug('old node id is %s\n' % node.hex(c.node())) | |
230 ui.debug('origextra: %r\n' % fixedextra) | |
231 newtopic = None if clear else topic | |
232 oldtopic = fixedextra.get(constants.extrakey, None) | |
233 if oldtopic == newtopic: | |
234 continue | |
235 if clear: | |
236 del fixedextra[constants.extrakey] | |
237 else: | |
238 fixedextra[constants.extrakey] = topic | |
239 if 'amend_source' in fixedextra: | |
240 # TODO: right now the commitctx wrapper in | |
241 # topicrepo overwrites the topic in extra if | |
242 # amend_source is set to support 'hg commit | |
243 # --amend'. Support for amend should be adjusted | |
244 # to not be so invasive. | |
245 del fixedextra['amend_source'] | |
246 ui.debug('changing topic of %s from %s to %s\n' % ( | |
247 c, oldtopic, newtopic)) | |
248 ui.debug('fixedextra: %r\n' % fixedextra) | |
249 mc = context.memctx( | |
250 repo, (c.p1().node(), c.p2().node()), c.description(), | |
251 c.files(), filectxfn, | |
252 user=c.user(), date=c.date(), extra=fixedextra) | |
253 newnode = repo.commitctx(mc) | |
254 ui.debug('new node id is %s\n' % node.hex(newnode)) | |
255 needevolve = needevolve or (len(c.children()) > 0) | |
256 obsolete.createmarkers(repo, [(c, (repo[newnode],))]) | |
257 rewrote += 1 | |
258 txn.close() | |
1856
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
259 except: |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
260 try: |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
261 txn.abort() |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
262 finally: |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
263 repo.invalidate() |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
264 raise |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
265 finally: |
7d7f5f9e2f8c
rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents:
1855
diff
changeset
|
266 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
|
267 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
|
268 if needevolve: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
269 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
|
270 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
|
271 if clear: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
272 if repo.vfs.exists('topic'): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
273 repo.vfs.unlink('topic') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
274 return |
1860
b7b9e5028c2a
topics: consistently use empty string instead of None
Matt Mackall <mpm@selenic.com>
parents:
1859
diff
changeset
|
275 if topic: |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
276 with repo.vfs.open('topic', 'w') as f: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
277 f.write(topic) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
278 return |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
279 current = repo.currenttopic |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
280 for t in sorted(repo.topics): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
281 marker = '*' if t == current else ' ' |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
282 ui.write(' %s %s\n' % (marker, t)) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
283 |
1848
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
284 def summaryhook(ui, repo): |
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
285 t = repo.currenttopic |
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
286 if not t: |
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
287 return |
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
288 # i18n: column positioning for "hg summary" |
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
289 ui.write(_("topic: %s\n") % t) |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
290 |
1850 | 291 def commitwrap(orig, ui, repo, *args, **opts): |
292 if opts.get('topic'): | |
293 t = opts['topic'] | |
294 with repo.vfs.open('topic', 'w') as f: | |
295 f.write(t) | |
296 return orig(ui, repo, *args, **opts) | |
297 | |
1852
3084687f7994
commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents:
1851
diff
changeset
|
298 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
|
299 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
|
300 t = repo.currenttopic |
3084687f7994
commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents:
1851
diff
changeset
|
301 if t: |
3084687f7994
commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents:
1851
diff
changeset
|
302 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
|
303 "\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
|
304 return ret |
3084687f7994
commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents:
1851
diff
changeset
|
305 |
1877
69077c65919d
topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents:
1874
diff
changeset
|
306 def mergeupdatewrap(orig, repo, node, branchmerge, force, *args, **kwargs): |
69077c65919d
topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents:
1874
diff
changeset
|
307 partial = bool(len(args)) or 'matcher' in kwargs |
1853
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
308 wlock = repo.wlock() |
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
309 try: |
1877
69077c65919d
topic: handle merge.update function signature change
Augie Fackler <raf@durin42.com>
parents:
1874
diff
changeset
|
310 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
|
311 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
|
312 ot = repo.currenttopic |
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
313 t = '' |
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
314 pctx = repo[node] |
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
315 if pctx.phase() > phases.public: |
1861
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
316 t = pctx.topic() |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
317 with repo.vfs.open('topic', 'w') as f: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
318 f.write(t) |
1853
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
319 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
|
320 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
|
321 return ret |
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
322 finally: |
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
323 wlock.release() |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
324 |
1854
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
325 def _fixrebase(loaded): |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
326 if not loaded: |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
327 return |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
328 |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
329 def savetopic(ctx, extra): |
1861
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
330 if ctx.topic(): |
972d4e0c3d44
changectx: add topic method
Matt Mackall <mpm@selenic.com>
parents:
1860
diff
changeset
|
331 extra[constants.extrakey] = ctx.topic() |
1854
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
332 |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
333 def newmakeextrafn(orig, copiers): |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
334 return orig(copiers + [savetopic]) |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
335 |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
336 rebase = extensions.find("rebase") |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
337 extensions.wrapfunction(rebase, '_makeextrafn', newmakeextrafn) |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
338 |
1946
72246b13bd72
patch: document the section about import/export
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1945
diff
changeset
|
339 ## 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
|
340 |
1866
13fc93fb7fbe
patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1863
diff
changeset
|
341 def _exporttopic(seq, ctx): |
13fc93fb7fbe
patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1863
diff
changeset
|
342 topic = ctx.topic() |
13fc93fb7fbe
patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1863
diff
changeset
|
343 if topic: |
1917 | 344 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
|
345 return None |
13fc93fb7fbe
patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1863
diff
changeset
|
346 |
1867
c9cacc62fa17
patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1866
diff
changeset
|
347 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
|
348 if 'topic' in patchdata: |
c9cacc62fa17
patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1866
diff
changeset
|
349 extra['topic'] = patchdata['topic'] |
c9cacc62fa17
patch: import topic from patch header
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1866
diff
changeset
|
350 |
1948
54810b543bf4
patch: move setup of import/export logic into a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1947
diff
changeset
|
351 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
|
352 """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
|
353 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
|
354 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
|
355 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
|
356 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
|
357 patch.patchheadermap.append(('EXP-Topic', 'topic')) |
1945
f4f5bf8b4d17
patch: move import/export wrapping close to the function definition
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1944
diff
changeset
|
358 |
1854
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
359 extensions.afterloaded('rebase', _fixrebase) |
67950fcf1c69
rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents:
1853
diff
changeset
|
360 |
1850 | 361 entry = extensions.wrapcommand(commands.table, 'commit', commitwrap) |
362 entry[1].append(('t', 'topic', '', | |
363 _("use specified topic"), _('TOPIC'))) | |
364 | |
1852
3084687f7994
commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents:
1851
diff
changeset
|
365 extensions.wrapfunction(cmdutil, 'buildcommittext', committextwrap) |
1853
8db7828751b7
topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents:
1852
diff
changeset
|
366 extensions.wrapfunction(merge, 'update', mergeupdatewrap) |
1889
d9b929bcc3ad
topicmap: ensure that 'served' view is updated with topicmap
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1888
diff
changeset
|
367 extensions.wrapfunction(changegroup.cg1unpacker, 'apply', cgapply) |
1848
9a81657deec2
summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents:
1847
diff
changeset
|
368 cmdutil.summaryhooks.add('topic', summaryhook) |
1866
13fc93fb7fbe
patch: add topic to exported patch
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
1863
diff
changeset
|
369 |