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