359
360
osutils.rmtree(tmp_dirname)
361
362
def _copy_to_tempdir(self, from_repo):
362
tmp_dirname = tempfile.mkdtemp(prefix='tmpbzrclone')
363
tmp_dirname = osutils.mkdtemp(prefix='tmpbzrclone')
363
364
tmp_bzrdir = from_repo.bzrdir._format.initialize(tmp_dirname)
364
365
tmp_repo = from_repo._format.initialize(tmp_bzrdir)
365
366
from_repo.copy_content_into(tmp_repo)
389
390
dirname = dirname.encode(sys.getfilesystemencoding())
390
391
# python's tarball module includes the whole path by default so
392
assert dirname.endswith('.bzr')
393
if not dirname.endswith('.bzr'):
394
raise ValueError(dirname)
393
395
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())
416
for name_tuple, bytes in stream:
417
buffer.write(pack.bytes_record(bytes, [name_tuple]))
419
# Undo the lock_read that happens once the iterator from
420
# get_data_stream is started.
423
except errors.RevisionNotPresent, e:
424
return FailedSmartServerResponse(('NoSuchRevision', e.revision_id))
425
buffer.write(pack.end())
426
return SuccessfulSmartServerResponse(('ok',), buffer.getvalue())
429
class SmartServerRepositoryStreamRevisionsChunked(SmartServerRepositoryRequest):
430
"""Bzr 1.1+ streaming pull."""
432
def do_body(self, body_bytes):
433
repository = self._repository
434
repository.lock_read()
436
search, error = self.recreate_search(repository, body_bytes)
437
if error is not None:
440
stream = repository.get_data_stream_for_search(search.get_result())
442
# On non-error, unlocking is done by the body stream handler.
445
return SuccessfulSmartServerResponse(('ok',),
446
body_stream=self.body_stream(stream, repository))
448
def body_stream(self, stream, repository):
449
pack = ContainerSerialiser()
453
for name_tuple, bytes in stream:
454
yield pack.bytes_record(bytes, [name_tuple])
456
# Undo the lock_read that that happens once the iterator from
457
# get_data_stream is started.
460
except errors.RevisionNotPresent, e:
461
# This shouldn't be able to happen, but as we don't buffer
462
# everything it can in theory happen.
464
yield FailedSmartServerResponse(('NoSuchRevision', e.revision_id))