Fixed a "ValueError: Invalid simple block" when uninstalling a package with a custom name and external source // Resolve #3816

This commit is contained in:
Ivan Kravets
2021-01-26 16:15:11 +02:00
parent dd4fff3a79
commit 4012a86cac
5 changed files with 31 additions and 21 deletions

View File

@ -27,6 +27,7 @@ PlatformIO Core 5
- Added new `check_prune_system_threshold <https://docs.platformio.org/page/core/userguide/cmd_settings.html#check-prune-system-threshold>`__ setting - Added new `check_prune_system_threshold <https://docs.platformio.org/page/core/userguide/cmd_settings.html#check-prune-system-threshold>`__ setting
- Disabled automatic removal of unnecessary development platform packages (`issue #3708 <https://github.com/platformio/platformio-core/issues/3708>`_, `issue #3770 <https://github.com/platformio/platformio-core/issues/3770>`_) - Disabled automatic removal of unnecessary development platform packages (`issue #3708 <https://github.com/platformio/platformio-core/issues/3708>`_, `issue #3770 <https://github.com/platformio/platformio-core/issues/3770>`_)
- Fixed an issue when unnecessary packages were removed in ``update --dry-run`` mode (`issue #3809 <https://github.com/platformio/platformio-core/issues/3809>`_) - Fixed an issue when unnecessary packages were removed in ``update --dry-run`` mode (`issue #3809 <https://github.com/platformio/platformio-core/issues/3809>`_)
- Fixed a "ValueError: Invalid simple block" when uninstalling a package with a custom name and external source (`issue #3816 <https://github.com/platformio/platformio-core/issues/3816>`_)
* **PlatformIO Home** * **PlatformIO Home**

View File

@ -112,16 +112,11 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc
) )
def _install_dependency(self, dependency, silent=False): def _install_dependency(self, dependency, silent=False):
if set(["name", "version"]) <= set(dependency.keys()) and any( spec = PackageSpec(
c in dependency["version"] for c in (":", "/", "@") owner=dependency.get("owner"),
): name=dependency.get("name"),
spec = PackageSpec("%s=%s" % (dependency["name"], dependency["version"])) requirements=dependency.get("version"),
else: )
spec = PackageSpec(
owner=dependency.get("owner"),
name=dependency.get("name"),
requirements=dependency.get("version"),
)
search_filters = { search_filters = {
key: value key: value
for key, value in dependency.items() for key, value in dependency.items()
@ -143,11 +138,12 @@ class LibraryPackageManager(BasePackageManager): # pylint: disable=too-many-anc
if not silent: if not silent:
self.print_message("Removing dependencies...", fg="yellow") self.print_message("Removing dependencies...", fg="yellow")
for dependency in manifest.get("dependencies"): for dependency in manifest.get("dependencies"):
pkg = self.get_package( spec = PackageSpec(
PackageSpec( owner=dependency.get("owner"),
name=dependency.get("name"), requirements=dependency.get("version") name=dependency.get("name"),
) requirements=dependency.get("version"),
) )
pkg = self.get_package(spec)
if not pkg: if not pkg:
continue continue
self._uninstall(pkg, silent=silent) self._uninstall(pkg, silent=silent)

View File

@ -107,16 +107,21 @@ class PackageSpec(object): # pylint: disable=too-many-instance-attributes
def __init__( # pylint: disable=redefined-builtin,too-many-arguments def __init__( # pylint: disable=redefined-builtin,too-many-arguments
self, raw=None, owner=None, id=None, name=None, requirements=None, url=None self, raw=None, owner=None, id=None, name=None, requirements=None, url=None
): ):
self._requirements = None
self.owner = owner self.owner = owner
self.id = id self.id = id
self.name = name self.name = name
self._requirements = None
self.url = url self.url = url
self.raw = raw self.raw = raw
if requirements: if requirements:
self.requirements = requirements try:
self.requirements = requirements
except ValueError as exc:
if not self.name or self.url or self.raw:
raise exc
self.raw = "%s=%s" % (self.name, requirements)
self._name_is_custom = False self._name_is_custom = False
self._parse(raw) self._parse(self.raw)
def __eq__(self, other): def __eq__(self, other):
return all( return all(

View File

@ -18,11 +18,10 @@ from platformio.package.meta import PackageSpec
class PlatformPackagesMixin(object): class PlatformPackagesMixin(object):
def get_package_spec(self, name, version=None): def get_package_spec(self, name, version=None):
version = version or self.packages[name].get("version")
if version and any(c in version for c in (":", "/", "@")):
return PackageSpec("%s=%s" % (name, version))
return PackageSpec( return PackageSpec(
owner=self.packages[name].get("owner"), name=name, requirements=version owner=self.packages[name].get("owner"),
name=name,
requirements=version or self.packages[name].get("version"),
) )
def get_package(self, name, spec=None): def get_package(self, name, spec=None):

View File

@ -169,6 +169,15 @@ def test_spec_vcs_urls():
url="git+git@github.com:platformio/platformio-core.git", url="git+git@github.com:platformio/platformio-core.git",
requirements="^1.2.3,!=5", requirements="^1.2.3,!=5",
) )
assert PackageSpec(
owner="platformio",
name="external-repo",
requirements="https://github.com/platformio/platformio-core",
) == PackageSpec(
owner="platformio",
name="external-repo",
url="git+https://github.com/platformio/platformio-core",
)
def test_spec_as_dict(): def test_spec_as_dict():