diff --git a/platformio/builder/tools/piolib.py b/platformio/builder/tools/piolib.py index 24229b1c..3a7b3aad 100644 --- a/platformio/builder/tools/piolib.py +++ b/platformio/builder/tools/piolib.py @@ -1022,6 +1022,8 @@ def ConfigureProjectLibBuilder(env): pkg = PackageSourceItem(lb.path) if pkg.metadata: title += " %s" % pkg.metadata.version + elif lb.version: + title += " %s" % lb.version click.echo("%s|-- %s" % (margin, title), nl=False) if int(ARGUMENTS.get("PIOVERBOSE", 0)): if pkg.metadata and pkg.metadata.spec.external: diff --git a/platformio/builder/tools/pioplatform.py b/platformio/builder/tools/pioplatform.py index e280372b..8c047365 100644 --- a/platformio/builder/tools/pioplatform.py +++ b/platformio/builder/tools/pioplatform.py @@ -139,7 +139,7 @@ def PrintConfiguration(env): # pylint: disable=too-many-statements ) def _get_plaform_data(): - data = ["PLATFORM: %s %s" % (platform.title, platform.version)] + data = ["PLATFORM: %s (%s)" % (platform.title, platform.version)] if platform.src_version: data.append("#" + platform.src_version) if int(ARGUMENTS.get("PIOVERBOSE", 0)) and platform.src_url: diff --git a/platformio/commands/lib/command.py b/platformio/commands/lib/command.py index 33249f3e..ec5fd8e6 100644 --- a/platformio/commands/lib/command.py +++ b/platformio/commands/lib/command.py @@ -283,12 +283,14 @@ def lib_update( # pylint: disable=too-many-arguments json_result[storage_dir] = result else: for library in _libraries: - spec = ( + to_spec = ( None if isinstance(library, PackageSourceItem) else PackageSpec(library) ) - lm.update(library, spec=spec, only_check=only_check, silent=silent) + lm.update( + library, to_spec=to_spec, only_check=only_check, silent=silent + ) if json_output: return click.echo( diff --git a/platformio/package/manager/_download.py b/platformio/package/manager/_download.py index 83de9f37..34295287 100644 --- a/platformio/package/manager/_download.py +++ b/platformio/package/manager/_download.py @@ -17,8 +17,6 @@ import os import tempfile import time -import click - from platformio import app, compat from platformio.package.download import FileDownloader from platformio.package.lockfile import LockFile @@ -77,7 +75,7 @@ class PackageManagerDownloadMixin(object): except IOError: raise_error = True if raise_error: - click.secho( + self.print_message( "Error: Please read http://bit.ly/package-manager-ioerror", fg="red", err=True, diff --git a/platformio/package/manager/_install.py b/platformio/package/manager/_install.py index cb565f10..c63a504d 100644 --- a/platformio/package/manager/_install.py +++ b/platformio/package/manager/_install.py @@ -20,7 +20,7 @@ import tempfile import click from platformio import app, compat, fs, util -from platformio.package.exception import MissingPackageManifestError, PackageException +from platformio.package.exception import PackageException from platformio.package.meta import PackageSourceItem, PackageSpec from platformio.package.unpack import FileUnpacker from platformio.package.vcsclient import VCSClientFactory @@ -71,7 +71,7 @@ class PackageManagerInstallMixin(object): if pkg: if not silent: - click.secho( + self.print_message( "{name} @ {version} is already installed".format( **pkg.metadata.as_dict() ), @@ -80,8 +80,9 @@ class PackageManagerInstallMixin(object): return pkg if not silent: - msg = "Installing %s" % click.style(spec.humanize(), fg="cyan") - self.print_message(msg) + self.print_message( + "Installing %s" % click.style(spec.humanize(), fg="cyan") + ) if spec.external: pkg = self.install_from_url(spec.url, spec, silent=silent) @@ -96,12 +97,10 @@ class PackageManagerInstallMixin(object): if not silent: self.print_message( - click.style( - "{name} @ {version} has been successfully installed!".format( - **pkg.metadata.as_dict() - ), - fg="green", - ) + "{name} @ {version} has been successfully installed!".format( + **pkg.metadata.as_dict() + ), + fg="green", ) self.memcache_reset() @@ -115,10 +114,10 @@ class PackageManagerInstallMixin(object): if not manifest.get("dependencies"): return if not silent: - self.print_message(click.style("Installing dependencies...", fg="yellow")) + self.print_message("Installing dependencies...") for dependency in manifest.get("dependencies"): if not self._install_dependency(dependency, silent) and not silent: - click.secho( + self.print_message( "Warning! Could not install dependency %s for package '%s'" % (dependency, pkg.metadata.name), fg="yellow", @@ -255,20 +254,3 @@ class PackageManagerInstallMixin(object): _cleanup_dir(dst_pkg.path) shutil.move(tmp_pkg.path, dst_pkg.path) return PackageSourceItem(dst_pkg.path) - - def get_installed(self): - result = [] - for name in os.listdir(self.package_dir): - pkg_dir = os.path.join(self.package_dir, name) - if not os.path.isdir(pkg_dir): - continue - pkg = PackageSourceItem(pkg_dir) - if not pkg.metadata: - try: - spec = self.build_legacy_spec(pkg_dir) - pkg.metadata = self.build_metadata(pkg_dir, spec) - except MissingPackageManifestError: - pass - if pkg.metadata: - result.append(pkg) - return result diff --git a/platformio/package/manager/_registry.py b/platformio/package/manager/_registry.py index 41ca58b3..0d1e45e1 100644 --- a/platformio/package/manager/_registry.py +++ b/platformio/package/manager/_registry.py @@ -108,8 +108,8 @@ class PackageManageRegistryMixin(object): silent=silent, ) except Exception as e: # pylint: disable=broad-except - click.secho("Warning! Package Mirror: %s" % e, fg="yellow") - click.secho("Looking for another mirror...", fg="yellow") + self.print_message("Warning! Package Mirror: %s" % e, fg="yellow") + self.print_message("Looking for another mirror...", fg="yellow") return None @@ -159,9 +159,8 @@ class PackageManageRegistryMixin(object): click.echo("") return packages[0]["id"] - @staticmethod - def print_multi_package_issue(packages, spec): - click.secho( + def print_multi_package_issue(self, packages, spec): + self.print_message( "Warning! More than one package has been found by ", fg="yellow", nl=False ) click.secho(spec.humanize(), fg="cyan", nl=False) @@ -174,9 +173,9 @@ class PackageManageRegistryMixin(object): version=item["version"]["name"], ) ) - click.secho( + self.print_message( "Please specify detailed REQUIREMENTS using package owner and version " - "(showed above) to avoid project compatibility issues.", + "(showed above) to avoid name conflicts", fg="yellow", ) diff --git a/platformio/package/manager/_uninstall.py b/platformio/package/manager/_uninstall.py index 813ada6d..603ad382 100644 --- a/platformio/package/manager/_uninstall.py +++ b/platformio/package/manager/_uninstall.py @@ -23,17 +23,17 @@ from platformio.package.meta import PackageSourceItem, PackageSpec class PackageManagerUninstallMixin(object): - def uninstall(self, pkg, silent=False, skip_dependencies=False): + def uninstall(self, spec, silent=False, skip_dependencies=False): try: self.lock() - return self._uninstall(pkg, silent, skip_dependencies) + return self._uninstall(spec, silent, skip_dependencies) finally: self.unlock() - def _uninstall(self, pkg, silent=False, skip_dependencies=False): - pkg = self.get_package(pkg) + def _uninstall(self, spec, silent=False, skip_dependencies=False): + pkg = self.get_package(spec) if not pkg or not pkg.metadata: - raise UnknownPackageError(pkg) + raise UnknownPackageError(spec) if not silent: self.print_message( @@ -78,7 +78,7 @@ class PackageManagerUninstallMixin(object): if not manifest.get("dependencies"): return if not silent: - self.print_message(click.style("Removing dependencies...", fg="yellow")) + self.print_message("Removing dependencies...", fg="yellow") for dependency in manifest.get("dependencies"): pkg = self.get_package( PackageSpec( diff --git a/platformio/package/manager/_update.py b/platformio/package/manager/_update.py index 87d5e7f4..d120e030 100644 --- a/platformio/package/manager/_update.py +++ b/platformio/package/manager/_update.py @@ -78,18 +78,18 @@ class PackageManagerUpdateMixin(object): ).version ) - def update(self, pkg, spec=None, only_check=False, silent=False): - pkg = self.get_package(pkg) + def update(self, from_spec, to_spec=None, only_check=False, silent=False): + pkg = self.get_package(from_spec) if not pkg or not pkg.metadata: - raise UnknownPackageError(pkg) + raise UnknownPackageError(from_spec) if not silent: click.echo( "{} {:<45} {:<30}".format( "Checking" if only_check else "Updating", click.style(pkg.metadata.spec.humanize(), fg="cyan"), - "%s (%s)" % (pkg.metadata.version, spec.requirements) - if spec and spec.requirements + "%s (%s)" % (pkg.metadata.version, to_spec.requirements) + if to_spec and to_spec.requirements else str(pkg.metadata.version), ), nl=False, @@ -99,7 +99,7 @@ class PackageManagerUpdateMixin(object): click.echo("[%s]" % (click.style("Off-line", fg="yellow"))) return pkg - outdated = self.outdated(pkg, spec) + outdated = self.outdated(pkg, to_spec) if not silent: self.print_outdated_state(outdated) diff --git a/platformio/package/manager/base.py b/platformio/package/manager/base.py index ee2928c5..58c35d47 100644 --- a/platformio/package/manager/base.py +++ b/platformio/package/manager/base.py @@ -103,8 +103,11 @@ class BasePackageManager( # pylint: disable=too-many-public-methods def manifest_names(self): raise NotImplementedError - def print_message(self, message, nl=True): - click.echo("%s: %s" % (self.__class__.__name__, message), nl=nl) + def print_message(self, message, **kwargs): + click.echo( + "%s: " % str(self.__class__.__name__).replace("Package", " "), nl=False + ) + click.secho(message, **kwargs) def get_download_dir(self): if not self._download_dir: @@ -160,7 +163,7 @@ class BasePackageManager( # pylint: disable=too-many-public-methods return result except ManifestException as e: if not PlatformioCLI.in_silence(): - click.secho(str(e), fg="yellow") + self.print_message(str(e), fg="yellow") raise MissingPackageManifestError(", ".join(self.manifest_names)) @staticmethod @@ -186,37 +189,63 @@ class BasePackageManager( # pylint: disable=too-many-public-methods metadata.version = self.generate_rand_version() return metadata + def get_installed(self): + result = [] + for name in os.listdir(self.package_dir): + pkg_dir = os.path.join(self.package_dir, name) + if not os.path.isdir(pkg_dir): + continue + pkg = PackageSourceItem(pkg_dir) + if not pkg.metadata: + try: + spec = self.build_legacy_spec(pkg_dir) + pkg.metadata = self.build_metadata(pkg_dir, spec) + except MissingPackageManifestError: + pass + if pkg.metadata: + result.append(pkg) + return result + def get_package(self, spec): if isinstance(spec, PackageSourceItem): return spec - - if not isinstance(spec, PackageSpec) and os.path.isdir(spec): - for pkg in self.get_installed(): - if spec == pkg.path: - return pkg - return None - spec = self.ensure_spec(spec) best = None for pkg in self.get_installed(): - skip_conditions = [ - spec.owner - and not ci_strings_are_equal(spec.owner, pkg.metadata.spec.owner), - spec.external and spec.url != pkg.metadata.spec.url, - spec.id and spec.id != pkg.metadata.spec.id, - not spec.id - and not spec.external - and not ci_strings_are_equal(spec.name, pkg.metadata.name), - ] - if any(skip_conditions): + if not self._test_pkg_with_spec(pkg, spec): continue - if self.pkg_type == PackageType.TOOL: - # TODO: check "system" for pkg - pass - assert isinstance(pkg.metadata.version, semantic_version.Version) if spec.requirements and pkg.metadata.version not in spec.requirements: continue if not best or (pkg.metadata.version > best.metadata.version): best = pkg return best + + def _test_pkg_with_spec(self, pkg, spec): + # "id" mismatch + if spec.id and spec.id != pkg.metadata.spec.id: + return False + + # "owner" mismatch + if spec.owner and not ci_strings_are_equal(spec.owner, pkg.metadata.spec.owner): + return False + + # external "URL" mismatch + if spec.external: + # local folder mismatch + if spec.url == pkg.path or ( + spec.url.startswith("file://") and pkg.path == spec.url[7:] + ): + return True + if spec.url != pkg.metadata.spec.url: + return False + + # "name" mismatch + 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/commands/test_lib_complex.py b/tests/commands/test_lib_complex.py index 3f0f3725..a71330db 100644 --- a/tests/commands/test_lib_complex.py +++ b/tests/commands/test_lib_complex.py @@ -15,7 +15,6 @@ import json import re -from platformio import exception from platformio.commands import PlatformioCLI from platformio.commands.lib.command import cli as cmd_lib from platformio.package.exception import UnknownPackageError