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