Mercurial > hg
comparison mercurial/wireproto.py @ 13741:b51bf961b3cb
wireproto: add getbundle() function
getbundle(common, heads) -> bundle
Returns the changegroup for all ancestors of heads which are not ancestors of common. For both
sets, the heads are included in the set.
Intended to eventually supercede changegroupsubset and changegroup. Uses heads of common region
to exclude unwanted changesets instead of bases of desired region, which is more useful and
easier to implement.
Designed to be extensible with new optional arguments (which will have to be guarded by
corresponding capabilities).
author | Peter Arrenbrecht <peter.arrenbrecht@gmail.com> |
---|---|
date | Wed, 23 Mar 2011 16:02:11 +0100 |
parents | 378522bdc059 |
children | 88f0e41d8802 |
comparison
equal
deleted
inserted
replaced
13740:dcb51f156fa6 | 13741:b51bf961b3cb |
---|---|
121 heads = encodelist(heads) | 121 heads = encodelist(heads) |
122 f = self._callstream("changegroupsubset", | 122 f = self._callstream("changegroupsubset", |
123 bases=bases, heads=heads) | 123 bases=bases, heads=heads) |
124 return changegroupmod.unbundle10(self._decompress(f), 'UN') | 124 return changegroupmod.unbundle10(self._decompress(f), 'UN') |
125 | 125 |
126 def getbundle(self, source, heads=None, common=None): | |
127 self.requirecap('getbundle', _('look up remote changes')) | |
128 opts = {} | |
129 if heads is not None: | |
130 opts['heads'] = encodelist(heads) | |
131 if common is not None: | |
132 opts['common'] = encodelist(common) | |
133 f = self._callstream("getbundle", **opts) | |
134 return changegroupmod.unbundle10(self._decompress(f), 'UN') | |
135 | |
126 def unbundle(self, cg, heads, source): | 136 def unbundle(self, cg, heads, source): |
127 '''Send cg (a readable file-like object representing the | 137 '''Send cg (a readable file-like object representing the |
128 changegroup to push, typically a chunkbuffer object) to the | 138 changegroup to push, typically a chunkbuffer object) to the |
129 remote server as a bundle. Return an integer indicating the | 139 remote server as a bundle. Return an integer indicating the |
130 result of the push (see localrepository.addchangegroup()).''' | 140 result of the push (see localrepository.addchangegroup()).''' |
204 for b in repo.branches(nodes): | 214 for b in repo.branches(nodes): |
205 r.append(encodelist(b) + "\n") | 215 r.append(encodelist(b) + "\n") |
206 return "".join(r) | 216 return "".join(r) |
207 | 217 |
208 def capabilities(repo, proto): | 218 def capabilities(repo, proto): |
209 caps = 'lookup changegroupsubset branchmap pushkey known'.split() | 219 caps = 'lookup changegroupsubset branchmap pushkey known getbundle'.split() |
210 if _allowstream(repo.ui): | 220 if _allowstream(repo.ui): |
211 requiredformats = repo.requirements & repo.supportedformats | 221 requiredformats = repo.requirements & repo.supportedformats |
212 # if our local revlogs are just revlogv1, add 'stream' cap | 222 # if our local revlogs are just revlogv1, add 'stream' cap |
213 if not requiredformats - set(('revlogv1',)): | 223 if not requiredformats - set(('revlogv1',)): |
214 caps.append('stream') | 224 caps.append('stream') |
231 | 241 |
232 def debugwireargs(repo, proto, one, two, others): | 242 def debugwireargs(repo, proto, one, two, others): |
233 # only accept optional args from the known set | 243 # only accept optional args from the known set |
234 opts = options('debugwireargs', ['three', 'four'], others) | 244 opts = options('debugwireargs', ['three', 'four'], others) |
235 return repo.debugwireargs(one, two, **opts) | 245 return repo.debugwireargs(one, two, **opts) |
246 | |
247 def getbundle(repo, proto, others): | |
248 opts = options('getbundle', ['heads', 'common'], others) | |
249 for k, v in opts.iteritems(): | |
250 opts[k] = decodelist(v) | |
251 cg = repo.getbundle('serve', **opts) | |
252 return streamres(proto.groupchunks(cg)) | |
236 | 253 |
237 def heads(repo, proto): | 254 def heads(repo, proto): |
238 h = repo.heads() | 255 h = repo.heads() |
239 return encodelist(h) + "\n" | 256 return encodelist(h) + "\n" |
240 | 257 |
380 'branches': (branches, 'nodes'), | 397 'branches': (branches, 'nodes'), |
381 'capabilities': (capabilities, ''), | 398 'capabilities': (capabilities, ''), |
382 'changegroup': (changegroup, 'roots'), | 399 'changegroup': (changegroup, 'roots'), |
383 'changegroupsubset': (changegroupsubset, 'bases heads'), | 400 'changegroupsubset': (changegroupsubset, 'bases heads'), |
384 'debugwireargs': (debugwireargs, 'one two *'), | 401 'debugwireargs': (debugwireargs, 'one two *'), |
402 'getbundle': (getbundle, '*'), | |
385 'heads': (heads, ''), | 403 'heads': (heads, ''), |
386 'hello': (hello, ''), | 404 'hello': (hello, ''), |
387 'known': (known, 'nodes'), | 405 'known': (known, 'nodes'), |
388 'listkeys': (listkeys, 'namespace'), | 406 'listkeys': (listkeys, 'namespace'), |
389 'lookup': (lookup, 'key'), | 407 'lookup': (lookup, 'key'), |