/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/plugins/git/remote.py

  • Committer: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2018-05-20 17:58:25 UTC
  • mfrom: (6968.4.4 git-archive)
  • Revision ID: breezy.the.bot@gmail.com-20180520175825-4qlo2ido7qbud18s
Implement GitRevisionTree.archive for remote git trees.

Merged from https://code.launchpad.net/~jelmer/brz/git-archive/+merge/345969

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
 
19
19
from __future__ import absolute_import
20
20
 
 
21
from io import BytesIO
21
22
import re
22
23
 
23
24
from ... import (
24
25
    config,
25
26
    debug,
26
27
    errors,
 
28
    osutils,
27
29
    trace,
28
30
    ui,
29
31
    urlutils,
45
47
    NoWorkingTree,
46
48
    UninitializableFormat,
47
49
    )
 
50
from ...revisiontree import RevisionTree
48
51
from ...transport import (
49
52
    Transport,
50
53
    register_urlparse_netloc_protocol,
364
367
    def _gitrepository_class(self):
365
368
        return RemoteGitRepository
366
369
 
 
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)
 
374
        if progress is None:
 
375
            pb = ui.ui_factory.nested_progress_bar()
 
376
            progress = DefaultProgressReporter(pb).progress
 
377
        else:
 
378
            pb = None
 
379
        try:
 
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)
 
385
        finally:
 
386
            if pb is not None:
 
387
                pb.finished()
 
388
 
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:"))
700
722
 
701
723
 
 
724
class GitRemoteRevisionTree(RevisionTree):
 
725
 
 
726
    def archive(self, format, name, root=None, subdir=None, force_mtime=None):
 
727
        """Create an archive of this tree.
 
728
 
 
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
 
734
        """
 
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
 
739
        # can find one.
 
740
        reverse_refs = {
 
741
                v: k for (k, v) in
 
742
                self._repository.controldir.get_refs_container().as_dict().items()}
 
743
        try:
 
744
            committish = reverse_refs[commit]
 
745
        except KeyError:
 
746
            # No? Maybe the user has uploadArchive.allowUnreachable enabled.
 
747
            # Let's hope for the best.
 
748
            committish = commit
 
749
        self._repository.archive(
 
750
                format, committish, f.write,
 
751
                subdirs=([subdir] if subdir else None),
 
752
                prefix=(root+'/') if root else '')
 
753
        f.seek(0)
 
754
        return osutils.file_iterator(f)
 
755
 
 
756
 
702
757
class RemoteGitRepository(GitRepository):
703
758
 
704
759
    @property
708
763
    def get_parent_map(self, revids):
709
764
        raise GitSmartRemoteNotSupported(self.get_parent_map, self)
710
765
 
 
766
    def archive(self, *args, **kwargs):
 
767
        return self.controldir.archive(*args, **kwargs)
 
768
 
711
769
    def fetch_pack(self, determine_wants, graph_walker, pack_data,
712
770
                   progress=None):
713
771
        return self.controldir.fetch_pack(determine_wants, graph_walker,
745
803
        return mapping.revision_id_foreign_to_bzr(foreign_revid)
746
804
 
747
805
    def revision_tree(self, revid):
748
 
        raise GitSmartRemoteNotSupported(self.revision_tree, self)
 
806
        return GitRemoteRevisionTree(self, revid)
749
807
 
750
808
    def get_revisions(self, revids):
751
809
        raise GitSmartRemoteNotSupported(self.get_revisions, self)