From ff8ec43a288d7314ef542e08ba662c06884af7c6 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Thu, 13 Aug 2020 21:46:46 +0300 Subject: [PATCH] Ensure tool-type package is compatible with a host system --- platformio/package/manager/base.py | 22 +++++++++++------- tests/package/test_manager.py | 36 ++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/platformio/package/manager/base.py b/platformio/package/manager/base.py index 58c35d47..c0e1e23f 100644 --- a/platformio/package/manager/base.py +++ b/platformio/package/manager/base.py @@ -202,8 +202,17 @@ class BasePackageManager( # pylint: disable=too-many-public-methods pkg.metadata = self.build_metadata(pkg_dir, spec) except MissingPackageManifestError: pass - if pkg.metadata: - result.append(pkg) + if not pkg.metadata: + continue + if self.pkg_type == PackageType.TOOL: + try: + if not self.is_system_compatible( + self.load_manifest(pkg).get("system") + ): + continue + except MissingPackageManifestError: + pass + result.append(pkg) return result def get_package(self, spec): @@ -212,7 +221,7 @@ class BasePackageManager( # pylint: disable=too-many-public-methods spec = self.ensure_spec(spec) best = None for pkg in self.get_installed(): - if not self._test_pkg_with_spec(pkg, spec): + if not self.test_pkg_spec(pkg, spec): continue assert isinstance(pkg.metadata.version, semantic_version.Version) if spec.requirements and pkg.metadata.version not in spec.requirements: @@ -221,7 +230,8 @@ class BasePackageManager( # pylint: disable=too-many-public-methods best = pkg return best - def _test_pkg_with_spec(self, pkg, spec): + @staticmethod + def test_pkg_spec(pkg, spec): # "id" mismatch if spec.id and spec.id != pkg.metadata.spec.id: return False @@ -244,8 +254,4 @@ class BasePackageManager( # pylint: disable=too-many-public-methods elif not spec.id and not ci_strings_are_equal(spec.name, pkg.metadata.name): return False - if self.pkg_type == PackageType.TOOL: - # TODO: check "system" for pkg - pass - return True diff --git a/tests/package/test_manager.py b/tests/package/test_manager.py index 131346af..c91924f4 100644 --- a/tests/package/test_manager.py +++ b/tests/package/test_manager.py @@ -239,7 +239,7 @@ def test_install_force(isolated_pio_core, tmpdir_factory): def test_get_installed(isolated_pio_core, tmpdir_factory): storage_dir = tmpdir_factory.mktemp("storage") - lm = LibraryPackageManager(str(storage_dir)) + pm = ToolPackageManager(str(storage_dir)) # VCS package ( @@ -259,7 +259,7 @@ def test_get_installed(isolated_pio_core, tmpdir_factory): "requirements": null, "url": "git+https://github.com/username/repo.git" }, - "type": "library", + "type": "tool", "version": "0.0.0+sha.1ea4d5e" } """ @@ -270,13 +270,13 @@ def test_get_installed(isolated_pio_core, tmpdir_factory): ( storage_dir.join("foo@3.4.5") .mkdir() - .join("library.json") + .join("package.json") .write('{"name": "foo", "version": "3.4.5"}') ) # package with metadata file foo_dir = storage_dir.join("foo").mkdir() - foo_dir.join("library.json").write('{"name": "foo", "version": "3.6.0"}') + foo_dir.join("package.json").write('{"name": "foo", "version": "3.6.0"}') foo_dir.join(".piopm").write( """ { @@ -286,21 +286,33 @@ def test_get_installed(isolated_pio_core, tmpdir_factory): "owner": null, "requirements": "^3" }, - "type": "library", + "type": "tool", "version": "3.6.0" } """ ) - # invalid package - storage_dir.join("invalid-package").mkdir().join("package.json").write( - '{"name": "tool-scons", "version": "4.0.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() ) - installed = lm.get_installed() - assert len(installed) == 3 - assert set(["pkg-via-vcs", "foo"]) == set(p.metadata.name for p in installed) - assert str(lm.get_package("foo").metadata.version) == "3.6.0" + # 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 test_uninstall(isolated_pio_core, tmpdir_factory):