~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: John Arbash Meinel
  • Date: 2006-04-26 20:52:37 UTC
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060426205237-36d969d421bcb429
Some more work to get LocalTransport to only support URLs

Show diffs side-by-side

added added

removed removed

Lines of Context:
208
208
 
209
209
def posix_local_path_from_url(url):
210
210
    """Convert a url like file:///path/to/foo into /path/to/foo"""
211
 
    if not url.startswith('file://'):
212
 
        raise InvalidURL(url, 'local urls must start with file://')
 
211
    if not url.startswith('file:///'):
 
212
        raise InvalidURL(url, 'local urls must start with file:///')
 
213
    # We only strip off 2 slashes
213
214
    return urlunescape(url[len('file://'):])
214
215
 
215
216
 
228
229
 
229
230
def win32_local_path_from_url(url):
230
231
    """Convert a url like file:///C|/path/to/foo into C:/path/to/foo"""
231
 
    if not url.startswith('file://'):
232
 
        raise InvalidURL(url, 'local urls must start with file://')
233
 
    win32_url = url[len('file://'):]
234
 
    if (win32_url[0] != '/' 
235
 
        or win32_url[1] not in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
236
 
        or win32_url[2] != '|'
237
 
        or win32_url[3] != '/'):
 
232
    if not url.startswith('file:///'):
 
233
        raise InvalidURL(url, 'local urls must start with file:///')
 
234
    # We strip off all 3 slashes
 
235
    win32_url = url[len('file:///'):]
 
236
    if (win32_url[0] not in 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
237
        or win32_url[1] != '|'
 
238
        or win32_url[2] != '/'):
238
239
        raise InvalidURL(url, 'Win32 file urls start with file:///X|/, where X is a valid drive letter')
239
240
    # TODO: jam 20060426, we could .upper() or .lower() the drive letter
240
241
    #       for better consistency.
241
 
    return win32_url[1] + u':' + urlunescape(win32_url[3:])
 
242
    return win32_url[0] + u':' + urlunescape(win32_url[2:])
242
243
 
243
244
 
244
245
# Default is to just use the python builtins
255
256
local_path_from_url = posix_local_path_from_url
256
257
 
257
258
MIN_ABS_PATHLENGTH = 1
 
259
MIN_ABS_URLPATHLENGTH = len('file:///')
258
260
 
259
261
 
260
262
if os.name == "posix":
297
299
    local_path_from_url = win32_local_path_from_url
298
300
 
299
301
    MIN_ABS_PATHLENGTH = 3
 
302
    MIN_ABS_URLPATHLENGTH = len('file:///C|/')
300
303
 
301
304
def normalizepath(f):
302
305
    if hasattr(os.path, 'realpath'):
679
682
    on string prefixes, assuming that '/u' is a prefix of '/u2'.  This
680
683
    avoids that problem.
681
684
    """
 
685
 
682
686
    assert len(base) >= MIN_ABS_PATHLENGTH, ('Length of base must be equal or'
683
687
        ' exceed the platform minimum length (which is %d)' % 
684
688
        MIN_ABS_PATHLENGTH)
685
689
 
686
 
    return _relpath_helper(base, abspath(path))
687
 
 
688
 
 
689
 
def _relpath_helper(base, path):
690
 
    """Compute the relative path, without making the child path absolute."""
 
690
    rp = abspath(path)
691
691
 
692
692
    s = []
693
 
    head = path
 
693
    head = rp
694
694
    while len(head) >= len(base):
695
695
        if head == base:
696
696
            break
698
698
        if tail:
699
699
            s.insert(0, tail)
700
700
    else:
701
 
        raise PathNotChild(path, base)
 
701
        raise PathNotChild(rp, base)
702
702
 
703
703
    if s:
704
704
        return pathjoin(*s)
711
711
    
712
712
    This assumes that both paths are already fully specified URLs.
713
713
    """
714
 
    return _relpath_helper(base, path)
 
714
    assert len(base) >= MIN_ABS_URLPATHLENGTH, ('Length of base must be equal or'
 
715
        ' exceed the platform minimum url length (which is %d)' % 
 
716
        MIN_ABS_URLPATHLENGTH)
 
717
 
 
718
    base = local_path_from_url(base)
 
719
    path = local_path_from_url(path)
 
720
    return relpath(base, path)
715
721
 
716
722
 
717
723
def safe_unicode(unicode_or_utf8_string):
795
801
    return sys.platform != "win32"
796
802
 
797
803
 
798
 
def strip_trailing_slash(path):
 
804
def strip_url_trailing_slash(path):
799
805
    """Strip trailing slash, except for root paths.
800
806
    The definition of 'root path' is platform-dependent.
801
807
    """
802
 
    if len(path) != MIN_ABS_PATHLENGTH and path[-1] == '/':
 
808
    assert path.startswith('file:///'), \
 
809
        'strip_url_trailing_slash expects file:// urls (%s)' % path
 
810
    if len(path) != MIN_ABS_URLPATHLENGTH and path[-1] == '/':
803
811
        return path[:-1]
804
812
    else:
805
813
        return path