Fix a bug with package updating when version is not in SemVer format // Resolve #3635

This commit is contained in:
Ivan Kravets
2020-08-23 15:26:58 +03:00
parent 1c8aca2f6a
commit a069bae1fb
2 changed files with 13 additions and 6 deletions

View File

@ -22,6 +22,7 @@ import semantic_version
from platformio.compat import get_object_members, hashlib_encode_data, string_types
from platformio.package.manifest.parser import ManifestFileType
from platformio.package.version import cast_version_to_semver
try:
from urllib.parse import urlparse
@ -89,7 +90,7 @@ class PackageOutdatedResult(object):
and name in ("current", "latest", "wanted")
and not isinstance(value, semantic_version.Version)
):
value = semantic_version.Version(str(value))
value = cast_version_to_semver(str(value))
return super(PackageOutdatedResult, self).__setattr__(name, value)
def is_outdated(self, allow_incompatible=False):

View File

@ -392,8 +392,14 @@ def test_registry(isolated_pio_core):
def test_update_with_metadata(isolated_pio_core, tmpdir_factory):
storage_dir = tmpdir_factory.mktemp("storage")
lm = LibraryPackageManager(str(storage_dir))
pkg = lm.install("ArduinoJson @ 5.10.1", silent=True)
# test non SemVer in registry
pkg = lm.install("RadioHead @ <1.90", silent=True)
outdated = lm.outdated(pkg)
assert str(outdated.current) == "1.89.0"
assert outdated.latest > semantic_version.Version("1.100.0")
pkg = lm.install("ArduinoJson @ 5.10.1", silent=True)
# tesy latest
outdated = lm.outdated(pkg)
assert str(outdated.current) == "5.10.1"
@ -411,7 +417,7 @@ def test_update_with_metadata(isolated_pio_core, tmpdir_factory):
new_pkg = lm.update("ArduinoJson@^5", PackageSpec("ArduinoJson@^5"), silent=True)
assert str(new_pkg.metadata.version) == "5.13.4"
# check that old version is removed
assert len(lm.get_installed()) == 1
assert len(lm.get_installed()) == 2
# update to the latest
lm = LibraryPackageManager(str(storage_dir))
@ -422,7 +428,7 @@ def test_update_with_metadata(isolated_pio_core, tmpdir_factory):
def test_update_without_metadata(isolated_pio_core, tmpdir_factory):
storage_dir = tmpdir_factory.mktemp("storage")
storage_dir.join("legacy-package").mkdir().join("library.json").write(
'{"name": "AsyncMqttClient-esphome", "version": "0.8.2"}'
'{"name": "AsyncMqttClient-esphome", "version": "0.8"}'
)
storage_dir.join("legacy-dep").mkdir().join("library.json").write(
'{"name": "AsyncTCP-esphome", "version": "1.1.1"}'
@ -431,8 +437,8 @@ def test_update_without_metadata(isolated_pio_core, tmpdir_factory):
pkg = lm.get_package("AsyncMqttClient-esphome")
outdated = lm.outdated(pkg)
assert len(lm.get_installed()) == 2
assert str(pkg.metadata.version) == "0.8.2"
assert outdated.latest > semantic_version.Version("0.8.2")
assert str(pkg.metadata.version) == "0.8.0"
assert outdated.latest > semantic_version.Version("0.8.0")
# update
lm = LibraryPackageManager(str(storage_dir))