~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: John Arbash Meinel
  • Date: 2008-09-09 15:09:12 UTC
  • mto: This revision was merged to the branch mainline in revision 3699.
  • Revision ID: john@arbash-meinel.com-20080909150912-wyttm8he1zsls2ck
Use the right timing function on win32

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
 
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
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
 
 
29
24
from bzrlib import (
30
25
    config,
31
26
    errors,
45
40
        errors.BzrError.__init__(self, lp_instance=lp_instance)
46
41
 
47
42
 
48
 
class NotLaunchpadBranch(errors.BzrError):
49
 
 
50
 
    _fmt = "%(url)s is not registered on Launchpad."
51
 
 
52
 
    def __init__(self, url):
53
 
        errors.BzrError.__init__(self, url=url)
54
 
 
55
 
 
56
43
class LaunchpadService(object):
57
44
    """A service to talk to Launchpad via XMLRPC.
58
45
 
59
46
    See http://bazaar-vcs.org/Specs/LaunchpadRpc for the methods we can call.
60
47
    """
61
48
 
62
 
    LAUNCHPAD_DOMAINS = {
63
 
        'production': 'launchpad.net',
64
 
        'edge': 'edge.launchpad.net',
65
 
        'staging': 'staging.launchpad.net',
66
 
        'demo': 'demo.launchpad.net',
67
 
        'dev': 'launchpad.dev',
68
 
        }
69
 
 
70
49
    # NB: these should always end in a slash to avoid xmlrpclib appending
71
50
    # '/RPC2'
72
 
    LAUNCHPAD_INSTANCE = {}
73
 
    for instance, domain in LAUNCHPAD_DOMAINS.iteritems():
74
 
        LAUNCHPAD_INSTANCE[instance] = 'https://xmlrpc.%s/bazaar/' % domain
75
 
 
76
51
    # We use edge as the default because:
77
52
    # Beta users get redirected to it
78
53
    # All users can use it
79
54
    # There is a bug in the launchpad side where redirection causes an OOPS.
80
 
    DEFAULT_INSTANCE = 'edge'
81
 
    DEFAULT_SERVICE_URL = LAUNCHPAD_INSTANCE[DEFAULT_INSTANCE]
 
55
    LAUNCHPAD_INSTANCE = {
 
56
        'production': 'https://xmlrpc.launchpad.net/bazaar/',
 
57
        'edge': 'https://xmlrpc.edge.launchpad.net/bazaar/',
 
58
        'staging': 'https://xmlrpc.staging.launchpad.net/bazaar/',
 
59
        'demo': 'https://xmlrpc.demo.launchpad.net/bazaar/',
 
60
        'dev': 'http://xmlrpc.launchpad.dev/bazaar/',
 
61
        }
 
62
    DEFAULT_SERVICE_URL = LAUNCHPAD_INSTANCE['edge']
82
63
 
83
64
    transport = None
84
65
    registrant_email = None
177
158
                # TODO: print more headers to help in tracking down failures
178
159
                raise errors.BzrError("xmlrpc protocol error connecting to %s: %s %s"
179
160
                        % (self.service_url, e.errcode, e.errmsg))
180
 
        except socket.gaierror, e:
181
 
            raise errors.ConnectionError(
182
 
                "Could not resolve '%s'" % self.domain,
183
 
                orig_error=e)
184
161
        return result
185
162
 
186
 
    @property
187
 
    def domain(self):
188
 
        if self._lp_instance is None:
189
 
            instance = self.DEFAULT_INSTANCE
190
 
        else:
191
 
            instance = self._lp_instance
192
 
        return self.LAUNCHPAD_DOMAINS[instance]
193
 
 
194
 
    def get_web_url_from_branch_url(self, branch_url, _request_factory=None):
195
 
        """Get the Launchpad web URL for the given branch URL.
196
 
 
197
 
        :raise errors.InvalidURL: if 'branch_url' cannot be identified as a
198
 
            Launchpad branch URL.
199
 
        :return: The URL of the branch on Launchpad.
200
 
        """
201
 
        scheme, hostinfo, path = urlsplit(branch_url)[:3]
202
 
        if _request_factory is None:
203
 
            _request_factory = ResolveLaunchpadPathRequest
204
 
        if scheme == 'lp':
205
 
            resolve = _request_factory(path)
206
 
            try:
207
 
                result = resolve.submit(self)
208
 
            except xmlrpclib.Fault, fault:
209
 
                raise errors.InvalidURL(branch_url, str(fault))
210
 
            branch_url = result['urls'][0]
211
 
            path = urlsplit(branch_url)[2]
212
 
        else:
213
 
            domains = (
214
 
                'bazaar.%s' % domain
215
 
                for domain in self.LAUNCHPAD_DOMAINS.itervalues())
216
 
            if hostinfo not in domains:
217
 
                raise NotLaunchpadBranch(branch_url)
218
 
        return urlutils.join('https://code.%s' % self.domain, path)
219
 
 
220
163
 
221
164
class BaseRequest(object):
222
165
    """Base request for talking to a XMLRPC server."""
241
184
 
242
185
class DryRunLaunchpadService(LaunchpadService):
243
186
    """Service that just absorbs requests without sending to server.
244
 
 
 
187
    
245
188
    The dummy service does not need authentication.
246
189
    """
247
190
 
318
261
    def __init__(self, path):
319
262
        if not path:
320
263
            raise errors.InvalidURL(path=path,
321
 
                                    extra="You must specify a project.")
 
264
                                    extra="You must specify a product.")
322
265
        self.path = path
323
266
 
324
267
    def _request_params(self):