forked from platformio/platformio-core
Ensure tool-type package is compatible with a host system
This commit is contained in:
@ -202,8 +202,17 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
|
|||||||
pkg.metadata = self.build_metadata(pkg_dir, spec)
|
pkg.metadata = self.build_metadata(pkg_dir, spec)
|
||||||
except MissingPackageManifestError:
|
except MissingPackageManifestError:
|
||||||
pass
|
pass
|
||||||
if pkg.metadata:
|
if not pkg.metadata:
|
||||||
result.append(pkg)
|
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
|
return result
|
||||||
|
|
||||||
def get_package(self, spec):
|
def get_package(self, spec):
|
||||||
@ -212,7 +221,7 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
|
|||||||
spec = self.ensure_spec(spec)
|
spec = self.ensure_spec(spec)
|
||||||
best = None
|
best = None
|
||||||
for pkg in self.get_installed():
|
for pkg in self.get_installed():
|
||||||
if not self._test_pkg_with_spec(pkg, spec):
|
if not self.test_pkg_spec(pkg, spec):
|
||||||
continue
|
continue
|
||||||
assert isinstance(pkg.metadata.version, semantic_version.Version)
|
assert isinstance(pkg.metadata.version, semantic_version.Version)
|
||||||
if spec.requirements and pkg.metadata.version not in spec.requirements:
|
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
|
best = pkg
|
||||||
return best
|
return best
|
||||||
|
|
||||||
def _test_pkg_with_spec(self, pkg, spec):
|
@staticmethod
|
||||||
|
def test_pkg_spec(pkg, spec):
|
||||||
# "id" mismatch
|
# "id" mismatch
|
||||||
if spec.id and spec.id != pkg.metadata.spec.id:
|
if spec.id and spec.id != pkg.metadata.spec.id:
|
||||||
return False
|
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):
|
elif not spec.id and not ci_strings_are_equal(spec.name, pkg.metadata.name):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if self.pkg_type == PackageType.TOOL:
|
|
||||||
# TODO: check "system" for pkg
|
|
||||||
pass
|
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -239,7 +239,7 @@ def test_install_force(isolated_pio_core, tmpdir_factory):
|
|||||||
|
|
||||||
def test_get_installed(isolated_pio_core, tmpdir_factory):
|
def test_get_installed(isolated_pio_core, tmpdir_factory):
|
||||||
storage_dir = tmpdir_factory.mktemp("storage")
|
storage_dir = tmpdir_factory.mktemp("storage")
|
||||||
lm = LibraryPackageManager(str(storage_dir))
|
pm = ToolPackageManager(str(storage_dir))
|
||||||
|
|
||||||
# VCS package
|
# VCS package
|
||||||
(
|
(
|
||||||
@ -259,7 +259,7 @@ def test_get_installed(isolated_pio_core, tmpdir_factory):
|
|||||||
"requirements": null,
|
"requirements": null,
|
||||||
"url": "git+https://github.com/username/repo.git"
|
"url": "git+https://github.com/username/repo.git"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "tool",
|
||||||
"version": "0.0.0+sha.1ea4d5e"
|
"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")
|
storage_dir.join("foo@3.4.5")
|
||||||
.mkdir()
|
.mkdir()
|
||||||
.join("library.json")
|
.join("package.json")
|
||||||
.write('{"name": "foo", "version": "3.4.5"}')
|
.write('{"name": "foo", "version": "3.4.5"}')
|
||||||
)
|
)
|
||||||
|
|
||||||
# package with metadata file
|
# package with metadata file
|
||||||
foo_dir = storage_dir.join("foo").mkdir()
|
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(
|
foo_dir.join(".piopm").write(
|
||||||
"""
|
"""
|
||||||
{
|
{
|
||||||
@ -286,21 +286,33 @@ def test_get_installed(isolated_pio_core, tmpdir_factory):
|
|||||||
"owner": null,
|
"owner": null,
|
||||||
"requirements": "^3"
|
"requirements": "^3"
|
||||||
},
|
},
|
||||||
"type": "library",
|
"type": "tool",
|
||||||
"version": "3.6.0"
|
"version": "3.6.0"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
|
|
||||||
# invalid package
|
# test "system"
|
||||||
storage_dir.join("invalid-package").mkdir().join("package.json").write(
|
storage_dir.join("pkg-incompatible-system").mkdir().join("package.json").write(
|
||||||
'{"name": "tool-scons", "version": "4.0.0"}'
|
'{"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()
|
# invalid package
|
||||||
assert len(installed) == 3
|
storage_dir.join("invalid-package").mkdir().join("library.json").write(
|
||||||
assert set(["pkg-via-vcs", "foo"]) == set(p.metadata.name for p in installed)
|
'{"name": "SomeLib", "version": "4.0.0"}'
|
||||||
assert str(lm.get_package("foo").metadata.version) == "3.6.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):
|
def test_uninstall(isolated_pio_core, tmpdir_factory):
|
||||||
|
Reference in New Issue
Block a user