/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: Canonical.com Patch Queue Manager
  • Date: 2011-08-12 18:48:36 UTC
  • mfrom: (6055.2.19 unparsedurl-b)
  • Revision ID: pqm@pqm.ubuntu.com-20110812184836-5jv1u3ns0s74zsg0
(jelmer) Add URL.clone,
 URL.__str__ and use them in various places. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
785
785
        else:
786
786
            host = netloc
787
787
 
788
 
        if ':' in host and not (host[0] == '[' and host[-1] == ']'): #there *is* port
 
788
        if ':' in host and not (host[0] == '[' and host[-1] == ']'):
 
789
            # there *is* port
789
790
            host, port = host.rsplit(':',1)
790
791
            try:
791
792
                port = int(port)
797
798
 
798
799
        return cls(scheme, user, password, host, port, path)
799
800
 
 
801
    def __str__(self):
 
802
        netloc = self.quoted_host
 
803
        if ":" in netloc:
 
804
            netloc = "[%s]" % netloc
 
805
        if self.quoted_user is not None:
 
806
            # Note that we don't put the password back even if we
 
807
            # have one so that it doesn't get accidentally
 
808
            # exposed.
 
809
            netloc = '%s@%s' % (self.quoted_user, netloc)
 
810
        if self.port is not None:
 
811
            netloc = '%s:%d' % (netloc, self.port)
 
812
        return urlparse.urlunparse(
 
813
            (self.scheme, netloc, self.quoted_path, None, None, None))
 
814
 
 
815
    @staticmethod
 
816
    def _combine_paths(base_path, relpath):
 
817
        """Transform a Transport-relative path to a remote absolute path.
 
818
 
 
819
        This does not handle substitution of ~ but does handle '..' and '.'
 
820
        components.
 
821
 
 
822
        Examples::
 
823
 
 
824
            t._combine_paths('/home/sarah', 'project/foo')
 
825
                => '/home/sarah/project/foo'
 
826
            t._combine_paths('/home/sarah', '../../etc')
 
827
                => '/etc'
 
828
            t._combine_paths('/home/sarah', '/etc')
 
829
                => '/etc'
 
830
 
 
831
        :param base_path: base path
 
832
        :param relpath: relative url string for relative part of remote path.
 
833
        :return: urlencoded string for final path.
 
834
        """
 
835
        if not isinstance(relpath, str):
 
836
            raise errors.InvalidURL(relpath)
 
837
        if relpath.startswith('/'):
 
838
            base_parts = []
 
839
        else:
 
840
            base_parts = base_path.split('/')
 
841
        if len(base_parts) > 0 and base_parts[-1] == '':
 
842
            base_parts = base_parts[:-1]
 
843
        for p in relpath.split('/'):
 
844
            if p == '..':
 
845
                if len(base_parts) == 0:
 
846
                    # In most filesystems, a request for the parent
 
847
                    # of root, just returns root.
 
848
                    continue
 
849
                base_parts.pop()
 
850
            elif p == '.':
 
851
                continue # No-op
 
852
            elif p != '':
 
853
                base_parts.append(p)
 
854
        path = '/'.join(base_parts)
 
855
        if not path.startswith('/'):
 
856
            path = '/' + path
 
857
        return path
 
858
 
 
859
    def clone(self, offset=None):
 
860
        """Return a new URL for a path relative to this URL.
 
861
 
 
862
        :param offset: A relative path, already urlencoded
 
863
        :return: `URL` instance
 
864
        """
 
865
        if offset is not None:
 
866
            relative = unescape(offset).encode('utf-8')
 
867
            path = self._combine_paths(self.path, relative)
 
868
            path = urllib.quote(path)
 
869
        else:
 
870
            path = self.quoted_path
 
871
        return self.__class__(self.scheme, self.quoted_user,
 
872
                self.quoted_password, self.quoted_host, self.port,
 
873
                path)
 
874
 
800
875
 
801
876
def parse_url(url):
802
877
    """Extract the server address, the credentials and the path from the url.