/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 repository.py

Reduce number of round trips when fetching from Git.

Show diffs side-by-side

added added

removed removed

Lines of Context:
42
42
from bzrlib.plugins.git.commit import (
43
43
    GitCommitBuilder,
44
44
    )
 
45
from bzrlib.plugins.git.foreign import (
 
46
    versionedfiles,
 
47
    )
45
48
from bzrlib.plugins.git.inventory import (
46
49
    GitInventory,
47
50
    )
51
54
    mapping_registry,
52
55
    )
53
56
from bzrlib.plugins.git.versionedfiles import (
54
 
    GitRevisions,
55
57
    GitTexts,
56
58
    )
57
59
 
58
60
 
 
61
class GitTags(object):
 
62
 
 
63
    def __init__(self, tags):
 
64
        self._tags = tags
 
65
 
 
66
    def __iter__(self):
 
67
        return iter(self._tags)
 
68
 
 
69
 
59
70
class GitRepository(ForeignRepository):
60
71
    """An adapter to git repositories for bzr."""
61
72
 
90
101
    def make_working_trees(self):
91
102
        return True
92
103
 
93
 
    def revision_graph_can_have_wrong_parents(self):
94
 
        return False
95
 
 
96
104
    def dfetch(self, source, stop_revision):
97
105
        interrepo = repository.InterRepository.get(source, self)
98
106
        return interrepo.dfetch(stop_revision)
113
121
        self.base = gitdir.root_transport.base
114
122
        self._git = gitdir._git
115
123
        self.texts = None
116
 
        self.signatures = None
117
 
        self.revisions = GitRevisions(self._git.object_store)
118
 
        self.inventories = None
 
124
        self.signatures = versionedfiles.VirtualSignatureTexts(self)
 
125
        self.revisions = versionedfiles.VirtualRevisionTexts(self)
 
126
        self.inventories = versionedfiles.VirtualInventoryTexts(self)
119
127
        self.texts = GitTexts(self)
 
128
        self.tags = GitTags(self._git.get_tags())
120
129
 
121
130
    def all_revision_ids(self):
122
131
        ret = set([revision.NULL_REVISION])
123
 
        heads = self._git.refs.as_dict('refs/heads')
 
132
        heads = self._git.heads()
124
133
        if heads == {}:
125
134
            return ret
126
135
        bzr_heads = [self.get_mapping().revision_id_foreign_to_bzr(h) for h in heads.itervalues()]
232
241
class GitRevisionTree(revisiontree.RevisionTree):
233
242
 
234
243
    def __init__(self, repository, revision_id):
 
244
        self._repository = repository
235
245
        self._revision_id = revision_id
236
 
        self._repository = repository
237
 
        store = repository._git.object_store
238
246
        assert isinstance(revision_id, str)
239
247
        git_id, self.mapping = repository.lookup_git_revid(revision_id)
240
248
        try:
241
 
            commit = store[git_id]
 
249
            commit = repository._git.commit(git_id)
242
250
        except KeyError, r:
243
251
            raise errors.NoSuchRevision(repository, revision_id)
244
252
        self.tree = commit.tree
245
 
        self._inventory = GitInventory(self.tree, self.mapping, store, 
246
 
                                       revision_id)
 
253
        self._inventory = GitInventory(self.tree, self.mapping, repository._git.object_store, revision_id)
247
254
 
248
255
    def get_revision_id(self):
249
256
        return self._revision_id
250
257
 
251
 
    def get_file_text(self, file_id, path=None):
252
 
        if path is not None:
253
 
            entry = self._inventory._get_ie(path)
254
 
        else:
255
 
            entry = self._inventory[file_id]
 
258
    def get_file_text(self, file_id):
 
259
        entry = self._inventory[file_id]
256
260
        if entry.kind == 'directory': return ""
257
261
        return entry.object.data
258
262
 
271
275
 
272
276
    def check_conversion_target(self, target_repo_format):
273
277
        return target_repo_format.rich_root_data
274
 
 
275
 
    def network_name(self):
276
 
        return "git"