/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.252 by Jelmer Vernooij
Clarify history, copyright.
1
# Copyright (C) 2007-2009 Jelmer Vernooij <jelmer@samba.org>
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
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
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
17
import bzrlib
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
18
from bzrlib import (
19
    branch,
20
    tag,
0.200.333 by Jelmer Vernooij
Support progress reporting when creating index.
21
    ui,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
22
    urlutils,
23
    )
24
from bzrlib.errors import (
25
    BzrError,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
26
    InvalidRevisionId,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
27
    NoSuchFile,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
28
    NoSuchRevision,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
29
    NotLocalUrl,
30
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
31
from bzrlib.trace import (
32
    info,
33
    )
34
from bzrlib.transport import (
35
    Transport,
36
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
37
0.200.292 by Jelmer Vernooij
Fix formatting.
38
from bzrlib.plugins.git import (
39
    lazy_check_versions,
40
    )
0.200.200 by Jelmer Vernooij
Register lazily where possible.
41
lazy_check_versions()
42
0.200.292 by Jelmer Vernooij
Fix formatting.
43
from bzrlib.plugins.git.branch import (
44
    GitBranch,
45
    )
46
from bzrlib.plugins.git.errors import (
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
47
    GitSmartRemoteNotSupported,
0.200.292 by Jelmer Vernooij
Fix formatting.
48
    NoSuchRef,
49
    )
50
from bzrlib.plugins.git.dir import (
51
    GitDir,
52
    )
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
53
from bzrlib.plugins.git.mapping import (
54
    mapping_registry,
55
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
56
from bzrlib.plugins.git.repository import (
57
    GitRepositoryFormat,
58
    GitRepository,
59
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
60
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
61
import dulwich as git
0.200.292 by Jelmer Vernooij
Fix formatting.
62
from dulwich.errors import (
63
    GitProtocolError,
64
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
65
from dulwich.pack import (
66
    Pack,
67
    PackData,
68
    )
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
69
import os
70
import tempfile
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
71
import urllib
72
import urlparse
73
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
74
try:
75
    from dulwich.pack import load_pack_index
76
except ImportError:
77
    from dulwich.pack import PackIndex as load_pack_index
78
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
79
0.200.181 by Jelmer Vernooij
Support setting tags.
80
# Don't run any tests on GitSmartTransport as it is not intended to be 
81
# a full implementation of Transport
82
def get_test_permutations():
83
    return []
84
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
85
86
class GitSmartTransport(Transport):
87
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
88
    def __init__(self, url, _client=None):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
89
        Transport.__init__(self, url)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
90
        (scheme, _, loc, _, _) = urlparse.urlsplit(url)
91
        hostport, self._path = urllib.splithost(loc)
0.200.340 by Jelmer Vernooij
Fix default port for git+ssh://
92
        (self._host, self._port) = urllib.splitnport(hostport, None)
0.200.166 by Jelmer Vernooij
don't reuse client objects.
93
        self._client = _client
94
0.200.238 by Jelmer Vernooij
Import Transport.has().
95
    def has(self, relpath):
96
        return False
97
0.200.166 by Jelmer Vernooij
don't reuse client objects.
98
    def _get_client(self):
0.200.307 by Jelmer Vernooij
Support git+ssh.
99
        raise NotImplementedError(self._get_client)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
100
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
101
    def fetch_pack(self, determine_wants, graph_walker, pack_data, progress=None):
102
        if progress is None:
103
            def progress(text):
104
                info("git: %s" % text)
0.200.240 by Jelmer Vernooij
Wrap socket errors.
105
        client = self._get_client()
106
        try:
107
            client.fetch_pack(self._path, determine_wants, 
108
                graph_walker, pack_data, progress)
109
        except GitProtocolError, e:
110
            raise BzrError(e)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
111
0.200.427 by Jelmer Vernooij
make send_pack accessible.
112
    def send_pack(self, get_changed_refs, generate_pack_contents):
113
        client = self._get_client()
114
        try:
115
            client.send_pack(self._path, get_changed_refs, 
116
                generate_pack_contents)
117
        except GitProtocolError, e:
118
            raise BzrError(e)
119
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
120
    def get(self, path):
121
        raise NoSuchFile(path)
122
0.200.160 by Jelmer Vernooij
Implement abspath.
123
    def abspath(self, relpath):
124
        return urlutils.join(self.base, relpath)
125
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
126
    def clone(self, offset=None):
127
        """See Transport.clone()."""
128
        if offset is None:
129
            newurl = self.base
130
        else:
131
            newurl = urlutils.join(self.base, offset)
132
0.200.307 by Jelmer Vernooij
Support git+ssh.
133
        return self.__class__(newurl, self._client)
134
135
136
class TCPGitSmartTransport(GitSmartTransport):
137
0.200.332 by Jelmer Vernooij
Support activity reporting.
138
    _scheme = 'git'
139
0.200.307 by Jelmer Vernooij
Support git+ssh.
140
    def _get_client(self):
141
        if self._client is not None:
142
            ret = self._client
143
            self._client = None
144
            return ret
0.200.332 by Jelmer Vernooij
Support activity reporting.
145
        return git.client.TCPGitClient(self._host, self._port, thin_packs=False,
146
            report_activity=self._report_activity)
0.200.307 by Jelmer Vernooij
Support git+ssh.
147
148
149
class SSHGitSmartTransport(GitSmartTransport):
150
0.200.332 by Jelmer Vernooij
Support activity reporting.
151
    _scheme = 'git+ssh'
152
0.200.307 by Jelmer Vernooij
Support git+ssh.
153
    def _get_client(self):
154
        if self._client is not None:
155
            ret = self._client
156
            self._client = None
157
            return ret
0.200.332 by Jelmer Vernooij
Support activity reporting.
158
        return git.client.SSHGitClient(self._host, self._port, thin_packs=False,
159
            report_activity=self._report_activity)
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
160
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
161
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
162
class RemoteGitDir(GitDir):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
163
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
164
    def __init__(self, transport, lockfiles, format):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
165
        self._format = format
166
        self.root_transport = transport
167
        self.transport = transport
168
        self._lockfiles = lockfiles
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
169
        self._mode_check_done = None
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
170
171
    def open_repository(self):
172
        return RemoteGitRepository(self, self._lockfiles)
173
0.200.320 by Jelmer Vernooij
Handle lightweight checkouts.
174
    def open_branch(self, ignore_fallbacks=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
175
        repo = self.open_repository()
176
        # TODO: Support for multiple branches in one bzrdir in bzrlib!
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
177
        return RemoteGitBranch(self, repo, "HEAD", self._lockfiles)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
178
179
    def open_workingtree(self):
180
        raise NotLocalUrl(self.transport.base)
181
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
182
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
183
class EmptyObjectStoreIterator(dict):
184
185
    def iterobjects(self):
186
        return []
187
188
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
189
class TemporaryPackIterator(Pack):
190
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
191
    def __init__(self, path, resolve_ext_ref):
0.200.310 by Jelmer Vernooij
Fix pull from remote branches.
192
        super(TemporaryPackIterator, self).__init__(path)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
193
        self.resolve_ext_ref = resolve_ext_ref
194
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
195
    @property
196
    def idx(self):
197
        if self._idx is None:
0.200.302 by Jelmer Vernooij
Fix index creation when fetching from remote host.
198
            if self._data is None:
199
                self._data = PackData(self._data_path)
0.200.333 by Jelmer Vernooij
Support progress reporting when creating index.
200
            pb = ui.ui_factory.nested_progress_bar()
201
            try:
202
                def report_progress(cur, total):
203
                    pb.update("generating index", cur, total)
204
                self._data.create_index_v2(self._idx_path, self.resolve_ext_ref,
205
                    progress=report_progress)
206
            finally:
207
                pb.finished()
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
208
            self._idx = load_pack_index(self._idx_path)
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
209
        return self._idx
0.200.205 by Jelmer Vernooij
Fix remote fetching.
210
211
    def __del__(self):
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
212
        os.remove(self._data_path)
213
        os.remove(self._idx_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
214
215
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
216
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
217
218
    def __init__(self, gitdir, lockfiles):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
219
        GitRepository.__init__(self, gitdir, lockfiles)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
220
        self._refs = None
221
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
222
    @property
223
    def inventories(self):
224
        raise GitSmartRemoteNotSupported()
225
226
    @property
227
    def revisions(self):
228
        raise GitSmartRemoteNotSupported()
229
230
    @property
231
    def texts(self):
232
        raise GitSmartRemoteNotSupported()
233
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
234
    def get_refs(self):
235
        if self._refs is not None:
236
            return self._refs
237
        def determine_wants(heads):
238
            self._refs = heads
239
            return []
240
        self.bzrdir.root_transport.fetch_pack(determine_wants, None, 
241
            lambda x: None, lambda x: mutter("git: %s" % x))
242
        return self._refs
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
243
0.200.155 by Jelmer Vernooij
Fix formatting, remove catch-all for exceptions when opening local repositories.
244
    def fetch_pack(self, determine_wants, graph_walker, pack_data, 
245
                   progress=None):
246
        self._transport.fetch_pack(determine_wants, graph_walker, pack_data, 
247
            progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
248
0.200.427 by Jelmer Vernooij
make send_pack accessible.
249
    def send_pack(self, get_changed_refs, generate_pack_contents):
250
        self._transport.send_pack(get_changed_refs, generate_pack_contents)
251
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
252
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref, progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
253
        fd, path = tempfile.mkstemp(suffix=".pack")
254
        self.fetch_pack(determine_wants, graph_walker, lambda x: os.write(fd, x), progress)
255
        os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
256
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
257
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
258
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
259
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
260
    def lookup_git_revid(self, bzr_revid):
261
        # This won't work for any round-tripped bzr revisions, but it's a start..
262
        try:
263
            return mapping_registry.revision_id_bzr_to_foreign(bzr_revid)
264
        except InvalidRevisionId:
265
            raise NoSuchRevision(self, bzr_revid)
266
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
267
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
268
class RemoteGitTagDict(tag.BasicTags):
269
270
    def __init__(self, branch):
271
        self.branch = branch
272
        self.repository = branch.repository
273
274
    def get_tag_dict(self):
275
        ret = {}
276
        refs = self.repository.get_refs()
277
        for k,v in refs.iteritems():
278
            if k.startswith("refs/tags/") and not k.endswith("^{}"):
279
                v = refs.get(k+"^{}", v)
0.228.4 by Jelmer Vernooij
Strip ref directory name from tag names.
280
                ret[k[len("refs/tags/"):]] = self.branch.mapping.revision_id_foreign_to_bzr(v)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
281
        return ret
282
283
    def set_tag(self, name, revid):
284
        # FIXME: Not supported yet, should do a push of a new ref
285
        raise NotImplementedError(self.set_tag)
286
287
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
288
class RemoteGitBranch(GitBranch):
289
290
    def __init__(self, bzrdir, repository, name, lockfiles):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
291
        heads = repository.get_refs()
292
        if not name in heads:
293
            raise NoSuchRef(name)
294
        self._ref = heads[name]
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
295
        super(RemoteGitBranch, self).__init__(bzrdir, repository, name, self._ref, lockfiles)
296
0.200.408 by Jelmer Vernooij
Show proper error when attempting to access history of remote git branches.
297
    def revision_history(self):
298
        raise GitSmartRemoteNotSupported()
299
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
300
    def last_revision(self):
0.200.140 by Jelmer Vernooij
Support negotiating with remote git repository and receiving pack.
301
        return self.mapping.revision_id_foreign_to_bzr(self._ref)
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
302
0.200.169 by Jelmer Vernooij
Fix branch cloning.
303
    def _synchronize_history(self, destination, revision_id):
304
        """See Branch._synchronize_history()."""
305
        destination.generate_revision_history(self.last_revision())
306