/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 push.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) 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
 
"""Push implementation that simply prints message saying push is not supported."""
18
 
 
19
 
from bzrlib import (
20
 
    ui,
21
 
    )
22
 
from bzrlib.repository import (
23
 
    InterRepository,
24
 
    )
25
 
from bzrlib.revision import (
26
 
    NULL_REVISION,
27
 
    )
28
 
 
29
 
from bzrlib.plugins.git.converter import (
30
 
    BazaarObjectStore,
31
 
    )
32
 
from bzrlib.plugins.git.errors import (
33
 
    NoPushSupport,
34
 
    )
35
 
from bzrlib.plugins.git.mapping import (
36
 
    inventory_to_tree_and_blobs,
37
 
    revision_to_commit,
38
 
    )
39
 
from bzrlib.plugins.git.repository import (
40
 
    GitRepository,
41
 
    GitRepositoryFormat,
42
 
    )
43
 
 
44
 
 
45
 
class MissingObjectsIterator(object):
46
 
    """Iterate over git objects that are missing from a target repository.
47
 
 
48
 
    """
49
 
 
50
 
    def __init__(self, source, mapping, pb=None):
51
 
        """Create a new missing objects iterator.
52
 
 
53
 
        """
54
 
        self.source = source
55
 
        self._object_store = BazaarObjectStore(self.source, mapping)
56
 
        self._revids = set()
57
 
        self._sent_shas = set()
58
 
        self._pending = []
59
 
        self.pb = pb
60
 
 
61
 
    def import_revisions(self, revids):
62
 
        self._revids.update(revids)
63
 
        for i, revid in enumerate(revids):
64
 
            if self.pb:
65
 
                self.pb.update("pushing revisions", i, len(revids))
66
 
            git_commit = self.import_revision(revid)
67
 
            yield (revid, git_commit)
68
 
 
69
 
    def need_sha(self, sha):
70
 
        if sha in self._sent_shas:
71
 
            return False
72
 
        (type, (fileid, revid)) = self._object_store._idmap.lookup_git_sha(sha)
73
 
        assert type in ("blob", "tree")
74
 
        if revid in self._revids:
75
 
            # Not sent yet, and part of the set of revisions to send
76
 
            return True
77
 
        # Not changed in the revisions to send, so either not necessary
78
 
        # or already present remotely (as git doesn't do ghosts)
79
 
        return False
80
 
 
81
 
    def queue(self, sha, obj, path, ie=None, inv=None):
82
 
        if obj is None:
83
 
            obj = (ie, inv)
84
 
        self._pending.append((obj, path))
85
 
        self._sent_shas.add(sha)
86
 
 
87
 
    def import_revision(self, revid):
88
 
        """Import the gist of a revision into this Git repository.
89
 
 
90
 
        """
91
 
        inv = self.source.get_inventory(revid)
92
 
        todo = [inv.root]
93
 
        tree_sha = None
94
 
        while todo:
95
 
            ie = todo.pop()
96
 
            (sha, object) = self._object_store._get_ie_object_or_sha1(ie, inv)
97
 
            if ie.parent_id is None:
98
 
                tree_sha = sha
99
 
            if not self.need_sha(sha):
100
 
                continue
101
 
            self.queue(sha, object, inv.id2path(ie.file_id), ie, inv)
102
 
            if ie.kind == "directory":
103
 
                todo.extend(ie.children.values())
104
 
        assert tree_sha is not None
105
 
        commit = self._object_store._get_commit(revid, tree_sha)
106
 
        self.queue(commit.id, commit, None)
107
 
        return commit.id
108
 
 
109
 
    def __len__(self):
110
 
        return len(self._pending)
111
 
 
112
 
    def __iter__(self):
113
 
        for i, (object, path) in enumerate(self._pending):
114
 
            if self.pb:
115
 
                self.pb.update("writing pack objects", i, len(self))
116
 
            if isinstance(object, tuple):
117
 
                object = self._object_store._get_ie_object(*object)
118
 
            yield (object, path)   
119
 
 
120
 
 
121
 
class InterToGitRepository(InterRepository):
122
 
    """InterRepository that copies into a Git repository."""
123
 
 
124
 
    _matching_repo_format = GitRepositoryFormat()
125
 
 
126
 
    @staticmethod
127
 
    def _get_repo_format_to_test():
128
 
        return None
129
 
 
130
 
    def copy_content(self, revision_id=None, pb=None):
131
 
        """See InterRepository.copy_content."""
132
 
        self.fetch(revision_id, pb, find_ghosts=False)
133
 
 
134
 
    def fetch(self, revision_id=None, pb=None, find_ghosts=False, 
135
 
            fetch_spec=None):
136
 
        raise NoPushSupport()
137
 
 
138
 
    def missing_revisions(self, stop_revision):
139
 
        if stop_revision is None:
140
 
            raise NotImplementedError
141
 
        missing = []
142
 
        pb = ui.ui_factory.nested_progress_bar()
143
 
        try:
144
 
            graph = self.source.get_graph()
145
 
            for revid, _ in graph.iter_ancestry([stop_revision]):
146
 
                pb.update("determining revisions to fetch", len(missing))
147
 
                if not self.target.has_revision(revid):
148
 
                    missing.append(revid)
149
 
            return graph.iter_topo_order(missing)
150
 
        finally:
151
 
            pb.finished()
152
 
 
153
 
    def dfetch(self, stop_revision=None):
154
 
        """Import the gist of the ancestry of a particular revision."""
155
 
        revidmap = {}
156
 
        mapping = self.target.get_mapping()
157
 
        self.source.lock_read()
158
 
        try:
159
 
            todo = [revid for revid in self.missing_revisions(stop_revision) if revid != NULL_REVISION]
160
 
            pb = ui.ui_factory.nested_progress_bar()
161
 
            try:
162
 
                object_generator = MissingObjectsIterator(self.source, mapping, pb)
163
 
                for old_bzr_revid, git_commit in object_generator.import_revisions(
164
 
                    todo):
165
 
                    new_bzr_revid = mapping.revision_id_foreign_to_bzr(git_commit)
166
 
                    revidmap[old_bzr_revid] = new_bzr_revid
167
 
                self.target._git.object_store.add_objects(object_generator) 
168
 
            finally:
169
 
                pb.finished()
170
 
        finally:
171
 
            self.source.unlock()
172
 
        return revidmap
173
 
 
174
 
    @staticmethod
175
 
    def is_compatible(source, target):
176
 
        """Be compatible with GitRepository."""
177
 
        return (not isinstance(source, GitRepository) and 
178
 
                isinstance(target, GitRepository))