~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Sidnei da Silva
  • Date: 2009-05-29 14:19:29 UTC
  • mto: (4531.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4532.
  • Revision ID: sidnei.da.silva@canonical.com-20090529141929-3heywbvj36po72a5
- Add initial config

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2006 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
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
 
 
18
from getpass import getpass
18
19
import os
19
 
import socket
20
20
from urlparse import urlsplit, urlunsplit
21
21
import urllib
22
22
import xmlrpclib
23
23
 
 
24
from bzrlib.lazy_import import lazy_import
 
25
lazy_import(globals(), """
 
26
from bzrlib import urlutils
 
27
""")
 
28
 
24
29
from bzrlib import (
25
30
    config,
26
31
    errors,
27
 
    urlutils,
28
32
    __version__ as _bzrlib_version,
29
33
    )
30
 
from bzrlib.transport.http import _urllib2_wrappers
31
 
 
32
34
 
33
35
# for testing, do
34
36
'''
51
53
        errors.BzrError.__init__(self, url=url)
52
54
 
53
55
 
54
 
class XMLRPCTransport(xmlrpclib.Transport):
55
 
 
56
 
    def __init__(self, scheme):
57
 
        # In python2.4 xmlrpclib.Transport is a old-style class, and does not
58
 
        # define __init__, so we check first
59
 
        init = getattr(xmlrpclib.Transport, '__init__', None)
60
 
        if init is not None:
61
 
            init(self)
62
 
        self._scheme = scheme
63
 
        self._opener = _urllib2_wrappers.Opener()
64
 
        self.verbose = 0
65
 
 
66
 
    def request(self, host, handler, request_body, verbose=0):
67
 
        self.verbose = verbose
68
 
        url = self._scheme + "://" + host + handler
69
 
        request = _urllib2_wrappers.Request("POST", url, request_body)
70
 
        # FIXME: _urllib2_wrappers will override user-agent with its own
71
 
        # request.add_header("User-Agent", self.user_agent)
72
 
        request.add_header("Content-Type", "text/xml")
73
 
 
74
 
        response = self._opener.open(request)
75
 
        if response.code != 200:
76
 
            raise xmlrpclib.ProtocolError(host + handler, response.code,
77
 
                                          response.msg, response.info())
78
 
        return self.parse_response(response)
79
 
 
80
 
 
81
56
class LaunchpadService(object):
82
57
    """A service to talk to Launchpad via XMLRPC.
83
58
 
84
 
    See http://wiki.bazaar.canonical.com/Specs/LaunchpadRpc for the methods we can call.
 
59
    See http://bazaar-vcs.org/Specs/LaunchpadRpc for the methods we can call.
85
60
    """
86
61
 
87
62
    LAUNCHPAD_DOMAINS = {
115
90
        self._lp_instance = lp_instance
116
91
        if transport is None:
117
92
            uri_type = urllib.splittype(self.service_url)[0]
118
 
            transport = XMLRPCTransport(uri_type)
 
93
            if uri_type == 'https':
 
94
                transport = xmlrpclib.SafeTransport()
 
95
            else:
 
96
                transport = xmlrpclib.Transport()
119
97
            transport.user_agent = 'bzr/%s (xmlrpclib/%s)' \
120
98
                    % (_bzrlib_version, xmlrpclib.__version__)
121
99
        self.transport = transport
122
100
 
 
101
 
123
102
    @property
124
103
    def service_url(self):
125
104
        """Return the http or https url for the xmlrpc server.
137
116
        else:
138
117
            return self.DEFAULT_SERVICE_URL
139
118
 
140
 
    @classmethod
141
 
    def for_url(cls, url, **kwargs):
142
 
        """Return the Launchpad service corresponding to the given URL."""
143
 
        result = urlsplit(url)
144
 
        lp_instance = result[1]
145
 
        if lp_instance == '':
146
 
            lp_instance = None
147
 
        elif lp_instance not in cls.LAUNCHPAD_INSTANCE:
148
 
            raise errors.InvalidURL(path=url)
149
 
        return cls(lp_instance=lp_instance, **kwargs)
150
 
 
151
119
    def get_proxy(self, authenticated):
152
120
        """Return the proxy for XMLRPC requests."""
153
121
        if authenticated:
209
177
                # TODO: print more headers to help in tracking down failures
210
178
                raise errors.BzrError("xmlrpc protocol error connecting to %s: %s %s"
211
179
                        % (self.service_url, e.errcode, e.errmsg))
212
 
        except socket.gaierror, e:
213
 
            raise errors.ConnectionError(
214
 
                "Could not resolve '%s'" % self.domain,
215
 
                orig_error=e)
216
180
        return result
217
181
 
218
182
    @property
223
187
            instance = self._lp_instance
224
188
        return self.LAUNCHPAD_DOMAINS[instance]
225
189
 
226
 
    def _guess_branch_path(self, branch_url, _request_factory=None):
 
190
    def get_web_url_from_branch_url(self, branch_url, _request_factory=None):
 
191
        """Get the Launchpad web URL for the given branch URL.
 
192
 
 
193
        :raise errors.InvalidURL: if 'branch_url' cannot be identified as a
 
194
            Launchpad branch URL.
 
195
        :return: The URL of the branch on Launchpad.
 
196
        """
227
197
        scheme, hostinfo, path = urlsplit(branch_url)[:3]
228
198
        if _request_factory is None:
229
199
            _request_factory = ResolveLaunchpadPathRequest
241
211
                for domain in self.LAUNCHPAD_DOMAINS.itervalues())
242
212
            if hostinfo not in domains:
243
213
                raise NotLaunchpadBranch(branch_url)
244
 
        return path.lstrip('/')
245
 
 
246
 
    def get_web_url_from_branch_url(self, branch_url, _request_factory=None):
247
 
        """Get the Launchpad web URL for the given branch URL.
248
 
 
249
 
        :raise errors.InvalidURL: if 'branch_url' cannot be identified as a
250
 
            Launchpad branch URL.
251
 
        :return: The URL of the branch on Launchpad.
252
 
        """
253
 
        path = self._guess_branch_path(branch_url, _request_factory)
254
214
        return urlutils.join('https://code.%s' % self.domain, path)
255
215
 
256
216
 
354
314
    def __init__(self, path):
355
315
        if not path:
356
316
            raise errors.InvalidURL(path=path,
357
 
                                    extra="You must specify a project.")
 
317
                                    extra="You must specify a product.")
358
318
        self.path = path
359
319
 
360
320
    def _request_params(self):