/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

  • Committer: Andrew Bennetts
  • Date: 2009-10-21 11:13:40 UTC
  • mto: This revision was merged to the branch mainline in revision 4762.
  • Revision ID: andrew.bennetts@canonical.com-20091021111340-w7x4d5yf83qwjncc
Add test that WSGI glue allows request handlers to access paths above that request's. backing transport, so long as it is within the WSGI app's backing transport.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
2
 
# Copyright (C) 2008-2009 Jelmer Vernooij <jelmer@samba.org>
3
 
#
4
 
# This program is free software; you can redistribute it and/or modify
5
 
# it under the terms of the GNU General Public License as published by
6
 
# the Free Software Foundation; either version 2 of the License, or
7
 
# (at your option) any later version.
8
 
#
9
 
# This program is distributed in the hope that it will be useful,
10
 
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 
# GNU General Public License for more details.
13
 
#
14
 
# You should have received a copy of the GNU General Public License
15
 
# along with this program; if not, write to the Free Software
16
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
 
 
18
 
"""An adapter between a Git Repository and a Bazaar Branch"""
19
 
 
20
 
import bzrlib
21
 
from bzrlib import (
22
 
    errors,
23
 
    graph,
24
 
    inventory,
25
 
    osutils,
26
 
    repository,
27
 
    revision,
28
 
    revisiontree,
29
 
    ui,
30
 
    urlutils,
31
 
    )
32
 
from bzrlib.foreign import (
33
 
    ForeignRepository,
34
 
    )
35
 
from bzrlib.trace import (
36
 
    mutter,
37
 
    )
38
 
from bzrlib.transport import (
39
 
    get_transport,
40
 
    )
41
 
 
42
 
from bzrlib.plugins.git.commit import (
43
 
    GitCommitBuilder,
44
 
    )
45
 
from bzrlib.plugins.git.foreign import (
46
 
    versionedfiles,
47
 
    )
48
 
from bzrlib.plugins.git.inventory import (
49
 
    GitInventory,
50
 
    )
51
 
from bzrlib.plugins.git.mapping import (
52
 
    default_mapping,
53
 
    foreign_git,
54
 
    mapping_registry,
55
 
    )
56
 
from bzrlib.plugins.git.versionedfiles import (
57
 
    GitTexts,
58
 
    )
59
 
 
60
 
import dulwich as git
61
 
import os
62
 
import time
63
 
 
64
 
 
65
 
class GitTags(object):
66
 
 
67
 
    def __init__(self, tags):
68
 
        self._tags = tags
69
 
 
70
 
    def __iter__(self):
71
 
        return iter(self._tags)
72
 
 
73
 
 
74
 
class GitRepository(ForeignRepository):
75
 
    """An adapter to git repositories for bzr."""
76
 
 
77
 
    _serializer = None
78
 
    _commit_builder_class = GitCommitBuilder
79
 
    vcs = foreign_git
80
 
 
81
 
    def __init__(self, gitdir, lockfiles):
82
 
        ForeignRepository.__init__(self, GitRepositoryFormat(), gitdir, 
83
 
            lockfiles)
84
 
        from bzrlib.plugins.git import fetch, push
85
 
        for optimiser in [fetch.InterRemoteGitNonGitRepository, 
86
 
                          fetch.InterLocalGitNonGitRepository,
87
 
                          fetch.InterGitRepository,
88
 
                          push.InterToGitRepository]:
89
 
            repository.InterRepository.register_optimiser(optimiser)
90
 
 
91
 
    def is_shared(self):
92
 
        return True
93
 
 
94
 
    def supports_rich_root(self):
95
 
        return True
96
 
 
97
 
    def _warn_if_deprecated(self):
98
 
        # This class isn't deprecated
99
 
        pass
100
 
 
101
 
    def get_mapping(self):
102
 
        return default_mapping
103
 
 
104
 
    def make_working_trees(self):
