/brz/remove-bazaar

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