/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 gitlib/git_repository.py

More refactoring. Add some direct tests for GitModel.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""An adapter between a Git Repository and a Bazaar Branch"""
18
18
 
19
19
from bzrlib import (
20
 
    errors,
21
20
    repository,
22
21
    urlutils,
23
22
    )
24
23
 
25
 
from bzrlib.plugins.git import GitModel
 
24
from bzrlib.plugins.git.gitlib import model
26
25
 
27
26
 
28
27
class GitRepository(repository.Repository):
31
30
    def __init__(self, gitdir, lockfiles):
32
31
        self.bzrdir = gitdir
33
32
        self.control_files = lockfiles
34
 
        gitdirectory = urlutils.local_path_from_url(gitdir.transport.base)
35
 
        self.git = GitModel(gitdirectory)
 
33
        gitdirectory = gitdir.transport.local_abspath('.')
 
34
        self._git = model.GitModel(gitdirectory)
36
35
        self._revision_cache = {}
37
36
 
38
37
    def _ancestor_revisions(self, revision_ids):
40
39
            git_revisions = [gitrevid_from_bzr(r) for r in revision_ids]
41
40
        else:
42
41
            git_revisions = None
43
 
        for lines in self.git.ancestor_lines(git_revisions):
 
42
        for lines in self._git.ancestor_lines(git_revisions):
44
43
            yield self.parse_rev(lines)
45
44
 
46
45
    def is_shared(self):
63
62
    def get_revision(self, revision_id):
64
63
        if revision_id in self._revision_cache:
65
64
            return self._revision_cache[revision_id]
66
 
        raw = self.git.rev_list([gitrevid_from_bzr(revision_id)], max_count=1,
67
 
                                header=True)
 
65
        raw = self._git.rev_list([gitrevid_from_bzr(revision_id)], max_count=1,
 
66
                                 header=True)
68
67
        return self.parse_rev(raw)
69
68
 
70
69
    def has_revision(self, revision_id):
112
111
        result.inventory_sha1 = ""
113
112
        result.timezone = timezone and int(timezone)
114
113
        result.timestamp = float(timestamp)
115
 
        result.committer = committer 
 
114
        result.committer = committer
116
115
        result.properties['git-tree-id'] = tree_id
117
116
        return result
118
117
 
129
128
        tree_id = revision.properties['git-tree-id']
130
129
        type_map = {'blob': 'file', 'tree': 'directory' }
131
130
        def get_inventory(tree_id, prefix):
132
 
            for perms, type, obj_id, name in self.git.get_inventory(tree_id):
 
131
            for perms, type, obj_id, name in self._git.get_inventory(tree_id):
133
132
                full_path = prefix + name
134
133
                if type == 'blob':
135
134
                    text_sha1 = obj_id
153
152
        self.inventory = repository.get_inventory(revision_id)
154
153
 
155
154
    def get_file(self, file_id):
 
155
        return iterablefile.IterableFile(self.get_file_lines(file_id))
 
156
 
 
157
    def get_file_lines(self, file_id):
156
158
        obj_id = self.inventory[file_id].text_sha1
157
 
        lines = self.repository.git.cat_file('blob', obj_id)
158
 
        return iterablefile.IterableFile(lines)
 
159
        return self.repository._git.cat_file('blob', obj_id)
159
160
 
160
161
    def is_executable(self, file_id):
161
162
        return self.inventory[file_id].executable
162
163
 
163
164
 
 
165
class GitInventory(object):
 
166
 
 
167
    def __init__(self, revision_id):
 
168
        self.entries = {}
 
169
        self.root = GitEntry('', 'directory', revision_id)
 
170
        self.entries[''] = self.root
 
171
 
 
172
    def __getitem__(self, key):
 
173
        return self.entries[key]
 
174
 
 
175
    def iter_entries(self):
 
176
        return iter(sorted(self.entries.items()))
 
177
 
 
178
    def iter_entries_by_dir(self):
 
179
        return self.iter_entries()
 
180
 
 
181
    def __len__(self):
 
182
        return len(self.entries)
 
183
 
 
184
 
 
185
class GitEntry(object):
 
186
 
 
187
    def __init__(self, path, kind, revision, text_sha1=None, executable=False,
 
188
                 text_size=None):
 
189
        self.path = path
 
190
        self.file_id = path
 
191
        self.kind = kind
 
192
        self.executable = executable
 
193
        self.name = osutils.basename(path)
 
194
        if path == '':
 
195
            self.parent_id = None
 
196
        else:
 
197
            self.parent_id = osutils.dirname(path)
 
198
        self.revision = revision
 
199
        self.symlink_target = None
 
200
        self.text_sha1 = text_sha1
 
201
        self.text_size = None
 
202
 
 
203
    def __repr__(self):
 
204
        return "GitEntry(%r, %r, %r, %r)" % (self.path, self.kind,
 
205
                                             self.revision, self.parent_id)
 
206
 
 
207