105
 
        return True
106
 
 
107
 
 
108
 
class LocalGitRepository(GitRepository):
109
 
    """Git repository on the file system."""
110
 
 
111
 
    def __init__(self, gitdir, lockfiles):
112
 
        # FIXME: This also caches negatives. Need to be more careful 
113
 
        # about this once we start writing to git
114
 
        self._parents_provider = graph.CachingParentsProvider(self)
115
 
        GitRepository.__init__(self, gitdir, lockfiles)
116
 
        self.base = gitdir.root_transport.base
117
 
        self._git = gitdir._git
118
 
        self.texts = None
119
 
        self.signatures = versionedfiles.VirtualSignatureTexts(self)
120
 
        self.revisions = versionedfiles.VirtualRevisionTexts(self)
121
 
        self.inventories = versionedfiles.VirtualInventoryTexts(self)
122
 
        self.texts = GitTexts(self)
123
 
        self.tags = GitTags(self._git.get_tags())
124
 
 
125
 
    def all_revision_ids(self):
126
 
        ret = set([revision.NULL_REVISION])
127
 
        heads = self._git.heads()
128
 
        if heads == {}:
129
 
            return ret
130
 
        bzr_heads = [self.get_mapping().revision_id_foreign_to_bzr(h) for h in heads.itervalues()]
131
 
        ret = set(bzr_heads)
132
 
        graph = self.get_graph()
133
 
        for rev, parents in graph.iter_ancestry(bzr_heads):
134
 
            ret.add(rev)
135
 
        return ret
136
 
 
137
 
    #def get_revision_delta(self, revision_id):
138
 
    #    parent_revid = self.get_revision(revision_id).parent_ids[0]
139
 
    #    diff = self._git.diff(ids.convert_revision_id_bzr_to_git(parent_revid),
140
 
    #                   ids.convert_revision_id_bzr_to_git(revision_id))
141
 
 
142
 
    def _make_parents_provider(self):
143
 
        """See Repository._make_parents_provider()."""
144
 
        return self._parents_provider
145
 
 
146
 
    def get_parent_map(self, revids):
147
 
        parent_map = {}
148
 
        for revision_id in revids:
149
 
            assert isinstance(revision_id, str)
150
 
            if revision_id == revision.NULL_REVISION:
151
 
                parent_map[revision_id] = ()
152
 
                continue
153
 
            hexsha, mapping = self.lookup_git_revid(revision_id)
154
 
            commit  = self._git.commit(hexsha)
155
 
            if commit is None:
156
 
                continue
157
 
            else:
158
 
                parent_map[revision_id] = [mapping.revision_id_foreign_to_bzr(p) for p in commit.parents]
159
 
        return parent_map
160
 
 
161
 
    def get_ancestry(self, revision_id, topo_sorted=True):
162
 
        """See Repository.get_ancestry().
163
 
        """
164
 
        if revision_id is None:
165
 
            return [None, revision.NULL_REVISION] + self._all_revision_ids()
166
 
        assert isinstance(revision_id, str)
167
 
        ancestry = []
168
 
        graph = self.get_graph()
169
 
        for rev, parents in graph.iter_ancestry([revision_id]):
170
 
            ancestry.append(rev)
171
 
        ancestry.reverse()
172
 
        return [None] + ancestry
173
 
 
174
 
    def dfetch(self, source, stop_revision):
175
 
        interrepo = repository.InterRepository.get(source, self)
176
 
        return interrepo.dfetch(stop_revision)
177
 
 
178
 
    def get_signature_text(self, revision_id):
179
 
        raise errors.NoSuchRevision(self, revision_id)
180
 
 
181
 
    def lookup_revision_id(self, revid):
182
 
        """Lookup a revision id.
183
 
        
184
 
        :param revid: Bazaar revision id.
185
 
        :return: Tuple with git revisionid and mapping.
186
 
        """
