/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.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
26
    InvalidRevisionId,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
27
    NoSuchFile,
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
28
    NoSuchRevision,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
29
    NotBranchError,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
30
    NotLocalUrl,
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
31
    UninitializableFormat,
0.200.289 by Jelmer Vernooij
Cope with new member variables in RepositoryFormat.
32
    )
0.200.292 by Jelmer Vernooij
Fix formatting.
33
from bzrlib.transport import (
34
    Transport,
35
    )
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
36
0.200.292 by Jelmer Vernooij
Fix formatting.
37
from bzrlib.plugins.git import (
38
    lazy_check_versions,
39
    )
0.200.200 by Jelmer Vernooij
Register lazily where possible.
40
lazy_check_versions()
41
0.200.292 by Jelmer Vernooij
Fix formatting.
42
from bzrlib.plugins.git.branch import (
43
    GitBranch,
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
44
    GitTags,
0.200.292 by Jelmer Vernooij
Fix formatting.
45
    )
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
46
from bzrlib.plugins.git.dir import (
47
    GitControlDirFormat,
48
    GitDir,
49
    GitLockableFiles,
50
    GitLock,
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
129
0.200.543 by Jelmer Vernooij
Implement GitSmartTransport.external_url().
130
    def external_url(self):
131
        return self.base
132
0.200.238 by Jelmer Vernooij
Import Transport.has().
133
    def has(self, relpath):
134
        return False
135
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
136
    def _get_client(self, thin_packs):
0.200.307 by Jelmer Vernooij
Support git+ssh.
137
        raise NotImplementedError(self._get_client)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
138
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
139
    def _get_path(self):
0.200.1318 by Jelmer Vernooij
Strip segment parameters where necessary.
140
        return urlutils.split_segment_parameters_raw(self._path)[0]
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
141
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
142
    def get(self, path):
143
        raise NoSuchFile(path)
144
0.200.160 by Jelmer Vernooij
Implement abspath.
145
    def abspath(self, relpath):
146
        return urlutils.join(self.base, relpath)
147
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
148
    def clone(self, offset=None):
149
        """See Transport.clone()."""
150
        if offset is None:
151
            newurl = self.base
152
        else:
153
            newurl = urlutils.join(self.base, offset)
154
0.200.307 by Jelmer Vernooij
Support git+ssh.
155
        return self.__class__(newurl, self._client)
156
157
158
class TCPGitSmartTransport(GitSmartTransport):
159
0.200.332 by Jelmer Vernooij
Support activity reporting.
160
    _scheme = 'git'
161
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
162
    def _get_client(self, thin_packs):
0.200.307 by Jelmer Vernooij
Support git+ssh.
163
        if self._client is not None:
164
            ret = self._client
165
            self._client = None
166
            return ret
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
167
        return dulwich.client.TCPGitClient(self._host, self._port,
0.200.859 by Jelmer Vernooij
Trivial cleanups.
168
            thin_packs=thin_packs, report_activity=self._report_activity)
0.200.307 by Jelmer Vernooij
Support git+ssh.
169
170
171
class SSHGitSmartTransport(GitSmartTransport):
172
0.200.332 by Jelmer Vernooij
Support activity reporting.
173
    _scheme = 'git+ssh'
174
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
175
    def _get_path(self):
0.200.1318 by Jelmer Vernooij
Strip segment parameters where necessary.
176
        path = urlutils.split_segment_parameters_raw(self._path)[0]
177
        if path.startswith("/~/"):
178
            return path[3:]
179
        return path
0.200.470 by Jelmer Vernooij
Properly parse username in URLs.
180
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
181
    def _get_client(self, thin_packs):
0.200.307 by Jelmer Vernooij
Support git+ssh.
182
        if self._client is not None:
183
            ret = self._client
184
            self._client = None
185
            return ret
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
186
        location_config = config.LocationConfig(self.base)
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
187
        client = dulwich.client.SSHGitClient(self._host, self._port, self._username,
0.200.567 by Jelmer Vernooij
Pass along thin pack settings.
188
            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
189
        # Set up alternate pack program paths
190
        upload_pack = location_config.get_user_option('git_upload_pack')
191
        if upload_pack:
0.200.949 by Jelmer Vernooij
merge support for specifying alternative paths for git executables.
192
            client.alternative_paths["upload-pack"] = upload_pack
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
193
        receive_pack = location_config.get_user_option('git_receive_pack')
194
        if receive_pack:
0.200.949 by Jelmer Vernooij
merge support for specifying alternative paths for git executables.
195
            client.alternative_paths["receive-pack"] = receive_pack
0.253.1 by Ross Light
Added configuration options for git-upload-pack and git-receive-pack
196
        return client
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
197
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
198
0.200.148 by Jelmer Vernooij
Share more infrastructure between LocalGitDir and RemoteGitDir.
199
class RemoteGitDir(GitDir):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
200
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
201
    def __init__(self, transport, lockfiles, format, get_client, client_path):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
202
        self._format = format
203
        self.root_transport = transport
204
        self.transport = transport
205
        self._lockfiles = lockfiles
0.200.381 by Jelmer Vernooij
Support working trees properly, status and ls.
206
        self._mode_check_done = None
0.200.1335 by Jelmer Vernooij
Move _get_client.
207
        self._get_client = get_client
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
208
        self._client_path = client_path
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.1068 by Jelmer Vernooij
Implement user_url/control_url.
229
    @property
230
    def user_url(self):
231
        return self.control_url
232
0.200.1314 by Jelmer Vernooij
Provide RemoteGitDir.user_transport.
233
    @property
234
    def user_transport(self):
235
        return self.root_transport
236
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
237
    def open_repository(self):
238
        return RemoteGitRepository(self, self._lockfiles)
239
0.200.1310 by Jelmer Vernooij
Add _get_selected_ref method.
240
    def open_branch(self, name=None, unsupported=False,
241
            ignore_fallbacks=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
242
        repo = self.open_repository()
0.200.1310 by Jelmer Vernooij
Add _get_selected_ref method.
243
        refname = self._get_selected_ref(name)
0.200.729 by Jelmer Vernooij
Improve colocated branches support.
244
        return RemoteGitBranch(self, repo, refname, self._lockfiles)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
245
0.200.662 by Jelmer Vernooij
Deal with recommend_upgrade argument to open_workingtree.
246
    def open_workingtree(self, recommend_upgrade=False):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
247
        raise NotLocalUrl(self.transport.base)
248
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
249
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
250
class EmptyObjectStoreIterator(dict):
251
252
    def iterobjects(self):
253
        return []
254
255
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
256
class TemporaryPackIterator(Pack):
257
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
258
    def __init__(self, path, resolve_ext_ref):
0.200.310 by Jelmer Vernooij
Fix pull from remote branches.
259
        super(TemporaryPackIterator, self).__init__(path)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
260
        self.resolve_ext_ref = resolve_ext_ref
261
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
262
    @property
0.200.604 by Jelmer Vernooij
Fix fetching of remote repositories on Windows.
263
    def data(self):
264
        if self._data is None:
0.200.1298 by Jelmer Vernooij
Fix compatibility with newer versions of dulwich.
265
            self._data = PackData(self._data_path)
0.200.604 by Jelmer Vernooij
Fix fetching of remote repositories on Windows.
266
        return self._data
267
268
    @property
0.200.458 by Jelmer Vernooij
Fix index.
269
    def index(self):
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
270
        if self._idx is None:
0.200.562 by Jelmer Vernooij
Only create pack index if it doesn't exist yet.
271
            if not os.path.exists(self._idx_path):
272
                pb = ui.ui_factory.nested_progress_bar()
273
                try:
274
                    def report_progress(cur, total):
275
                        pb.update("generating index", cur, total)
0.200.900 by Jelmer Vernooij
Fix compatibility with newer versions of Dulwich.
276
                    self.data.create_index(self._idx_path, 
0.200.562 by Jelmer Vernooij
Only create pack index if it doesn't exist yet.
277
                        progress=report_progress)
278
                finally:
279
                    pb.finished()
0.200.306 by Jelmer Vernooij
Fix tests, split up InterGitNonGitRepository.
280
            self._idx = load_pack_index(self._idx_path)
0.200.218 by Jelmer Vernooij
Simplify TemporaryPack implementation.
281
        return self._idx
0.200.205 by Jelmer Vernooij
Fix remote fetching.
282
283
    def __del__(self):
0.200.611 by Jelmer Vernooij
Merge warning fix from Naoki.
284
        if self._idx is not None:
0.241.1 by Naoki INADA
Fix can't delete tempfile on Windows
285
            self._idx.close()
286
            os.remove(self._idx_path)
0.200.611 by Jelmer Vernooij
Merge warning fix from Naoki.
287
        if self._data is not None:
0.241.1 by Naoki INADA
Fix can't delete tempfile on Windows
288
            self._data.close()
289
            os.remove(self._data_path)
0.200.205 by Jelmer Vernooij
Fix remote fetching.
290
291
0.200.1337 by Jelmer Vernooij
Re-use http connection if possible.
292
class BzrGitHttpClient(dulwich.client.HttpGitClient):
293
294
    def __init__(self, transport, *args, **kwargs):
295
        self.transport = transport
296
        super(BzrGitHttpClient, self).__init__(transport.external_url(), *args, **kwargs)
297
        import urllib2
298
        self._http_perform = getattr(self.transport, "_perform", urllib2.urlopen)
299
300
    def _perform(self, req):
301
        req.accepted_errors = (200, 404)
302
        req.follow_redirections = True
303
        req.redirected_to = None
304
        return self._http_perform(req)
305
306
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
307
class RemoteGitControlDirFormat(GitControlDirFormat):
308
    """The .git directory control format."""
309
310
    supports_workingtrees = False
311
312
    @classmethod
313
    def _known_formats(self):
314
        return set([RemoteGitControlDirFormat()])
315
316
    def open(self, transport, _found=None):
317
        """Open this directory.
318
319
        """
320
        # we dont grok readonly - git isn't integrated with transport.
321
        url = transport.base
322
        if url.startswith('readonly+'):
323
            url = url[len('readonly+'):]
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
324
        if isinstance(transport, GitSmartTransport):
325
            get_client = transport._get_client
326
            client_path = transport._get_path()
327
        elif urlparse.urlsplit(transport.external_url())[0] in ("http", "https"):
328
            def get_client(thin_packs=False):
0.200.1337 by Jelmer Vernooij
Re-use http connection if possible.
329
                return BzrGitHttpClient(transport, thin_packs=thin_packs)
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
330
            client_path = transport._path
331
        else:
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
332
            raise NotBranchError(transport.base)
333
        lockfiles = GitLockableFiles(transport, GitLock())
0.200.1336 by Jelmer Vernooij
Support the git smart server http protocol.
334
        return RemoteGitDir(transport, lockfiles, self, get_client, client_path)
0.200.1137 by Jelmer Vernooij
Support BzrProber.known_formats().
335
336
    def get_format_description(self):
337
        return "Remote Git Repository"
338
339
    def initialize_on_transport(self, transport):
340
        raise UninitializableFormat(self)
341
342
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
343
class RemoteGitRepository(GitRepository):
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
344
345
    def __init__(self, gitdir, lockfiles):
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
346
        GitRepository.__init__(self, gitdir, lockfiles)
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
347
        self._refs = None
348
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
349
    @property
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
350
    def user_url(self):
351
        return self.control_url
352
0.200.1288 by Jelmer Vernooij
Properly raise GitRemoteNotSupported from RemoteGitRepository.
353
    def get_parent_map(self, revids):
0.200.319 by Jelmer Vernooij
Print proper error when trying unsupported operations against a git server.
354
        raise GitSmartRemoteNotSupported()
355
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
356
    def get_refs(self):
357
        if self._refs is not None:
358
            return self._refs
0.200.1335 by Jelmer Vernooij
Move _get_client.
359
        self._refs = self.bzrdir.fetch_pack(lambda x: [], None,
0.200.586 by Jelmer Vernooij
Fix issues pointed out by pyflakes.
360
            lambda x: None, lambda x: trace.mutter("git: %s" % x))
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
361
        return self._refs
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
362
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
363
    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.
364
                   progress=None):
0.200.1335 by Jelmer Vernooij
Move _get_client.
365
        return self.bzrdir.fetch_pack(determine_wants, graph_walker,
0.200.456 by Jelmer Vernooij
Fix git -> git fetching.
366
                                          pack_data, progress)
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
367
0.200.427 by Jelmer Vernooij
make send_pack accessible.
368
    def send_pack(self, get_changed_refs, generate_pack_contents):
0.200.1335 by Jelmer Vernooij
Move _get_client.
369
        return self.bzrdir.send_pack(get_changed_refs, generate_pack_contents)
0.200.427 by Jelmer Vernooij
make send_pack accessible.
370
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
371
    def fetch_objects(self, determine_wants, graph_walker, resolve_ext_ref,
372
                      progress=None):
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
373
        fd, path = tempfile.mkstemp(suffix=".pack")
0.200.1299 by Jelmer Vernooij
Make sure file gets closed.
374
        try:
375
            self.fetch_pack(determine_wants, graph_walker,
376
                lambda x: os.write(fd, x), progress)
377
        finally:
378
            os.close(fd)
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
379
        if os.path.getsize(path) == 0:
0.225.2 by Jelmer Vernooij
Handle situation when repository is already up to date during pull.
380
            return EmptyObjectStoreIterator()
0.200.226 by Jelmer Vernooij
Merge thin-pack work.
381
        return TemporaryPackIterator(path[:-len(".pack")], resolve_ext_ref)
0.200.167 by Jelmer Vernooij
Implement fetch_objects properly.
382
0.200.650 by Jelmer Vernooij
Use standard names for lookup functions.
383
    def lookup_bzr_revision_id(self, bzr_revid):
0.200.415 by Jelmer Vernooij
make 'bzr pull --revision' work for remote repositories.
384
        # This won't work for any round-tripped bzr revisions, but it's a start..
385
        try:
386
            return mapping_registry.revision_id_bzr_to_foreign(bzr_revid)
387
        except InvalidRevisionId:
388
            raise NoSuchRevision(self, bzr_revid)
389
0.252.48 by Jelmer Vernooij
Implement lookup_foreign_revision for remote branches.
390
    def lookup_foreign_revision_id(self, foreign_revid, mapping=None):
391
        """Lookup a revision id.
392
393
        """
394
        if mapping is None:
395
            mapping = self.get_mapping()
396
        # Not really an easy way to parse foreign revids here..
397
        return mapping.revision_id_foreign_to_bzr(foreign_revid)
398
0.200.138 by Jelmer Vernooij
Add initial infrastructure for accessing remote git repositories.
399
0.200.1064 by Jelmer Vernooij
Use common base class for tags.
400
class RemoteGitTagDict(GitTags):
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
401
0.200.1066 by Jelmer Vernooij
Add GitTags.get_refs.
402
    def get_refs(self):
403
        return self.repository.get_refs()
404
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
405
    def _iter_tag_refs(self, refs):
0.200.1060 by Jelmer Vernooij
Return unpeeled tags in extract_tags.
406
        for k, (peeled, unpeeled) in extract_tags(refs).iteritems():
0.200.1065 by Jelmer Vernooij
Don't peel tags automatically when pushing back.
407
            yield (k, peeled, unpeeled,
408
                  self.branch.mapping.revision_id_foreign_to_bzr(peeled))
0.228.3 by Jelmer Vernooij
Fix tags when fetching from remotes.
409
410
    def set_tag(self, name, revid):
411
        # FIXME: Not supported yet, should do a push of a new ref
412
        raise NotImplementedError(self.set_tag)
413
414
0.200.139 by Jelmer Vernooij
Share more code between local and remote classes, support opening remote branches.
415
class RemoteGitBranch(GitBranch):
416
417
    def __init__(self, bzrdir, repository, name, lockfiles):
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
418
        self._sha = None
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
419
        super(RemoteGitBranch, self).__init__(bzrdir, repository, name,
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
420
                lockfiles)
421
0.200.1317 by Jelmer Vernooij
Avoid NotImplementedError.
422
    def last_revision_info(self):
423
        raise GitSmartRemoteNotSupported()
424
0.200.1068 by Jelmer Vernooij
Implement user_url/control_url.
425
    @property
426
    def user_url(self):
427
        return self.control_url
428
429
    @property
430
    def control_url(self):
431
        return self.base
432
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
433
    def revision_history(self):
434
        raise GitSmartRemoteNotSupported()
435
436
    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.
437
        return self.lookup_foreign_revision_id(self.head)
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
438
0.200.596 by Jelmer Vernooij
Import RemoteGitBranch._get_config().
439
    def _get_config(self):
440
        class EmptyConfig(object):
441
442
            def _get_configobj(self):
443
                return config.ConfigObj()
444
445
        return EmptyConfig()
446
0.200.461 by Jelmer Vernooij
Reduce number of round trips when fetching from Git.
447
    @property
448
    def head(self):
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
449
        if self._sha is not None:
450
            return self._sha
0.200.465 by Jelmer Vernooij
Use dulwich standard functionality for finding missing revisions.
451
        heads = self.repository.get_refs()
0.200.1311 by Jelmer Vernooij
More work on colocated branch support.
452
        name = branch_name_to_ref(self.name, "HEAD")
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
453
        if name in heads:
454
            self._sha = heads[name]
0.248.4 by Jelmer Vernooij
Look for heads a bit harder.
455
        else:
0.200.586 by Jelmer Vernooij
Fix issues pointed out by pyflakes.
456
            raise NoSuchRef(self.name)
0.200.919 by Jelmer Vernooij
Simplify ref handling in remote.py.
457
        return self._sha
0.200.141 by Jelmer Vernooij
Separate out local and remote fetching.
458
0.200.169 by Jelmer Vernooij
Fix branch cloning.
459
    def _synchronize_history(self, destination, revision_id):
460
        """See Branch._synchronize_history()."""
461
        destination.generate_revision_history(self.last_revision())
0.200.695 by Jelmer Vernooij
Clean up trailing whitespace.
462
0.200.499 by Jelmer Vernooij
Implement RemoteBranch.{get,set}_push_location.
463
    def get_push_location(self):
464
        return None
465
466
    def set_push_location(self, url):
467
        pass