/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2245.8.3 by Martin Pool
Start adding indirection transport
1
# Copyright (C) 2007 Canonical Ltd
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
17
18
"""Transport indirection that uses Launchpad as a directory lookup.
19
20
When the transport is opened, it immediately redirects to a url
21
on Launchpad, which can then either serve the branch itself or redirect
22
again.
23
"""
24
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
25
from urlparse import urlsplit, urlunsplit
2898.4.4 by James Henstridge
Changes to account for modifications to the XMLRPC API.
26
import xmlrpclib
27
2245.8.4 by Martin Pool
lp:/// indirection works
28
from bzrlib import (
2898.4.14 by James Henstridge
* Use urlsplit() to process URLs.
29
    debug,
2245.8.4 by Martin Pool
lp:/// indirection works
30
    errors,
2898.4.14 by James Henstridge
* Use urlsplit() to process URLs.
31
    trace,
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
32
    urlutils,
2245.8.4 by Martin Pool
lp:/// indirection works
33
    )
34
from bzrlib.transport import (
35
    get_transport,
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
36
    register_urlparse_netloc_protocol,
2245.8.4 by Martin Pool
lp:/// indirection works
37
    Transport,
38
    )
39
2898.4.7 by James Henstridge
Fix up tests.
40
from bzrlib.plugins.launchpad.lp_registration import (
41
    LaunchpadService, ResolveLaunchpadPathRequest)
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
42
from bzrlib.plugins.launchpad.account import get_lp_login
43
44
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
45
# As bzrlib.transport.remote may not be loaded yet, make sure bzr+ssh
46
# is counted as a netloc protocol.
47
register_urlparse_netloc_protocol('bzr+ssh')
2898.4.14 by James Henstridge
* Use urlsplit() to process URLs.
48
register_urlparse_netloc_protocol('lp')
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
49
50
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
51
class LaunchpadTransport(Transport):
52
    """lp:/// URL transport
53
54
    This transport redirects requests to the real branch location
55
    after resolving the URL via an XMLRPC request to Launchpad.
56
    """
57
58
    def __init__(self, base):
59
        super(LaunchpadTransport, self).__init__(base)
2898.4.14 by James Henstridge
* Use urlsplit() to process URLs.
60
        # We only support URLs without a netloc
61
        netloc = urlsplit(base)[1]
62
        if netloc != '':
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
63
            raise errors.InvalidURL(path=base)
64
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
65
    def _resolve(self, abspath,
66
                 _request_factory=ResolveLaunchpadPathRequest,
67
                 _lp_login=None):
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
68
        """Resolve the base URL for this transport."""
2898.4.14 by James Henstridge
* Use urlsplit() to process URLs.
69
        path = urlsplit(abspath)[2].lstrip('/')
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
70
        # Perform an XMLRPC request to resolve the path
71
        resolve = _request_factory(path)
72
        service = LaunchpadService()
73
        try:
74
            result = resolve.submit(service)
75
        except xmlrpclib.Fault, fault:
76
            raise errors.InvalidURL(
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
77
                path=abspath, extra=fault.faultString)
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
78
2898.4.14 by James Henstridge
* Use urlsplit() to process URLs.
79
        if 'launchpad' in debug.debug_flags:
80
            trace.mutter("resolve_lp_path(%r) == %r", path, result)
81
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
82
        if _lp_login is None:
83
            _lp_login = get_lp_login()
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
84
        for url in result['urls']:
85
            scheme, netloc, path, query, fragment = urlsplit(url)
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
86
            if scheme == 'bzr+ssh' and (netloc.endswith('launchpad.net') or
87
                                        netloc.endswith('launchpad.dev')):
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
88
                # Only accept launchpad.net bzr+ssh URLs if we know
89
                # the user's Launchpad login:
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
90
                if _lp_login is None:
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
91
                    continue
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
92
                url = urlunsplit((scheme, '%s@%s' % (_lp_login, netloc),
93
                                  path, query, fragment))
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
94
                break
2898.4.15 by James Henstridge
Use get_transport() to decide whether Bazaar supports a given URL.
95
            else:
96
                # Use the URL if we can create a transport for it.
97
                try:
98
                    get_transport(url)
99
                except (errors.PathError, errors.TransportError):
100
                    pass
101
                else:
102
                    break
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
103
        else:
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
104
            raise errors.InvalidURL(path=abspath,
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
105
                                    extra='no supported schemes')
106
        return url
107
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
108
    def _request_redirect(self, relpath):
109
        source = urlutils.join(self.base, relpath)
110
        # Split the source location into the branch location, and the
111
        # extra path components.
112
        pos = source.find('/.bzr/')
113
        if pos >= 0:
114
            branchpath = source[:pos]
115
            extra = source[pos:]
116
        else:
117
            branchpath = source
118
            extra = ''
119
        target = self._resolve(branchpath) + extra
120
        raise errors.RedirectRequested(
121
            source=source,
122
            target=target)
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
123
124
    def get(self, relpath):
125
        """See Transport.get()."""
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
126
        self._request_redirect(relpath)
2898.4.9 by James Henstridge
Add some more tests for the bzr+ssh://bazaar.launchpad.net URL
127
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
128
    def mkdir(self, relpath, mode=None):
129
        """See Transport.mkdir()."""
2898.4.11 by James Henstridge
Switch back to RedirectRequested based implementation.
130
        self._request_redirect(relpath)
2898.4.8 by James Henstridge
Switch lp: over to a pass-through transport, so that the XMLRPC gets
131
2245.8.3 by Martin Pool
Start adding indirection transport
132
133
def get_test_permutations():
134
    # Since this transport doesn't do anything once opened, it's not subjected
135
    # to the usual transport tests.
136
    return []