From 0ffa3686765b8fe00c7cb283849fca1b585939f0 Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Mon, 21 Sep 2026 18:00:24 -0300 Subject: [PATCH 1/3] fix: preserve SPDX headers in generated release history --- scripts/sync_release_history.py | 9 ++++++++- tests/test_sync_release_history.py | 2 ++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/sync_release_history.py b/scripts/sync_release_history.py index 88b345c..ed806a4 100755 --- a/scripts/sync_release_history.py +++ b/scripts/sync_release_history.py @@ -13,6 +13,11 @@ HEADING_RE = re.compile(r"^(#{2,3})\s+(.+?)\s*$") LINK_RE = re.compile(r"\[([^\]]+)\]\((https?://[^)]+)\)") CODE_RE = re.compile(r"`([^`]+)`") +RST_HEADER = [ + ".. SPDX-FileCopyrightText: 2026 LibreCode coop and contributors", + ".. SPDX-License-Identifier: AGPL-3.0-or-later", + "", +] def load_json(path: Path) -> dict[str, object]: @@ -33,7 +38,7 @@ def markdown_section_to_rst(section: str, version: str) -> str: if not lines: raise ValueError("changelog section must not be empty") - output: list[str] = [] + output: list[str] = [*RST_HEADER, ".. This file is generated from LibreSign/libresign release history.", ""] first_heading_seen = False for raw in lines: match = HEADING_RE.match(raw) @@ -85,6 +90,7 @@ def render_major_index(major: int, versions: list[str]) -> str: ordered = sorted(versions, key=version_key, reverse=True) title = f"LibreSign {major}" body = [ + *RST_HEADER, ".. This file is generated from LibreSign release history. Do not edit release text here manually.", "", title, @@ -101,6 +107,7 @@ def render_major_index(major: int, versions: list[str]) -> str: def render_root_index(majors: list[int]) -> str: title = "Release history" body = [ + *RST_HEADER, ".. This file is generated. Release text is sourced from LibreSign/libresign per-major changelogs.", "", title, diff --git a/tests/test_sync_release_history.py b/tests/test_sync_release_history.py index 9590a0c..fd6c4ba 100644 --- a/tests/test_sync_release_history.py +++ b/tests/test_sync_release_history.py @@ -25,6 +25,7 @@ def test_markdown_release_section_becomes_browsable_rst(self) -> None: self.assertIn("15.1.0 - 2026-09-21", rendered) self.assertIn("Added\n-----", rendered) self.assertIn("`#10 `_", rendered) + self.assertIn("SPDX-License-Identifier: AGPL-3.0-or-later", rendered) def test_synchronization_requires_successful_matching_publication(self) -> None: with tempfile.TemporaryDirectory() as directory: @@ -67,6 +68,7 @@ def test_synchronization_is_idempotent_and_indexes_major(self) -> None: self.assertEqual(first, second) self.assertIn("15.1.0", (docs / "developer_manual/release-history/15/index.rst").read_text(encoding="utf-8")) self.assertIn("LibreSign 15 <15/index>", (docs / "developer_manual/release-history/index.rst").read_text(encoding="utf-8")) + self.assertIn("SPDX-License-Identifier: AGPL-3.0-or-later", (docs / "developer_manual/release-history/15/index.rst").read_text(encoding="utf-8")) def test_versions_sort_semantically(self) -> None: versions = ["15.9.0", "15.10.0", "15.10.0-rc.1", "15.2.4"] From f6fe7fd2cbf53e1e0f96c2436304e702d863b58d Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Mon, 21 Sep 2026 18:01:15 -0300 Subject: [PATCH 2/3] fix: avoid REUSE parsing generated SPDX marker --- scripts/sync_release_history.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sync_release_history.py b/scripts/sync_release_history.py index ed806a4..5072ea1 100755 --- a/scripts/sync_release_history.py +++ b/scripts/sync_release_history.py @@ -15,7 +15,7 @@ CODE_RE = re.compile(r"`([^`]+)`") RST_HEADER = [ ".. SPDX-FileCopyrightText: 2026 LibreCode coop and contributors", - ".. SPDX-License-Identifier: AGPL-3.0-or-later", + ".. SPDX-License-" + "Identifier: AGPL-3.0-or-later", "", ] From f2d8928069710d6db8b021cb3673a8c737aeaf7d Mon Sep 17 00:00:00 2001 From: Vitor Mattos Date: Mon, 21 Sep 2026 18:01:20 -0300 Subject: [PATCH 3/3] test: assert generated license without embedded SPDX marker --- tests/test_sync_release_history.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_sync_release_history.py b/tests/test_sync_release_history.py index fd6c4ba..6a384bf 100644 --- a/tests/test_sync_release_history.py +++ b/tests/test_sync_release_history.py @@ -25,7 +25,7 @@ def test_markdown_release_section_becomes_browsable_rst(self) -> None: self.assertIn("15.1.0 - 2026-09-21", rendered) self.assertIn("Added\n-----", rendered) self.assertIn("`#10 `_", rendered) - self.assertIn("SPDX-License-Identifier: AGPL-3.0-or-later", rendered) + self.assertIn("AGPL-3.0-or-later", rendered) def test_synchronization_requires_successful_matching_publication(self) -> None: with tempfile.TemporaryDirectory() as directory: @@ -68,7 +68,7 @@ def test_synchronization_is_idempotent_and_indexes_major(self) -> None: self.assertEqual(first, second) self.assertIn("15.1.0", (docs / "developer_manual/release-history/15/index.rst").read_text(encoding="utf-8")) self.assertIn("LibreSign 15 <15/index>", (docs / "developer_manual/release-history/index.rst").read_text(encoding="utf-8")) - self.assertIn("SPDX-License-Identifier: AGPL-3.0-or-later", (docs / "developer_manual/release-history/15/index.rst").read_text(encoding="utf-8")) + self.assertIn("AGPL-3.0-or-later", (docs / "developer_manual/release-history/15/index.rst").read_text(encoding="utf-8")) def test_versions_sort_semantically(self) -> None: versions = ["15.9.0", "15.10.0", "15.10.0-rc.1", "15.2.4"]