/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.200.1014 by Jelmer Vernooij
Fix tests.
1
# Copyright (C) 2007-2010 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.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
17
from bzrlib import (
0.200.596 by Jelmer Vernooij
Import RemoteGitBranch._get_config().
18
    config,
0.200.707 by Jelmer Vernooij
Add debug routines.
19
    debug,
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,
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
23
    version_info as bzrlib_version,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
24
    )
25
from bzrlib.errors import (
26
    BzrError,
0.200.1412 by Jelmer Vernooij
Implement GitControlDirFormat.supports_transport.
27
    InProcessTransport,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
28
    InvalidRevisionId,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
29
    NoSuchFile,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
30
    NoSuchRevision,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
31
    NotBranchError,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
32
    NotLocalUrl,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
33
    UninitializableFormat,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
34
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
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.1064 by Jelmer Vernooij
Use common base class for tags.
46
    GitTags,
0.200.292 by Jelmer Vernooij
Fix formatting.
47
    )
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
48
from bzrlib.plugins.git.dir import (
49
    GitControlDirFormat,
50
    GitDir,
51
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
52
from bzrlib.plugins.git.errors import (
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
53
    GitSmartRemoteNotSupported,
0.200.292 by Jelmer Vernooij
Fix formatting.
54
    NoSuchRef,
55
    )
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
56
from bzrlib.plugins.git.mapping import (
57
    mapping_registry,
58
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
59
from bzrlib.plugins.git.repository import (
60
    GitRepository,
61
    )
0.200.872 by Jelmer Vernooij
Move refs code to separate module.
62
from bzrlib.plugins.git.refs import (
63
    extract_tags,
64
    branch_name_to_ref,
65
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
66
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
67
import dulwich
68
import dulwich.client
0.200.292 by Jelmer Vernooij
Fix formatting.
69
from dulwich.errors import (
70
    GitProtocolError,
71
    )
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
72
from dulwich.pack import (
73
    Pack,
0.200.1298 by Jelmer Vernooij
Fix compatibility with newer versions of dulwich.
74
    PackData,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
75
    )
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
76
import os
77
import tempfile
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
78
import urllib
79
import urlparse
0.200.741 by Jelmer Vernooij
Cope with older versions of Python by adding git and git+ssh to the list of known schemes.
80
urlparse.uses_netloc.extend(['git', 'git+ssh'])
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
81
0.200.586 by Jelmer Vernooij
Fix issues pointed out by pyflakes.
82
from dulwich.pack import load_pack_index
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
83
0.200.143 by Jelmer Vernooij
Reoncile InterGitRepository objects.
84
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
85
# Don't run any tests on GitSmartTransport as it is not intended to be
0.200.181 by Jelmer Vernooij
Support setting tags.
86
# a full implementation of Transport
87
def get_test_permutations():
88
    return []
89
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
90
0.200.708 by Jelmer Vernooij
Factor out URL parsing.
91
def split_git_url(url):
0.200.709 by Jelmer Vernooij
When unpacking URLs, strip leftmost slash to match gits behaviour.
92
    """Split a Git URL.
93
94
    :param url: Git URL
95
    :return: Tuple with host, port, username, path.
96
    """
0.200.743 by Jelmer Vernooij
Fix URL parsing.
97
    (scheme, netloc, loc, _, _) = urlparse.urlsplit(url)
98
    path = urllib.unquote(loc)
0.246.2 by Jelmer Vernooij
Improve the fix dealing with git repo's in home directories.
99
    if path.startswith("/~"):
0.200.709 by Jelmer Vernooij
When unpacking URLs, strip leftmost slash to match gits behaviour.
100
        path = path[1:]
0.200.743 by Jelmer Vernooij
Fix URL parsing.
101
    (username, hostport) = urllib.splituser(netloc)
0.200.708 by Jelmer Vernooij
Factor out URL parsing.
102
    (host, port) = urllib.splitnport(hostport, None)
103
    return (host, port, username, path)
104
105
0.200.1275 by Jelmer Vernooij
recognize missing repositories
106
def parse_git_error(url, message):
107
    """Parse a remote git server error and return a bzr exception.
108
109
    :param url: URL of the remote repository
110
    :param message: Message sent by the remote git server
111
    """
112
    message = str(message).strip()
113
    if message.startswith("Could not find Repository "):
114
        return NotBranchError(url, message)
115
    # Don't know, just return it to the user as-is
116
    return BzrError(message)
117
118
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
119
class GitSmartTransport(Transport):
120
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
121
    def __init__(self, url, _client=None):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
122
        Transport.__init__(self, url)
0.200.708 by Jelmer Vernooij
Factor out URL parsing.
123
        (self._host, self._port, self._username, self._path) = \
124
            split_git_url(url)
0.200.707 by Jelmer Vernooij
Add debug routines.
125
        if 'transport' in debug.debug_flags:
126
            trace.mutter('host: %r, user: %r, port: %r, path: %r',
127
                         self._host, self._username, self._port, self._path)
0.200.166 by Jelmer Vernooij
don't reuse client objects.
128
        self._client = _client
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
129
        if "," in self._path and bzrlib_version < (2, 5, 0):
130
            trace.warning(
131
                "ignoring parameters %r, not supported in bzr < 2.5.",
132
                self._path.rsplit(",", 1)[1])
133
        self._stripped_path = self._path.rsplit(",", 1)[0]
0.200.166 by Jelmer Vernooij
don't reuse client objects.
134
0.200.543 by Jelmer Vernooij
Implement GitSmartTransport.external_url().
135
    def external_url(self):
136
        return self.base
137
0.200.238 by Jelmer Vernooij
Import Transport.has().
138
    def has(self, relpath):
139
        return False
140
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
141
    def _get_client(self, thin_packs):
0.200.307 by Jelmer Vernooij
Support git+ssh.
142
        raise NotImplementedError(self._get_client)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
143
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
144
    def _get_path(self):
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
145
        return self._stripped_path
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
146
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
147
    def get(self, path):
148
        raise NoSuchFile(path)
149
0.200.160 by Jelmer Vernooij
Implement abspath.
150
    def abspath(self, relpath):
151
        return urlutils.join(self.base, relpath)
152
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
153
    def clone(self, offset=None):
154
        """See Transport.clone()."""
155
        if offset is None:
156
            newurl = self.base
157
        else:
158
            newurl = urlutils.join(self.base, offset)
159
0.200.307 by Jelmer Vernooij
Support git+ssh.
160
        return self.__class__(newurl, self._client)
161
162
163
class TCPGitSmartTransport(GitSmartTransport):
164
0.200.332 by Jelmer Vernooij
Support activity reporting.
165
    _scheme = 'git'
166
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
167
    def _get_client(self, thin_packs):
0.200.307 by Jelmer Vernooij
Support git+ssh.
168
        if self._client is not None:
169
            ret = self._client
170
            self._client = None
171
            return ret
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
172
        return dulwich.client.TCPGitClient(self._host, self._port,
0.200.859 by Jelmer Vernooij
Trivial cleanups.
173
            thin_packs=thin_packs, report_activity=self._report_activity)
0.200.307 by Jelmer Vernooij
Support git+ssh.
174
175
176
class SSHGitSmartTransport(GitSmartTransport):
177
0.200.332 by Jelmer Vernooij
Support activity reporting.
178
    _scheme = 'git+ssh'
179
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
180
    def _get_path(self):
0.200.1464 by Jelmer Vernooij
Warn about ignoring path segment parameters when using bzr 2.4.
181
        path = self._stripped_path
0.200.1318 by Jelmer Vernooij
Strip segment parameters where necessary.
182
        if path.startswith("/~/"):
183
            return path[3:]
184
        return path
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
185
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
186
    def _get_client(self, thin_packs):
0.200.307 by Jelmer Vernooij
Support git+ssh.
187
        if self._client is not None:
188
            ret = self._client
189
            self._client = None
190
            return ret
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
191
        location_config = config.LocationConfig(self.base)
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
192
        client = dulwich.client.SSHGitClient(self._host, self._port, self._username,
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
193
            thin_packs=thin_packs, report_activity=self._report_activity)
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
194
        # Set up alternate pack program paths
195
        upload_pack = location_config.get_user_option('git_upload_pack')
196
        if upload_pack:
0.200.949 by Jelmer Vernooij
merge support for specifying alternative paths for git executables.
197
            client.alternative_paths["upload-pack"] = upload_pack
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
198
        receive_pack = location_config.get_user_option('git_receive_pack')
199
        if receive_pack:
0.200.949 by Jelmer Vernooij
merge support for specifying alternative paths for git executables.
200
            client.alternative_paths["receive-pack"] = receive_pack
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
201
        return client
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
202
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
203
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
204
class RemoteGitDir(GitDir):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
205
0.200.1411 by Jelmer Vernooij
Fix control files.
206
    def __init__(self, transport, format, get_client, client_path):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
207
        self._format = format
208
        self.root_transport = transport
209
        self.transport = transport
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
210
        self._mode_check_done = None
0.200.1335 by Jelmer Vernooij
Move _get_client.
211
        self._get_client = get_client
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
212
        self._client_path = client_path
0.200.1396 by Jelmer Vernooij
Support updating tags in remote branches during pull.
213
        self.base = self.root_transport.base
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
214
        self._refs = None
0.200.1335 by Jelmer Vernooij
Move _get_client.
215
216
    def fetch_pack(self, determine_wants, graph_walker, pack_data, progress=None):
217
        if progress is None:
218
            def progress(text):
219
                trace.info("git: %s" % text)
220
        client = self._get_client(thin_packs=False)
221
        try:
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
222
            return client.fetch_pack(self._client_path, determine_wants,
0.200.1335 by Jelmer Vernooij
Move _get_client.
223
                graph_walker, pack_data, progress)
224
        except GitProtocolError, e:
225
            raise parse_git_error(self.transport.external_url(), e)
226
227
    def send_pack(self, get_changed_refs, generate_pack_contents):
228
        client = self._get_client(thin_packs=False)
229
        try:
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
230
            return client.send_pack(self._client_path, get_changed_refs,
0.200.1335 by Jelmer Vernooij
Move _get_client.
231
                generate_pack_contents)
232
        except GitProtocolError, e:
233
            raise parse_git_error(self.transport.external_url(), e)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
234
0.200.1393 by Jelmer Vernooij
Implement removal of remote branches.
235
    def destroy_branch(self, name=None):
236
        refname = self._get_selected_ref(name)
237
        if refname is None:
238
            refname = "HEAD"
239
        def get_changed_refs(old_refs):
240
            ret = dict(old_refs)
241
            if not refname in ret:
0.200.1395 by Jelmer Vernooij
Fix error reporting.
242
                raise NotBranchError(self.user_url)
0.200.1393 by Jelmer Vernooij
Implement removal of remote branches.
243
            ret[refname] = "00" * 20
244
            return ret
245
        self.send_pack(get_changed_refs, lambda have, want: [])
246
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
247
    @property
248
    def user_url(self):
249
        return self.control_url
250
0.200.1314 by Jelmer Vernooij
Provide RemoteGitDir.user_transport.
251
    @property
252
    def user_transport(self):
253
        return self.root_transport
254
0.200.1395 by Jelmer Vernooij
Fix error reporting.
255
    @property
256
    def control_url(self):
257
        return self.control_transport.base
258
259
    @property
260
    def control_transport(self):
261
        return self.root_transport
262
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
263
    def open_repository(self):
0.200.1415 by Jelmer Vernooij
Fix lock files for remote directories.
264
        return RemoteGitRepository(self)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
265
0.200.1310 by Jelmer Vernooij
Add _get_selected_ref method.
266
    def open_branch(self, name=None, unsupported=False,
0.200.1473 by Jelmer Vernooij
Support possible_transports argument to .open_branch.
267
            ignore_fallbacks=False, ref=None, possible_transports=None):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
268
        repo = self.open_repository()
0.269.8 by Jelmer Vernooij
Support push in git-remote-bzr.
269
        refname = self._get_selected_ref(name, ref)
0.200.1415 by Jelmer Vernooij
Fix lock files for remote directories.
270
        return RemoteGitBranch(self, repo, refname)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
271
0.200.662 by Jelmer Vernooij
Deal with recommend_upgrade argument to open_workingtree.
272
    def open_workingtree(self, recommend_upgrade=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
273
        raise NotLocalUrl(self.transport.base)
274
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
275
    def get_refs(self):
276
        if self._refs is not None:
277
            return self._refs
278
        self._refs = self.fetch_pack(lambda x: [], None,
279
            lambda x: None, lambda x: trace.mutter("git: %s" % x))
280
        return self._refs
281
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
282
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
283
class EmptyObjectStoreIterator(dict):
284
285
    def iterobjects(self):
286
        return []
287
288
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
289
class TemporaryPackIterator(Pack):
290
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
291
    def __init__(self, path, resolve_ext_ref):
0.200.310 by Jelmer Vernooij
Fix pull from remote branches.
292
        super(TemporaryPackIterator, self).__init__(path)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
293
        self.resolve_ext_ref = resolve_ext_ref
294
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
295
    @property
0.200.604 by Jelmer Vernooij
Fix fetching of remote repositories on Windows.
296
    def data(self):
297
        if self._data is None:
0.200.1298 by Jelmer Vernooij
Fix compatibility with newer versions of dulwich.
298
            self._data = PackData(self._data_path)
0.200.604 by Jelmer Vernooij
Fix fetching of remote repositories on Windows.
299
        return self._data
300
301
    @property
0.200.458 by Jelmer Vernooij
Fix index.
302
    def index(self):
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
303
        if self._idx is None:
0.200.562 by Jelmer Vernooij
Only create pack index if it doesn't exist yet.
304
            if not os.path.exists(self._idx_path):
305
                pb = ui.ui_factory.nested_progress_bar()
306
                try:
307
                    def report_progress(cur, total):
308
                        pb.update("generating index", cur, total)
0.200.900 by Jelmer Vernooij
Fix compatibility with newer versions of Dulwich.
309
                    self.data.create_index(self._idx_path, 
0.200.562 by Jelmer Vernooij
Only create pack index if it doesn't exist yet.
310
                        progress=report_progress)
311
                finally:
312
                    pb.finished()
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
313
            self._idx = load_pack_index(self._idx_path)
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
314
        return self._idx
0.200.205 by Jelmer Vernooij
Fix remote fetching.
315
316
    def __del__(self):
0.200.611 by Jelmer Vernooij
Merge warning fix from Naoki.
317
        if self._idx is not None:
0.241.1 by Naoki INADA
Fix can't delete tempfile on Windows
318
            self._idx.close()
319
            os.remove(self._idx_path)
0.200.611 by Jelmer Vernooij
Merge warning fix from Naoki.
320
        if self._data is not None:
0.241.1 by Naoki INADA
Fix can't delete tempfile on Windows
321
            self._data.close()
322
            os.remove(self._data_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
323
324
0.200.1337 by Jelmer Vernooij
Re-use http connection if possible.
325
class BzrGitHttpClient(dulwich.client.HttpGitClient):
326
327
    def __init__(self, transport, *args, **kwargs):
328
        self.transport = transport
329
        super(BzrGitHttpClient, self).__init__(transport.external_url(), *args, **kwargs)
330
        import urllib2
331
        self._http_perform = getattr(self.transport, "_perform", urllib2.urlopen)
332
333
    def _perform(self, req):
334
        req.accepted_errors = (200, 404)
335
        req.follow_redirections = True
336
        req.redirected_to = None
337
        return self._http_perform(req)
338
339
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
340
class RemoteGitControlDirFormat(GitControlDirFormat):
341
    """The .git directory control format."""
342
343
    supports_workingtrees = False
344
345
    @classmethod
346
    def _known_formats(self):
347
        return set([RemoteGitControlDirFormat()])
348
0.200.1413 by Jelmer Vernooij
Fix is_initializable()
349
    def is_initializable(self):
350
        return False
351
352
    def is_supported(self):
353
        return True
354
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
355
    def open(self, transport, _found=None):
356
        """Open this directory.
357
358
        """
359
        # we dont grok readonly - git isn't integrated with transport.
360
        url = transport.base
361
        if url.startswith('readonly+'):
362
            url = url[len('readonly+'):]
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
363
        if isinstance(transport, GitSmartTransport):
364
            get_client = transport._get_client
365
            client_path = transport._get_path()
366
        elif urlparse.urlsplit(transport.external_url())[0] in ("http", "https"):
367
            def get_client(thin_packs=False):
0.200.1337 by Jelmer Vernooij
Re-use http connection if possible.
368
                return BzrGitHttpClient(transport, thin_packs=thin_packs)
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
369
            client_path = transport._path
370
        else:
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
371
            raise NotBranchError(transport.base)
0.200.1411 by Jelmer Vernooij
Fix control files.
372
        return RemoteGitDir(transport, self, get_client, client_path)
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
373
374
    def get_format_description(self):
375
        return "Remote Git Repository"
376
377
    def initialize_on_transport(self, transport):
378
        raise UninitializableFormat(self)
379
0.200.1412 by Jelmer Vernooij
Implement GitControlDirFormat.supports_transport.
380
    def supports_transport(self, transport):
381
        try:
382
            external_url = transport.external_url()
383
        except InProcessTransport:
384
            raise NotBranchError(path=transport.base)
385
        return (external_url.startswith("http:") or
386
                external_url.startswith("https:") or
387
                external_url.startswith("git+") or
388
                external_url.startswith("git:"))
389
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
390
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
391
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
392
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
393
    @property
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
394
    def user_url(self):
395
        return self.control_url
396
0.200.1288 by Jelmer Vernooij
Properly raise GitRemoteNotSupported from RemoteGitRepository.
397
    def get_parent_map(self, revids):
0.200.1398 by Jelmer Vernooij
Make GitSmartRemoteNotSupported derive from UnsupportedOperation.
398
        raise GitSmartRemoteNotSupported(self.get_parent_map, self)
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
399
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
400
    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.
401
                   progress=None):
0.200.1335 by Jelmer Vernooij
Move _get_client.
402
        return self.bzrdir.fetch_pack(determine_wants, graph_walker,
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
403
                                          pack_data, progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
404
0.200.427 by Jelmer Vernooij
make send_pack accessible.
405
    def send_pack(self, get_changed_refs, generate_pack_contents):
0.200.1335 by Jelmer Vernooij
Move _get_client.
406
        return self.bzrdir.send_pack(get_changed_refs, generate_pack_contents)
0.200.427 by Jelmer Vernooij
make send_pack accessible.
407
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
408
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
409
                      progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
410
        fd, path = tempfile.mkstemp(suffix=".pack")
0.200.1299 by Jelmer Vernooij
Make sure file gets closed.
411
        try:
412
            self.fetch_pack(determine_wants, graph_walker,
413
                lambda x: os.write(fd, x), progress)
414
        finally:
415
            os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
416
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
417
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
418
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
419
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
420
    def lookup_bzr_revision_id(self, bzr_revid):
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
421
        # This won't work for any round-tripped bzr revisions, but it's a start..
422
        try:
423
            return mapping_registry.revision_id_bzr_to_foreign(bzr_revid)
424
        except InvalidRevisionId:
425
            raise NoSuchRevision(self, bzr_revid)
426
0.252.48 by Jelmer Vernooij
Implement lookup_foreign_revision for remote branches.
427
    def lookup_foreign_revision_id(self, foreign_revid, mapping=None):
428
        """Lookup a revision id.
429
430
        """
431
        if mapping is None:
432
            mapping = self.get_mapping()
433
        # Not really an easy way to parse foreign revids here..
434
        return mapping.revision_id_foreign_to_bzr(foreign_revid)
435
0.200.1446 by Jelmer Vernooij
Add stub for RemoteGitRepository.revision_tree.
436
    def revision_tree(self, revid):
437
        raise GitSmartRemoteNotSupported(self.revision_tree, self)
438
0.200.1481 by Jelmer Vernooij
'Implement' RemoteGitRepository.get_revisions.
439
    def get_revisions(self, revids):
440
        raise GitSmartRemoteNotSupported(self.get_revisions, self)
441
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
442
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
443
class RemoteGitTagDict(GitTags):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
444
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
445
    def get_refs(self):
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
446
        return self.repository.bzrdir.get_refs()
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
447
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
448
    def _iter_tag_refs(self, refs):
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
449
        for k, (peeled, unpeeled) in extract_tags(refs).iteritems():
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
450
            yield (k, peeled, unpeeled,
451
                  self.branch.mapping.revision_id_foreign_to_bzr(peeled))
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
452
453
    def set_tag(self, name, revid):
454
        # FIXME: Not supported yet, should do a push of a new ref
455
        raise NotImplementedError(self.set_tag)
456
457
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
458
class RemoteGitBranch(GitBranch):
459
0.200.1415 by Jelmer Vernooij
Fix lock files for remote directories.
460
    def __init__(self, bzrdir, repository, name):
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
461
        self._sha = None
0.200.1415 by Jelmer Vernooij
Fix lock files for remote directories.
462
        super(RemoteGitBranch, self).__init__(bzrdir, repository, name)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
463
0.200.1317 by Jelmer Vernooij
Avoid NotImplementedError.
464
    def last_revision_info(self):
0.200.1398 by Jelmer Vernooij
Make GitSmartRemoteNotSupported derive from UnsupportedOperation.
465
        raise GitSmartRemoteNotSupported(self.last_revision_info, self)
0.200.1317 by Jelmer Vernooij
Avoid NotImplementedError.
466
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
467
    @property
468
    def user_url(self):
469
        return self.control_url
470
471
    @property
472
    def control_url(self):
473
        return self.base
474
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
475
    def revision_history(self):
0.200.1436 by Jelmer Vernooij
Raise UnsupportedOperation for `Branch.revision_id_to_dotted_revno`,
476
        raise GitSmartRemoteNotSupported(self.revision_history, self)
477
478
    def revision_id_to_revno(self, revision_id):
479
        raise GitSmartRemoteNotSupported(self.revision_id_to_revno, self)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
480
481
    def last_revision(self):
0.252.44 by Jelmer Vernooij
Properly look up Bazaar revision ids for revision parents in case they are round-tripped.
482
        return self.lookup_foreign_revision_id(self.head)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
483
484
    @property
485
    def head(self):
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
486
        if self._sha is not None:
487
            return self._sha
0.200.1434 by Jelmer Vernooij
Move refs access to control dir.
488
        refs = self.bzrdir.get_refs()
0.200.1311 by Jelmer Vernooij
More work on colocated branch support.
489
        name = branch_name_to_ref(self.name, "HEAD")
0.200.1386 by Jelmer Vernooij
Friendlier message if HEAD is not found.
490
        try:
491
            self._sha = refs[name]
492
        except KeyError:
493
            raise NoSuchRef(name, self.repository.user_url, refs)
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
494
        return self._sha
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
495
0.200.169 by Jelmer Vernooij
Fix branch cloning.
496
    def _synchronize_history(self, destination, revision_id):
497
        """See Branch._synchronize_history()."""
498
        destination.generate_revision_history(self.last_revision())
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
499
0.200.499 by Jelmer Vernooij
Implement RemoteBranch.{get,set}_push_location.
500
    def get_push_location(self):
501
        return None
502
503
    def set_push_location(self, url):
504
        pass