Erste von claude.ai erstellte Version
This commit is contained in:
107
scripts/update_plugins_xml.py
Normal file
107
scripts/update_plugins_xml.py
Normal file
@@ -0,0 +1,107 @@
|
||||
#!/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)
|
||||
Reference in New Issue
Block a user