Minor improvements

This commit is contained in:
Ivan Kravets
2020-08-12 20:09:10 +03:00
parent 893ca1b328
commit d5451756fd
10 changed files with 90 additions and 79 deletions

View File

@ -1022,6 +1022,8 @@ def ConfigureProjectLibBuilder(env):
pkg = PackageSourceItem(lb.path) pkg = PackageSourceItem(lb.path)
if pkg.metadata: if pkg.metadata:
title += " %s" % pkg.metadata.version title += " %s" % pkg.metadata.version
elif lb.version:
title += " %s" % lb.version
click.echo("%s|-- %s" % (margin, title), nl=False) click.echo("%s|-- %s" % (margin, title), nl=False)
if int(ARGUMENTS.get("PIOVERBOSE", 0)): if int(ARGUMENTS.get("PIOVERBOSE", 0)):
if pkg.metadata and pkg.metadata.spec.external: if pkg.metadata and pkg.metadata.spec.external:

View File

@ -139,7 +139,7 @@ def PrintConfiguration(env): # pylint: disable=too-many-statements
) )
def _get_plaform_data(): def _get_plaform_data():
data = ["PLATFORM: %s %s" % (platform.title, platform.version)] data = ["PLATFORM: %s (%s)" % (platform.title, platform.version)]
if platform.src_version: if platform.src_version:
data.append("#" + platform.src_version) data.append("#" + platform.src_version)
if int(ARGUMENTS.get("PIOVERBOSE", 0)) and platform.src_url: if int(ARGUMENTS.get("PIOVERBOSE", 0)) and platform.src_url:

View File

