~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/__init__.py

  • Committer: Martin Pool
  • Date: 2006-06-20 07:55:43 UTC
  • mfrom: (1798 +trunk)
  • mto: This revision was merged to the branch mainline in revision 1799.
  • Revision ID: mbp@sourcefrog.net-20060620075543-b10f6575d4a4fa32
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
29
29
import errno
30
30
from collections import deque
31
31
from copy import deepcopy
32
 
from stat import *
 
32
import re
 
33
from stat import S_ISDIR
33
34
import sys
34
35
from unittest import TestSuite
35
36
import urllib
36
37
import urlparse
 
38
import warnings
37
39
 
38
 
from bzrlib.trace import mutter, warning
 
40
import bzrlib
39
41
import bzrlib.errors as errors
40
42
from bzrlib.errors import DependencyNotPresent
41
 
from bzrlib.symbol_versioning import *
 
43
import bzrlib.osutils as osutils
 
44
from bzrlib.osutils import pumpfile
 
45
from bzrlib.symbol_versioning import (deprecated_passed, deprecated_method, deprecated_function, 
 
46
        DEPRECATED_PARAMETER,
 
47
        zero_eight)
 
48
from bzrlib.trace import mutter, warning
 
49
import bzrlib.urlutils as urlutils
42
50
 
43
51
# {prefix: [transport_classes]}
44
52
# Transports are inserted onto the list LIFO and tried in order; as a result
58
66
    # working, etc.
59
67
    global _protocol_handlers
60
68
    if deprecated_passed(override):
61
 
        warn("register_transport(override) is deprecated")
 
69
        warnings.warn("register_transport(override) is deprecated")
62
70
    _protocol_handlers.setdefault(prefix, []).insert(0, klass)
63
71
 
64
72
 
127
135
 
128
136
 
129
137
def split_url(url):
 
138
    # TODO: jam 20060606 urls should only be ascii, or they should raise InvalidURL
130
139
    if isinstance(url, unicode):
131
140
        url = url.encode('utf-8')
132
141
    (scheme, netloc, path, params,
216
225
        if isinstance(from_file, basestring):
217
226
            to_file.write(from_file)
218
227
        else:
219
 
            from bzrlib.osutils import pumpfile
220
228
            pumpfile(from_file, to_file)
221
229
 
222
230
    def _get_total(self, multi):
284
292
        pl = len(self.base)
285
293
        return abspath[pl:].strip('/')
286
294
 
 
295
    def local_abspath(self, relpath):
 
296
        """Return the absolute path on the local filesystem.
 
297
 
 
298
        This function will only be defined for Transports which have a
 
299
        physical local filesystem representation.
 
300
        """
 
301
        # TODO: jam 20060426 Should this raise NotLocalUrl instead?
 
302
        raise errors.TransportNotPossible('This is not a LocalTransport,'
 
303
            ' so there is no local representation for a path')
 
304
 
287
305
    def has(self, relpath):
288
306
        """Does the file relpath exist?
289
307
        
662
680
        return False
663
681
 
664
682
 
 
683
# jam 20060426 For compatibility we copy the functions here
 
684
# TODO: The should be marked as deprecated
 
685
urlescape = urlutils.escape
 
686
urlunescape = urlutils.unescape
 
687
_urlRE = re.compile(r'^(?P<proto>[^:/\\]+)://(?P<path>.*)$')
 
688
 
 
689
 
665
690
def get_transport(base):
666
691
    """Open a transport to access a URL or directory.
667
692
 
671
696
    # handler for the scheme?
672
697
    global _protocol_handlers
673
698
    if base is None:
674
 
        base = u'.'
675
 
    else:
676
 
        base = unicode(base)
 
699
        base = '.'
 
700
 
 
701
    def convert_path_to_url(base, error_str):
 
702
        m = _urlRE.match(base)
 
703
        if m:
 
704
            # This looks like a URL, but we weren't able to 
 
705
            # instantiate it as such raise an appropriate error
 
706
            raise errors.InvalidURL(base, error_str % m.group('proto'))
 
707
        # This doesn't look like a protocol, consider it a local path
 
708
        new_base = urlutils.local_path_to_url(base)
 
709
        mutter('converting os path %r => url %s', base, new_base)
 
710
        return new_base
 
711
 
 
712
    # Catch any URLs which are passing Unicode rather than ASCII
 
713
    try:
 
714
        base = base.encode('ascii')
 
715
    except UnicodeError:
 
716
        # Only local paths can be Unicode
 
717
        base = convert_path_to_url(base,
 
718
            'URLs must be properly escaped (protocol: %s)')
 
719
    
677
720
    for proto, factory_list in _protocol_handlers.iteritems():
678
721
        if proto is not None and base.startswith(proto):
679
722
            t = _try_transport_factories(base, factory_list)
680
723
            if t:
681
724
                return t
 
725
 
 
726
    # We tried all the different protocols, now try one last time
 
727
    # as a local protocol
 
728
    base = convert_path_to_url(base, 'Unsupported protocol: %s')
 
729
 
682
730
    # The default handler is the filesystem handler, stored as protocol None
683
731
    return _try_transport_factories(base, _protocol_handlers[None])
684
732
 
694
742
    return None
695
743
 
696
744
 
697
 
def urlescape(relpath):
698
 
    """Escape relpath to be a valid url."""
699
 
    if isinstance(relpath, unicode):
700
 
        relpath = relpath.encode('utf-8')
701
 
    return urllib.quote(relpath)
702
 
 
703
 
 
704
 
def urlunescape(relpath):
705
 
    """Unescape relpath from url format."""
706
 
    return urllib.unquote(relpath)
707
 
    # TODO de-utf8 it last. relpath = utf8relpath.decode('utf8')
708
 
 
709
 
 
710
745
class Server(object):
711
746
    """A Transport Server.
712
747
    
831
866
register_lazy_transport('https://', 'bzrlib.transport.http._pycurl', 'PyCurlTransport')
832
867
register_lazy_transport('ftp://', 'bzrlib.transport.ftp', 'FtpTransport')
833
868
register_lazy_transport('aftp://', 'bzrlib.transport.ftp', 'FtpTransport')
834
 
register_lazy_transport('memory:/', 'bzrlib.transport.memory', 'MemoryTransport')
 
869
register_lazy_transport('memory://', 'bzrlib.transport.memory', 'MemoryTransport')
835
870
register_lazy_transport('readonly+', 'bzrlib.transport.readonly', 'ReadonlyTransportDecorator')
836
871
register_lazy_transport('fakenfs+', 'bzrlib.transport.fakenfs', 'FakeNFSTransportDecorator')
837
872
register_lazy_transport('vfat+',