Show More
@@ -522,17 +522,11 b' class dirstate(object):' | |||
|
522 | 522 | results[nf] = None |
|
523 | 523 | |
|
524 | 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)] | |
|
526 |
for nf in util.s |
|
|
527 | results[nf] = None | |
|
528 |
|
|
|
529 | st = lstat(join(nf)) | |
|
530 | kind = getkind(st.st_mode) | |
|
531 | if kind == regkind or kind == lnkkind: | |
|
532 | results[nf] = st | |
|
533 | except OSError, inst: | |
|
534 | if inst.errno not in (errno.ENOENT, errno.ENOTDIR): | |
|
535 | raise | |
|
525 | visit = util.sort([f for f in dmap if f not in results and match(f)]) | |
|
526 | for nf, st in zip(visit, util.statfiles([join(i) for i in visit])): | |
|
527 | if not st is None and not getkind(st.st_mode) in (regkind, lnkkind): | |
|
528 | st = None | |
|
529 | results[nf] = st | |
|
536 | 530 | |
|
537 | 531 | del results['.hg'] |
|
538 | 532 | return results |
@@ -826,6 +826,52 b' def openhardlinks():' | |||
|
826 | 826 | '''return true if it is safe to hold open file handles to hardlinks''' |
|
827 | 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 | 875 | getuser_fallback = None |
|
830 | 876 | |
|
831 | 877 | def getuser(): |
General Comments 0
You need to be logged in to leave comments.
Login now