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