annotate src/topic/__init__.py @ 1856:7d7f5f9e2f8c

rewrite: use a lock and transaction as spotted by devel warnings
author Augie Fackler <augie@google.com>
date Thu, 18 Jun 2015 15:46:26 -0400
parents f241a00e93a7
children a506ed8ab8da
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 """
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
13 import functools
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
14
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
15 from mercurial.i18n import _
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
16 from mercurial import cmdutil
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
17 from mercurial import commands
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
18 from mercurial import context
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
19 from mercurial import extensions
1856
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
20 from mercurial import lock
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
21 from mercurial import merge
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
22 from mercurial import namespaces
1842
94bbc18daa99 topic: disallow use of topics without obsolete enabled
Augie Fackler <augie@google.com>
parents: 1841
diff changeset
23 from mercurial import obsolete
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
24 from mercurial import phases
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
25 from mercurial import util
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
26
1845
24d8053020a2 constants: extract key for extra into a constant
Augie Fackler <augie@google.com>
parents: 1844
diff changeset
27 from . import constants
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
28 from . import revset as topicrevset
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
29
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
30 cmdtable = {}
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
31 command = cmdutil.command(cmdtable)
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
32
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
33 def _namemap(repo, name):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
34 return [ctx.node() for ctx in
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
35 repo.set('not public() and extra(topic, %s)', name)]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
36
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
37 def _nodemap(repo, node):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
38 ctx = repo[node]
1845
24d8053020a2 constants: extract key for extra into a constant
Augie Fackler <augie@google.com>
parents: 1844
diff changeset
39 t = ctx.extra().get(constants.extrakey, '')
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
40 if t and ctx.phase() > phases.public:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
41 return [t]
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
42 return []
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
43
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
44 def reposetup(ui, repo):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
45 orig = repo.__class__
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
46 class topicrepo(repo.__class__):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
47 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
48 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
49 current = self.currenttopic
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
50 if current:
f241a00e93a7 topics: only apply topic to commits of the working copy
Matt Mackall <mpm@selenic.com>
parents: 1854
diff changeset
51 ctx.extra()[constants.extrakey] = current
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
52 return orig.commitctx(self, ctx, error=error)
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
53
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
54 @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
55 def topics(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
56 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
57 for c in self.set('not public()'):
1845
24d8053020a2 constants: extract key for extra into a constant
Augie Fackler <augie@google.com>
parents: 1844
diff changeset
58 topics.add(c.extra().get(constants.extrakey, ''))
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
59 topics.remove('')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
60 return topics
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
61
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
62 @property
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
63 def currenttopic(self):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
64 return self.vfs.tryread('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
65
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
66 if util.safehasattr(repo, 'names'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
67 repo.names.addnamespace(namespaces.namespace(
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
68 'topics', 'topic', namemap=_namemap, nodemap=_nodemap))
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
69 repo.__class__ = topicrepo
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
70
1847
9fa5b8f4e98e topics: add command summary
Matt Mackall <mpm@selenic.com>
parents: 1846
diff changeset
71 @command('topics [TOPIC]', [
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
72 ('', '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
73 ('', 'change', '', 'revset of existing revisions to change topic'),
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
74 ])
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
75 def topics(ui, repo, topic=None, clear=False, change=None):
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
76 """View current topic, set current topic, or see all topics."""
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
77 if change:
1851
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
78 if not obsolete.isenabled(repo, obsolete.createmarkersopt):
67d53e8e0c1a topic: only require obsolete support for --change
Matt Mackall <mpm@selenic.com>
parents: 1850
diff changeset
79 raise util.Abort(_('must have obsolete enabled to use --change'))
1844
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
80 if topic is None and not clear:
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
81 raise util.Abort('changing topic requires a topic name or --clear')
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
82 if any(not c.mutable() for c in repo.set('%r and public()', change)):
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
83 raise util.Abort("can't change topic of a public change")
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
84 rewrote = 0
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
85 needevolve = False
1856
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
86 l = repo.lock()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
87 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
88 try:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
89 for c in repo.set('%r', change):
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
90 def filectxfn(repo, ctx, path):
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
91 try:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
92 return c[path]
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
93 except error.ManifestLookupError:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
94 return None
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
95 fixedextra = dict(c.extra())
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
96 newtopic = None if clear else topic
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
97 if fixedextra.get(constants.extrakey, None) == topic:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
98 continue
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
99 if clear and constants.extrakey in fixedextra:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
100 del fixedextra[constants.extrakey]
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
101 else:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
102 fixedextra[constants.extrakey] = topic
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
103 c.parents()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
104 mc = context.memctx(
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
105 repo, (c.p1().node(), c.p2().node()), c.description(),
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
106 c.files(), filectxfn,
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
107 user=c.user(), date=c.date(), extra=fixedextra)
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
108 newnode = repo.commitctx(mc)
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
109 needevolve = needevolve or (len(c.children()) > 0)
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
110 obsolete.createmarkers(repo, [(c, (repo[newnode],))])
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
111 rewrote += 1
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
112 txn.close()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
113 except:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
114 try:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
115 txn.abort()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
116 finally:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
117 repo.invalidate()
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
118 raise
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
119 finally:
7d7f5f9e2f8c rewrite: use a lock and transaction as spotted by devel warnings
Augie Fackler <augie@google.com>
parents: 1855
diff changeset
120 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
121 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
122 if needevolve:
862cabc132fd topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents: 1843
diff changeset
123 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
124 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
125 if clear:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
126 if repo.vfs.exists('topic'):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
127 repo.vfs.unlink('topic')
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
128 return
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
129 if topic is not None:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
130 with repo.vfs.open('topic', 'w') as f:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
131 f.write(topic)
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
132 return
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
133 current = repo.currenttopic
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
134 for t in sorted(repo.topics):
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
135 marker = '*' if t == current else ' '
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
136 ui.write(' %s %s\n' % (marker, t))
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
137
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
138 def summaryhook(ui, repo):
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
139 t = repo.currenttopic
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
140 if not t:
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
141 return
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
142 # i18n: column positioning for "hg summary"
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
143 ui.write(_("topic: %s\n") % t)
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
144
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
145 def commitwrap(orig, ui, repo, *args, **opts):
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
146 if opts.get('topic'):
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
147 t = opts['topic']
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
148 with repo.vfs.open('topic', 'w') as f:
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
149 f.write(t)
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
150 return orig(ui, repo, *args, **opts)
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
151
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
152 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
153 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
154 t = repo.currenttopic
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
155 if t:
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
156 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
157 "\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
158 return ret
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
159
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
160 def mergeupdatewrap(orig, repo, node, branchmerge, force, partial,
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
161 ancestor=None, mergeancestor=False, labels=None):
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
162 wlock = repo.wlock()
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
163 try:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
164 ret = orig(repo, node, branchmerge, force, partial, ancestor=ancestor,
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
165 mergeancestor=mergeancestor, labels=labels)
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
166 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
167 ot = repo.currenttopic
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
168 t = ''
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
169 pctx = repo[node]
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
170 if pctx.phase() > phases.public:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
171 t = pctx.extra().get(constants.extrakey, '')
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
172 with repo.vfs.open('topic', 'w') as f:
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
173 f.write(t)
1853
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
174 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
175 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
176 return ret
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
177 finally:
8db7828751b7 topic: wrap the underlying update function rather than the command
Matt Mackall <mpm@selenic.com>
parents: 1852
diff changeset
178 wlock.release()
1839
1bc5e62fc0c7 Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff changeset
179
1854
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
180 def _fixrebase(loaded):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
181 if not loaded:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
182 return
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
183
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
184 def savetopic(ctx, extra):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
185 e = ctx.extra()
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
186 if constants.extrakey in e:
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
187 print "copying topic"
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
188 extra[constants.extrakey] = e[constants.extrakey]
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
189
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
190 def newmakeextrafn(orig, copiers):
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
191 return orig(copiers + [savetopic])
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
192
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
193 rebase = extensions.find("rebase")
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
194 extensions.wrapfunction(rebase, '_makeextrafn', newmakeextrafn)
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
195
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
196 extensions.afterloaded('rebase', _fixrebase)
67950fcf1c69 rebase: teach rebase how to copy topics
Matt Mackall <mpm@selenic.com>
parents: 1853
diff changeset
197
1850
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
198 entry = extensions.wrapcommand(commands.table, 'commit', commitwrap)
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
199 entry[1].append(('t', 'topic', '',
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
200 _("use specified topic"), _('TOPIC')))
0da6bf86b718 commit: add a --topic flag
Matt Mackall <mpm@selenic.com>
parents: 1849
diff changeset
201
1852
3084687f7994 commit: add a topic field to the in-editor commit text
Matt Mackall <mpm@selenic.com>
parents: 1851
diff changeset
202 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
203 extensions.wrapfunction(merge, 'update', mergeupdatewrap)
1843
0ba067a97d06 revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents: 1842
diff changeset
204 topicrevset.modsetup()
1848
9a81657deec2 summary: add topic summary hook
Matt Mackall <mpm@selenic.com>
parents: 1847
diff changeset
205 cmdutil.summaryhooks.add('topic', summaryhook)