Mercurial > evolve
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 |
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 | 145 def commitwrap(orig, ui, repo, *args, **opts): |
146 if opts.get('topic'): | |
147 t = opts['topic'] | |
148 with repo.vfs.open('topic', 'w') as f: | |
149 f.write(t) | |
150 return orig(ui, repo, *args, **opts) | |
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 | 198 entry = extensions.wrapcommand(commands.table, 'commit', commitwrap) |
199 entry[1].append(('t', 'topic', '', | |
200 _("use specified topic"), _('TOPIC'))) | |
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) |