Files
platformio-core/platformio/pkgmanager.py

151 lines
4.6 KiB
Python
Raw Normal View History

# Copyright (C) Ivan Kravets <me@ikravets.com>
# See LICENSE for details.
from os import makedirs, remove
2014-11-22 23:55:17 +02:00
from os.path import isdir, join
from shutil import rmtree
2014-11-22 23:55:17 +02:00
from time import time
2014-12-03 20:16:50 +02:00
import click
2014-12-03 20:16:50 +02:00
from platformio import exception, telemetry
2014-11-29 22:39:44 +02:00
from platformio.app import get_state_item, set_state_item
from platformio.downloader import FileDownloader
from platformio.unpacker import FileUnpacker
2014-11-29 22:39:44 +02:00
from platformio.util import get_api_result, get_home_dir, get_systype
class PackageManager(object):
2014-11-22 23:55:17 +02:00
def __init__(self):
self._package_dir = join(get_home_dir(), "packages")
if not isdir(self._package_dir):
makedirs(self._package_dir)
assert isdir(self._package_dir)
@classmethod
def get_manifest(cls):
try:
return cls._cached_manifest
except AttributeError:
cls._cached_manifest = get_api_result("/packages")
return cls._cached_manifest
@staticmethod
def download(url, dest_dir, sha1=None):
fd = FileDownloader(url, dest_dir)
fd.start()
fd.verify(sha1)
return fd.get_filepath()
@staticmethod
def unpack(pkgpath, dest_dir):
fu = FileUnpacker(pkgpath, dest_dir)
return fu.start()
@staticmethod
2014-11-22 23:55:17 +02:00
def get_installed():
2014-11-29 22:39:44 +02:00
return get_state_item("installed_packages", {})
def get_outdated(self):
outdated = []
for name, data in self.get_installed().items():
if data['version'] != self.get_info(name)['version']:
outdated.append(name)
return outdated
def is_installed(self, name):
2014-11-22 23:55:17 +02:00
return name in self.get_installed()
def get_info(self, name, version=None):
manifest = self.get_manifest()
if name not in manifest:
2014-12-03 20:16:50 +02:00
raise exception.UnknownPackage(name)
# check system platform
2014-07-31 16:20:31 +03:00
systype = get_systype()
builds = ([b for b in manifest[name] if b['system'] == "all" or systype
in b['system']])
if not builds:
2014-12-03 20:16:50 +02:00
raise exception.NonSystemPackage(name, systype)
if version:
for b in builds:
if b['version'] == version:
return b
2014-12-03 20:16:50 +02:00
raise exception.InvalidPackageVersion(name, version)
else:
return sorted(builds, key=lambda s: s['version'])[-1]
2014-11-22 23:55:17 +02:00
def install(self, name):
2014-12-03 20:16:50 +02:00
click.echo("Installing %s package:" % click.style(name, fg="cyan"))
if self.is_installed(name):
2014-12-03 20:16:50 +02:00
click.secho("Already installed", fg="yellow")
2014-11-22 23:55:17 +02:00
return False
info = self.get_info(name)
2014-11-22 23:55:17 +02:00
pkg_dir = join(self._package_dir, name)
if not isdir(pkg_dir):
makedirs(pkg_dir)
dlpath = self.download(info['url'], pkg_dir, info['sha1'])
if self.unpack(dlpath, pkg_dir):
2014-11-22 23:55:17 +02:00
self._register(name, info['version'])
# remove archive
remove(dlpath)
2014-11-29 22:48:15 +02:00
telemetry.on_event(
category="PackageManager", action="Install", label=name)
2014-11-22 23:55:17 +02:00
def uninstall(self, name):
2014-12-03 20:16:50 +02:00
click.echo("Uninstalling %s package: \t" %
click.style(name, fg="cyan"), nl=False)
2014-11-22 23:55:17 +02:00
if not self.is_installed(name):
2014-12-03 20:16:50 +02:00
click.secho("Not installed", fg="yellow")
2014-11-22 23:55:17 +02:00
return False
rmtree(join(self._package_dir, name))
self._unregister(name)
2014-12-03 20:16:50 +02:00
click.echo("[%s]" % click.style("OK", fg="green"))
2014-11-29 22:48:15 +02:00
# report usage
telemetry.on_event(
category="PackageManager", action="Uninstall", label=name)
def update(self, name):
2014-12-03 20:16:50 +02:00
click.echo("Updating %s package:" % click.style(name, fg="yellow"))
2014-11-22 23:55:17 +02:00
installed = self.get_installed()
current_version = installed[name]['version']
latest_version = self.get_info(name)['version']
2014-12-03 20:16:50 +02:00
click.echo("Versions: Current=%d, Latest=%d \t " % (
current_version, latest_version), nl=False)
if current_version == latest_version:
2014-12-03 20:16:50 +02:00
click.echo("[%s]" % (click.style("Up-to-date", fg="green")))
return True
else:
2014-12-03 20:16:50 +02:00
click.echo("[%s]" % (click.style("Out-of-date", fg="red")))
2014-11-22 23:55:17 +02:00
self.uninstall(name)
self.install(name)
2014-11-29 22:48:15 +02:00
telemetry.on_event(
category="PackageManager", action="Update", label=name)
2014-11-22 23:55:17 +02:00
def _register(self, name, version):
data = self.get_installed()
2014-11-22 23:55:17 +02:00
data[name] = {
"version": version,
"time": int(time())
}
set_state_item("installed_packages", data)
def _unregister(self, name):
data = self.get_installed()
2014-11-22 23:55:17 +02:00
del data[name]
set_state_item("installed_packages", data)