From d994da9d53f7a34456fb40e11b4237c0fe260901 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Wed, 8 Mar 2017 19:52:11 +0200 Subject: [PATCH] Check outdated packages for development platform --- platformio/commands/platform.py | 15 +++++--- platformio/maintenance.py | 12 +++++-- platformio/managers/package.py | 3 +- platformio/managers/platform.py | 63 ++++++++++++--------------------- 4 files changed, 44 insertions(+), 49 deletions(-) diff --git a/platformio/commands/platform.py b/platformio/commands/platform.py index 0d01cc6d..5d44417e 100644 --- a/platformio/commands/platform.py +++ b/platformio/commands/platform.py @@ -336,9 +336,13 @@ def platform_update(platforms, only_packages, only_check, json_output): app.clean_cache() pm = PlatformManager() + pkg_dir_to_name = {} if not platforms: platforms = [] - platforms = [manifest['__pkg_dir'] for manifest in pm.get_installed()] + for manifest in pm.get_installed(): + platforms.append(manifest['__pkg_dir']) + pkg_dir_to_name[manifest['__pkg_dir']] = manifest.get( + "title", manifest['name']) if only_check and json_output: result = [] @@ -352,16 +356,19 @@ def platform_update(platforms, only_packages, only_check, json_output): if not pkg_dir: continue latest = pm.outdated(pkg_dir, requirements) - if not latest: + if (not latest and not PlatformFactory.newPlatform(pkg_dir) + .are_outdated_packages()): continue data = _get_installed_platform_data( pkg_dir, with_boards=False, expose_packages=False) - data['versionLatest'] = latest + if latest: + data['versionLatest'] = latest result.append(data) return click.echo(json.dumps(result)) else: for platform in platforms: - click.echo("Platform %s" % click.style(platform, fg="cyan")) + click.echo("Platform %s" % click.style( + pkg_dir_to_name.get(platform, platform), fg="cyan")) click.echo("--------") pm.update( platform, only_packages=only_packages, only_check=only_check) diff --git a/platformio/maintenance.py b/platformio/maintenance.py index 2acc8ef1..da6c1329 100644 --- a/platformio/maintenance.py +++ b/platformio/maintenance.py @@ -30,7 +30,7 @@ from platformio.commands.platform import \ from platformio.commands.platform import platform_update as cmd_platform_update from platformio.commands.upgrade import get_latest_version from platformio.managers.lib import LibraryManager -from platformio.managers.platform import PlatformManager +from platformio.managers.platform import PlatformFactory, PlatformManager from platformio.pioplus import pioplus_update @@ -260,8 +260,14 @@ def check_internal_updates(ctx, what): pm = PlatformManager() if what == "platforms" else LibraryManager() outdated_items = [] for manifest in pm.get_installed(): - if manifest['name'] not in outdated_items and \ - pm.outdated(manifest['__pkg_dir']): + if manifest['name'] in outdated_items: + continue + conds = [ + pm.outdated(manifest['__pkg_dir']), what == "platforms" and + PlatformFactory.newPlatform( + manifest['__pkg_dir']).are_outdated_packages() + ] + if any(conds): outdated_items.append(manifest['name']) if not outdated_items: diff --git a/platformio/managers/package.py b/platformio/managers/package.py index 94e59e87..539c5ab8 100644 --- a/platformio/managers/package.py +++ b/platformio/managers/package.py @@ -547,6 +547,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): `False` - package is up-to-date `String` - a found latest version """ + assert isdir(pkg_dir) latest = None manifest = self.load_manifest(pkg_dir) # skip a fixed package to a specific version @@ -709,7 +710,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin): return if "__src_url" in manifest: - vcs = VCSClientFactory.newClient(pkg_dir, manifest['__vcs_url']) + vcs = VCSClientFactory.newClient(pkg_dir, manifest['__src_url']) assert vcs.update() self._update_src_manifest( dict(version=vcs.get_current_revision()), vcs.storage_dir) diff --git a/platformio/managers/platform.py b/platformio/managers/platform.py index dddafc45..0283fdd1 100644 --- a/platformio/managers/platform.py +++ b/platformio/managers/platform.py @@ -253,45 +253,29 @@ class PlatformPackagesMixin(object): return True + def update_packages(self, only_check=False): + for name, manifest in self.get_installed_packages().items(): + version = self.packages[name].get("version", "") + if "@" in version: + _, version = version.rsplit("@", 1) + self.pm.update(manifest['__pkg_dir'], version, only_check) + def get_installed_packages(self): items = {} - for name, opts in self.packages.items(): - version = opts.get("version", "") - if self.is_valid_requirements(version): - package = self.pm.get_package(name, version) - else: - package = self.pm.get_package(*self._parse_pkg_input(name, - version)) - if package: - items[name] = package + for name in self.packages: + pkg_dir = self.get_package_dir(name) + if pkg_dir: + items[name] = self.pm.load_manifest(pkg_dir) return items - def update_packages(self, only_check=False): - for name in self.get_installed_packages(): + def are_outdated_packages(self): + for name, manifest in self.get_installed_packages().items(): version = self.packages[name].get("version", "") - if self.is_valid_requirements(version): - self.pm.update(name, version, only_check) - else: - requirements = None - if "@" in version: - version, requirements = version.rsplit("@", 1) - self.pm.update("%s=%s" % (name, version), requirements, - only_check) - - # def are_outdated_packages(self): - # latest = None - # for name in self.get_installed_packages(): - # version = self.packages[name].get("version", "") - # if self.is_valid_requirements(version): - # latest = self.pm.outdated(name, version) - # else: - # requirements = None - # if "@" in version: - # version, requirements = version.rsplit("@", 1) - # latest = self.pm.outdated(name, requirements, version) - # if latest or latest is None: - # return True - # return False + if "@" in version: + _, version = version.rsplit("@", 1) + if self.pm.outdated(manifest['__pkg_dir'], version): + return True + return False def get_package_dir(self, name): version = self.packages[name].get("version", "") @@ -302,13 +286,10 @@ class PlatformPackagesMixin(object): version)) def get_package_version(self, name): - version = self.packages[name].get("version", "") - if self.is_valid_requirements(version): - package = self.pm.get_package(name, version) - else: - package = self.pm.get_package(*self._parse_pkg_input(name, - version)) - return package['version'] if package else None + pkg_dir = self.get_package_dir(name) + if not pkg_dir: + return None + return self.pm.load_manifest(pkg_dir).get("version") @staticmethod def is_valid_requirements(requirements):