diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e92710..33ca4cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ - CI: bumped `actions/checkout` v4→v5 and `actions/setup-python` v5→v6 onto the Node 24 runtime ahead of GitHub's Node 20 removal, and added a `node --check` syntax gate for the dashboard's `app.js`. - CI: added a `Build & release installer` workflow (manual dispatch or `v*` tag) that PyInstaller-freezes the four executables, compiles the Inno Setup installer, and uploads the artifact (attaching it to a GitHub Release on tag). Uses Node-24 actions (`checkout@v5`, `setup-python@v6`, `upload-artifact@v7`). - Installer build: `build.ps1 -BundleAhk` now fetches AutoHotkey v2 from its GitHub release (pinned 2.0.26) instead of `autohotkey.com`, which began returning a Cloudflare bot-challenge page to non-browser clients (the download succeeded but `Expand-Archive` failed on the HTML). `autohotkey.com` is kept as a fallback. +- Installer compile: `installer.iss` now actually compiles end-to-end (the build workflow's first green run). Three latent bugs, each masking the next, are fixed: (1) a trailing `; ...` comment on the `MinVersion` directive was parsed as part of the value (Inno Setup only treats `;` as a comment at the start of a line); (2) no `SourceDir` was set, so Inno resolved every repo-root-relative `Source`/`SetupIconFile`/`OutputDir` against the script's own `installer\` directory — now `SourceDir=..`, which also lands the output at `\out` where the build script and CI look for it; (3) an `{app}` Inno constant inside a Pascal `{ }` doc-comment in `[Code]` closed the comment early (these comments don't nest). Also ships `scripts\assets\*` (the tray `.ico` the AHK loads at runtime), which `[Files]` had omitted. ## 1.6.0 diff --git a/installer/installer.iss b/installer/installer.iss index 9dc0914..152e9de 100644 --- a/installer/installer.iss +++ b/installer/installer.iss @@ -55,6 +55,13 @@ AppUpdatesURL={#AppURL}/releases DefaultDirName={commonpf}\FastFlowPrompt DefaultGroupName={#AppName} DisableProgramGroupPage=yes +; Every Source path below (dist\, vendor\, scripts\, SetupIconFile, LICENSE, +; README.md) is written relative to the REPO ROOT, but Inno Setup resolves +; relative paths against the directory containing this .iss by default — which +; is installer\, not the root. Point SourceDir at the root (this script lives +; in installer\, so "..") so every Source resolves. This also lands OutputDir +; at \out, where build.ps1 and release-installer.yml look for the exe. +SourceDir=.. OutputDir=out OutputBaseFilename=Flowkey-Setup-{#AppVersion} PrivilegesRequired=admin @@ -96,6 +103,10 @@ Source: "vendor\ahk\LICENSE.txt"; DestDir: "{app}\ahk"; Flags: ignoreversio Source: "scripts\grammarFix.ahk"; DestDir: "{app}\scripts"; Flags: ignoreversion Source: "scripts\lib\*"; DestDir: "{app}\scripts\lib"; Flags: ignoreversion recursesubdirs Source: "scripts\ui\*"; DestDir: "{app}\scripts\ui"; Flags: ignoreversion recursesubdirs +; Tray/window icon — grammarFix.ahk loads {app}\scripts\assets\flowkey.ico at +; runtime (A_ScriptDir "\assets\flowkey.ico"); without this it silently has no +; tray icon. Same .ico is the compile-time SetupIconFile above. +Source: "scripts\assets\*"; DestDir: "{app}\scripts\assets"; Flags: ignoreversion recursesubdirs ; --- Docs --------------------------------------------------------------------- Source: "LICENSE"; DestDir: "{app}"; Flags: ignoreversion skipifsourcedoesntexist; DestName: "LICENSE.txt" @@ -168,6 +179,7 @@ Type: filesandordirs; Name: "{app}\dist" Type: dirifempty; Name: "{app}\ahk" Type: dirifempty; Name: "{app}\scripts\lib" Type: dirifempty; Name: "{app}\scripts\ui" +Type: dirifempty; Name: "{app}\scripts\assets" Type: dirifempty; Name: "{app}\scripts" Type: dirifempty; Name: "{app}" @@ -269,8 +281,10 @@ begin end; { During uninstall: ask whether to wipe per-user config/data/logs, then act. - Runs AFTER files in {app} are removed but BEFORE the uninstaller exits, so - the prompt isn't competing with file-in-use errors. } + Runs AFTER files in the install dir are removed but BEFORE the uninstaller + exits, so the prompt isn't competing with file-in-use errors. + NB: never put an Inno brace-constant in a Pascal comment — these comments + do not nest, so the constant's closing brace would end the comment early. } procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); var Wipe: Integer;