def _create_new_cache(self): # type: () -> Dict[str, os.stat_result] """Create a new cache for packages in a repo. The implementation here should try to minimize filesystem calls. At the moment, it is O(number of packages) and makes about one stat call per package. This is reasonably fast, and avoids actually importing packages in Spack, which is slow. """ # Create a dictionary that will store the mapping between a # package name and its stat info cache = {} # type: Dict[str, os.stat_result] for pkg_name in os.listdir(self.packages_path): # Skip non-directories in the package root. pkg_dir = os.path.join(self.packages_path, pkg_name) # Warn about invalid names that look like packages. if not nm.valid_module_name(pkg_name): if not pkg_name.startswith('.'): tty.warn('Skipping package at {0}. "{1}" is not ' 'a valid Spack module name.'.format( pkg_dir, pkg_name)) continue # Construct the file name from the directory pkg_file = os.path.join( self.packages_path, pkg_name, package_file_name ) # Use stat here to avoid lots of calls to the filesystem. try: sinfo = os.stat(pkg_file) except OSError as e: if e.errno == errno.ENOENT: # No package.py file here. continue elif e.errno == errno.EACCES: tty.warn("Can't read package file %s." % pkg_file) continue raise e # If it's not a file, skip it. if stat.S_ISDIR(sinfo.st_mode): continue # If it is a file, then save the stats under the # appropriate key cache[pkg_name] = sinfo return cache
def _create_new_cache(self): """Create a new cache for packages in a repo. The implementation here should try to minimize filesystem calls. At the moment, it is O(number of packages) and makes about one stat call per package. This is reasonably fast, and avoids actually importing packages in Spack, which is slow. """ # Create a dictionary that will store the mapping between a # package name and its stat info cache = {} for pkg_name in os.listdir(self.packages_path): # Skip non-directories in the package root. pkg_dir = os.path.join(self.packages_path, pkg_name) # Warn about invalid names that look like packages. if not valid_module_name(pkg_name): msg = 'Skipping package at {0}. ' msg += '"{1}" is not a valid Spack module name.' tty.warn(msg.format(pkg_dir, pkg_name)) continue # Construct the file name from the directory pkg_file = os.path.join( self.packages_path, pkg_name, package_file_name ) # Use stat here to avoid lots of calls to the filesystem. try: sinfo = os.stat(pkg_file) except OSError as e: if e.errno == errno.ENOENT: # No package.py file here. continue elif e.errno == errno.EACCES: tty.warn("Can't read package file %s." % pkg_file) continue raise e # If it's not a file, skip it. if stat.S_ISDIR(sinfo.st_mode): continue # If it is a file, then save the stats under the # appropriate key cache[pkg_name] = sinfo return cache