#!/usr/bin/env python3 """Aktualisiert die passende plugins.xml anhand des Channels.""" import argparse import os import sys import zipfile import io import configparser import requests from lxml import etree from pathlib import Path CHANNEL_FILES = { "stable": "plugins.xml", "beta": "plugins-beta.xml", "dev": "plugins-dev.xml", } def fetch_metadata_from_zip(download_url: str, token: str) -> dict: """Lädt die ZIP und extrahiert metadata.txt.""" headers = {"Authorization": f"token {token}"} print(f"→ Lade ZIP von {download_url}") response = requests.get(download_url, headers=headers) response.raise_for_status() with zipfile.ZipFile(io.BytesIO(response.content)) as z: meta_path = next( (n for n in z.namelist() if n.endswith("metadata.txt")), None ) if not meta_path: print("FEHLER: metadata.txt nicht in ZIP gefunden!", file=sys.stderr) sys.exit(1) meta_content = z.read(meta_path).decode("utf-8") return parse_metadata(meta_content) def parse_metadata(content: str) -> dict: cfg = configparser.ConfigParser() cfg.read_string("[plugin]\n" + content) p = cfg["plugin"] return { "name": p.get("name", ""), "qgisMinimumVersion": p.get("qgisminimumversion", "3.0"), "qgisMaximumVersion": p.get("qgismaximumversion", "3.99"), "description": p.get("description", ""), "version": p.get("version", ""), "author": p.get("author", ""), "email": p.get("email", ""), "homepage": p.get("homepage", ""), "tracker": p.get("tracker", ""), "repository": p.get("repository", ""), "experimental": p.get("experimental", "False"), "deprecated": p.get("deprecated", "False"), } def update_xml(xml_file: str, metadata: dict, download_url: str): xml_path = Path(xml_file) if xml_path.exists(): tree = etree.parse(xml_path) root = tree.getroot() else: root = etree.Element("plugins") tree = etree.ElementTree(root) # Bestehenden Eintrag gleichen Namens entfernen plugin_name = metadata["name"] for old in root.findall(f"pyqgis_plugin[@name='{plugin_name}']"): root.remove(old) # Neuen Eintrag anlegen el = etree.SubElement(root, "pyqgis_plugin", name=plugin_name, version=metadata["version"]) field_order = [ "qgisMinimumVersion", "qgisMaximumVersion", "description", "author", "email", "homepage", "tracker", "repository", "download_url", "experimental", "deprecated", ] for key in field_order: child = etree.SubElement(el, key) child.text = metadata.get(key, "") if key != "download_url" else download_url etree.indent(tree, space=" ") tree.write(xml_path, xml_declaration=True, encoding="UTF-8", pretty_print=True) print(f"✓ {xml_file} aktualisiert: {plugin_name} {metadata['version']}") if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--plugin", required=True) parser.add_argument("--version", required=True) parser.add_argument("--channel", required=True, choices=["stable", "beta", "dev"]) parser.add_argument("--download-url", required=True) args = parser.parse_args() token = os.environ.get("GITEA_TOKEN", "") metadata = fetch_metadata_from_zip(args.download_url, token) xml_file = CHANNEL_FILES[args.channel] update_xml(xml_file, metadata, args.download_url)