~ubuntu-branches/ubuntu/karmic/bzr/karmic-proposed

« back to all changes in this revision

Viewing changes to bzrlib/urlutils.py

  • Committer: Bazaar Package Importer
  • Author(s): Jelmer Vernooij
  • Date: 2008-08-25 19:06:49 UTC
  • mfrom: (1.1.44 upstream)
  • Revision ID: james.westby@ubuntu.com-20080825190649-pq87jonr4uvs7s0y
Tags: 1.6-1
New upstream release.

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,
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('//'):
636
645
            return from_location[sep+1:]
637
646
        else:
638
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)