mercurial/util.py
changeset 705 574869103985
parent 667 31a9aa890016
parent 704 5ca319a641e1
child 724 1c0c413cccdd
child 725 c6b912f8b5b2
child 737 8db4d406b3d3
child 740 d2422f10c136
equal deleted inserted replaced
694:51eb248d3348 705:574869103985
     3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com>
     3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com>
     4 #
     4 #
     5 # This software may be used and distributed according to the terms
     5 # This software may be used and distributed according to the terms
     6 # of the GNU General Public License, incorporated herein by reference.
     6 # of the GNU General Public License, incorporated herein by reference.
     7 
     7 
     8 import os
     8 import os, errno
     9 
     9 
    10 def unique(g):
    10 def unique(g):
    11     seen = {}
    11     seen = {}
    12     for f in g:
    12     for f in g:
    13         if f not in seen:
    13         if f not in seen:
    44         os.rename(src, dst)
    44         os.rename(src, dst)
    45     except:
    45     except:
    46         os.unlink(dst)
    46         os.unlink(dst)
    47         os.rename(src, dst)
    47         os.rename(src, dst)
    48 
    48 
       
    49 def copytree(src, dst, copyfile):
       
    50     """Copy a directory tree, files are copied using 'copyfile'."""
       
    51     names = os.listdir(src)
       
    52     os.mkdir(dst)
       
    53 
       
    54     for name in names:
       
    55         srcname = os.path.join(src, name)
       
    56         dstname = os.path.join(dst, name)
       
    57         if os.path.isdir(srcname):
       
    58             copytree(srcname, dstname, copyfile)
       
    59         elif os.path.isfile(srcname):
       
    60             copyfile(srcname, dstname)
       
    61         else:
       
    62             raise IOError("Not a regular file: %r" % srcname)
       
    63 
       
    64 def _makelock_file(info, pathname):
       
    65     ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
       
    66     os.write(ld, info)
       
    67     os.close(ld)
       
    68 
       
    69 def _readlock_file(pathname):
       
    70     return file(pathname).read()
       
    71 
    49 # Platfor specific varients
    72 # Platfor specific varients
    50 if os.name == 'nt':
    73 if os.name == 'nt':
    51     nulldev = 'NUL:'
    74     nulldev = 'NUL:'
    52 
    75 
    53     def is_exec(f, last):
    76     def is_exec(f, last):
    57         pass
    80         pass
    58 
    81 
    59     def pconvert(path):
    82     def pconvert(path):
    60         return path.replace("\\", "/")
    83         return path.replace("\\", "/")
    61 
    84 
    62     def makelock(info, pathname):
    85     makelock = _makelock_file
    63         ld = os.open(pathname, os.O_CREAT | os.O_WRONLY | os.O_EXCL)
    86     readlock = _readlock_file
    64         os.write(ld, info)
       
    65         os.close(ld)
       
    66 
       
    67     def readlock(pathname):
       
    68         return file(pathname).read()
       
    69 
    87 
    70 else:
    88 else:
    71     nulldev = '/dev/null'
    89     nulldev = '/dev/null'
    72 
    90 
    73     def is_exec(f, last):
    91     def is_exec(f, last):
    88 
   106 
    89     def pconvert(path):
   107     def pconvert(path):
    90         return path
   108         return path
    91 
   109 
    92     def makelock(info, pathname):
   110     def makelock(info, pathname):
    93         os.symlink(info, pathname)
   111         try:
       
   112             os.symlink(info, pathname)
       
   113         except OSError, why:
       
   114             if why.errno == errno.EEXIST:
       
   115                 raise
       
   116             else:
       
   117                 _makelock_file(info, pathname)
    94 
   118 
    95     def readlock(pathname):
   119     def readlock(pathname):
    96         return os.readlink(pathname)
   120         try:
       
   121             return os.readlink(pathname)
       
   122         except OSError, why:
       
   123             if why.errno == errno.EINVAL:
       
   124                 return _readlock_file(pathname)
       
   125             else:
       
   126                 raise