diff --git a/platformio/commands/platform.py b/platformio/commands/platform.py index 4f493229..c8bb3374 100644 --- a/platformio/commands/platform.py +++ b/platformio/commands/platform.py @@ -137,10 +137,7 @@ def platform_update(platforms, only_packages, only_check, json_output): continue manifest = pm.load_manifest( pm.get_package_dir(name, requirements, url)) - if latest is True: - manifest['versionLatest'] = "Out-of-date" - else: - manifest['versionLatest'] = latest or "Unknown" + manifest['versionLatest'] = latest or "Unknown" result.append(manifest) return click.echo(json.dumps(result)) else: diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 7b5768af..a38fe067 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -635,9 +635,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): click.echo("[%s]" % (click.style("Off-line", fg="yellow"))) return latest = self.outdated(name, requirements, url) - if latest is True: - click.echo("[%s]" % (click.style("Out-of-date", fg="red"))) - elif latest: + if latest: click.echo("[%s]" % (click.style(latest, fg="red"))) elif latest is False: click.echo("[%s]" % (click.style("Up-to-date", fg="green"))) @@ -659,11 +657,11 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): with open(manifest_path, "w") as fp: manifest['version'] = vcs.get_current_revision() json.dump(manifest, fp) - self.reset_cache() else: self.uninstall(name, manifest['version'], trigger_event=False) self.install(name, latest, trigger_event=False) + self.reset_cache() telemetry.on_event( category=self.__class__.__name__, action="Update", diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index caf41b99..b1b34414 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -60,9 +60,16 @@ class PlatformManager(BasePkgManager): with_packages=None, without_packages=None, skip_default_package=False, + trigger_event=True, **_): # pylint: disable=too-many-arguments platform_dir = BasePkgManager.install(self, name, requirements) p = PlatformFactory.newPlatform(self.get_manifest_path(platform_dir)) + + # @Hook: when 'update' operation (trigger_event is False), + # don't cleanup packages or install them + if not trigger_event: + return True + p.install_packages(with_packages, without_packages, skip_default_package) self.cleanup_packages(p.packages.keys()) @@ -72,10 +79,13 @@ class PlatformManager(BasePkgManager): name, requirements, _ = self.parse_pkg_name(name, requirements) p = PlatformFactory.newPlatform(name, requirements) BasePkgManager.uninstall(self, name, requirements) - # trigger event is disabled when upgrading operation - # don't cleanup packages, "install" will do that - if trigger_event: - self.cleanup_packages(p.packages.keys()) + + # @Hook: when 'update' operation (trigger_event is False), + # don't cleanup packages or install them + if not trigger_event: + return True + + self.cleanup_packages(p.packages.keys()) return True def update( # pylint: disable=arguments-differ @@ -85,19 +95,24 @@ class PlatformManager(BasePkgManager): only_packages=False, only_check=False): name, requirements, _ = self.parse_pkg_name(name, requirements) + + p = PlatformFactory.newPlatform(name, requirements) + pkgs_before = pkgs_after = p.get_installed_packages().keys() + if not only_packages: BasePkgManager.update(self, name, requirements, only_check) - p = PlatformFactory.newPlatform(name, requirements) + p = PlatformFactory.newPlatform(name, requirements) + pkgs_after = p.get_installed_packages().keys() + p.update_packages(only_check) self.cleanup_packages(p.packages.keys()) - return True - def outdated(self, name, requirements=None, url=None): - latest = BasePkgManager.outdated(self, name, requirements, url) - if latest: - return latest - p = PlatformFactory.newPlatform(name, requirements) - return p.are_outdated_packages() + pkgs_missed = set(pkgs_before) - set(pkgs_after) + if pkgs_missed: + p.install_packages( + with_packages=pkgs_missed, skip_default_package=True) + + return True def cleanup_packages(self, names): self.reset_cache() diff --git a/tests/commands/test_platform.py b/tests/commands/test_platform.py index e6c34011..fe29ce58 100644 --- a/tests/commands/test_platform.py +++ b/tests/commands/test_platform.py @@ -53,10 +53,14 @@ def test_install_unknown_from_registry(clirunner, validate_cliresult, def test_install_known_version(clirunner, validate_cliresult, isolated_pio_home): - result = clirunner.invoke(cli_platform.platform_install, - ["atmelavr@1.1.0", "--skip-default-package"]) + result = clirunner.invoke(cli_platform.platform_install, [ + "atmelavr@1.1.0", "--skip-default-package", "--with-package", + "tool-avrdude" + ]) validate_cliresult(result) assert "atmelavr @ 1.1.0" in result.output + assert "Installing tool-avrdude @" in result.output + assert len(isolated_pio_home.join("packages").listdir()) == 1 def test_install_from_vcs(clirunner, validate_cliresult, isolated_pio_home): @@ -92,12 +96,19 @@ def test_update_check(clirunner, validate_cliresult, isolated_pio_home): output = json.loads(result.output) assert len(output) == 1 assert output[0]['name'] == "atmelavr" + assert len(isolated_pio_home.join("packages").listdir()) == 1 + + +def test_update_raw(clirunner, validate_cliresult, isolated_pio_home): + result = clirunner.invoke(cli_platform.platform_update) + validate_cliresult(result) + assert "Uninstalling atmelavr @ 1.1.0:" in result.output + assert "PlatformManager: Installing atmelavr @" in result.output + assert len(isolated_pio_home.join("packages").listdir()) == 1 def test_uninstall(clirunner, validate_cliresult, isolated_pio_home): result = clirunner.invoke(cli_platform.platform_uninstall, ["atmelavr", "espressif8266_stage"]) validate_cliresult(result) - assert len( - [d.basename - for d in isolated_pio_home.join("platforms").listdir()]) == 0 + assert len(isolated_pio_home.join("platforms").listdir()) == 0