From 0f7062b0c415a9438e08a6bd67dc3d299a02974e Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 24 Apr 2026 14:18:45 +0000 Subject: [PATCH] =?UTF-8?q?fix(release-plugin):=20Regex=20=E2=80=94=20.*?= =?UTF-8?q?=20greedy=20mit=20DOTALL=20schluckt=20bis=20EOF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mit re.DOTALL matcht .* auch Newlines. Kombination mit (?:\s+.*)?$\n führte dazu, dass die erste Version-Zeile bis zum Dateiende gefressen wurde und Capture-Group leer blieb (0 Zeichen). Fix: .* durch [^\n]* ersetzen, damit erste Zeile genau auf eine Zeile begrenzt ist. Gilt für beide Changelog-Parser (Block-Extraktion und entry_pat in readme.txt-Generator). --- .gitea/workflows/release-plugin.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/.gitea/workflows/release-plugin.yml b/.gitea/workflows/release-plugin.yml index e21af46..c91a47b 100644 --- a/.gitea/workflows/release-plugin.yml +++ b/.gitea/workflows/release-plugin.yml @@ -168,10 +168,11 @@ jobs: version = os.environ["VERSION"] with open("CHANGELOG.md", encoding="utf-8") as f: content = f.read() - # "## v" optional gefolgt von " — Datum" und beliebigem Suffix, - # Inhalt bis zum nächsten "## v" oder einer "---"-Trennzeile oder EOF. + # "## v" gefolgt von beliebigem Rest der Zeile (auch "— Datum"), + # Inhalt ab nächster Zeile bis zum nächsten "## v" oder "---" oder EOF. + # [^\n]* statt .*, damit die erste Zeile nicht mit DOTALL bis EOF gefressen wird. pat = re.compile( - r"^##\s+v" + re.escape(version) + r"(?:\s+.*)?$\n(.*?)(?=^##\s+v\d|^---\s*$|\Z)", + r"^##\s+v" + re.escape(version) + r"[^\n]*\n(.*?)(?=^##\s+v\d|^---\s*$|\Z)", re.MULTILINE | re.DOTALL, ) m = pat.search(content) @@ -229,9 +230,10 @@ jobs: readme_path = pathlib.Path(sys.argv[1]) changelog_path = pathlib.Path(sys.argv[2]) - # CHANGELOG.md parsen: Einträge "## v" bis zum nächsten "## v…" oder "---" oder EOF + # CHANGELOG.md parsen: Einträge "## v" bis zum nächsten "## v…" oder "---" oder EOF. + # [^\n]* für die erste Zeile, damit DOTALL nicht greedy über Zeilen frisst. entry_pat = re.compile( - r"^##\s+v(\d+\.\d+\.\d+)(?:\s+—\s+(\S+))?(?:\s+.*)?$\n(.*?)(?=^##\s+v\d|^---\s*$|\Z)", + r"^##\s+v(\d+\.\d+\.\d+)(?:\s+—\s+(\S+))?[^\n]*\n(.*?)(?=^##\s+v\d|^---\s*$|\Z)", re.MULTILINE | re.DOTALL, ) content = changelog_path.read_text(encoding="utf-8")