From e6d1805f0b3c8ca7e27d084d4991ab81ca06619c Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 24 May 2019 14:09:25 +0300 Subject: [PATCH] Save library requirements when using `--save` option // Issue #1028 --- docs | 2 +- platformio/commands/lib.py | 53 ++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/docs b/docs index 2ed6a490..82316b22 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 2ed6a490e5853bd71afaa08bc34750970293d43d +Subproject commit 82316b22ff38d4e62dd38dd8e465afa38bd062b5 diff --git a/platformio/commands/lib.py b/platformio/commands/lib.py index af0e2105..bf3458b1 100644 --- a/platformio/commands/lib.py +++ b/platformio/commands/lib.py @@ -19,6 +19,7 @@ import time from os.path import isdir, join import click +import semantic_version from platformio import exception, util from platformio.managers.lib import (LibraryManager, get_builtin_libs, @@ -133,49 +134,61 @@ def cli(ctx, **options): def lib_install( # pylint: disable=too-many-arguments ctx, libraries, save, silent, interactive, force): storage_dirs = ctx.meta[CTX_META_STORAGE_DIRS_KEY] - input_dirs = ctx.meta.get(CTX_META_INPUT_DIRS_KEY, []) storage_libdeps = ctx.meta.get(CTX_META_STORAGE_LIBDEPS_KEY, []) - if save and libraries: - project_environments = ctx.meta[CTX_META_PROJECT_ENVIRONMENTS_KEY] - for input_dir in input_dirs: - config = ProjectConfig.get_instance( - join(input_dir, "platformio.ini")) - config.validate(project_environments) - for env in config.envs(): - if project_environments and env not in project_environments: - continue - config.expand_interpolations = False - lib_deps = (config.getlist( - "env:" + env, "lib_deps") if config.has_option( - "env:" + env, "lib_deps") else []) - lib_deps.extend(l for l in libraries if l not in lib_deps) - config.set("env:" + env, "lib_deps", lib_deps) - config.save() - + installed_manifests = {} for storage_dir in storage_dirs: if not silent and (libraries or storage_dir in storage_libdeps): print_storage_header(storage_dirs, storage_dir) lm = LibraryManager(storage_dir) if libraries: for library in libraries: - lm.install( + pkg_dir = lm.install( library, silent=silent, interactive=interactive, force=force) + installed_manifests[library] = lm.load_manifest(pkg_dir) elif storage_dir in storage_libdeps: for library in storage_libdeps[storage_dir]: try: - lm.install( + pkg_dir = lm.install( library, silent=silent, interactive=interactive, force=force) + installed_manifests[library] = lm.load_manifest(pkg_dir) except exception.LibNotFound as e: if not silent or not is_builtin_lib(library): click.secho("Warning! %s" % e, fg="yellow") + if not save or not libraries: + return + + input_dirs = ctx.meta.get(CTX_META_INPUT_DIRS_KEY, []) + project_environments = ctx.meta[CTX_META_PROJECT_ENVIRONMENTS_KEY] + for input_dir in input_dirs: + config = ProjectConfig.get_instance(join(input_dir, "platformio.ini")) + config.validate(project_environments) + for env in config.envs(): + if project_environments and env not in project_environments: + continue + config.expand_interpolations = False + lib_deps = (config.getlist("env:" + env, "lib_deps") + if config.has_option("env:" + env, "lib_deps") else []) + for library in libraries: + if library in lib_deps: + continue + manifest = installed_manifests[library] + try: + assert library.lower() == manifest['name'].lower() + assert semantic_version.Version(manifest['version']) + lib_deps.append("{name}@^{version}".format(**manifest)) + except (AssertionError, ValueError): + lib_deps.append(library) + config.set("env:" + env, "lib_deps", lib_deps) + config.save() + @cli.command("uninstall", short_help="Uninstall libraries") @click.argument("libraries", nargs=-1, metavar="[LIBRARY...]")