forked from platformio/platformio-core
Cleanup PackageManager
This commit is contained in:
@ -252,14 +252,14 @@ def lib_list(lm, json_output):
|
|||||||
@click.argument("library", metavar="[LIBRARY]")
|
@click.argument("library", metavar="[LIBRARY]")
|
||||||
def lib_show(lm, library): # pylint: disable=too-many-branches
|
def lib_show(lm, library): # pylint: disable=too-many-branches
|
||||||
name, requirements, url = lm.parse_pkg_name(library)
|
name, requirements, url = lm.parse_pkg_name(library)
|
||||||
installed_dir = lm.get_installed_dir(name, requirements, url)
|
package_dir = lm.get_package_dir(name, requirements, url)
|
||||||
if not installed_dir:
|
if not package_dir:
|
||||||
click.secho(
|
click.secho(
|
||||||
"%s @ %s is not installed" % (name, requirements or "*"),
|
"%s @ %s is not installed" % (name, requirements or "*"),
|
||||||
fg="yellow")
|
fg="yellow")
|
||||||
return
|
return
|
||||||
|
|
||||||
manifest = lm.load_manifest(installed_dir)
|
manifest = lm.load_manifest(package_dir)
|
||||||
|
|
||||||
click.secho(manifest['name'], fg="cyan")
|
click.secho(manifest['name'], fg="cyan")
|
||||||
click.echo("=" * len(manifest['name']))
|
click.echo("=" * len(manifest['name']))
|
||||||
|
@ -114,9 +114,9 @@ class LibraryManager(BasePkgManager):
|
|||||||
if name.startswith("id="):
|
if name.startswith("id="):
|
||||||
return int(name[3:])
|
return int(name[3:])
|
||||||
# try to find ID from installed packages
|
# try to find ID from installed packages
|
||||||
installed_dir = self.get_installed_dir(name, requirements)
|
package_dir = self.get_package_dir(name, requirements)
|
||||||
if installed_dir:
|
if package_dir:
|
||||||
manifest = self.load_manifest(installed_dir)
|
manifest = self.load_manifest(package_dir)
|
||||||
if "id" in manifest:
|
if "id" in manifest:
|
||||||
return int(manifest['id'])
|
return int(manifest['id'])
|
||||||
return int(
|
return int(
|
||||||
@ -151,7 +151,7 @@ class LibraryManager(BasePkgManager):
|
|||||||
if not _url:
|
if not _url:
|
||||||
_name = "id=%d" % self._get_pkg_id_by_name(
|
_name = "id=%d" % self._get_pkg_id_by_name(
|
||||||
_name, _requirements, silent=silent, interactive=interactive)
|
_name, _requirements, silent=silent, interactive=interactive)
|
||||||
already_installed = self.get_installed_dir(_name, _requirements, _url)
|
already_installed = self.get_package(_name, _requirements, _url)
|
||||||
pkg_dir = BasePkgManager.install(self, _name if not _url else name,
|
pkg_dir = BasePkgManager.install(self, _name if not _url else name,
|
||||||
_requirements, silent, trigger_event)
|
_requirements, silent, trigger_event)
|
||||||
|
|
||||||
|
@ -370,7 +370,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
|
|||||||
BasePkgManager._INSTALLED_CACHE[self.package_dir] = items
|
BasePkgManager._INSTALLED_CACHE[self.package_dir] = items
|
||||||
return items
|
return items
|
||||||
|
|
||||||
def get_installed_dir(self, name, requirements=None, url=None):
|
def get_package(self, name, requirements=None, url=None):
|
||||||
pkg_id = int(name[3:]) if name.startswith("id=") else 0
|
pkg_id = int(name[3:]) if name.startswith("id=") else 0
|
||||||
best = None
|
best = None
|
||||||
reqspec = None
|
reqspec = None
|
||||||
@ -406,19 +406,23 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
|
|||||||
# check that URL is the same in installed package (VCS)
|
# check that URL is the same in installed package (VCS)
|
||||||
if url and best.get("url") != url:
|
if url and best.get("url") != url:
|
||||||
return None
|
return None
|
||||||
return best.get("__pkg_dir")
|
return best
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def get_package_dir(self, name, requirements=None, url=None):
|
||||||
|
package = self.get_package(name, requirements, url)
|
||||||
|
return package.get("__pkg_dir") if package else None
|
||||||
|
|
||||||
def is_outdated(self, name, requirements=None):
|
def is_outdated(self, name, requirements=None):
|
||||||
installed_dir = self.get_installed_dir(name, requirements)
|
package_dir = self.get_package_dir(name, requirements)
|
||||||
if not installed_dir:
|
if not package_dir:
|
||||||
click.secho(
|
click.secho(
|
||||||
"%s @ %s is not installed" % (name, requirements or "*"),
|
"%s @ %s is not installed" % (name, requirements or "*"),
|
||||||
fg="yellow")
|
fg="yellow")
|
||||||
return
|
return
|
||||||
if self.get_vcs_manifest_path(installed_dir):
|
if self.get_vcs_manifest_path(package_dir):
|
||||||
return False
|
return False
|
||||||
manifest = self.load_manifest(installed_dir)
|
manifest = self.load_manifest(package_dir)
|
||||||
return manifest['version'] != self.get_latest_repo_version(
|
return manifest['version'] != self.get_latest_repo_version(
|
||||||
name, requirements)
|
name, requirements)
|
||||||
|
|
||||||
@ -429,20 +433,20 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
|
|||||||
trigger_event=True,
|
trigger_event=True,
|
||||||
interactive=False): # pylint: disable=unused-argument
|
interactive=False): # pylint: disable=unused-argument
|
||||||
name, requirements, url = self.parse_pkg_name(name, requirements)
|
name, requirements, url = self.parse_pkg_name(name, requirements)
|
||||||
installed_dir = self.get_installed_dir(name, requirements, url)
|
package_dir = self.get_package_dir(name, requirements, url)
|
||||||
|
|
||||||
if not installed_dir or not silent:
|
if not package_dir or not silent:
|
||||||
msg = "Installing " + click.style(name, fg="cyan")
|
msg = "Installing " + click.style(name, fg="cyan")
|
||||||
if requirements:
|
if requirements:
|
||||||
msg += " @ " + requirements
|
msg += " @ " + requirements
|
||||||
self.print_message(msg)
|
self.print_message(msg)
|
||||||
if installed_dir:
|
if package_dir:
|
||||||
if not silent:
|
if not silent:
|
||||||
click.secho(
|
click.secho(
|
||||||
"{name} @ {version} is already installed".format(
|
"{name} @ {version} is already installed".format(
|
||||||
**self.load_manifest(installed_dir)),
|
**self.load_manifest(package_dir)),
|
||||||
fg="yellow")
|
fg="yellow")
|
||||||
return installed_dir
|
return package_dir
|
||||||
|
|
||||||
if url:
|
if url:
|
||||||
pkg_dir = self._install_from_url(name, url, requirements)
|
pkg_dir = self._install_from_url(name, url, requirements)
|
||||||
@ -470,24 +474,24 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
|
|||||||
|
|
||||||
def uninstall(self, name, requirements=None, trigger_event=True):
|
def uninstall(self, name, requirements=None, trigger_event=True):
|
||||||
name, requirements, url = self.parse_pkg_name(name, requirements)
|
name, requirements, url = self.parse_pkg_name(name, requirements)
|
||||||
installed_dir = self.get_installed_dir(name, requirements, url)
|
package_dir = self.get_package_dir(name, requirements, url)
|
||||||
if not installed_dir:
|
if not package_dir:
|
||||||
click.secho(
|
click.secho(
|
||||||
"%s @ %s is not installed" % (name, requirements or "*"),
|
"%s @ %s is not installed" % (name, requirements or "*"),
|
||||||
fg="yellow")
|
fg="yellow")
|
||||||
return
|
return
|
||||||
|
|
||||||
manifest = self.load_manifest(installed_dir)
|
manifest = self.load_manifest(package_dir)
|
||||||
click.echo(
|
click.echo(
|
||||||
"Uninstalling %s @ %s: \t" % (click.style(
|
"Uninstalling %s @ %s: \t" % (click.style(
|
||||||
manifest['name'], fg="cyan"), manifest['version']),
|
manifest['name'], fg="cyan"), manifest['version']),
|
||||||
nl=False)
|
nl=False)
|
||||||
|
|
||||||
if isdir(installed_dir):
|
if isdir(package_dir):
|
||||||
if islink(installed_dir):
|
if islink(package_dir):
|
||||||
os.unlink(installed_dir)
|
os.unlink(package_dir)
|
||||||
else:
|
else:
|
||||||
util.rmtree_(installed_dir)
|
util.rmtree_(package_dir)
|
||||||
|
|
||||||
click.echo("[%s]" % click.style("OK", fg="green"))
|
click.echo("[%s]" % click.style("OK", fg="green"))
|
||||||
|
|
||||||
@ -501,19 +505,19 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
|
|||||||
|
|
||||||
def update(self, name, requirements=None, only_check=False):
|
def update(self, name, requirements=None, only_check=False):
|
||||||
name, requirements, url = self.parse_pkg_name(name, requirements)
|
name, requirements, url = self.parse_pkg_name(name, requirements)
|
||||||
installed_dir = self.get_installed_dir(name, requirements, url)
|
package_dir = self.get_package_dir(name, requirements, url)
|
||||||
if not installed_dir:
|
if not package_dir:
|
||||||
click.secho(
|
click.secho(
|
||||||
"%s @ %s is not installed" % (name, requirements or "*"),
|
"%s @ %s is not installed" % (name, requirements or "*"),
|
||||||
fg="yellow")
|
fg="yellow")
|
||||||
return
|
return
|
||||||
|
|
||||||
is_vcs_pkg = False
|
is_vcs_pkg = False
|
||||||
if self.get_vcs_manifest_path(installed_dir):
|
if self.get_vcs_manifest_path(package_dir):
|
||||||
is_vcs_pkg = True
|
is_vcs_pkg = True
|
||||||
manifest_path = self.get_vcs_manifest_path(installed_dir)
|
manifest_path = self.get_vcs_manifest_path(package_dir)
|
||||||
else:
|
else:
|
||||||
manifest_path = self.get_manifest_path(installed_dir)
|
manifest_path = self.get_manifest_path(package_dir)
|
||||||
|
|
||||||
manifest = self.load_manifest(manifest_path)
|
manifest = self.load_manifest(manifest_path)
|
||||||
click.echo(
|
click.echo(
|
||||||
@ -527,7 +531,7 @@ class BasePkgManager(PkgRepoMixin, PkgInstallerMixin):
|
|||||||
click.echo("[%s]" % (click.style("Skip", fg="yellow")))
|
click.echo("[%s]" % (click.style("Skip", fg="yellow")))
|
||||||
return
|
return
|
||||||
click.echo("[%s]" % (click.style("VCS", fg="yellow")))
|
click.echo("[%s]" % (click.style("VCS", fg="yellow")))
|
||||||
vcs = VCSClientFactory.newClient(installed_dir, manifest['url'])
|
vcs = VCSClientFactory.newClient(package_dir, manifest['url'])
|
||||||
if not vcs.can_be_updated:
|
if not vcs.can_be_updated:
|
||||||
click.secho(
|
click.secho(
|
||||||
"Skip update because repository is fixed "
|
"Skip update because repository is fixed "
|
||||||
|
@ -144,8 +144,8 @@ class PlatformFactory(object):
|
|||||||
else:
|
else:
|
||||||
if not requirements and "@" in name:
|
if not requirements and "@" in name:
|
||||||
name, requirements = name.rsplit("@", 1)
|
name, requirements = name.rsplit("@", 1)
|
||||||
platform_dir = PlatformManager().get_installed_dir(name,
|
platform_dir = PlatformManager().get_package_dir(name,
|
||||||
requirements)
|
requirements)
|
||||||
|
|
||||||
if not platform_dir:
|
if not platform_dir:
|
||||||
raise exception.UnknownPlatform(name if not requirements else
|
raise exception.UnknownPlatform(name if not requirements else
|
||||||
@ -167,30 +167,6 @@ class PlatformFactory(object):
|
|||||||
|
|
||||||
class PlatformPackagesMixin(object):
|
class PlatformPackagesMixin(object):
|
||||||
|
|
||||||
def get_installed_packages(self):
|
|
||||||
items = {}
|
|
||||||
installed = self.pm.get_installed()
|
|
||||||
for name, opts in self.packages.items():
|
|
||||||
manifest = None
|
|
||||||
reqspec = None
|
|
||||||
try:
|
|
||||||
reqspec = semantic_version.Spec(opts['version'])
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
for p in installed:
|
|
||||||
if p['name'] != name:
|
|
||||||
continue
|
|
||||||
if reqspec and not reqspec.match(
|
|
||||||
semantic_version.Version(p['version'])):
|
|
||||||
continue
|
|
||||||
elif (not manifest or semantic_version.compare(
|
|
||||||
p['version'], manifest['version']) == 1):
|
|
||||||
manifest = p
|
|
||||||
if manifest:
|
|
||||||
items[name] = manifest
|
|
||||||
return items
|
|
||||||
|
|
||||||
def install_packages(self,
|
def install_packages(self,
|
||||||
with_packages=None,
|
with_packages=None,
|
||||||
without_packages=None,
|
without_packages=None,
|
||||||
@ -217,6 +193,14 @@ class PlatformPackagesMixin(object):
|
|||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def get_installed_packages(self):
|
||||||
|
items = {}
|
||||||
|
for name, opts in self.packages.items():
|
||||||
|
package = self.pm.get_package(name, opts['version'])
|
||||||
|
if package:
|
||||||
|
items[name] = package
|
||||||
|
return items
|
||||||
|
|
||||||
def update_packages(self, only_check=False):
|
def update_packages(self, only_check=False):
|
||||||
for name in self.get_installed_packages():
|
for name in self.get_installed_packages():
|
||||||
self.pm.update(name, self.packages[name]['version'], only_check)
|
self.pm.update(name, self.packages[name]['version'], only_check)
|
||||||
@ -228,6 +212,14 @@ class PlatformPackagesMixin(object):
|
|||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def get_package_dir(self, name):
|
||||||
|
return self.pm.get_package_dir(name,
|
||||||
|
self.packages[name].get("version"))
|
||||||
|
|
||||||
|
def get_package_version(self, name):
|
||||||
|
package = self.pm.get_package(name, self.packages[name].get("version"))
|
||||||
|
return package['version'] if package else None
|
||||||
|
|
||||||
|
|
||||||
class PlatformRunMixin(object):
|
class PlatformRunMixin(object):
|
||||||
|
|
||||||
@ -417,18 +409,6 @@ class PlatformBase(PlatformPackagesMixin, PlatformRunMixin):
|
|||||||
def board_config(self, id_):
|
def board_config(self, id_):
|
||||||
return self.get_boards(id_)
|
return self.get_boards(id_)
|
||||||
|
|
||||||
def get_package_dir(self, name):
|
|
||||||
packages = self.get_installed_packages()
|
|
||||||
if name not in packages:
|
|
||||||
return None
|
|
||||||
return packages[name]['__pkg_dir']
|
|
||||||
|
|
||||||
def get_package_version(self, name):
|
|
||||||
packages = self.get_installed_packages()
|
|
||||||
if name not in packages:
|
|
||||||
return None
|
|
||||||
return packages[name]['version']
|
|
||||||
|
|
||||||
def get_package_type(self, name):
|
def get_package_type(self, name):
|
||||||
return self.packages[name].get("type")
|
return self.packages[name].get("type")
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user