diff --git a/tools/release-notes/README.md b/tools/release-notes/README.md new file mode 100644 index 0000000..e2fc0ea --- /dev/null +++ b/tools/release-notes/README.md @@ -0,0 +1,54 @@ +# update_gitea_releases.py + +Script one-shot per aggiornare il body delle release Gitea esistenti con il testo del CHANGELOG. + +## Quando usarlo + +Il workflow `release.yml` aggiorna automaticamente il body delle release **nuove** su Gitea. +Questo script serve per le release **già esistenti**, create prima che quella funzionalità fosse aggiunta. + +## Prerequisiti + +- Python 3.8+ +- Un Gitea API token con permesso **Repository → Read and Write** + +### Creare il token su Gitea + +1. Gitea → avatar → **Settings** → **Applications** +2. Sezione **"Manage Access Tokens"** → nome a piacere (es. `release-body-update`) +3. Permission: **Repository** → `Read and Write` +4. **Generate Token** → copia il valore (mostrato una sola volta) + +## Uso + +```bash +# Tramite variabile d'ambiente +GITEA_TOKEN= python3 tools/update_gitea_releases.py + +# Tramite argomento +python3 tools/update_gitea_releases.py --token +``` + +## Output atteso + +``` +[v2.0.0] recupero release... id=1, aggiorno body... OK +[v2.0.1] recupero release... id=2, aggiorno body... OK +[v2.1.0] recupero release... id=3, aggiorno body... OK +[v2.2.0] recupero release... id=4, aggiorno body... OK +[v2.2.1] recupero release... id=5, aggiorno body... OK +``` + +Se una release non esiste su Gitea per quel tag, la riga mostra `SALTATO`. + +## Come funziona + +Per ogni file `tools/release-notes/vX.Y.Z.md`: + +1. Chiama `GET /api/v1/repos/{owner}/{repo}/releases/tags/vX.Y.Z` per ottenere l'ID +2. Chiama `PATCH /api/v1/repos/{owner}/{repo}/releases/{id}` con il body del file `.md` + +## Aggiungere nuove versioni + +Crea un file `tools/release-notes/vX.Y.Z.md` con il contenuto desiderato, poi riesegui lo script. +Per le release future il workflow lo fa automaticamente — questo script non è necessario. diff --git a/tools/release-notes/v2.0.0.md b/tools/release-notes/v2.0.0.md new file mode 100644 index 0000000..5a94ec3 --- /dev/null +++ b/tools/release-notes/v2.0.0.md @@ -0,0 +1,8 @@ +### Added +- Prima release come repository indipendente +- Build script unificato (`build_plugin.py`) con CLI canonica +- CI/CD via GitHub Actions (mirror automatico Gitea → GitHub) +- Documentazione completa (README, CONTRIBUTING, SECURITY) + +--- +_Repository primario: vedi link Gitea nel README. Il mirror GitHub è generato automaticamente._ diff --git a/tools/release-notes/v2.0.1.md b/tools/release-notes/v2.0.1.md new file mode 100644 index 0000000..e57c2c4 --- /dev/null +++ b/tools/release-notes/v2.0.1.md @@ -0,0 +1,8 @@ +### Fixed +- Restored `tools/legacy/` build scripts lost from repository +- Fixed `UnicodeEncodeError` on CI: replaced Unicode checkmarks with ASCII OK/FAIL in build summary +- Fixed MSB8020 toolset error on GitHub Actions: `build_plugin_2600_vs2026.py` now detects the installed VS toolset dynamically (falls back to v143 on VS2022 runners) +- Build script for 26.00 selects `Nsis7z_vs2026.vcxproj` (v145) or `Nsis7z.vcxproj` (v143) based on detected toolset + +--- +_Repository primario: vedi link Gitea nel README. Il mirror GitHub è generato automaticamente._ diff --git a/tools/release-notes/v2.1.0.md b/tools/release-notes/v2.1.0.md new file mode 100644 index 0000000..c47e3c0 --- /dev/null +++ b/tools/release-notes/v2.1.0.md @@ -0,0 +1,13 @@ +### Added +- NSIS plugin API (`pluginapi.cpp`/`pluginapi.h`) for 7-Zip zstd build +- `ExtractCallbackConsole` class for extraction progress and user input +- Main extraction logic (`Main.cpp`, `MainAr.cpp`) for the zstd bundle +- User input utilities (`UserInputUtils2`) for password handling and prompts +- Break signal handling (`NSISBreak`) for graceful interruption +- `Nsis7z_vs2026.vcxproj` (v145 toolset) for Visual Studio 2026 builds +- `tools/fix_vcxproj.py` helper for project file patching +- `versions/7-zip-zstd` submodule added +- `build_zstd.cmd` top-level build script for the zstd variant + +--- +_Repository primario: vedi link Gitea nel README. Il mirror GitHub è generato automaticamente._ diff --git a/tools/release-notes/v2.2.0.md b/tools/release-notes/v2.2.0.md new file mode 100644 index 0000000..7a62c4b --- /dev/null +++ b/tools/release-notes/v2.2.0.md @@ -0,0 +1,11 @@ +### Added +- Linux MinGW-w64 cross-build support in `build_plugin.py` via `--host linux` +- `tools/linux/build_plugin_linux.py` for standalone Linux builds +- Color output and progress spinner in all legacy build scripts + +### Changed +- `build_plugin.py` now supports both Windows (MSBuild) and Linux (MinGW-w64) targets +- Windows build-script f-string fixes + +--- +_Repository primario: vedi link Gitea nel README. Il mirror GitHub è generato automaticamente._ diff --git a/tools/release-notes/v2.2.1.md b/tools/release-notes/v2.2.1.md new file mode 100644 index 0000000..111a763 --- /dev/null +++ b/tools/release-notes/v2.2.1.md @@ -0,0 +1,8 @@ +### Added +- Linux CI jobs for the GitHub `build` and `release` workflows using the MinGW-w64 cross-build path + +### Changed +- GitHub Actions workflows now opt into Node 24 for JavaScript-based actions to avoid Node 20 deprecation warnings + +--- +_Repository primario: vedi link Gitea nel README. Il mirror GitHub è generato automaticamente._ diff --git a/tools/update_gitea_releases.py b/tools/update_gitea_releases.py new file mode 100644 index 0000000..9ede753 --- /dev/null +++ b/tools/update_gitea_releases.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 +""" +One-shot script: aggiorna il body delle release Gitea esistenti +con i file in tools/release-notes/. + +Uso: + GITEA_TOKEN= python3 tools/update_gitea_releases.py +oppure: + python3 tools/update_gitea_releases.py --token +""" + +import argparse +import json +import os +import sys +import urllib.request +import urllib.error +from pathlib import Path + +GITEA_BASE = "https://gitea.emulab.it/api/v1" +REPO = "Simone/nsis-plugin-ns7zip" +NOTES_DIR = Path(__file__).parent / "release-notes" + + +def api(method: str, path: str, token: str, data: dict | None = None) -> dict: + url = f"{GITEA_BASE}{path}" + body = json.dumps(data).encode() if data else None + req = urllib.request.Request( + url, + data=body, + method=method, + headers={ + "Authorization": f"token {token}", + "Content-Type": "application/json", + "Accept": "application/json", + }, + ) + try: + with urllib.request.urlopen(req) as resp: + return json.loads(resp.read()) + except urllib.error.HTTPError as e: + print(f" HTTP {e.code} {e.reason} — {e.read().decode()}", file=sys.stderr) + raise + + +def main() -> None: + parser = argparse.ArgumentParser(description="Update Gitea release bodies") + parser.add_argument("--token", default=os.environ.get("GITEA_TOKEN"), help="Gitea API token") + args = parser.parse_args() + + if not args.token: + sys.exit("Errore: token mancante. Usa --token oppure imposta GITEA_TOKEN.") + + note_files = sorted(NOTES_DIR.glob("v*.md")) + if not note_files: + sys.exit(f"Nessun file trovato in {NOTES_DIR}") + + for note_path in note_files: + tag = note_path.stem # es. v2.2.1 + body = note_path.read_text(encoding="utf-8").strip() + + print(f"[{tag}] recupero release...", end=" ", flush=True) + try: + release = api("GET", f"/repos/{REPO}/releases/tags/{tag}", args.token) + except urllib.error.HTTPError: + print("SALTATO (release non trovata)") + continue + + release_id = release["id"] + print(f"id={release_id}, aggiorno body...", end=" ", flush=True) + try: + api("PATCH", f"/repos/{REPO}/releases/{release_id}", args.token, {"body": body}) + print("OK") + except urllib.error.HTTPError: + print("FALLITO") + + +if __name__ == "__main__": + main()