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

  • Committer: John Arbash Meinel
  • Date: 2010-01-12 22:51:31 UTC
  • mto: This revision was merged to the branch mainline in revision 4955.
  • Revision ID: john@arbash-meinel.com-20100112225131-he8h411p6aeeb947
Delay grabbing an output stream until we actually go to show a diff.

This makes the test suite happy, but it also seems to be reasonable.
If we aren't going to write anything, we don't need to hold an
output stream open.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009 Jelmer Vernooij <jelmer@samba.org>
2
 
 
3
 
# This program is free software; you can redistribute it and/or modify
4
 
# it under the terms of the GNU General Public License as published by
5
 
# the Free Software Foundation; either version 2 of the License, or
6
 
# (at your option) any later version.
7
 
#
8
 
# This program is distributed in the hope that it will be useful,
9
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
 
# GNU General Public License for more details.
12
 
#
13
 
# You should have received a copy of the GNU General Public License
14
 
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
from dulwich.object_store import (
18
 
    tree_lookup_path,
19
 
    )
20
 
from dulwich.objects import (
21
 
    Blob,
22
 
    Commit,
23
 
    Tree,
24
 
    )
25
 
 
26
 
from bzrlib import (
27
 
    annotate,
28
 
    )
29
 
 
30
 
from bzrlib.versionedfile import (
31
 
    AbsentContentFactory,
32
 
    ChunkedContentFactory,
33
 
    VersionedFiles,
34
 
    )
35
 
 
36
 
 
37
 
class GitRevisions(VersionedFiles):
38
 
 
39
 
    def __init__(self, repository, object_store):
40
 
        self.repository = repository
41
 
        self.object_store = object_store
42
 
 
43
 
    def check(self, progressbar=None):
44
 
        return True
45
 
 
46
 
    def get_annotator(self):
47
 
        return annotate.Annotator(self)
48
 
 
49
 
    def iterkeys(self):
50
 
        for sha in self.object_store:
51
 
            if type(sha) == Commit:
52
 
                yield (sha,)
53
 
 
54
 
    def keys(self):
55
 
        return list(self.iterkeys())
56
 
 
57
 
    def add_mpdiffs(self, records):
58
 
        raise NotImplementedError(self.add_mpdiffs)
59
 
 
60
 
    def get_record_stream(self, keys, ordering, include_delta_closure):
61
 
        for key in keys:
62
 
            (revid,) = key
63
 
            (commit_id, mapping) = self.repository.lookup_bzr_revision_id(revid)
64
 
            try:
65
 
                commit = self.object_store[commit_id]
66
 
            except KeyError:
67
 
                yield AbsentContentFactory(key)
68
 
            else:
69
 
                yield ChunkedContentFactory(key, 
70
 
                    tuple([(self.repository.lookup_foreign_revision_id(p, mapping),) for p in commit.parents]), None, 
71
 
                    commit.as_raw_chunks())
72
 
 
73
 
    def get_parent_map(self, keys):
74
 
        ret = {}
75
 
        for (revid,) in keys:
76
 
            (commit_id, mapping) = self.repository.lookup_bzr_revision_id(revid)
77
 
            try:
78
 
                ret[(revid,)] = [(self.repository.lookup_foreign_revision_id(p, mapping),) for p in self.object_store[commit_id].parents]
79
 
            except KeyError:
80
 
                ret[(revid,)] = None
81
 
        return ret
82
 
 
83
 
 
84
 
class GitTexts(VersionedFiles):
85
 
    """A texts VersionedFiles instance that is backed onto a Git object store."""
86
 
 
87
 
    def __init__(self, repository):
88
 
        self.repository = repository
89
 
        self.object_store = self.repository._git.object_store
90
 
 
91
 
    def check(self, progressbar=None):
92
 
        return True
93
 
 
94
 
    def get_annotator(self):
95
 
        return annotate.Annotator(self)
96
 
 
97
 
    def add_mpdiffs(self, records):
98
 
        raise NotImplementedError(self.add_mpdiffs)
99
 
 
100
 
    def get_record_stream(self, keys, ordering, include_delta_closure):
101
 
        for key in keys:
102
 
            (fileid, revid) = key
103
 
            (commit_id, mapping) = self.repository.lookup_bzr_revision_id(revid)
104
 
            root_tree = self.object_store[commit_id].tree
105
 
            path = mapping.parse_file_id(fileid)
106
 
            try:
107
 
                obj = tree_lookup_path(
108
 
                    self.object_store.__getitem__, root_tree, path)
109
 
                if isinstance(obj, tuple):
110
 
                    (mode, item_id) = obj
111
 
                    obj = self.object_store[item_id]
112
 
            except KeyError:
113
 
                yield AbsentContentFactory(key)
114
 
            else:
115
 
                if isinstance(obj, Tree):
116
 
                    yield ChunkedContentFactory(key, None, None, [])
117
 
                elif isinstance(obj, Blob):
118
 
                    yield ChunkedContentFactory(key, None, None, obj.chunked)
119
 
                else:
120
 
                    raise AssertionError("file text resolved to %r" % obj)
121
 
 
122
 
    def get_parent_map(self, keys):
123
 
        raise NotImplementedError(self.get_parent_map)
124