mercurial/pathutil.py
changeset 25285 46f2df2f0680
parent 25281 660b178f49c7
child 25286 127a11f705d9
equal deleted inserted replaced
25284:7072b91ccd20 25285:46f2df2f0680
     1 import os, errno, stat
     1 import os, errno, stat, posixpath
     2 
     2 
     3 import encoding
     3 import encoding
     4 import util
     4 import util
     5 from i18n import _
     5 from i18n import _
     6 
     6 
   186     if len(p) != len(os.sep):
   186     if len(p) != len(os.sep):
   187         return path + os.sep
   187         return path + os.sep
   188     else:
   188     else:
   189         return path
   189         return path
   190 
   190 
   191 def join(path, *paths):
   191 def join(*args):
   192     '''Join two or more pathname components, inserting '/' as needed.
   192     '''Join two or more pathname components, inserting '/' as needed.
   193 
   193 
   194     Based on the posix os.path.join() implementation.
   194     Based on the posix os.path.join() implementation.
   195 
   195 
   196     >>> join('foo', 'bar')
   196     >>> join('foo', 'bar')
   212     >>> join('', '', '')
   212     >>> join('', '', '')
   213     ''
   213     ''
   214     >>> join ('foo', '', '', 'bar')
   214     >>> join ('foo', '', '', 'bar')
   215     'foo/bar'
   215     'foo/bar'
   216     '''
   216     '''
   217     sep = '/'
   217     return posixpath.join(*args)
   218     if not paths:
       
   219         path[:0] + sep #23780: Ensure compatible data type even if p is null.
       
   220     for piece in paths:
       
   221         if piece.startswith(sep):
       
   222             path = piece
       
   223         elif not path or path.endswith(sep):
       
   224             path += piece
       
   225         else:
       
   226             path += sep + piece
       
   227     return path
       
   228 
   218 
   229 def dirname(path):
   219 def dirname(path):
   230     '''returns the directory portion of the given path
   220     '''returns the directory portion of the given path
   231 
   221 
   232     Based on the posix os.path.split() implementation.
   222     Based on the posix os.path.split() implementation.
   244     >>> dirname('/foo//bar/poo')
   234     >>> dirname('/foo//bar/poo')
   245     '/foo//bar'
   235     '/foo//bar'
   246     >>> dirname('/foo//bar')
   236     >>> dirname('/foo//bar')
   247     '/foo'
   237     '/foo'
   248     '''
   238     '''
   249     sep = '/'
   239     return posixpath.dirname(path)
   250     i = path.rfind(sep) + 1
       
   251     dirname = path[:i]
       
   252     if dirname and dirname != sep * len(dirname):
       
   253         dirname = dirname.rstrip(sep)
       
   254     return dirname