~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/__init__.py

  • Committer: John Arbash Meinel
  • Date: 2006-04-26 19:54:32 UTC
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060426195432-5de612237c46f96d
Updated LocalTransport so that it's base is now a URL rather than a local path. This helps consistency with all other functions. To do so, I added local_abspath() which returns the local path, and local_path_to/from_url

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
import re
32
33
from stat import *
33
34
import sys
34
35
from unittest import TestSuite
35
 
import urllib
36
36
import urlparse
37
37
 
38
 
from bzrlib.trace import mutter, warning
39
38
import bzrlib.errors as errors
40
39
from bzrlib.errors import DependencyNotPresent
 
40
import bzrlib.osutils as osutils
41
41
from bzrlib.symbol_versioning import *
 
42
from bzrlib.trace import mutter, warning
42
43
 
43
44
# {prefix: [transport_classes]}
44
45
# Transports are inserted onto the list LIFO and tried in order; as a result
255
256
        pl = len(self.base)
256
257
        return abspath[pl:].strip('/')
257
258
 
 
259
    def local_abspath(self, relpath):
 
260
        """Return the absolute path on the local filesystem.
 
261
 
 
262
        This function will only be defined for Transports which have a
 
263
        physical local filesystem representation.
 
264
        """
 
265
        # TODO: jam 20060426 Should this raise 
 
266
        raise errors.TransportNotPossible('This is not a LocalTransport,'
 
267
            ' so there is no local representation for a path')
 
268
 
258
269
    def has(self, relpath):
259
270
        """Does the file relpath exist?
260
271
        
633
644
        return False
634
645
 
635
646
 
 
647
# jam 20060426 For compatibility we copy the functions here
 
648
urlescape = osutils.urlescape
 
649
urlunescape = osutils.urlunescape
 
650
_urlRE = re.compile(r'^(?P<proto>[^:/\\]+)://(?P<path>.*)$')
 
651
 
 
652
 
636
653
def get_transport(base):
637
654
    """Open a transport to access a URL or directory.
638
655
 
645
662
        base = u'.'
646
663
    else:
647
664
        base = unicode(base)
 
665
 
 
666
    # Now that we have a unicode string, it really should be a URL string
 
667
    m = _urlRE.match(base)
 
668
    if m:
 
669
        # This is a real URL, so convert it back into a string
 
670
        base = str(base)
 
671
    else:
 
672
        # This is a local unicode path, convert it to a url
 
673
        new_base = osutils.local_path_to_url(base)
 
674
        mutter('converting os path %r => url %s' , base, new_base)
 
675
        base = new_base
 
676
    
648
677
    for proto, factory_list in _protocol_handlers.iteritems():
649
678
        if proto is not None and base.startswith(proto):
650
679
            t = _try_transport_factories(base, factory_list)
665
694
    return None
666
695
 
667
696
 
668
 
def urlescape(relpath):
669
 
    """Escape relpath to be a valid url."""
670
 
    if isinstance(relpath, unicode):
671
 
        relpath = relpath.encode('utf-8')
672
 
    return urllib.quote(relpath)
673
 
 
674
 
 
675
 
def urlunescape(url):
676
 
    """Unescape relpath from url format.
677
 
 
678
 
    This returns a Unicode path from a URL
679
 
    """
680
 
    unquoted = urllib.unquote(url)
681
 
    try:
682
 
        unicode_path = unquoted.decode('utf-8')
683
 
    except UnicodeError, e:
684
 
        raise errors.InvalidURL(url, e)
685
 
    return unicode_path
686
 
 
687
 
 
688
697
class Server(object):
689
698
    """A Transport Server.
690
699