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