Files
kniip/.cursor/plans/update-tab_met_changelog_6879da2a.plan.md
T
2026-11-09 00:07:44 +01:00

6.6 KiB

name, overview, todos, isProject
name overview todos isProject
Update-tab met changelog Add an "Update" tab to the settings that reads releases from git.hibbit.net (public Gitea/Forgejo API), shows the changelog rendered as Markdown, and on "Updaten" downloads the installer, runs it silently and restarts kniip.
id content status
checker UpdateChecker: releases ophalen via Gitea-API, versies vergelijken completed
id content status
markdown Markdig-referentie + MarkdownRenderer naar FlowDocument completed
id content status
installer-dl UpdateInstaller: download met voortgang en stille start completed
id content status
tab-ui Update-tab in SettingsWindow (xaml + code-behind) completed
id content status
app-exit App: TryCloseAllWindows en --updated-argument completed
id content status
iss Kniip.iss: herstart na stille installatie completed
id content status
readme README: releasenotes en publiek-vereiste documenteren completed
false

Update-tab met changelog

Uitgangspunten

  • git.hibbit.net heeft een Gitea/Forgejo-API (/api/v1/version geeft 28.3.0). Releases: GET https://git.hibbit.net/api/v1/repos/rogier/kniip/releases?limit=20. De repo moet publiek worden; nu geeft die URL 404.
  • Per release gebruiken we deze velden: tag_name (v1.2.0), name, body (markdown-changelog), published_at, draft, prerelease, html_url en assets[]. Uit assets[] zoeken we name = Kniip-Setup-*.exe en de bijbehorende browser_download_url op.
  • Alleen handmatig controleren: bij het openen van de tab en met de knop "Opnieuw controleren". Er komt geen achtergrondcontrole.
  • Huidige versie: Assembly.GetEntryAssembly().GetName().Version, gezet via -p:Version in build.ps1. Niet InformationalVersion, want daar zet de .NET 8 SDK een +commithash achter.
flowchart LR
    Tab[Update-tab geopend] --> Api["GET releases API"]
    Api --> Compare{"Nieuwere versie?"}
    Compare -->|ja| Show["Changelog van alle nieuwere versies + knop Updaten"]
    Compare -->|nee| Current["'Je hebt de nieuwste versie' + changelog huidige versie"]
    Show --> Download["Installer downloaden naar TEMP met voortgang"]
    Download --> Exit["Vensters sluiten, installer /VERYSILENT starten, kniip afsluiten"]
    Exit --> Restart["Installer start kniip --updated"]

Nieuwe bestanden

  • src/Kniip/Update/UpdateChecker.cs
    • Record ReleaseInfo(Version Version, string Tag, string Title, DateTimeOffset? Date, string Body, string HtmlUrl, string? InstallerUrl, long InstallerSize).
    • Task<IReadOnlyList<ReleaseInfo>> GetReleasesAsync(CancellationToken): haalt de releases op via één statische HttpClient (zoals in ZiplineUploader.cs) met User-Agent kniip/<versie>. Drafts, prereleases en tags die niet als versie te lezen zijn vallen af. Gesorteerd van nieuw naar oud.
    • static Version CurrentVersion, genormaliseerd naar 3 delen voor de vergelijking.
  • src/Kniip/Update/UpdateInstaller.cs
    • Task<string> DownloadAsync(ReleaseInfo, IProgress<double>, CancellationToken) downloadt naar %TEMP%\kniip-update\Kniip-Setup-<versie>.exe. Daarna controleren we of de bestandsgrootte gelijk is aan size van de asset.
    • Start(string path) start de installer met /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS. UsePreviousTasks behoudt de eerder gekozen integraties.
  • src/Kniip/Update/MarkdownRenderer.cs: zet markdown om naar een WPF FlowDocument via Markdig (nieuwe NuGet-referentie in Kniip.csproj). Een eigen walker over de AST ondersteunt:
    • koppen, alinea's, opsommingen (ook genummerd en genest) en citaten
    • codeblokken en inline code (Consolas, grijze achtergrond), vet, cursief en doorhalen
    • links: Hyperlink die de browser opent, met Process.Start zoals OpenUrl in SettingsWindow
    • horizontale lijnen
    • kleuren en lettertypen uit de bestaande resources (AccentBrush, SubtleTextBrush, Segoe UI)

Wijzigingen

  • src/Kniip/Settings/SettingsWindow.xaml: nieuwe TabItem Header="Update" na "Editor", met:
    • CardTitle "Update", met daaronder "Geïnstalleerde versie: 1.0.0" en een statusregel (Hint).
    • Knoppen AccentButton "Updaten naar x.y.z" (verborgen als er geen update is), SecondaryButton "Opnieuw controleren" en FlatButton "Releasepagina".
    • ProgressBar (verborgen) voor de download.
    • Changelog in een FlowDocumentScrollViewer met vaste hoogte (~300) en een rand. De tab staat al in een ScrollViewer, dus de viewer heeft een vaste hoogte nodig.
  • src/Kniip/Settings/SettingsWindow.xaml.cs:
    • In Tabs_SelectionChanged start de eerste keer dat de Update-tab wordt gekozen de controle (CheckForUpdatesAsync). Het resultaat blijft bewaard zolang het venster open is.
    • Changelog: per nieuwere release een kop "Versie x.y.z, d MMMM yyyy" met de body eronder. Is er geen update, dan tonen we de notes van de huidige versie. Is er een fout of offline, dan tonen we een melding in de statusregel.
    • Update_Click:
      1. Bevestigen met "kniip wordt afgesloten en bijgewerkt".
      2. Downloaden met voortgang. Tijdens het downloaden zijn de knoppen uitgeschakeld en annuleert sluiten van het venster de download.
      3. App.Instance.TryExitForUpdate(). Lukt dat, dan UpdateInstaller.Start en Shutdown.
  • src/Kniip/App.xaml.cs:
    • Splits ExitApplication op in bool TryCloseAllWindows(). Die stopt als er een screencast loopt of als een editor het sluiten tegenhoudt, zodat we de installer pas starten als kniip echt kan stoppen.
    • Nieuw argument --updated in HandleArguments: toont de ballon "kniip is bijgewerkt naar versie x.y.z" en gedraagt zich verder als --tray.
  • installer/Kniip.iss: extra [Run]-regel die kniip opnieuw start na een stille installatie: Filename: "{app}\{#AppExe}"; Parameters: "--updated"; Flags: nowait; Check: WizardSilent
  • README.md, sectie "Een nieuwe versie publiceren": de releasebeschrijving (markdown) wordt de changelog in kniip, de installerbijlage moet Kniip-Setup-<versie>.exe heten, en de repo moet publiek zijn voor de updatecontrole.

Randgevallen

  • Draai je kniip als losse exe (niet geïnstalleerd), dan installeert de update in %LOCALAPPDATA%\Programs\Kniip. Dat is acceptabel; het staat in de bevestiging.
  • Een release zonder installerbijlage: geen knop Updaten, wel een link naar de releasepagina.
  • Een oude download in %TEMP%\kniip-update wordt overschreven.