Fix issue with installing only the one platform package by specified type

This commit is contained in:
Ivan Kravets
2018-03-16 13:33:59 +02:00
parent 02bad10652
commit 218a1dccf6
5 changed files with 39 additions and 35 deletions

View File

@ -69,7 +69,7 @@ class CorePackageManager(PackageManager):
if manifest['name'] not in best_pkg_versions: if manifest['name'] not in best_pkg_versions:
continue continue
if manifest['version'] != best_pkg_versions[manifest['name']]: if manifest['version'] != best_pkg_versions[manifest['name']]:
self.uninstall(manifest['__pkg_dir'], trigger_event=False) self.uninstall(manifest['__pkg_dir'], after_update=True)
self.cache_reset() self.cache_reset()
return True return True

View File

@ -332,7 +332,7 @@ class LibraryManager(BasePkgManager):
name, name,
requirements=None, requirements=None,
silent=False, silent=False,
trigger_event=True, after_update=False,
interactive=False, interactive=False,
force=False): force=False):
_name, _requirements, _url = self.parse_pkg_uri(name, requirements) _name, _requirements, _url = self.parse_pkg_uri(name, requirements)
@ -350,7 +350,7 @@ class LibraryManager(BasePkgManager):
name, name,
requirements, requirements,
silent=silent, silent=silent,
trigger_event=trigger_event, after_update=after_update,
force=force) force=force)
if not pkg_dir: if not pkg_dir:
@ -369,7 +369,7 @@ class LibraryManager(BasePkgManager):
self.install( self.install(
"{name}={version}".format(**filters), "{name}={version}".format(**filters),
silent=silent, silent=silent,
trigger_event=trigger_event, after_update=after_update,
interactive=interactive, interactive=interactive,
force=force) force=force)
else: else:
@ -385,14 +385,14 @@ class LibraryManager(BasePkgManager):
lib_id, lib_id,
filters.get("version"), filters.get("version"),
silent=silent, silent=silent,
trigger_event=trigger_event, after_update=after_update,
interactive=interactive, interactive=interactive,
force=force) force=force)
else: else:
self.install( self.install(
lib_id, lib_id,
silent=silent, silent=silent,
trigger_event=trigger_event, after_update=after_update,
interactive=interactive, interactive=interactive,
force=force) force=force)
return pkg_dir return pkg_dir

View File

