~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/__init__.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-07-19 13:06:44 UTC
  • mfrom: (6030.2.7 locspec-to-url)
  • Revision ID: pqm@pqm.ubuntu.com-20110719130644-efx0i6dq30myjhmk
(jelmer) Split location to URL conversion out into a separate function from
 get_transport. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
118
118
    def register_transport(self, key, help=None):
119
119
        self.register(key, [], help)
120
120
 
121
 
    def set_default_transport(self, key=None):
122
 
        """Return either 'key' or the default key if key is None"""
123
 
        self._default_key = key
124
 
 
125
121
 
126
122
transport_list_registry = TransportListRegistry()
127
123
 
1557
1553
        raise NotImplementedError(self.disconnect)
1558
1554
 
1559
1555
 
 
1556
def location_to_url(location):
 
1557
    """Determine a fully qualified URL from a location string.
 
1558
 
 
1559
    This will try to interpret location as both a URL and a directory path. It
 
1560
    will also lookup the location in directories.
 
1561
 
 
1562
    :param location: Unicode or byte string object with a location
 
1563
    :raise InvalidURL: If the location is already a URL, but not valid.
 
1564
    :return: Byte string with resulting URL
 
1565
    """
 
1566
    if not isinstance(location, basestring):
 
1567
        raise AssertionError("location not a byte or unicode string")
 
1568
    from bzrlib.directory_service import directories
 
1569
    location = directories.dereference(location)
 
1570
 
 
1571
    # Catch any URLs which are passing Unicode rather than ASCII
 
1572
    try:
 
1573
        location = location.encode('ascii')
 
1574
    except UnicodeError:
 
1575
        if urlutils.is_url(location):
 
1576
            raise errors.InvalidURL(path=location,
 
1577
                extra='URLs must be properly escaped')
 
1578
        location = urlutils.local_path_to_url(location)
 
1579
 
 
1580
    if urlutils.is_url(location):
 
1581
        return location
 
1582
 
 
1583
    return urlutils.local_path_to_url(location)
 
1584
 
 
1585
 
1560
1586
def get_transport(base, possible_transports=None):
1561
1587
    """Open a transport to access a URL or directory.
1562
1588
 
1570
1596
    """
1571
1597
    if base is None:
1572
1598
        base = '.'
1573
 
    last_err = None
1574
 
    from bzrlib.directory_service import directories
1575
 
    base = directories.dereference(base)
1576
 
 
1577
 
    def convert_path_to_url(base, error_str):
1578
 
        if urlutils.is_url(base):
1579
 
            # This looks like a URL, but we weren't able to
1580
 
            # instantiate it as such raise an appropriate error
1581
 
            # FIXME: we have a 'error_str' unused and we use last_err below
1582
 
            raise errors.UnsupportedProtocol(base, last_err)
1583
 
        # This doesn't look like a protocol, consider it a local path
1584
 
        new_base = urlutils.local_path_to_url(base)
1585
 
        # mutter('converting os path %r => url %s', base, new_base)
1586
 
        return new_base
1587
 
 
1588
 
    # Catch any URLs which are passing Unicode rather than ASCII
1589
 
    try:
1590
 
        base = base.encode('ascii')
1591
 
    except UnicodeError:
1592
 
        # Only local paths can be Unicode
1593
 
        base = convert_path_to_url(base,
1594
 
            'URLs must be properly escaped (protocol: %s)')
 
1599
    base = location_to_url(base)
1595
1600
 
1596
1601
    transport = None
1597
1602
    if possible_transports is not None:
1603
1608
                    possible_transports.append(t_same_connection)
1604
1609
                return t_same_connection
1605
1610
 
 
1611
    last_err = None
1606
1612
    for proto, factory_list in transport_list_registry.items():
1607
1613
        if proto is not None and base.startswith(proto):
1608
1614
            transport, last_err = _try_transport_factories(base, factory_list)
1612
1618
                        raise AssertionError()
1613
1619
                    possible_transports.append(transport)
1614
1620
                return transport
1615
 
 
1616
 
    # We tried all the different protocols, now try one last time
1617
 
    # as a local protocol
1618
 
    base = convert_path_to_url(base, 'Unsupported protocol: %s')
1619
 
 
1620
 
    # The default handler is the filesystem handler, stored as protocol None
1621
 
    factory_list = transport_list_registry.get(None)
1622
 
    transport, last_err = _try_transport_factories(base, factory_list)
1623
 
 
1624
 
    return transport
 
1621
    raise errors.UnsupportedProtocol(base, last_err)
1625
1622
 
1626
1623
 
1627
1624
def _try_transport_factories(base, factory_list):
1696
1693
register_transport_proto('file://',
1697
1694
            help="Access using the standard filesystem (default)")
1698
1695
register_lazy_transport('file://', 'bzrlib.transport.local', 'LocalTransport')
1699
 
transport_list_registry.set_default_transport("file://")
1700
1696
 
1701
1697
register_transport_proto('sftp://',
1702
1698
            help="Access using SFTP (most SSH servers provide SFTP).",