From 214d31228f16f39b1ad36b428a00d8da3e87df7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Sat, 23 Apr 2022 12:13:15 +0200 Subject: [PATCH] [core] Allow installation of packages without manifest --- platform.json | 5 +++- platform.py | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/platform.json b/platform.json index b4dbe82..b847e06 100644 --- a/platform.json +++ b/platform.json @@ -23,7 +23,10 @@ "framework-realtek-amb1": { "type": "framework", "optional": true, - "version": "https://github.com/kuba2k2/amb1_sdk" + "version": "https://github.com/ambiot/amb1_sdk", + "manifest": { + "description": "SDK for Ameba1" + } }, "toolchain-gccarmnoneeabi": { "type": "toolchain", diff --git a/platform.py b/platform.py index 1f4328b..36ceb67 100644 --- a/platform.py +++ b/platform.py @@ -1,9 +1,80 @@ from platformio.managers.platform import PlatformBase +from platformio.package.exception import MissingPackageManifestError +from platformio.package.manager.base import BasePackageManager +from platformio.package.meta import PackageItem, PackageSpec + +libretuya_packages = None +manifest_default = {"version": "0.0.0", "description": "", "keywords": []} + + +def load_manifest(self, src): + try: + return BasePackageManager._load_manifest(self, src) + except MissingPackageManifestError: + # ignore all exceptions + pass + # get the installation temporary path + path = src.path if isinstance(src, PackageItem) else src + # raise the exception if this package is not from libretuya + if ( + not hasattr(self, "spec_map") + or path not in self.spec_map + or not libretuya_packages + ): + raise MissingPackageManifestError(", ".join(self.manifest_names)) + # get the saved spec + spec: PackageSpec = self.spec_map[path] + # read package data from platform.json + manifest: dict = libretuya_packages[spec.name] + # find additional manifest info + manifest = manifest.get("manifest", manifest_default) + # put info from spec + manifest.update( + { + "name": spec.name, + "repository": { + "type": "git", + "url": spec.url, + }, + } + ) + # save in cache + cache_key = "load_manifest-%s" % path + self.memcache_set(cache_key, manifest) + # result = ManifestParserFactory.new(json.dumps(manifest), ManifestFileType.PACKAGE_JSON).as_dict() + return manifest + + +def find_pkg_root(self, path: str, spec: PackageSpec): + try: + return BasePackageManager._find_pkg_root(self, path, spec) + except MissingPackageManifestError as e: + # raise the exception if this package is not from libretuya + if not libretuya_packages or spec.name not in libretuya_packages: + raise e + # save the spec for later + if not hasattr(self, "spec_map"): + self.spec_map = {} + self.spec_map[path] = spec + return path class LibretuyaPlatform(PlatformBase): def configure_default_packages(self, options, targets): framework = options.get("pioframework")[0] + # patch find_pkg root to ignore missing manifests and save PackageSpec + BasePackageManager._find_pkg_root = BasePackageManager.find_pkg_root + BasePackageManager.find_pkg_root = find_pkg_root + # patch load_manifest to generate manifests from PackageSpec + BasePackageManager._load_manifest = BasePackageManager.load_manifest + BasePackageManager.load_manifest = load_manifest + + # set specific compiler versions if framework.startswith("realtek-ambz"): self.packages["toolchain-gccarmnoneeabi"]["version"] = "~1.50401.0" + + # save platform packages for later + global libretuya_packages + libretuya_packages = self.packages + return super().configure_default_packages(options, targets)