@ -633,7 +633,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
name, name,
requirements=None, requirements=None,
silent=False, silent=False,
trigger_event=True, after_update=False,
force=False): force=False):
name, requirements, url = self.parse_pkg_uri(name, requirements) name, requirements, url = self.parse_pkg_uri(name, requirements)
package_dir = self.get_package_dir(name, requirements, url) package_dir = self.get_package_dir(name, requirements, url)
@ -676,7 +676,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
manifest = self.load_manifest(pkg_dir) manifest = self.load_manifest(pkg_dir)
assert manifest assert manifest
if trigger_event: if not after_update:
telemetry.on_event( telemetry.on_event(
category=self.__class__.__name__, category=self.__class__.__name__,
action="Install", action="Install",
@ -690,7 +690,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
return pkg_dir return pkg_dir
def uninstall(self, package, requirements=None, trigger_event=True): def uninstall(self, package, requirements=None, after_update=False):
if isdir(package): if isdir(package):
pkg_dir = package pkg_dir = package
else: else:
@ -723,7 +723,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
click.echo("[%s]" % click.style("OK", fg="green")) click.echo("[%s]" % click.style("OK", fg="green"))
if trigger_event: if not after_update:
telemetry.on_event( telemetry.on_event(
category=self.__class__.__name__, category=self.__class__.__name__,
action="Uninstall", action="Uninstall",
@ -769,8 +769,8 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
self._update_src_manifest( self._update_src_manifest(
dict(version=vcs.get_current_revision()), vcs.storage_dir) dict(version=vcs.get_current_revision()), vcs.storage_dir)
else: else:
self.uninstall(pkg_dir, trigger_event=False) self.uninstall(pkg_dir, after_update=True)
self.install(name, latest, trigger_event=False) self.install(name, latest, after_update=True)
telemetry.on_event( telemetry.on_event(
category=self.__class__.__name__, category=self.__class__.__name__,

View File

@ -62,7 +62,7 @@ class PlatformManager(BasePkgManager):
with_packages=None, with_packages=None,
without_packages=None, without_packages=None,
skip_default_package=False, skip_default_package=False,
trigger_event=True, after_update=False,
silent=False, silent=False,
force=False, force=False,
**_): # pylint: disable=too-many-arguments, arguments-differ **_): # pylint: disable=too-many-arguments, arguments-differ
@ -70,20 +70,20 @@ class PlatformManager(BasePkgManager):
self, name, requirements, silent=silent, force=force) self, name, requirements, silent=silent, force=force)
p = PlatformFactory.newPlatform(platform_dir) p = PlatformFactory.newPlatform(platform_dir)
# @Hook: when 'update' operation (trigger_event is False), # don't cleanup packages or install them after update
# don't cleanup packages or install them # we check packages for updates in def update()
if not trigger_event: if after_update:
return True return True
p.install_packages( p.install_packages(
with_packages, with_packages,
without_packages, without_packages,
skip_default_package, skip_default_package,
silent=silent, silent=silent,
force=force) force=force)
self.cleanup_packages(p.packages.keys()) return self.cleanup_packages(p.packages.keys())
return True
def uninstall(self, package, requirements=None, trigger_event=True): def uninstall(self, package, requirements=None, after_update=False):
if isdir(package): if isdir(package):
pkg_dir = package pkg_dir = package
else: else:
@ -96,13 +96,12 @@ class PlatformManager(BasePkgManager):
p = PlatformFactory.newPlatform(pkg_dir) p = PlatformFactory.newPlatform(pkg_dir)
BasePkgManager.uninstall(self, pkg_dir, requirements) BasePkgManager.uninstall(self, pkg_dir, requirements)
# @Hook: when 'update' operation (trigger_event is False), # don't cleanup packages or install them after update
# don't cleanup packages or install them # we check packages for updates in def update()
if not trigger_event: if after_update:
return True return True
self.cleanup_packages(p.packages.keys()) return self.cleanup_packages(p.packages.keys())
return True
def update( # pylint: disable=arguments-differ def update( # pylint: disable=arguments-differ
self, self,
@ -154,7 +153,7 @@ class PlatformManager(BasePkgManager):
continue continue
if (manifest['name'] not in deppkgs if (manifest['name'] not in deppkgs
or manifest['version'] not in deppkgs[manifest['name']]): or manifest['version'] not in deppkgs[manifest['name']]):
pm.uninstall(manifest['__pkg_dir'], trigger_event=False) pm.uninstall(manifest['__pkg_dir'], after_update=True)
self.cache_reset() self.cache_reset()
return True return True
@ -280,21 +279,25 @@ class PlatformPackagesMixin(object):
return True return True
def find_pkg_names(self, items): def find_pkg_names(self, candidates):
result = [] result = []
for item in items: for candidate in candidates:
candidate = item found = False
# lookup by package types # lookup by package types
for _name, _opts in self.packages.items(): for _name, _opts in self.packages.items():
if _opts.get("type") == item: if _opts.get("type") == candidate:
candidate = _name result.append(_name)
found = True
if (self.frameworks and item.startswith("framework-") if (self.frameworks and candidate.startswith("framework-")
and item[10:] in self.frameworks): and candidate[10:] in self.frameworks):
candidate = self.frameworks[item[10:]]['package'] result.append(self.frameworks[candidate[10:]]['package'])
found = True
if not found:
result.append(candidate)
result.append(candidate)
return result return result
def update_packages(self, only_check=False): def update_packages(self, only_check=False):

View File

@ -61,13 +61,14 @@ def test_install_known_version(clirunner, validate_cliresult,
assert len(isolated_pio_home.join("packages").listdir()) == 1 assert len(isolated_pio_home.join("packages").listdir()) == 1
def test_install_from_vcs(clirunner, validate_cliresult): def test_install_from_vcs(clirunner, validate_cliresult, isolated_pio_home):
result = clirunner.invoke(cli_platform.platform_install, [ result = clirunner.invoke(cli_platform.platform_install, [
"https://github.com/platformio/" "https://github.com/platformio/"
"platform-espressif8266.git#feature/stage", "--skip-default-package" "platform-espressif8266.git#feature/stage", "--skip-default-package"
]) ])
validate_cliresult(result) validate_cliresult(result)
assert "espressif8266" in result.output assert "espressif8266" in result.output
assert len(isolated_pio_home.join("packages").listdir()) == 1
def test_list_json_output(clirunner, validate_cliresult): def test_list_json_output(clirunner, validate_cliresult):