9 from mercurial import util |
9 from mercurial import util |
10 from mercurial import context |
10 from mercurial import context |
11 from mercurial import revset |
11 from mercurial import revset |
12 from mercurial import scmutil |
12 from mercurial import scmutil |
13 from mercurial import extensions |
13 from mercurial import extensions |
|
14 from mercurial import pushkey |
14 from mercurial.node import hex, bin |
15 from mercurial.node import hex, bin |
15 |
16 |
16 # Patch changectx |
17 # Patch changectx |
17 ############################# |
18 ############################# |
18 |
19 |
51 if rebase: |
52 if rebase: |
52 extensions.wrapfunction(rebase, 'concludenode', concludenode) |
53 extensions.wrapfunction(rebase, 'concludenode', concludenode) |
53 except KeyError: |
54 except KeyError: |
54 pass # rebase not found |
55 pass # rebase not found |
55 |
56 |
|
57 # Pushkey mechanism for mutable |
|
58 ######################################### |
|
59 |
|
60 def pushobsolete(repo, key, old, relations): |
|
61 assert key == "relations" |
|
62 w = repo.wlock() |
|
63 try: |
|
64 for sub, objs in relations.iteritems(): |
|
65 for obj in objs: |
|
66 repo.addobsolete(sub, obj) |
|
67 finally: |
|
68 w.release() |
|
69 |
|
70 def listobsolete(repo): |
|
71 return {'relations': repo._obssubrels} |
|
72 |
|
73 pushkey.register('obsolete', pushobsolete, listobsolete) |
|
74 |
56 # New commands |
75 # New commands |
57 ############################# |
76 ############################# |
58 |
77 |
59 |
78 |
60 def cmddebugobsolete(ui, repo, subject, object): |
79 def cmddebugobsolete(ui, repo, subject, object): |
67 return 0 |
86 return 0 |
68 |
87 |
69 cmdtable = {'debugobsolete': (cmddebugobsolete, [], '<subject> <object>')} |
88 cmdtable = {'debugobsolete': (cmddebugobsolete, [], '<subject> <object>')} |
70 |
89 |
71 def reposetup(ui, repo): |
90 def reposetup(ui, repo): |
|
91 |
|
92 opull = repo.pull |
|
93 opush = repo.push |
72 |
94 |
73 class obsoletingrepo(repo.__class__): |
95 class obsoletingrepo(repo.__class__): |
74 |
96 |
75 |
97 |
76 ### Hidden revision support |
98 ### Hidden revision support |
126 f.write('%s %s\n' % (hex(sub), hex(obj))) |
148 f.write('%s %s\n' % (hex(sub), hex(obj))) |
127 f.rename() |
149 f.rename() |
128 finally: |
150 finally: |
129 f.close() |
151 f.close() |
130 |
152 |
|
153 ### pull // push support |
|
154 |
|
155 def pull(self, remote, *args, **kwargs): |
|
156 obskey = remote.listkeys('obsolete') |
|
157 obsrels = obskey.get('relations', {}) |
|
158 result = opull(remote, *args, **kwargs) |
|
159 for sub, objs in obsrels.iteritems(): |
|
160 for obj in objs: |
|
161 self.addobsolete(sub, obj) |
|
162 return result |
|
163 |
|
164 def push(self, remote, *args, **opts): |
|
165 obskey = remote.listkeys('obsolete') |
|
166 obssupport = 'relations' in obskey |
|
167 result = opush(remote, *args, **opts) |
|
168 if obssupport: |
|
169 remote.pushkey('obsolete', 'relations', {}, self._obssubrels) |
|
170 return result |
|
171 |
|
172 |
131 ### Public method |
173 ### Public method |
132 def obsoletedby(self, node): |
174 def obsoletedby(self, node): |
133 """return the set of node that make <node> obsolete (obj)""" |
175 """return the set of node that make <node> obsolete (obj)""" |
134 return self._obsobjrels.get(node, set()) |
176 return self._obsobjrels.get(node, set()) |
135 |
177 |