diff --git a/BEHEER.md b/BEHEER.md index 861595b..51141f7 100644 --- a/BEHEER.md +++ b/BEHEER.md @@ -218,16 +218,18 @@ in, dan valt de push in stap 3 om. Loopt dat toch mis, dan is ```powershell # 1. Versienummer in package.json van "x.x.x-dev" naar "x.x.x" -# 2. Changelog.md: kop van "Niet vrijgegeven" naar "[x.x.x] - datum" +# 2. Wijzigingen in Changelog.md onder de kop "## [Niet vrijgegeven]" +# (de kop zelf omzetten hoeft niet — dat doet het script) # 3. Token staat in .env.release (zie Tokens) — of eenmalig in de shell: $env:GITEA_TOKEN = "" -.\release.ps1 # test, bouw (amd64+arm64), push, tag, Gitea-release -.\release.ps1 -DryRun # droogloop — toont alle stappen zonder uit te voeren -.\release.ps1 -NoBuild # sla docker build over, alleen tag + release -.\release.ps1 -SkipTests # sla de testsuite over (niet aanbevolen) +.\release.ps1 # test, bouw (amd64+arm64), push, tag, Gitea-release +.\release.ps1 -DryRun # droogloop — toont alle stappen zonder uit te voeren +.\release.ps1 -NoBuild # sla docker build over, alleen tag + release +.\release.ps1 -SkipTests # sla de testsuite over (niet aanbevolen) +.\release.ps1 -NoChangelog # publiceer bewust zonder release-notes -# 4. Versienummer in package.json naar "x.x.(x+1)-dev" voor volgende cyclus +# Klaar. Het versienummer voor de volgende cyclus zet het script zelf. ``` Het script bouwt één image voor `linux/amd64` en `linux/arm64`, zodat dezelfde @@ -235,22 +237,35 @@ tag op een Raspberry Pi en op een x86-server werkt. **Wat het script zelf bijwerkt** — met de hand aanpassen is dus dubbel werk: -| Bestand | Wat | -|---|---| -| `frontend/package.json` | versie gelijkgetrokken met de root `package.json` | -| `README.md` | de `versie-x.x.x`-badge bovenaan | +| Bestand | Wat | Wanneer | +|---|---|---| +| `Changelog.md` | kop `## [Niet vrijgegeven]` → `## [x.x.x] - datum` | vóór de build | +| `frontend/package.json` | versie gelijkgetrokken met de root `package.json` | vóór de build | +| `README.md` | de `versie-x.x.x`-badge bovenaan | vóór de build | +| `package.json` (root) | versie → `x.x.(x+1)-dev` voor de volgende cyclus | **ná** het publiceren | -Beide gebeuren vóór de build, en een `-DryRun` meldt ze zonder te schrijven. Ze -blijven na een echte release als wijziging in je working tree staan; neem ze mee -in de volgende commit. +Een `-DryRun` meldt alle vier zonder te schrijven. Ze blijven na een echte +release als wijziging in je working tree staan; neem ze mee in de volgende +commit. -> **De changelog-kop moet exact `## [x.x.x]` zijn.** `release.ps1` zoekt die kop -> om de release-notes te vullen. Staat je werk nog onder `## [Niet vrijgegeven]`, -> dan vindt het script niets en valt het terug op de tekst `"Release x.x.x"` — -> dan staat er geen inhoudelijke release-notes in Gitea en ziet een gebruiker in -> het belletje een placeholder. Dat overkwam 0.1.9. Achteraf repareren kan met -> een `PATCH` op `/repos///releases/`, maar vóór de release -> omzetten is een stuk minder werk. +De laatste staat bewust ná het publiceren: breekt de release eerder af, dan +schuift het versienummer niet vooruit. Bijeffect dat je moet kennen — na een +geslaagde release staat er een `-dev` nummer in `package.json`, en de controle +bovenin het script weigert een `-dev` versie. Dat sluit een dubbele publicatie +uit, maar wil je dezelfde versie bewust opnieuw releasen (bijvoorbeeld omdat een +tag is verdwenen), zet het nummer dan eerst zelf terug naar `x.x.x`. + +> **Zonder changelog-sectie breekt het script af.** De release-notes komen uit de +> sectie `## [x.x.x]` in `Changelog.md`. Vond het script daar niets, dan +> publiceerde het stil de tekst `"Release x.x.x"` — dat gebeurde bij 0.1.9 en +> 1.0.2. Nu zet het de kop `## [Niet vrijgegeven]` zelf om, en als er ook dán +> niets over deze versie in staat, stopt het vóór de build met de melding wat je +> moet toevoegen. Wil je bewust zonder notes publiceren, gebruik `-NoChangelog`. +> +> De controle staat vóór de drie auto-updates hierboven, zodat een afgebroken +> release geen gewijzigde bestanden achterlaat. Is een release toch al gepubliceerd +> met de placeholder, dan repareer je dat met een `PATCH` op +> `/repos///releases/` met de juiste `body`. ### `.env.release` — token niet elke sessie opnieuw zetten @@ -283,7 +298,12 @@ docker compose pull && docker compose up -d docker compose down -v && docker compose up -d ``` -Pullen vereist een registry-login op die host — zie +Draai dit in de map met `docker-compose.yml` en `.env`. `docker compose` zoekt +dat bestand namelijk in de huidige map en kijkt niet omhoog; staat het er niet, +dan is het antwoord `no configuration file provided: not found`. Met +`docker compose -f /pad/naar/docker-compose.yml` kun je het expliciet meegeven. + +Pullen zelf werkt anoniem zolang de organisatie public is — zie [Pullen op een deploy-machine](#pullen-op-een-deploy-machine). ### PostgreSQL versie-upgrade diff --git a/Changelog.md b/Changelog.md index 73ef968..1bb24e7 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,44 @@ ## [Niet vrijgegeven] +### Toegevoegd +- `release.ps1` zet de changelog-kop `## [Niet vrijgegeven]` nu zelf om naar + `## [x.x.x] - datum`, net zoals het al deed met `frontend/package.json` en de + README-badge. Handmatig omzetten hoeft dus niet meer +- Staat er ook na die omzetting niets over deze versie in `Changelog.md`, dan + breekt het script af **vóór** de build met de melding wat je moet toevoegen. + Eerder viel het stil terug op de tekst `"Release x.x.x"` en meldde het + "Gepubliceerd" — dat overkwam 0.1.9 en 1.0.2, en is achteraf alleen met een + `PATCH` op de release te herstellen. Nieuwe switch `-NoChangelog` om bewust + zonder release-notes te publiceren +- `release.ps1` zet na een geslaagde release de versie in de root + `package.json` op `x.x.(x+1)-dev`. Dat was voorheen de laatste handmatige stap + van de release-workflow. Het staat bewust ná het publiceren, zodat een + afgebroken release het nummer niet vooruit schuift + +### Opgelost +- **`-DryRun` in combinatie met `-Force` verwijderde écht de Git-tag.** De twee + commando's in stap 4 (`git tag -d` en `git push origin :refs/tags/x.x.x`) + liepen niet via `Invoke-Cmd` en hadden dus geen droogloop-controle. Gitea + ruimt de release op zodra de tag verdwijnt, dus een droogloop kon een + gepubliceerde release wissen — zo is de release van 1.0.2 verloren gegaan en + opnieuw aangemaakt. Onder `-DryRun` worden beide nu alleen gemeld + +### Gewijzigd +- De changelog-controle staat vóór de drie auto-updates, zodat een afgebroken + release geen gewijzigde bestanden achterlaat terwijl hij "er is niets + gepubliceerd" meldt +- Stap 5 leest de release-notes uit het geheugen in plaats van opnieuw van + schijf. Een droogloop schrijft de kop niet, en toonde daardoor de placeholder + in de payload — precies wat je met een droogloop wilt uitsluiten +- De Quick Start in `README.md` begint nu met het ophalen van + `docker-compose.yml` (clone, of alleen die twee bestanden via `raw`). Zonder + dat bestand antwoordt `docker compose pull` met `no configuration file + provided: not found`, en die stap ontbrak. Beide foutmeldingen staan er nu bij + met hun oorzaak + +## [1.0.2] - 2026-09-10 + ### Gewijzigd - De update-melding op het belletje toont alleen nog de kop, de versieregel en de link naar de release. De release-notes stonden er als ruwe Markdown in — in een diff --git a/README.md b/README.md index ccb8b9e..11bfa7b 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Eigen vermogen · Schulden · Voortgang · Gebruikersbeheer ![Node.js](https://img.shields.io/badge/Node.js_22-339933?style=flat&logo=node.js&logoColor=white) ![PostgreSQL](https://img.shields.io/badge/PostgreSQL_18-4169E1?style=flat&logo=postgresql&logoColor=white) ![Docker](https://img.shields.io/badge/Docker_Compose-2496ED?style=flat&logo=docker&logoColor=white) -![Version](https://img.shields.io/badge/versie-1.0.1-8b5cf6?style=flat) +![Version](https://img.shields.io/badge/versie-1.0.2-8b5cf6?style=flat) ![Built with Claude](https://img.shields.io/badge/Gebouwd_met-Claude.ai-8b5cf6?style=flat&logo=anthropic&logoColor=white) VibeFinance dashboard @@ -32,7 +32,25 @@ Deze applicatie is volledig ontworpen en ontwikkeld met behulp van [Claude.ai](h De app draait in **2 containers**: `app` (Express API + gebouwde frontend) en `postgres` (database). -**`.env`** — kopieer `.env.example` en vul in: +**1. De bestanden op de server zetten.** `docker compose` leest +`docker-compose.yml` uit de map waarin je het commando draait, dus dat bestand +moet er eerst staan. De organisatie in Gitea is publiek, dus dit kan anoniem: + +```bash +git clone https://vibehoogie.duckdns.org/Vibe/VibeFinance.git +cd VibeFinance +``` + +Wil je de repo niet op je server, dan zijn deze twee bestanden genoeg: + +```bash +mkdir -p vibefinance && cd vibefinance +base=https://vibehoogie.duckdns.org/Vibe/VibeFinance/raw/branch/main +curl -fsSLO $base/docker-compose.yml +curl -fsSL $base/.env.example -o .env.example +``` + +**2. `.env` aanmaken** — kopieer `.env.example` en vul in: ```env POSTGRES_USER=vibefinance @@ -46,19 +64,25 @@ APP_PORT=3400 openssl rand -hex 64 ``` +**3. Starten:** + ```bash cp .env.example .env # en vul de waarden in docker compose pull && docker compose up -d ``` -De `Vibe`-organisatie in Gitea is publiek, dus een pull werkt anoniem — geen -`docker login` nodig. Krijg je toch `401 Unauthorized` of "pull access denied", -dan staat de organisatie weer op privé: +Twee foutmeldingen en wat ze betekenen: -```bash -docker login vibehoogie.duckdns.org # wachtwoord = Gitea-token met read:package -``` +- **`no configuration file provided: not found`** — je staat in een map zonder + `docker-compose.yml`. Controleer met `ls docker-compose.yml`, of geef het + bestand expliciet mee: `docker compose -f /pad/naar/docker-compose.yml up -d`. +- **`401 Unauthorized`** of **"pull access denied"** — de organisatie staat niet + meer op publiek. Dan alsnog inloggen: + + ```bash + docker login vibehoogie.duckdns.org # wachtwoord = Gitea-token met read:package + ``` Navigeer naar `http://:3400` en registreer je account. De **eerste** geregistreerde gebruiker krijgt automatisch de Admin-rol. @@ -129,6 +153,13 @@ $env:GITEA_TOKEN = "" Draait de tests, bouwt het app-image voor `amd64` + `arm64` (Raspberry Pi), pusht naar de registry, zet de Git-tag en publiceert de Gitea-release. +Het script regelt ook het bijwerken eromheen: de changelog-kop +`## [Niet vrijgegeven]` wordt `## [x.x.x] - datum`, de versie in +`frontend/package.json` en de badge hierboven gaan mee, en ná het publiceren +zet het de root `package.json` op `x.x.(x+1)-dev` voor de volgende cyclus. +Beschrijft de changelog niets over deze versie, dan stopt het script vóór de +build — anders zou de release met een placeholder als notes online komen. + --- ## 🗂️ Functionaliteit diff --git a/frontend/package.json b/frontend/package.json index 9ed99d3..83d79e2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "vibefinance-frontend", - "version": "1.0.2-dev", + "version": "1.0.2", "private": true, "type": "module", "scripts": { diff --git a/package.json b/package.json index 52153bf..f72b18e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vibefinance", - "version": "1.0.2", + "version": "1.0.3", "description": "VibeFinance — persoonlijk vermogensbeheer", "private": true, "repository": "https://vibehoogie.duckdns.org/vibe/VibeFinance", diff --git a/release.ps1 b/release.ps1 index 9228163..479542e 100644 --- a/release.ps1 +++ b/release.ps1 @@ -9,6 +9,16 @@ # .\release.ps1 -SkipTests # sla de testsuite over (niet aanbevolen) # .\release.ps1 -DryRun # toon alle commando's zonder iets uit te voeren # .\release.ps1 -Force # sla conflictcontrole over, overschrijf tags +# .\release.ps1 -NoChangelog # publiceer bewust zonder release-notes +# +# Het script werkt zelf vier dingen bij, dus die hoef je niet met de hand te +# doen: de changelog-kop `## [Niet vrijgegeven]` -> `## [x.x.x] - datum`, de +# versie in frontend/package.json, de versiebadge in README.md, en ná het +# publiceren de versie in de root package.json -> `x.x.(x+1)-dev`. +# +# LET OP bij -Force: dat verwijdert de bestaande tag lokaal en op origin, en +# Gitea gooit de bijbehorende release daarmee weg. Onder -DryRun wordt dat +# alleen gemeld (dat was eerder niet zo — zie stap 4). # # Vereisten: # - Docker Desktop actief @@ -16,6 +26,9 @@ # - docker buildx builder actief: docker buildx create --use # - Git geinstalleerd en working directory is de repo root # - root package.json bevat een schoon versienummer ZONDER -dev suffix +# - Changelog.md beschrijft deze versie, onder `## [Niet vrijgegeven]` of +# onder een kop `## [x.x.x]`; anders breekt het script af (-NoChangelog +# omzeilt dat) # - GITEA_TOKEN in de omgeving (token met release-rechten) voor stap 5, # de Gitea-release waar de update-melding in de app op afgaat @@ -23,7 +36,10 @@ param( [switch]$NoBuild, [switch]$SkipTests, [switch]$DryRun, - [switch]$Force + [switch]$Force, + # Releasen zonder inhoudelijke release-notes. Zonder deze switch breekt het + # script af wanneer de changelog niets over deze versie zegt. + [switch]$NoChangelog ) $ErrorActionPreference = "Stop" @@ -75,41 +91,6 @@ if ($appVersion -match "-dev$") { exit 1 } -# ── Versie synchroniseren naar frontend/package.json ────────────────────── -# Een droogloop schrijft hier niet: anders laat -DryRun een gewijzigd bestand -# achter, en tagt de echte release daarna een vervuilde working tree. -$frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json" -$frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json -if ($frontendPkg.version -ne $appVersion) { - if ($DryRun) { - Write-Host "[DRY-RUN] Versie naar frontend synchroniseren: $($frontendPkg.version) -> $appVersion" -ForegroundColor Yellow - } else { - $frontendPkg.version = $appVersion - [System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10)) - Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green - } -} - -# ── Versiebadge in README.md ────────────────────────────────────────────── -# Anders loopt die badge stil achter: hij stond drie releases achter voordat -# dit erin zat, en het script kent het nummer toch al. Zelfde regel als -# hierboven: een droogloop meldt het, maar schrijft niet. -$readmePath = Join-Path $PSScriptRoot "README.md" -if (Test-Path $readmePath) { - $readme = [System.IO.File]::ReadAllText($readmePath) - $patroon = "badge/versie-[^-]+-" - $nieuw = "badge/versie-$appVersion-" - $huidig = [regex]::Match($readme, $patroon) - if ($huidig.Success -and $huidig.Value -ne $nieuw) { - if ($DryRun) { - Write-Host "[DRY-RUN] Versiebadge in README.md: $($huidig.Value) -> $nieuw" -ForegroundColor Yellow - } else { - [System.IO.File]::WriteAllText($readmePath, ($readme -replace $patroon, $nieuw)) - Write-Host "Versiebadge in README.md bijgewerkt: $appVersion" -ForegroundColor Green - } - } -} - $gitTag = "$appVersion" # ── Registry tags (één image voor frontend + backend) ───────────────────── @@ -151,12 +132,13 @@ function Write-Step { Write-Host "── $Label" -ForegroundColor Cyan } -# Haalt de sectie van deze versie uit Changelog.md als release-notes. -function Get-ChangelogSection { - param([string]$Version) - $path = Join-Path $PSScriptRoot "Changelog.md" - if (-not (Test-Path $path)) { return "" } - $lines = Get-Content $path +# Haalt de sectie van deze versie uit changelog-tekst. Werkt op een string en +# niet op het bestand, zodat een droogloop kan valideren tegen de kop die hij +# zou schrijven zonder die daadwerkelijk te schrijven. +function Get-ChangelogSectionFromText { + param([string]$Text, [string]$Version) + if (-not $Text) { return "" } + $lines = $Text -split "\r?\n" $start = -1 $needle = "^##\s*\[" + [regex]::Escape($Version) + "\]" for ($i = 0; $i -lt $lines.Count; $i++) { @@ -172,6 +154,94 @@ function Get-ChangelogSection { return (($out -join "`n").Trim()) } +# ── Changelog-kop vrijgeven ─────────────────────────────────────────────── +# De release-notes komen uit de sectie `## [x.x.x]` in Changelog.md. Stond het +# werk nog onder `## [Niet vrijgegeven]`, dan vond het script niets en werd stil +# de placeholder "Release x.x.x" gepubliceerd — dat gebeurde bij 0.1.9 en 1.0.2, +# en is achteraf alleen met een PATCH op de release te herstellen. Daarom zet het +# script de kop nu zelf om, en breekt het af als er niets te melden valt. +# Zelfde regel als bij de andere auto-updates: een droogloop meldt, maar schrijft +# niet. +$changelogPath = Join-Path $PSScriptRoot "Changelog.md" +$nieuweKop = "## [$appVersion] - $(Get-Date -Format 'yyyy-MM-dd')" +$changelogTxt = if (Test-Path $changelogPath) { [System.IO.File]::ReadAllText($changelogPath) } else { "" } + +$kopPatroon = "(?m)^##\s*\[" + [regex]::Escape($appVersion) + "\]" +$onderwegPatroon = "(?m)^##\s*\[\s*Niet vrijgegeven\s*\]\s*$" + +# Eerst alleen in het geheugen omzetten. Schrijven gebeurt na de controle +# hieronder: bij een lege `[Niet vrijgegeven]`-sectie zou de kop anders al +# vervangen zijn terwijl het script daarna afbreekt, en dan blijft er een +# aangepaste changelog achter bij een release die niet doorging. +$kopOmzetten = ($changelogTxt -notmatch $kopPatroon -and $changelogTxt -match $onderwegPatroon) +if ($kopOmzetten) { + # $nieuweKop bevat geen '$', dus veilig als vervangingstekst. + $changelogTxt = [regex]::Replace($changelogTxt, $onderwegPatroon, $nieuweKop) +} + +if (-not (Get-ChangelogSectionFromText $changelogTxt $appVersion) -and -not $NoChangelog) { + Write-Host "" + Write-Host "Changelog.md zegt niets over $appVersion." -ForegroundColor Red + Write-Host "" + Write-Host "Zonder notes komt er alleen de tekst 'Release $appVersion' in de Gitea-release," -ForegroundColor Yellow + Write-Host "en dat is achteraf alleen met een PATCH op de release te herstellen." -ForegroundColor Yellow + Write-Host "" + Write-Host "Zet je wijzigingen in Changelog.md onder een kop:" -ForegroundColor White + Write-Host " ## [Niet vrijgegeven]" -ForegroundColor White + Write-Host "Die zet dit script bij de volgende run zelf om naar '$nieuweKop'." -ForegroundColor White + Write-Host "" + Write-Host "Bewust zonder release-notes publiceren? Draai met -NoChangelog." -ForegroundColor DarkGray + Write-Host "" + Write-Host "Er is niets gepubliceerd." -ForegroundColor DarkGray + exit 1 +} + +# De controle is doorstaan, dus nu pas schrijven. +if ($kopOmzetten) { + if ($DryRun) { + Write-Host "[DRY-RUN] Changelog-kop vrijgeven: '## [Niet vrijgegeven]' -> '$nieuweKop'" -ForegroundColor Yellow + } else { + [System.IO.File]::WriteAllText($changelogPath, $changelogTxt) + Write-Host "Changelog-kop vrijgegeven: $nieuweKop" -ForegroundColor Green + } +} + +# ── Versie synchroniseren naar frontend/package.json ────────────────────── +# Staat na de changelog-controle: anders laat een afgebroken release wél een +# gewijzigde working tree achter terwijl hij "niets gepubliceerd" meldt. +# Een droogloop schrijft hier niet, om dezelfde reden. +$frontendPkgPath = Join-Path $PSScriptRoot "frontend/package.json" +$frontendPkg = Get-Content $frontendPkgPath -Raw | ConvertFrom-Json +if ($frontendPkg.version -ne $appVersion) { + if ($DryRun) { + Write-Host "[DRY-RUN] Versie naar frontend synchroniseren: $($frontendPkg.version) -> $appVersion" -ForegroundColor Yellow + } else { + $frontendPkg.version = $appVersion + [System.IO.File]::WriteAllText($frontendPkgPath, ($frontendPkg | ConvertTo-Json -Depth 10)) + Write-Host "Versie gesynchroniseerd naar frontend: $appVersion" -ForegroundColor Green + } +} + +# ── Versiebadge in README.md ────────────────────────────────────────────── +# Anders loopt die badge stil achter: hij stond drie releases achter voordat +# dit erin zat, en het script kent het nummer toch al. Zelfde regel als +# hierboven: een droogloop meldt het, maar schrijft niet. +$readmePath = Join-Path $PSScriptRoot "README.md" +if (Test-Path $readmePath) { + $readme = [System.IO.File]::ReadAllText($readmePath) + $patroon = "badge/versie-[^-]+-" + $nieuw = "badge/versie-$appVersion-" + $huidig = [regex]::Match($readme, $patroon) + if ($huidig.Success -and $huidig.Value -ne $nieuw) { + if ($DryRun) { + Write-Host "[DRY-RUN] Versiebadge in README.md: $($huidig.Value) -> $nieuw" -ForegroundColor Yellow + } else { + [System.IO.File]::WriteAllText($readmePath, ($readme -replace $patroon, $nieuw)) + Write-Host "Versiebadge in README.md bijgewerkt: $appVersion" -ForegroundColor Green + } + } +} + # ── Samenvatting ─────────────────────────────────────────────────────────── Write-Host "" Write-Host "════════════════════════════════════════" -ForegroundColor Cyan @@ -365,14 +435,24 @@ if (-not $NoBuild) { Write-Step "[4/5] Git-tag aanmaken en pushen" if ($Force) { - Write-Host "Bestaande lokale tag verwijderen (indien aanwezig)..." -ForegroundColor Yellow - $ErrorActionPreference = "SilentlyContinue" - git tag -d $gitTag 2>$null | Out-Null - $ErrorActionPreference = "Stop" - Write-Host "Bestaande remote tag verwijderen (indien aanwezig)..." -ForegroundColor Yellow - $ErrorActionPreference = "SilentlyContinue" - git push origin ":refs/tags/$gitTag" 2>$null | Out-Null - $ErrorActionPreference = "Stop" + # LET OP: deze twee commando's gingen niet via Invoke-Cmd en hadden dus geen + # -DryRun-controle. Een `-DryRun -Force` verwijderde daardoor écht de tag, + # lokaal en op origin — en Gitea ruimt de release op zodra de tag verdwijnt. + # Zo is de release van 1.0.2 verloren gegaan. + if ($DryRun) { + Write-Host "[DRY-RUN] git tag -d $gitTag" -ForegroundColor Yellow + Write-Host "[DRY-RUN] git push origin :refs/tags/$gitTag" -ForegroundColor Yellow + } else { + Write-Host "Bestaande lokale tag verwijderen (indien aanwezig)..." -ForegroundColor Yellow + $ErrorActionPreference = "SilentlyContinue" + git tag -d $gitTag 2>$null | Out-Null + $ErrorActionPreference = "Stop" + Write-Host "Bestaande remote tag verwijderen (indien aanwezig)..." -ForegroundColor Yellow + Write-Host " Gitea verwijdert de bijbehorende release mee." -ForegroundColor DarkGray + $ErrorActionPreference = "SilentlyContinue" + git push origin ":refs/tags/$gitTag" 2>$null | Out-Null + $ErrorActionPreference = "Stop" + } } Write-Host "Git-tag aanmaken: $gitTag" -ForegroundColor White @@ -405,7 +485,10 @@ if (-not $releaseApi) { Write-Host "Geen GITEA_TOKEN in de omgeving — release overgeslagen." -ForegroundColor Yellow Write-Host " Zonder release ziet de app geen update-melding voor $appVersion." -ForegroundColor DarkGray } else { - $notes = Get-ChangelogSection $appVersion + # Uit $changelogTxt en niet opnieuw van schijf: in een droogloop is de kop + # nog niet geschreven, en dan zou de payload hier de placeholder tonen — + # precies wat je met een droogloop wilt uitsluiten. + $notes = Get-ChangelogSectionFromText $changelogTxt $appVersion if (-not $notes) { $notes = "Release $appVersion" } $payload = @{ tag_name = $gitTag @@ -451,6 +534,38 @@ Write-Host " Git-tag: $gitTag -> origin" -ForegroundColor Green Write-Host "════════════════════════════════════════" -ForegroundColor Cyan Write-Host "" +# ── Versie naar de volgende dev-cyclus ──────────────────────────────────── +# Was voorheen stap 4 met de hand. Gebeurt hier, ná het publiceren, zodat een +# afgebroken release het versienummer niet vooruit zet. Bijkomend voordeel: de +# `-dev` suffix laat dezelfde release niet nog eens draaien (de controle boven +# in dit script weigert een `-dev` versie), dus een dubbele publicatie is +# meteen uitgesloten. Wil je bewust opnieuw releasen, zet het nummer dan zelf +# terug. +if ($appVersion -match '^(\d+)\.(\d+)\.(\d+)$') { + $volgende = "{0}.{1}.{2}-dev" -f $Matches[1], $Matches[2], ([int]$Matches[3] + 1) + $rootPkgPath = Join-Path $PSScriptRoot "package.json" + + if ($DryRun) { + Write-Host "[DRY-RUN] Versie in package.json: $appVersion -> $volgende" -ForegroundColor Yellow + } else { + # Gerichte tekstvervanging in plaats van ConvertTo-Json: dat zou het hele + # bestand herschrijven en de opmaak van de andere velden aantasten. + $rootTxt = [System.IO.File]::ReadAllText($rootPkgPath) + $treffer = [regex]::Match($rootTxt, '"version"\s*:\s*"' + [regex]::Escape($appVersion) + '"') + if ($treffer.Success) { + $rootTxt = $rootTxt.Remove($treffer.Index, $treffer.Length).Insert($treffer.Index, '"version": "' + $volgende + '"') + [System.IO.File]::WriteAllText($rootPkgPath, $rootTxt) + Write-Host "Versie in package.json naar de volgende cyclus: $volgende" -ForegroundColor Green + Write-Host " Commit dit mee, samen met de changelog-kop en de README-badge." -ForegroundColor DarkGray + Write-Host "" + } else { + Write-Host "Kon '$appVersion' niet terugvinden in package.json — versie niet bijgewerkt." -ForegroundColor Yellow + } + } +} else { + Write-Host "Versie '$appVersion' is geen x.y.z — volgende dev-versie niet automatisch gezet." -ForegroundColor Yellow +} + # Expliciete 0: anders erft de caller de exitcode van het laatste # docker-commando (bijv. de registry-check). exit 0 diff --git a/release.sh b/release.sh index 8f643bc..f708cda 100644 --- a/release.sh +++ b/release.sh @@ -9,6 +9,7 @@ # ./release.sh -SkipTests # sla de testsuite over (niet aanbevolen) # ./release.sh -DryRun # toon alle commando's zonder iets uit te voeren # ./release.sh -Force # sla conflictcontrole over, overschrijf tags +# ./release.sh -NoChangelog # publiceer bewust zonder release-notes # # Combinaties: # ./release.sh -Force -NoBuild