364
367
def _gitrepository_class(self):
365
368
return RemoteGitRepository
370
def archive(self, format, committish, write_data, progress=None, write_error=None,
371
subdirs=None, prefix=None):
372
if format not in ('tar', 'zip'):
373
raise errors.NoSuchExportFormat(format)
375
pb = ui.ui_factory.nested_progress_bar()
376
progress = DefaultProgressReporter(pb).progress
380
self._client.archive(self._client_path, committish,
381
write_data, progress, write_error, format=format,
382
subdirs=subdirs, prefix=prefix)
383
except GitProtocolError as e:
384
raise parse_git_error(self.transport.external_url(), e)
367
389
def fetch_pack(self, determine_wants, graph_walker, pack_data, progress=None):
368
390
if progress is None:
369
391
pb = ui.ui_factory.nested_progress_bar()
699
721
external_url.startswith("git:"))
724
class GitRemoteRevisionTree(RevisionTree):
726
def archive(self, format, name, root=None, subdir=None, force_mtime=None):
727
"""Create an archive of this tree.
729
:param format: Format name (e.g. 'tar')
730
:param name: target file name
731
:param root: Root directory name (or None)
732
:param subdir: Subdirectory to export (or None)
733
:return: Iterator over archive chunks
735
commit = self._repository.lookup_bzr_revision_id(
736
self.get_revision_id())[0]
737
f = tempfile.SpooledTemporaryFile()
738
# git-upload-archive(1) generaly only supports refs. So let's see if we
742
self._repository.controldir.get_refs_container().as_dict().items()}
744
committish = reverse_refs[commit]
746
# No? Maybe the user has uploadArchive.allowUnreachable enabled.
747
# Let's hope for the best.
749
self._repository.archive(
750
format, committish, f.write,
751
subdirs=([subdir] if subdir else None),
752
prefix=(root+'/') if root else '')
754
return osutils.file_iterator(f)
702
757
class RemoteGitRepository(GitRepository):
708
763
def get_parent_map(self, revids):
709
764
raise GitSmartRemoteNotSupported(self.get_parent_map, self)
766
def archive(self, *args, **kwargs):
767
return self.controldir.archive(*args, **kwargs)
711
769
def fetch_pack(self, determine_wants, graph_walker, pack_data,
713
771
return self.controldir.fetch_pack(determine_wants, graph_walker,
745
803
return mapping.revision_id_foreign_to_bzr(foreign_revid)
747
805
def revision_tree(self, revid):
748
raise GitSmartRemoteNotSupported(self.revision_tree, self)
806
return GitRemoteRevisionTree(self, revid)
750
808
def get_revisions(self, revids):
751
809
raise GitSmartRemoteNotSupported(self.get_revisions, self)