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:
continue
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()
return True

View File

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

View File

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

View File

@ -62,7 +62,7 @@ class PlatformManager(BasePkgManager):
with_packages=None,
without_packages=None,
skip_default_package=False,
trigger_event=True,
after_update=False,
silent=False,
force=False,
**_): # pylint: disable=too-many-arguments, arguments-differ
@ -70,20 +70,20 @@ class PlatformManager(BasePkgManager):
self, name, requirements, silent=silent, force=force)
p = PlatformFactory.newPlatform(platform_dir)
# @Hook: when 'update' operation (trigger_event is False),
# don't cleanup packages or install them
if not trigger_event:
# don't cleanup packages or install them after update
# we check packages for updates in def update()
if after_update:
return True
p.install_packages(
with_packages,
without_packages,
skip_default_package,
silent=silent,
force=force)
self.cleanup_packages(p.packages.keys())
return True
return self.cleanup_packages(p.packages.keys())
def uninstall(self, package, requirements=None, trigger_event=True):
def uninstall(self, package, requirements=None, after_update=False):
if isdir(package):
pkg_dir = package
else:
@ -96,13 +96,12 @@ class PlatformManager(BasePkgManager):
p = PlatformFactory.newPlatform(pkg_dir)
BasePkgManager.uninstall(self, pkg_dir, requirements)
# @Hook: when 'update' operation (trigger_event is False),
# don't cleanup packages or install them
if not trigger_event:
# don't cleanup packages or install them after update
# we check packages for updates in def update()
if after_update:
return True
self.cleanup_packages(p.packages.keys())
return True
return self.cleanup_packages(p.packages.keys())
def update( # pylint: disable=arguments-differ
self,
@ -154,7 +153,7 @@ class PlatformManager(BasePkgManager):
continue
if (manifest['name'] not in deppkgs
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()
return True
@ -280,21 +279,25 @@ class PlatformPackagesMixin(object):
return True
def find_pkg_names(self, items):
def find_pkg_names(self, candidates):
result = []
for item in items:
candidate = item
for candidate in candidates:
found = False
# lookup by package types
for _name, _opts in self.packages.items():
if _opts.get("type") == item:
candidate = _name
if _opts.get("type") == candidate:
result.append(_name)
found = True
if (self.frameworks and item.startswith("framework-")
and item[10:] in self.frameworks):
candidate = self.frameworks[item[10:]]['package']
if (self.frameworks and candidate.startswith("framework-")
and candidate[10:] in self.frameworks):
result.append(self.frameworks[candidate[10:]]['package'])
found = True
if not found:
result.append(candidate)
result.append(candidate)
return result
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
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, [
"https://github.com/platformio/"
"platform-espressif8266.git#feature/stage", "--skip-default-package"
])
validate_cliresult(result)
assert "espressif8266" in result.output
assert len(isolated_pio_home.join("packages").listdir()) == 1
def test_list_json_output(clirunner, validate_cliresult):