def filter_files(self, files): if self.include: spec = PathSpec(map(GitWildMatchPattern, self.include)) files = list(spec.match_files(files)) if self.exclude: spec = PathSpec(map(GitWildMatchPattern, self.exclude)) exclude = list(spec.match_files(files)) files = list(filter(lambda f: f not in exclude, files)) return files
def extract_bower_zipfile(self, zip_file, dest, expected_version=None): bower_json = None root = None deps_installed = [] for info in zip_file.infolist(): if PurePath(info.filename).name == "bower.json": with zip_file.open(info) as f: bower_json = json.load(f) root = str(PurePath(info.filename).parent) break version = bower_json["version"] if expected_version is not None: expected_version = Bower.clean_semver(expected_version) if not semver.match(version, expected_version): click.secho("error: versions do not match ({} =/= {})".format( version, expected_version)) raise InvalidPackageError if "dependencies" in bower_json: for package, version in bower_json["dependencies"].items(): url = Bower.get_package_url(package) deps_installed.extend(self.get_bower_package( url, dest=dest, version=version)) ignore_patterns = [GitIgnorePattern(ig) for ig in bower_json["ignore"]] path_spec = PathSpec(ignore_patterns) namelist = [path for path in zip_file.namelist() if PurePath(path).parts[0] == root] ignored = list(path_spec.match_files(namelist)) for path in namelist: dest_path = PurePath( bower_json["name"], *PurePath(path).parts[1:]) if path in ignored: continue for path in ignored: for parent in PurePath(path): if parent in ignored: continue if path.endswith("/"): if list(path_spec.match_files([str(dest_path)])): ignored.append(PurePath(path)) elif not (dest / dest_path).is_dir(): (dest / dest_path).mkdir(parents=True) else: target_path = dest / dest_path.parent / dest_path.name source = zip_file.open(path) target = target_path.open("wb") with source, target: shutil.copyfileobj(source, target) deps_installed.append((bower_json["name"], bower_json["version"])) return deps_installed
def extract_bower_zipfile(self, zip_file, dest, expected_version=None): bower_json = None root = None deps_installed = [] for info in zip_file.infolist(): if PurePath(info.filename).name == "bower.json": with zip_file.open(info) as f: bower_json = json.load(f) root = str(PurePath(info.filename).parent) break version = bower_json["version"] if expected_version is not None: expected_version = Bower.clean_semver(expected_version) if not semver.match(version, expected_version): click.secho("error: versions do not match ({} =/= {})".format( version, expected_version)) raise InvalidPackageError if "dependencies" in bower_json: for package, version in bower_json["dependencies"].items(): url = Bower.get_package_url(package) deps_installed.extend( self.get_bower_package(url, dest=dest, version=version)) ignore_patterns = [GitIgnorePattern(ig) for ig in bower_json["ignore"]] path_spec = PathSpec(ignore_patterns) namelist = [ path for path in zip_file.namelist() if PurePath(path).parts[0] == root ] ignored = list(path_spec.match_files(namelist)) for path in namelist: dest_path = PurePath(bower_json["name"], *PurePath(path).parts[1:]) if path in ignored: continue for path in ignored: for parent in PurePath(path): if parent in ignored: continue if path.endswith("/"): if list(path_spec.match_files([str(dest_path)])): ignored.append(PurePath(path)) elif not (dest / dest_path).is_dir(): (dest / dest_path).mkdir(parents=True) else: target_path = dest / dest_path.parent / dest_path.name source = zip_file.open(path) target = target_path.open("wb") with source, target: shutil.copyfileobj(source, target) deps_installed.append((bower_json["name"], bower_json["version"])) return deps_installed