diff --git a/common/package.py b/common/package.py index 09201487..d3f8faa6 100644 --- a/common/package.py +++ b/common/package.py @@ -28,6 +28,7 @@ import json import os import shutil +from pathlib import Path from typing import Callable import jsonschema @@ -175,7 +176,10 @@ def versions(self, kind: str, name: str) -> list[str]: return list(self.__data.get(kind, {}).get(name, {}).keys()) def path(self, kind: str, name: str, version: str) -> str: - return self.__data.get(kind, {}).get(name, {}).get(version, "") + path = Path(self.__data.get(kind, {}).get(name, {}).get(version, "")) + if path.is_absolute(): + return str(path) + return str((SETTINGS.EXE_FOLDER / path).resolve()) class Package(QObject): @@ -343,7 +347,7 @@ def install(self, path: str, callback: Callable[[str, float], None]) -> bool: self.__index.origin.setdefault(kind, {}).setdefault(name, {})[version] = os.path.relpath(folder, SETTINGS.EXE_FOLDER) self.save() - self.installed.emit(kind, name, version, folder) + self.installed.emit(kind, name, version, self.__index.path(kind, name, version)) return True @@ -355,7 +359,7 @@ def uninstall(self, kind: str, name: str, version: str) -> bool: elif os.path.isfile(path): os.remove(path) else: - logger.error(f"uninstall failed {kind}@{name}-{version}") + logger.error(f"uninstall failed {kind}@{name}:{version}") return False # clear index tree self.__index.origin[kind][name].pop(version) @@ -364,7 +368,7 @@ def uninstall(self, kind: str, name: str, version: str) -> bool: if len(self.__index.origin[kind]) == 0: self.__index.origin.pop(kind) self.save() - self.installed.emit(kind, name, version, path) + self.uninstalled.emit(kind, name, version, path) return True @@ -415,11 +419,14 @@ def __init__(self, progress: bool, verbose: bool, parent=None): def install(self, path: str) -> bool: return PACKAGE.install(path, self.__package_install_callback) + def uninstall(self, kind: str, name: str, version: str) -> bool: + return PACKAGE.uninstall(kind, name, version) + def __on_x_installed(self, kind: str, name: str, version: str, path: str): - print(f"successfully installed the package ‘{kind}@{name}-{version}’ to: {path!r}") + print(f"successfully installed the package ‘{kind}@{name}:{version}’ to: {path!r}") def __on_x_uninstalled(self, kind: str, name: str, version: str, path: str): - print(f"successfully uninstalled the package ‘{kind}@{name}-{version}’ from: {path!r}") + print(f"successfully uninstalled the package ‘{kind}@{name}:{version}’ from: {path!r}") def __package_install_callback(self, file: str, progress: float): if self.progress: diff --git a/csp.py b/csp.py index e759de54..c532de9a 100644 --- a/csp.py +++ b/csp.py @@ -47,7 +47,7 @@ sys.stdout = stdout -from common import SETTINGS, PROJECT, CoderCmd, PackageCmd +from common import SETTINGS, PROJECT, CoderCmd, PackageCmd, PACKAGE from window import MainWindow, StartupWindow, NewProjectWindow @@ -131,7 +131,7 @@ def handleStartup(args: argparse.Namespace, parser: argparse.ArgumentParser, app # noinspection PyUnusedLocal def handleMain(args: argparse.Namespace, parser: argparse.ArgumentParser, app: QApplication): - file = args.file + file: str = args.file __setProject(file) __initQtEnv(app) window = MainWindow() @@ -142,9 +142,9 @@ def handleMain(args: argparse.Namespace, parser: argparse.ArgumentParser, app: Q # noinspection PyUnusedLocal def handleGen(args: argparse.Namespace, parser: argparse.ArgumentParser, app: QApplication): - file = args.file - progress = args.progress - output = args.output + file: str = args.file + progress: bool = args.progress + output: str = args.output __setProject(file) if not PROJECT.isGenerateSettingValid(): @@ -157,9 +157,9 @@ def handleGen(args: argparse.Namespace, parser: argparse.ArgumentParser, app: QA # noinspection PyUnusedLocal def handleInstall(args: argparse.Namespace, parser: argparse.ArgumentParser, app: QApplication): - path = args.path - progress = args.progress - verbose = args.verbose + path: str = args.path + progress: bool = args.progress + verbose: bool = args.verbose if not os.path.exists(path): print(f'The path {path!r} is not exist.') @@ -171,6 +171,33 @@ def handleInstall(args: argparse.Namespace, parser: argparse.ArgumentParser, app sys.exit(1) +# noinspection PyUnusedLocal +def handleUninstall(args: argparse.Namespace, parser: argparse.ArgumentParser, app: QApplication): + kind: str = args.type + name: str = args.name + version: str = args.version + + path = PACKAGE.index().path(kind, name, version) + if not os.path.exists(path): + print(f"uninstall failed {kind}@{name}:{version}") + sys.exit(1) + + cmd = PackageCmd(False, False) + if not cmd.uninstall(kind, name, version): + print(f'uninstall failed. Please check it.') + sys.exit(1) + + +# noinspection PyUnusedLocal +def handleList(args: argparse.Namespace, parser: argparse.ArgumentParser, app: QApplication): + for kind, package in PACKAGE.index().origin.items(): + print(f'{kind}:') + for name, info in package.items(): + print(f' {name}:') + for version, path in info.items(): + print(f' {version}: {PACKAGE.index().path(kind, name, version)}') + + def createParser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description='a fully open source chip configuration software system', formatter_class=argparse.RawDescriptionHelpFormatter) @@ -192,6 +219,15 @@ def createParser() -> argparse.ArgumentParser: install.add_argument('--verbose', required=False, help='enable verbose information for users.', action='store_true') install.set_defaults(func=handleInstall) + uninstall = subparsers.add_parser('uninstall', help='uninstall csp package') + uninstall.add_argument('-t', '--type', required=True, help='csp package type') + uninstall.add_argument('-n', '--name', required=True, help='csp package name') + uninstall.add_argument('-v', '--version', required=True, help='csp package version') + uninstall.set_defaults(func=handleUninstall) + + list_ = subparsers.add_parser('list', help='list csp package') + list_.set_defaults(func=handleList) + parser.add_argument('-f', '--file', required=False, help='csp project file') parser.add_argument('-v', '--version', required=False, help='print the version number', action='store_true')