Skip to content

Polish exe packaging (icon + version metadata) and automate releases - #2

Merged
CameronCrow merged 1 commit into
mainfrom
hal/exe-packaging
Jun 20, 2026
Merged

CameronCrow merged 1 commit into
mainfrom
hal/exe-packaging

Conversation

@CameronCrow

Copy link
Copy Markdown
Owner

What

Improves how StorageAnalyzer is packaged and shipped. The repo already built a working one-file storageanalyzer.exe, but it was a bare binary — no icon, no version metadata, and every release was a manual hand-build. This PR makes the exe a proper, identifiable Windows artifact and turns releasing it into a single tag push.

Changes

  • Embedded icon + version resource (storageanalyzer.spec). The exe now carries an application icon and a Windows version resource — right-click → Properties → Details shows ProductName, FileVersion, CompanyName, and copyright. Both are derived from storageanalyzer.__version__, so they can never drift from the package version (the resource is generated into build/ at build time).
  • App icon (packaging/). storageanalyzer.ico is a squarified-treemap tile that matches the HTML report's visual identity. It's checked in (so the exe build gains no new dependency) and regenerable with python packaging/make_icon.py (Pillow, build-time only).
  • Optional installer (installer/storageanalyzer.iss + build-installer.ps1). A per-user Inno Setup installer: no admin required (installs under %LOCALAPPDATA%\Programs), opt-in "add to PATH" task, and a registered uninstaller in Apps & features. If Inno Setup isn't installed, the build script falls back to "exe only" with a note.
  • Automated releases (.github/workflows/release.yml). Builds + smoke-tests the exe and installer on windows-latest for every push/PR, and publishes a GitHub Release with both attached on a v* tag. Releasing becomes: bump __version__, git tag vX.Y.Z, git push --tags.
  • LICENSE. Adds the MIT license text (pyproject.toml already declared MIT; the installer bundles it).
  • README. Documents the icon/version metadata, the installer, and tagged releases.

Verification

  • Built the exe locally via pyinstaller storageanalyzer.spec; confirmed the embedded version resource (ProductName=StorageAnalyzer, FileVersion=1.0.0, CompanyName=Cameron Crow, MIT copyright), a present icon resource, working --version, and a successful native-engine scan producing an HTML report.
  • pytest — all 37 tests pass.
  • The committed surface is source/config only; build/, dist/, and the native .pyd remain gitignored.

Notes

  • Scope is deliberately the exe/installer + release path (per "shipping an exe is fine, not iterating much") — not the separate native-GUI effort, which is in flight on its own branch.
  • The Inno Setup installer and the GitHub Actions release flow build cleanly in principle but could not be exercised end-to-end in this headless environment (no Inno Setup installed locally; Actions needs a push to run). Worth a first manual build-installer.ps1 run and a throwaway tag to confirm.

🤖 Generated with Claude Code

…utomate releases

Turn the standalone exe from a bare, metadata-less binary built by hand into a
proper, identifiable Windows artifact with a one-command release path.

- storageanalyzer.spec now embeds an application icon and a Windows version
  resource (Properties -> Details: ProductName / version / company / copyright),
  both derived from storageanalyzer.__version__ so they can never drift from the
  package version. The version resource is generated at build time into build/.
- packaging/: committed app icon (storageanalyzer.ico -- a treemap tile that
  matches the HTML report) plus make_icon.py to regenerate it (Pillow, build-time
  only; the .ico is checked in so the exe build gains no new dependency).
- installer/storageanalyzer.iss + build-installer.ps1: optional per-user Inno
  Setup installer -- no admin, opt-in "add to PATH", registered uninstaller.
  Degrades gracefully to "exe only" when Inno Setup isn't installed.
- .github/workflows/release.yml: build + smoke-test the exe and installer on
  Windows for every push/PR, and publish a GitHub Release with both attached on
  a v* tag. Releasing becomes: bump __version__, git tag vX.Y.Z, git push --tags.
- LICENSE: add the MIT license text (pyproject already declared MIT; the
  installer bundles it).
- README: document the icon/version metadata, the installer, and tagged releases.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@CameronCrow
CameronCrow marked this pull request as ready for review June 20, 2026 15:35
@CameronCrow
CameronCrow merged commit 1c6bc7d into main Jun 20, 2026
1 check passed
@CameronCrow
CameronCrow deleted the hal/exe-packaging branch June 20, 2026 15:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant