From 0ada9d32fb4f83cd73400148590c7282ad304d56 Mon Sep 17 00:00:00 2001 From: sisungo Date: Mon, 17 Aug 2026 17:43:54 +0800 Subject: [PATCH] feat: add support of zip source archives Signed-off-by: sisungo --- lib/sources.py | 52 ++++++++++++++++++++++++++++++++++++++++---------- x.py | 1 + 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lib/sources.py b/lib/sources.py index c643024..3748bdc 100644 --- a/lib/sources.py +++ b/lib/sources.py @@ -4,6 +4,7 @@ import sys import tarfile import urllib.parse import urllib.request +import zipfile def filename(url): @@ -128,6 +129,25 @@ def tar_common_root(tar: tarfile.TarFile) -> str | None: return root +def zip_common_root(zip_file: zipfile.ZipFile) -> str | None: + members = zip_file.infolist() + if not members: + return None + root = None + for member in members: + path = member.filename.replace('\\', '/').lstrip('./').lstrip('/') + if not path: + continue + this_root = path.split('/')[0] + if this_root in ('', '.', '..'): + continue + if root is None: + root = this_root + elif this_root != root: + return None + return root + + def sources_dir_name() -> str: with open("./target/sources.tag") as file: return file.read() @@ -139,16 +159,28 @@ def source_url(url: str): download_path = f"./target/{filename(url)}" download(url, download_path) - with tarfile.open(download_path, "r") as tar: - common_root = tar_common_root(tar) - extract_dir = "./target" - sources_dir = f"./target/{common_root}" - if common_root in ["", ".", "None"]: - extract_dir = "./target/sources" - sources_dir = "./target/sources" - tar.extractall(extract_dir) - with open("./target/sources.tag", "wt+") as file: - file.write(sources_dir) + if download_path.endswith(".zip"): + with zipfile.ZipFile(download_path, "r") as zip: + common_root = zip_common_root(zip) + else: + with tarfile.open(download_path, "r") as tar: + common_root = tar_common_root(tar) + + extract_dir = "./target" + sources_dir = f"./target/{common_root}" + if common_root in ["", ".", None]: + extract_dir = "./target/sources" + sources_dir = "./target/sources" + + if download_path.endswith(".zip"): + with zipfile.ZipFile(download_path, "r") as zip: + zip.extractall(extract_dir) + else: + with tarfile.open(download_path, "r") as tar: + tar.extractall(extract_dir) + + with open("./target/sources.tag", "wt+") as file: + file.write(sources_dir) def _git_repo_name(url: str) -> str: diff --git a/x.py b/x.py index f178d2f..2dd8a99 100644 --- a/x.py +++ b/x.py @@ -119,6 +119,7 @@ def cmd_build_package(package: str): "version": pkgver, "arch": pkgarch, "description": pkginfo[lib.make._key_description], + "maintainers": pkginfo[lib.make._key_maintainers], "dependencies": pkginfo[lib.make._key_dependencies], "provides": pkginfo[lib.make._key_provides], "recommendations": pkginfo[lib.make._key_recommendations],