From 0dce3a8cbe5c1c26c26530a3879f0c2d2d50f9af Mon Sep 17 00:00:00 2001 From: eXhumer <62310242+eXhumer@users.noreply.github.com> Date: Thu, 15 Feb 2024 04:17:26 +0000 Subject: [PATCH] Get plugin name for development ZIP during installation (#578) * fix: get plugin name for dev builds from ZIP (SteamDeckHomebrew/decky-loader#527) Signed-off-by: eXhumer --- backend/src/browser.py | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/backend/src/browser.py b/backend/src/browser.py index 966206671..5ce3e9628 100644 --- a/backend/src/browser.py +++ b/backend/src/browser.py @@ -10,6 +10,7 @@ from io import BytesIO from logging import getLogger from os import R_OK, W_OK, path, listdir, access, mkdir +from re import sub from shutil import rmtree from time import time from zipfile import ZipFile @@ -162,12 +163,6 @@ async def _install(self, artifact: str, name: str, version: str, hash: str): current_plugin_order = self.settings.getSetting("pluginOrder")[:] if self.loader.watcher: self.loader.watcher.disabled = True - try: - pluginFolderPath = self.find_plugin_folder(name) - if pluginFolderPath: - isInstalled = True - except: - logger.error(f"Failed to determine if {name} is already installed, continuing anyway.") # Check if the file is a local file or a URL if artifact.startswith("file://"): @@ -198,6 +193,28 @@ async def _install(self, artifact: str, name: str, version: str, hash: str): if res.status != 200: logger.error(f"Server did not accept install count increment request. code: {res.status}") + if res_zip and version == "dev": + with ZipFile(res_zip) as plugin_zip: + plugin_json_list = [file for file in plugin_zip.namelist() if file.endswith("/plugin.json") and file.count("/") == 1] + + if len(plugin_json_list) == 0: + logger.fatal("No plugin.json found in plugin ZIP") + return + + elif len(plugin_json_list) > 1: + logger.fatal("Multiple plugin.json found in plugin ZIP") + return + + else: + name = sub(r"/.+$", "", plugin_json_list[0]) + + try: + pluginFolderPath = self.find_plugin_folder(name) + if pluginFolderPath: + isInstalled = True + except: + logger.error(f"Failed to determine if {name} is already installed, continuing anyway.") + # Check to make sure we got the file if res_zip is None: logger.fatal(f"Could not fetch {artifact}")