3
0
Files
Repository/scripts/update_plugins_xml.py

107 lines
3.6 KiB
Python
Raw Normal View History

2026-03-02 07:47:24 +01:00
#!/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)