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