187
 
        # Yes, this doesn't really work, but good enough as a stub
188
 
        return osutils.sha(rev_id).hexdigest(), self.get_mapping()
189
 
 
190
 
    def has_signature_for_revision_id(self, revision_id):
191
 
        return False
192
 
 
193
 
    def lookup_git_revid(self, bzr_revid):
194
 
        try:
195
 
            return mapping_registry.revision_id_bzr_to_foreign(bzr_revid)
196
 
        except errors.InvalidRevisionId:
197
 
            raise errors.NoSuchRevision(self, bzr_revid)
198
 
 
199
 
    def get_revision(self, revision_id):
200
 
        git_commit_id, mapping = self.lookup_git_revid(revision_id)
201
 
        try:
202
 
            commit = self._git.commit(git_commit_id)
203
 
        except KeyError:
204
 
            raise errors.NoSuchRevision(self, revision_id)
205
 
        # print "fetched revision:", git_commit_id
206
 
        revision = mapping.import_commit(commit)
207
 
        assert revision is not None
208
 
        return revision
209
 
 
210
 
    def has_revision(self, revision_id):
211
 
        try:
212
 
            self.get_revision(revision_id)
213
 
        except errors.NoSuchRevision:
214
 
            return False
215
 
        else:
216
 
            return True
217
 
 
218
 
    def get_revisions(self, revids):
219
 
        return [self.get_revision(r) for r in revids]
220
 
 
221
 
    def revision_trees(self, revids):
222
 
        for revid in revids:
223
 
            yield self.revision_tree(revid)
224
 
 
225
 
    def revision_tree(self, revision_id):
226
 
        revision_id = revision.ensure_null(revision_id)
227
 
        if revision_id == revision.NULL_REVISION:
228
 
            inv = inventory.Inventory(root_id=None)
229
 
            inv.revision_id = revision_id
230
 
            return revisiontree.RevisionTree(self, inv, revision_id)
231
 
        return GitRevisionTree(self, revision_id)
232
 
 
233
 
    def get_inventory(self, revision_id):
234
 
        assert revision_id != None
235
 
        return self.revision_tree(revision_id).inventory
236
 
 
237
 
    def set_make_working_trees(self, trees):
238
 
        pass
239
 
 
240
 
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
241
 
        progress=None):
242
 
        return self._git.fetch_objects(determine_wants, graph_walker, progress)
243
 
 
244
 
 
245
 
class GitRevisionTree(revisiontree.RevisionTree):
246
 
 
247
 
    def __init__(self, repository, revision_id):
248
 
        self._repository = repository
249
 
        self._revision_id = revision_id
250
 
        assert isinstance(revision_id, str)
251
 
        git_id, self.mapping = repository.lookup_git_revid(revision_id)
252
 
        try:
253
 
            commit = repository._git.commit(git_id)
254
 
        except KeyError, r:
255
 
            raise errors.NoSuchRevision(repository, revision_id)
256
 
        self.tree = commit.tree
257
 
        self._inventory = GitInventory(self.tree, self.mapping, repository._git.object_store, revision_id)
258
 
 
259
 
    def get_revision_id(self):
260
 
        return self._revision_id
261
 
 
262
 
    def get_file_text(self, file_id):
263
 
        entry = self._inventory[file_id]
264
 
        if entry.kind == 'directory': return ""
265
 
        return entry.object.data
266
 
 
267
 
class GitRepositoryFormat(repository.RepositoryFormat):
268
 
 
269
 
    supports_tree_reference = False
270
 
    rich_root_data = True
271
 
 
272
 
    def get_format_description(self):
273
 
        return "Git Repository"
274
 
 
275
 
    def initialize(self, url, shared=False, _internal=False):
276
 
        raise bzr_errors.UninitializableFormat(self)
277
 
 
278
 
    def check_conversion_target(self, target_repo_format):
279
 
        return target_repo_format.rich_root_data