##// END OF EJS Templates
Take advantage of fstat calls clustering per directory if OS support it....
Petr Kodl -
r7118:619ebf82 default
parent child Browse files
Show More
@@ -522,17 +522,11 b' class dirstate(object):'
522 results[nf] = None
522 results[nf] = None
523
523
524 # step 3: report unseen items in the dmap hash
524 # step 3: report unseen items in the dmap hash
525 visit = [f for f in dmap if f not in results and match(f)]
525 visit = util.sort([f for f in dmap if f not in results and match(f)])
526 for nf in util.sort(visit):
526 for nf, st in zip(visit, util.statfiles([join(i) for i in visit])):
527 results[nf] = None
527 if not st is None and not getkind(st.st_mode) in (regkind, lnkkind):
528 try:
528 st = None
529 st = lstat(join(nf))
530 kind = getkind(st.st_mode)
531 if kind == regkind or kind == lnkkind:
532 results[nf] = st
529 results[nf] = st
533 except OSError, inst:
534 if inst.errno not in (errno.ENOENT, errno.ENOTDIR):
535 raise
536
530
537 del results['.hg']
531 del results['.hg']
538 return results
532 return results
@@ -826,6 +826,52 b' 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():
General Comments 0
You need to be logged in to leave comments. Login now