@ -283,12 +283,14 @@ def lib_update( # pylint: disable=too-many-arguments
json_result[storage_dir] = result json_result[storage_dir] = result
else: else:
for library in _libraries: for library in _libraries:
spec = ( to_spec = (
None None
if isinstance(library, PackageSourceItem) if isinstance(library, PackageSourceItem)
else PackageSpec(library) 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: if json_output:
return click.echo( return click.echo(

View File

@ -17,8 +17,6 @@ import os
import tempfile import tempfile
import time import time
import click
from platformio import app, compat from platformio import app, compat
from platformio.package.download import FileDownloader from platformio.package.download import FileDownloader
from platformio.package.lockfile import LockFile from platformio.package.lockfile import LockFile
@ -77,7 +75,7 @@ class PackageManagerDownloadMixin(object):
except IOError: except IOError:
raise_error = True raise_error = True
if raise_error: if raise_error:
click.secho( self.print_message(
"Error: Please read http://bit.ly/package-manager-ioerror", "Error: Please read http://bit.ly/package-manager-ioerror",
fg="red", fg="red",
err=True, err=True,

View File

@ -20,7 +20,7 @@ import tempfile
import click import click
from platformio import app, compat, fs, util 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.meta import PackageSourceItem, PackageSpec
from platformio.package.unpack import FileUnpacker from platformio.package.unpack import FileUnpacker
from platformio.package.vcsclient import VCSClientFactory from platformio.package.vcsclient import VCSClientFactory
@ -71,7 +71,7 @@ class PackageManagerInstallMixin(object):
if pkg: if pkg:
if not silent: if not silent:
click.secho( self.print_message(
"{name} @ {version} is already installed".format( "{name} @ {version} is already installed".format(
**pkg.metadata.as_dict() **pkg.metadata.as_dict()
), ),
@ -80,8 +80,9 @@ class PackageManagerInstallMixin(object):
return pkg return pkg
if not silent: if not silent:
msg = "Installing %s" % click.style(spec.humanize(), fg="cyan") self.print_message(
self.print_message(msg) "Installing %s" % click.style(spec.humanize(), fg="cyan")
)
if spec.external: if spec.external:
pkg = self.install_from_url(spec.url, spec, silent=silent) pkg = self.install_from_url(spec.url, spec, silent=silent)
@ -96,12 +97,10 @@ class PackageManagerInstallMixin(object):
if not silent: if not silent:
self.print_message( self.print_message(
click.style( "{name} @ {version} has been successfully installed!".format(
"{name} @ {version} has been successfully installed!".format( **pkg.metadata.as_dict()
**pkg.metadata.as_dict() ),
), fg="green",
fg="green",
)
) )
self.memcache_reset() self.memcache_reset()
@ -115,10 +114,10 @@ class PackageManagerInstallMixin(object):
if not manifest.get("dependencies"): if not manifest.get("dependencies"):
return return
if not silent: if not silent:
self.print_message(click.style("Installing dependencies...", fg="yellow")) self.print_message("Installing dependencies...")
for dependency in manifest.get("dependencies"): for dependency in manifest.get("dependencies"):
if not self._install_dependency(dependency, silent) and not silent: if not self._install_dependency(dependency, silent) and not silent:
click.secho( self.print_message(
"Warning! Could not install dependency %s for package '%s'" "Warning! Could not install dependency %s for package '%s'"
% (dependency, pkg.metadata.name), % (dependency, pkg.metadata.name),
fg="yellow", fg="yellow",
@ -255,20 +254,3 @@ class PackageManagerInstallMixin(object):
_cleanup_dir(dst_pkg.path) _cleanup_dir(dst_pkg.path)
shutil.move(tmp_pkg.path, dst_pkg.path) shutil.move(tmp_pkg.path, dst_pkg.path)
return PackageSourceItem(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

View File

@ -108,8 +108,8 @@ class PackageManageRegistryMixin(object):
silent=silent, silent=silent,
) )
except Exception as e: # pylint: disable=broad-except except Exception as e: # pylint: disable=broad-except
click.secho("Warning! Package Mirror: %s" % e, fg="yellow") self.print_message("Warning! Package Mirror: %s" % e, fg="yellow")
click.secho("Looking for another mirror...", fg="yellow") self.print_message("Looking for another mirror...", fg="yellow")
return None return None
@ -159,9 +159,8 @@ class PackageManageRegistryMixin(object):
click.echo("") click.echo("")
return packages[0]["id"] return packages[0]["id"]
@staticmethod def print_multi_package_issue(self, packages, spec):
def print_multi_package_issue(packages, spec): self.print_message(
click.secho(
"Warning! More than one package has been found by ", fg="yellow", nl=False "Warning! More than one package has been found by ", fg="yellow", nl=False
) )
click.secho(spec.humanize(), fg="cyan", nl=False) click.secho(spec.humanize(), fg="cyan", nl=False)
@ -174,9 +173,9 @@ class PackageManageRegistryMixin(object):
version=item["version"]["name"], version=item["version"]["name"],
) )
) )
click.secho( self.print_message(
"Please specify detailed REQUIREMENTS using package owner and version " "Please specify detailed REQUIREMENTS using package owner and version "
"(showed above) to avoid project compatibility issues.", "(showed above) to avoid name conflicts",
fg="yellow", fg="yellow",
) )

View File

@ -23,17 +23,17 @@ from platformio.package.meta import PackageSourceItem, PackageSpec
class PackageManagerUninstallMixin(object): class PackageManagerUninstallMixin(object):
def uninstall(self, pkg, silent=False, skip_dependencies=False): def uninstall(self, spec, silent=False, skip_dependencies=False):
try: try:
self.lock() self.lock()
return self._uninstall(pkg, silent, skip_dependencies) return self._uninstall(spec, silent, skip_dependencies)
finally: finally:
self.unlock() self.unlock()
def _uninstall(self, pkg, silent=False, skip_dependencies=False): def _uninstall(self, spec, silent=False, skip_dependencies=False):
pkg = self.get_package(pkg) pkg = self.get_package(spec)
if not pkg or not pkg.metadata: if not pkg or not pkg.metadata:
raise UnknownPackageError(pkg) raise UnknownPackageError(spec)
if not silent: if not silent:
self.print_message( self.print_message(
@ -78,7 +78,7 @@ class PackageManagerUninstallMixin(object):
if not manifest.get("dependencies"): if not manifest.get("dependencies"):
return return
if not silent: 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"): for dependency in manifest.get("dependencies"):
pkg = self.get_package( pkg = self.get_package(
PackageSpec( PackageSpec(

View File

@ -78,18 +78,18 @@ class PackageManagerUpdateMixin(object):
).version ).version
) )
def update(self, pkg, spec=None, only_check=False, silent=False): def update(self, from_spec, to_spec=None, only_check=False, silent=False):
pkg = self.get_package(pkg) pkg = self.get_package(from_spec)
if not pkg or not pkg.metadata: if not pkg or not pkg.metadata:
raise UnknownPackageError(pkg) raise UnknownPackageError(from_spec)
if not silent: if not silent:
click.echo( click.echo(
"{} {:<45} {:<30}".format( "{} {:<45} {:<30}".format(
"Checking" if only_check else "Updating", "Checking" if only_check else "Updating",
click.style(pkg.metadata.spec.humanize(), fg="cyan"), click.style(pkg.metadata.spec.humanize(), fg="cyan"),
"%s (%s)" % (pkg.metadata.version, spec.requirements) "%s (%s)" % (pkg.metadata.version, to_spec.requirements)
if spec and spec.requirements if to_spec and to_spec.requirements
else str(pkg.metadata.version), else str(pkg.metadata.version),
), ),
nl=False, nl=False,
@ -99,7 +99,7 @@ class PackageManagerUpdateMixin(object):
click.echo("[%s]" % (click.style("Off-line", fg="yellow"))) click.echo("[%s]" % (click.style("Off-line", fg="yellow")))
return pkg return pkg
outdated = self.outdated(pkg, spec) outdated = self.outdated(pkg, to_spec)
if not silent: if not silent:
self.print_outdated_state(outdated) self.print_outdated_state(outdated)

View File

@ -103,8 +103,11 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
def manifest_names(self): def manifest_names(self):
raise NotImplementedError raise NotImplementedError
def print_message(self, message, nl=True): def print_message(self, message, **kwargs):
click.echo("%s: %s" % (self.__class__.__name__, message), nl=nl) click.echo(
"%s: " % str(self.__class__.__name__).replace("Package", " "), nl=False
)
click.secho(message, **kwargs)
def get_download_dir(self): def get_download_dir(self):
if not self._download_dir: if not self._download_dir:
@ -160,7 +163,7 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
return result return result
except ManifestException as e: except ManifestException as e:
if not PlatformioCLI.in_silence(): if not PlatformioCLI.in_silence():
click.secho(str(e), fg="yellow") self.print_message(str(e), fg="yellow")
raise MissingPackageManifestError(", ".join(self.manifest_names)) raise MissingPackageManifestError(", ".join(self.manifest_names))
@staticmethod @staticmethod
@ -186,37 +189,63 @@ class BasePackageManager( # pylint: disable=too-many-public-methods
metadata.version = self.generate_rand_version() metadata.version = self.generate_rand_version()
return metadata 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): def get_package(self, spec):
if isinstance(spec, PackageSourceItem): if isinstance(spec, PackageSourceItem):
return spec 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) spec = self.ensure_spec(spec)
best = None best = None
for pkg in self.get_installed(): for pkg in self.get_installed():
skip_conditions = [ if not self._test_pkg_with_spec(pkg, spec):
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):
continue continue
if self.pkg_type == PackageType.TOOL:
# TODO: check "system" for pkg
pass
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:
continue continue
if not best or (pkg.metadata.version > best.metadata.version): if not best or (pkg.metadata.version > best.metadata.version):
best = pkg best = pkg
return best 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

View File

@ -15,7 +15,6 @@
import json import json
import re import re
from platformio import exception
from platformio.commands import PlatformioCLI from platformio.commands import PlatformioCLI
from platformio.commands.lib.command import cli as cmd_lib from platformio.commands.lib.command import cli as cmd_lib
from platformio.package.exception import UnknownPackageError from platformio.package.exception import UnknownPackageError