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