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: |