~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/plugins/launchpad/lp_indirect.py

  • Committer: Robert Collins
  • Date: 2007-04-19 02:27:44 UTC
  • mto: This revision was merged to the branch mainline in revision 2426.
  • Revision ID: robertc@robertcollins.net-20070419022744-pfdqz42kp1wizh43
``make docs`` now creates a man page at ``man1/bzr.1`` fixing bug 107388.
(Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007-2010 Canonical Ltd
 
1
# Copyright (C) 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
 
18
 
"""Directory lookup that uses Launchpad."""
19
 
 
20
 
from urlparse import urlsplit
21
 
import xmlrpclib
 
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
"""
22
24
 
23
25
from bzrlib import (
24
 
    debug,
25
26
    errors,
26
 
    trace,
27
27
    )
28
28
from bzrlib.transport import (
29
29
    get_transport,
30
 
    register_urlparse_netloc_protocol,
 
30
    Transport,
31
31
    )
32
32
 
33
 
from bzrlib.plugins.launchpad.lp_registration import (
34
 
    LaunchpadService, ResolveLaunchpadPathRequest)
35
 
from bzrlib.plugins.launchpad.account import get_lp_login
36
 
 
37
 
 
38
 
# As bzrlib.transport.remote may not be loaded yet, make sure bzr+ssh
39
 
# is counted as a netloc protocol.
40
 
register_urlparse_netloc_protocol('bzr+ssh')
41
 
register_urlparse_netloc_protocol('lp')
42
 
 
43
 
 
44
 
class LaunchpadDirectory(object):
45
 
 
46
 
    def _requires_launchpad_login(self, scheme, netloc, path, query,
47
 
                                  fragment):
48
 
        """Does the URL require a Launchpad login in order to be reached?
49
 
 
50
 
        The URL is specified by its parsed components, as returned from
51
 
        urlsplit.
52
 
        """
53
 
        return (scheme in ('bzr+ssh', 'sftp')
54
 
                and (netloc.endswith('launchpad.net')
55
 
                     or netloc.endswith('launchpad.dev')))
56
 
 
57
 
    def look_up(self, name, url):
58
 
        """See DirectoryService.look_up"""
59
 
        return self._resolve(url)
60
 
 
61
 
    def _resolve(self, url,
62
 
                 _request_factory=ResolveLaunchpadPathRequest,
63
 
                 _lp_login=None):
64
 
        """Resolve the base URL for this transport."""
65
 
        service = LaunchpadService.for_url(url)
66
 
        result = urlsplit(url)
67
 
        if _lp_login is None:
68
 
            _lp_login = get_lp_login()
69
 
        path = result[2].strip('/')
70
 
        if path.startswith('~/'):
71
 
            if _lp_login is None:
72
 
                raise errors.InvalidURL(path=url,
73
 
                    extra='Cannot resolve "~" to your username.'
74
 
                          ' See "bzr help launchpad-login"')
75
 
            path = '~' + _lp_login + path[1:]
76
 
        resolve = _request_factory(path)
77
 
        try:
78
 
            result = resolve.submit(service)
79
 
        except xmlrpclib.Fault, fault:
80
 
            raise errors.InvalidURL(
81
 
                path=url, extra=fault.faultString)
82
 
 
83
 
        if 'launchpad' in debug.debug_flags:
84
 
            trace.mutter("resolve_lp_path(%r) == %r", url, result)
85
 
 
86
 
        _warned_login = False
87
 
        for url in result['urls']:
88
 
            scheme, netloc, path, query, fragment = urlsplit(url)
89
 
            if self._requires_launchpad_login(scheme, netloc, path, query,
90
 
                                              fragment):
91
 
                # Only accept launchpad.net bzr+ssh URLs if we know
92
 
                # the user's Launchpad login:
93
 
                if _lp_login is not None:
94
 
                    break
95
 
                if _lp_login is None:
96
 
                    if not _warned_login:
97
 
                        trace.warning(
98
 
'You have not informed bzr of your Launchpad ID, and you must do this to\n'
99
 
'write to Launchpad or access private data.  See "bzr help launchpad-login".')
100
 
                        _warned_login = True
101
 
            else:
102
 
                # Use the URL if we can create a transport for it.
103
 
                try:
104
 
                    get_transport(url)
105
 
                except (errors.PathError, errors.TransportError):
106
 
                    pass
107
 
                else:
108
 
                    break
109
 
        else:
110
 
            raise errors.InvalidURL(path=url, extra='no supported schemes')
111
 
        return url
 
33
 
 
34
def launchpad_transport_indirect(base_url):
 
35
    """Uses Launchpad.net as a directory of open source software"""
 
36
    if base_url.startswith('lp:///'):
 
37
        real_url = 'http://code.launchpad.net/' + base_url[6:]
 
38
    elif base_url.startswith('lp:') and base_url[3] != '/':
 
39
        real_url = 'http://code.launchpad.net/' + base_url[3:]
 
40
    else:
 
41
        raise errors.InvalidURL(path=base_url)
 
42
    return get_transport(real_url)
112
43
 
113
44
 
114
45
def get_test_permutations():