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