def test_get_installed(isolated_pio_core, tmpdir_factory): storage_dir = tmpdir_factory.mktemp("storage") pm = ToolPackageManager(str(storage_dir)) # VCS package (storage_dir.join("pkg-vcs").mkdir().join(".git").mkdir().join( ".piopm").write(""" { "name": "pkg-via-vcs", "spec": { "id": null, "name": "pkg-via-vcs", "owner": null, "requirements": null, "url": "git+https://github.com/username/repo.git" }, "type": "tool", "version": "0.0.0+sha.1ea4d5e" } """)) # package without metadata file (storage_dir.join("[email protected]").mkdir().join("package.json").write( '{"name": "foo", "version": "3.4.5"}')) # package with metadata file foo_dir = storage_dir.join("foo").mkdir() foo_dir.join("package.json").write('{"name": "foo", "version": "3.6.0"}') foo_dir.join(".piopm").write(""" { "name": "foo", "spec": { "name": "foo", "owner": null, "requirements": "^3" }, "type": "tool", "version": "3.6.0" } """) # test "system" storage_dir.join("pkg-incompatible-system").mkdir( ).join("package.json").write( '{"name": "check-system", "version": "4.0.0", "system": ["unknown"]}') storage_dir.join("pkg-compatible-system").mkdir().join( "package.json").write( '{"name": "check-system", "version": "3.0.0", "system": "%s"}' % util.get_systype()) # invalid package storage_dir.join("invalid-package").mkdir().join("library.json").write( '{"name": "SomeLib", "version": "4.0.0"}') installed = pm.get_installed() assert len(installed) == 4 assert set(["pkg-via-vcs", "foo", "check-system"]) == set(p.metadata.name for p in installed) assert str(pm.get_package("foo").metadata.version) == "3.6.0" assert str(pm.get_package("check-system").metadata.version) == "3.0.0"
def remove_unnecessary_platform_packages(dry_run=False): candidates = [] required = set() core_packages = get_installed_core_packages() for platform in PlatformPackageManager().get_installed(): p = PlatformFactory.new(platform) for pkg in p.get_installed_packages(with_optional=True): required.add(pkg) pm = ToolPackageManager() for pkg in pm.get_installed(): skip_conds = [ pkg.metadata.spec.url, os.path.isfile(os.path.join(pkg.path, ".piokeep")), pkg in required, pkg in core_packages, ] if not any(skip_conds): candidates.append(pkg) if dry_run: return candidates for pkg in candidates: pm.uninstall(pkg) return candidates
def remove_unnecessary_core_packages(dry_run=False): candidates = [] pm = ToolPackageManager() best_pkg_versions = {} for name, requirements in __core_packages__.items(): spec = PackageSpec(owner="platformio", name=name, requirements=requirements) pkg = pm.get_package(spec) if not pkg: continue best_pkg_versions[pkg.metadata.name] = pkg.metadata.version for pkg in pm.get_installed(): skip_conds = [ os.path.isfile(os.path.join(pkg.path, ".piokeep")), pkg.metadata.spec.owner != "platformio", pkg.metadata.name not in best_pkg_versions, pkg.metadata.name in best_pkg_versions and pkg.metadata.version == best_pkg_versions[pkg.metadata.name], ] if not any(skip_conds): candidates.append(pkg) if dry_run: return candidates for pkg in candidates: pm.uninstall(pkg) return candidates
def cleanup_packages(self, names): self.memcache_reset() deppkgs = {} for platform in PlatformPackageManager().get_installed(): p = PlatformFactory.new(platform) for pkg in p.get_installed_packages(): if pkg.metadata.name not in deppkgs: deppkgs[pkg.metadata.name] = set() deppkgs[pkg.metadata.name].add(pkg.metadata.version) pm = ToolPackageManager() for pkg in pm.get_installed(): if pkg.metadata.name not in names: continue if ( pkg.metadata.name not in deppkgs or pkg.metadata.version not in deppkgs[pkg.metadata.name] ): try: pm.uninstall(pkg.metadata.spec) except UnknownPackageError: pass self.memcache_reset() return True
def _update_pkg_metadata(_): pm = ToolPackageManager() for pkg in pm.get_installed(): if not pkg.metadata or pkg.metadata.spec.external or pkg.metadata.spec.id: continue result = pm.search_registry_packages(PackageSpec(name=pkg.metadata.name)) if len(result) != 1: continue result = result[0] pkg.metadata.spec = PackageSpec( id=result["id"], owner=result["owner"]["username"], name=result["name"], ) pkg.dump_meta() return True
def _remove_unnecessary_packages(): pm = ToolPackageManager() best_pkg_versions = {} for name, requirements in __core_packages__.items(): spec = PackageSpec(owner="platformio", name=name, requirements=requirements) pkg = pm.get_package(spec) if not pkg: continue best_pkg_versions[pkg.metadata.name] = pkg.metadata.version for pkg in pm.get_installed(): if pkg.metadata.name not in best_pkg_versions: continue if pkg.metadata.version != best_pkg_versions[pkg.metadata.name]: pm.uninstall(pkg)