import fsspec import logging import requests import shutil import subprocess import tempfile from django.core.management.base import BaseCommand from django.conf import settings from pathlib import Path from urllib.parse import urlparse class Command(BaseCommand): help = "Downloads a new app version" def add_arguments(self, parser): parser.add_argument("version", type=str) def handle(self, *args, **options): version = options["version"] target = f"{settings.APP_DIST_STORAGE}/{version}" fs = fsspec.filesystem(urlparse(settings.APP_DIST_STORAGE).scheme) plugin_list = [ "tabby-web-container", "tabby-core", "tabby-settings", "tabby-terminal", "tabby-ssh", "tabby-community-color-schemes", "tabby-serial", "tabby-telnet", "tabby-web", "tabby-web-demo", ] with tempfile.TemporaryDirectory() as tempdir: tempdir = Path(tempdir) for plugin in plugin_list: logging.info(f"Resolving {plugin}@{version}") response = requests.get(f"{settings.NPM_REGISTRY}/{plugin}/{version}") response.raise_for_status() info = response.json() url = info["dist"]["tarball"] logging.info(f"Downloading {plugin}@{version} from {url}") response = requests.get(url) with tempfile.NamedTemporaryFile("wb") as f: f.write(response.content) f.flush() plugin_final_target = Path(tempdir) / plugin with tempfile.TemporaryDirectory() as extraction_tmp: subprocess.check_call( ["tar", "-xzf", f.name, "-C", str(extraction_tmp)] ) shutil.move( Path(extraction_tmp) / "package", plugin_final_target ) if fs.exists(target): fs.rm(target, recursive=True) fs.mkdir(target) fs.put(str(tempdir), target, recursive=True)