/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/urlutils.py

  • Committer: Andrew Bennetts
  • Date: 2008-09-08 12:59:00 UTC
  • mfrom: (3695 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3756.
  • Revision ID: andrew.bennetts@canonical.com-20080908125900-8ywtsr7jqyyatjz0
Merge from bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
lazy_import(globals(), """
27
27
from posixpath import split as _posix_split, normpath as _posix_normpath
28
28
import urllib
 
29
import urlparse
29
30
 
30
31
from bzrlib import (
31
32
    errors,
75
76
    
76
77
    This assumes that both paths are already fully specified file:// URLs.
77
78
    """
78
 
    assert len(base) >= MIN_ABS_FILEURL_LENGTH, ('Length of base must be equal or'
79
 
        ' exceed the platform minimum url length (which is %d)' % 
80
 
        MIN_ABS_FILEURL_LENGTH)
81
 
 
 
79
    if len(base) < MIN_ABS_FILEURL_LENGTH:
 
80
        raise ValueError('Length of base must be equal or'
 
81
            ' exceed the platform minimum url length (which is %d)' %
 
82
            MIN_ABS_FILEURL_LENGTH)
82
83
    base = local_path_from_url(base)
83
84
    path = local_path_from_url(path)
84
85
    return escape(osutils.relpath(base, path))
249
250
            raise errors.InvalidURL(url, 'Win32 UNC path urls'
250
251
                ' have form file://HOST/path')
251
252
        return unescape(win32_url)
 
253
 
 
254
    # allow empty paths so we can serve all roots
 
255
    if win32_url == '///':
 
256
        return '/'
 
257
    
252
258
    # usual local path with drive letter
253
259
    if (win32_url[3] not in ('abcdefghijklmnopqrstuvwxyz'
254
260
                             'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
270
276
    #       which actually strips trailing space characters.
271
277
    #       The worst part is that under linux ntpath.abspath has different
272
278
    #       semantics, since 'nt' is not an available module.
 
279
    if path == '/':
 
280
        return 'file:///'
 
281
 
273
282
    win32_path = osutils._win32_abspath(path)
274
283
    # check for UNC path \\HOST\path
275
284
    if win32_path.startswith('//'):
574
583
    :return: A unicode string which can be safely encoded into the 
575
584
         specified encoding.
576
585
    """
577
 
    assert encoding is not None, 'you cannot specify None for the display encoding.'
 
586
    if encoding is None:
 
587
        raise ValueError('you cannot specify None for the display encoding')
578
588
    if url.startswith('file://'):
579
589
        try:
580
590
            path = local_path_from_url(url)
635
645
            return from_location[sep+1:]
636
646
        else:
637
647
            return from_location
 
648
 
 
649
 
 
650
def _is_absolute(url):
 
651
    return (osutils.pathjoin('/foo', url) == url)
 
652
 
 
653
 
 
654
def rebase_url(url, old_base, new_base):
 
655
    """Convert a relative path from an old base URL to a new base URL.
 
656
 
 
657
    The result will be a relative path.
 
658
    Absolute paths and full URLs are returned unaltered.
 
659
    """
 
660
    scheme, separator = _find_scheme_and_separator(url)
 
661
    if scheme is not None:
 
662
        return url
 
663
    if _is_absolute(url):
 
664
        return url
 
665
    old_parsed = urlparse.urlparse(old_base)
 
666
    new_parsed = urlparse.urlparse(new_base)
 
667
    if (old_parsed[:2]) != (new_parsed[:2]):
 
668
        raise errors.InvalidRebaseURLs(old_base, new_base)
 
669
    return determine_relative_path(new_parsed[2],
 
670
                                   join(old_parsed[2], url))
 
671
 
 
672
 
 
673
def determine_relative_path(from_path, to_path):
 
674
    """Determine a relative path from from_path to to_path."""
 
675
    from_segments = osutils.splitpath(from_path)
 
676
    to_segments = osutils.splitpath(to_path)
 
677
    count = -1
 
678
    for count, (from_element, to_element) in enumerate(zip(from_segments,
 
679
                                                       to_segments)):
 
680
        if from_element != to_element:
 
681
            break
 
682
    else:
 
683
        count += 1
 
684
    unique_from = from_segments[count:]
 
685
    unique_to = to_segments[count:]
 
686
    segments = (['..'] * len(unique_from) + unique_to)
 
687
    if len(segments) == 0:
 
688
        return '.'
 
689
    return osutils.pathjoin(*segments)