393
392
tarball.add(dirname, '.bzr') # recursive by default
398
class SmartServerRepositoryStreamKnitDataForRevisions(SmartServerRepositoryRequest):
399
"""Bzr <= 1.1 streaming pull, buffers all data on server."""
401
def do_repository_request(self, repository, *revision_ids):
402
repository.lock_read()
404
return self._do_repository_request(repository, revision_ids)
408
def _do_repository_request(self, repository, revision_ids):
409
stream = repository.get_data_stream_for_search(
410
repository.revision_ids_to_search_result(set(revision_ids)))
412
pack = ContainerSerialiser()
413
buffer.write(pack.begin())
415
for name_tuple, bytes in stream:
416
buffer.write(pack.bytes_record(bytes, [name_tuple]))
417
except errors.RevisionNotPresent, e:
418
return FailedSmartServerResponse(('NoSuchRevision', e.revision_id))
419
buffer.write(pack.end())
420
return SuccessfulSmartServerResponse(('ok',), buffer.getvalue())
423
class SmartServerRepositoryStreamRevisionsChunked(SmartServerRepositoryRequest):
424
"""Bzr 1.1+ streaming pull."""
426
def do_body(self, body_bytes):
427
repository = self._repository
428
repository.lock_read()
430
search, error = self.recreate_search(repository, body_bytes)
431
if error is not None:
434
stream = repository.get_data_stream_for_search(search.get_result())
436
# On non-error, unlocking is done by the body stream handler.
439
return SuccessfulSmartServerResponse(('ok',),
440
body_stream=self.body_stream(stream, repository))
442
def body_stream(self, stream, repository):
443
pack = ContainerSerialiser()
447
for name_tuple, bytes in stream:
448
yield pack.bytes_record(bytes, [name_tuple])
450
# Undo the lock_read that that happens once the iterator from
451
# get_data_stream is started.
454
except errors.RevisionNotPresent, e:
455
# This shouldn't be able to happen, but as we don't buffer
456
# everything it can in theory happen.
458
yield FailedSmartServerResponse(('NoSuchRevision', e.revision_id))