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.s |
|
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 |
|
|
528 | st = None | |
529 | st = lstat(join(nf)) |
|
529 | results[nf] = st | |
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 |
|
|||
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