mercurial/util.py
changeset 7118 619ebf82cef2
parent 7106 4674706b5b95
child 7123 716277f5867e
equal deleted inserted replaced
7117:ceb8aef03aa7 7118:619ebf82cef2
   824 
   824 
   825 def openhardlinks():
   825 def openhardlinks():
   826     '''return true if it is safe to hold open file handles to hardlinks'''
   826     '''return true if it is safe to hold open file handles to hardlinks'''
   827     return True
   827     return True
   828 
   828 
       
   829 def _statfiles(files):
       
   830     'Stat each file in files and yield stat or None if file does not exist.'
       
   831     lstat = os.lstat
       
   832     for nf in files:
       
   833         try:
       
   834             st = lstat(nf)
       
   835         except OSError, err:
       
   836             if err.errno not in (errno.ENOENT, errno.ENOTDIR):
       
   837                 raise
       
   838             st = None
       
   839         yield st
       
   840 
       
   841 def _statfiles_clustered(files):
       
   842     '''Stat each file in files and yield stat or None if file does not exist.
       
   843     Cluster and cache stat per directory to minimize number of OS stat calls.'''
       
   844     lstat = os.lstat
       
   845     ncase = os.path.normcase
       
   846     sep   = os.sep
       
   847     dircache = {} # dirname -> filename -> status | None if file does not exist
       
   848     for nf in files:
       
   849         nf  = ncase(nf)
       
   850         pos = nf.rfind(sep)
       
   851         if pos == -1:
       
   852             dir, base = '.', nf
       
   853         else:
       
   854             dir, base = nf[:pos], nf[pos+1:]
       
   855         cache = dircache.get(dir, None)
       
   856         if cache is None:
       
   857             try:
       
   858                 dmap = dict([(ncase(n), s)
       
   859                     for n, k, s in osutil.listdir(dir, True)])
       
   860             except OSError, err:
       
   861                 # handle directory not found in Python version prior to 2.5
       
   862                 # Python <= 2.4 returns native Windows code 3 in errno
       
   863                 # Python >= 2.5 returns ENOENT and adds winerror field
       
   864                 if err.errno not in (3, errno.ENOENT, errno.ENOTDIR):
       
   865                     raise
       
   866                 dmap = {}
       
   867             cache = dircache.setdefault(dir, dmap)
       
   868         yield cache.get(base, None)
       
   869 
       
   870 if sys.platform == 'win32':
       
   871     statfiles = _statfiles_clustered
       
   872 else:
       
   873     statfiles = _statfiles
       
   874 
   829 getuser_fallback = None
   875 getuser_fallback = None
   830 
   876 
   831 def getuser():
   877 def getuser():
   832     '''return name of current user'''
   878     '''return name of current user'''
   833     try:
   879     try: