author | Augie Fackler <augie@google.com> |
Wed, 10 Jun 2015 15:03:39 -0400 | |
changeset 1844 | 862cabc132fd |
parent 1843 | 0ba067a97d06 |
child 1845 | 24d8053020a2 |
permissions | -rw-r--r-- |
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. |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
5 |
"""Adds topic branches. Topic branches are lightweight branches which |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
6 |
dissappear when changes are finalized. |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
7 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
8 |
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
|
9 |
series instead of a single revision. |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
10 |
""" |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
11 |
import functools |
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 |
from mercurial import cmdutil |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
14 |
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
|
15 |
from mercurial import context |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
16 |
from mercurial import extensions |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
17 |
from mercurial import namespaces |
1842
94bbc18daa99
topic: disallow use of topics without obsolete enabled
Augie Fackler <augie@google.com>
parents:
1841
diff
changeset
|
18 |
from mercurial import obsolete |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
19 |
from mercurial import phases |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
20 |
from mercurial import util |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
21 |
|
1843
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
1842
diff
changeset
|
22 |
from . import revset as topicrevset |
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
1842
diff
changeset
|
23 |
|
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
24 |
cmdtable = {} |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
25 |
command = cmdutil.command(cmdtable) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
26 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
27 |
def _namemap(repo, name): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
28 |
return [ctx.node() for ctx in |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
29 |
repo.set('not public() and extra(topic, %s)', name)] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
30 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
31 |
def _nodemap(repo, node): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
32 |
ctx = repo[node] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
33 |
t = ctx.extra().get('topic', '') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
34 |
if t and ctx.phase() > phases.public: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
35 |
return [t] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
36 |
return [] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
37 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
38 |
def reposetup(ui, repo): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
39 |
orig = repo.__class__ |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
40 |
class topicrepo(repo.__class__): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
41 |
def commitctx(self, ctx, error=None): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
42 |
current = self.currenttopic |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
43 |
if current: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
44 |
ctx.extra()['topic'] = current |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
45 |
return orig.commitctx(self, ctx, error=error) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
46 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
47 |
@property |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
48 |
def topics(self): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
49 |
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
|
50 |
for c in self.set('not public()'): |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
51 |
topics.add(c.extra().get('topic', '')) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
52 |
topics.remove('') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
53 |
return topics |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
54 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
55 |
@property |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
56 |
def currenttopic(self): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
57 |
return self.vfs.tryread('topic') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
58 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
59 |
if util.safehasattr(repo, 'names'): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
60 |
repo.names.addnamespace(namespaces.namespace( |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
61 |
'topics', 'topic', namemap=_namemap, nodemap=_nodemap)) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
62 |
repo.__class__ = topicrepo |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
63 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
64 |
@command('topics', [ |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
65 |
('', '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
|
66 |
('', 'change', '', 'revset of existing revisions to change topic'), |
1839
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
67 |
]) |
1844
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
68 |
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
|
69 |
"""View current topic, set current topic, or see all topics.""" |
1842
94bbc18daa99
topic: disallow use of topics without obsolete enabled
Augie Fackler <augie@google.com>
parents:
1841
diff
changeset
|
70 |
if not obsolete.isenabled(repo, obsolete.createmarkersopt): |
94bbc18daa99
topic: disallow use of topics without obsolete enabled
Augie Fackler <augie@google.com>
parents:
1841
diff
changeset
|
71 |
raise util.Abort('current reality means you should only ' |
94bbc18daa99
topic: disallow use of topics without obsolete enabled
Augie Fackler <augie@google.com>
parents:
1841
diff
changeset
|
72 |
'use topic with obsolete enabled') |
1844
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
73 |
if change: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
74 |
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
|
75 |
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
|
76 |
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
|
77 |
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
|
78 |
rewrote = 0 |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
79 |
needevolve = False |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
80 |
for c in repo.set('%r', change): |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
81 |
def filectxfn(repo, ctx, path): |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
82 |
try: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
83 |
return c[path] |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
84 |
except error.ManifestLookupError: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
85 |
return None |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
86 |
fixedextra = dict(c.extra()) |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
87 |
newtopic = None if clear else topic |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
88 |
if fixedextra.get('topic', None) == topic: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
89 |
continue |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
90 |
if clear and 'topic' in fixedextra: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
91 |
del fixedextra['topic'] |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
92 |
else: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
93 |
fixedextra['topic'] = topic |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
94 |
c.parents() |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
95 |
mc = context.memctx( |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
96 |
repo, (c.p1().node(), c.p2().node()), c.description(), |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
97 |
c.files(), filectxfn, |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
98 |
user=c.user(), date=c.date(), extra=fixedextra) |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
99 |
newnode = repo.commitctx(mc) |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
100 |
needevolve = needevolve or (len(c.children()) > 0) |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
101 |
obsolete.createmarkers(repo, [(c, (repo[newnode],))]) |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
102 |
rewrote += 1 |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
103 |
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
|
104 |
if needevolve: |
862cabc132fd
topic: add ability to change topic of non-public changes
Augie Fackler <augie@google.com>
parents:
1843
diff
changeset
|
105 |
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
|
106 |
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
|
107 |
if clear: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
108 |
if repo.vfs.exists('topic'): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
109 |
repo.vfs.unlink('topic') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
110 |
return |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
111 |
if topic is not None: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
112 |
with repo.vfs.open('topic', 'w') as f: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
113 |
f.write(topic) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
114 |
return |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
115 |
current = repo.currenttopic |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
116 |
for t in sorted(repo.topics): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
117 |
marker = '*' if t == current else ' ' |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
118 |
ui.write(' %s %s\n' % (marker, t)) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
119 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
120 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
121 |
def updatewrap(orig, ui, repo, *args, **kwargs): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
122 |
ret = orig(ui, repo, *args, **kwargs) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
123 |
pctx = repo['.'] |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
124 |
if pctx.phase() == phases.public and repo.vfs.exists('topic'): |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
125 |
repo.vfs.unlink('topic') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
126 |
else: |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
127 |
# inherit the topic of the parent revision |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
128 |
t = pctx.extra().get('topic', '') |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
129 |
if t and pctx.phase() > phases.public: |
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(t) |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
132 |
return ret |
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
133 |
|
1bc5e62fc0c7
Initial dumb version of topics.
Augie Fackler <augie@google.com>
parents:
diff
changeset
|
134 |
extensions.wrapcommand(commands.table, 'update', updatewrap) |
1843
0ba067a97d06
revset: add a topic() revset for querying topics
Augie Fackler <augie@google.com>
parents:
1842
diff
changeset
|
135 |
topicrevset.modsetup() |