Skip to content

Releases: MapleSyrupLover/BuzzInstaller

Da fix

Choose a tag to compare

@MapleSyrupLover MapleSyrupLover released this 09 Aug 22:27

Here's the release description for the changes:


BuzzInstaller v1.1.1

Major Change: Onedir Distribution (No More _MEI Temp Files)

BuzzInstaller now builds as a onedir distribution instead of a single-file executable. This eliminates the PyInstaller _MEIxxxxx temporary extraction/cleanup problem entirely.

What changed:

  • The app is now distributed as BuzzInstaller.zip containing the full application directory (BuzzInstaller.exe, _internal/, PySide6/, Qt DLLs, plugins, etc.)
  • No more "Failed to remove temporary directory" warnings
  • No more _MEI* folders being created in %TEMP% when launching
  • The background process (BuzzInstaller.exe --background) now runs directly from the installed directory — no handoff launcher needed
  • The installer (BuzzInstallerInstaller.exe) now downloads and extracts the entire BuzzInstaller.zip directory, preserving all DLLs, Qt plugins, and Python runtime files

Installation layout:

C:\BuzzInstaller\
    BuzzInstaller.exe
    _internal\          (all Python runtime, PySide6, Qt6*.dll, plugins)
    bz.cmd

Hotkey: Selected Text Only (Checkbox Option)

Removed clipboard-based downloading. The global hotkey now always reads the highlighted text — no more clipboard mode.

What changed:

  • The "Hotkey Mode" dropdown (Clipboard Mode / Selected Text Mode) is replaced with a simple checkbox: "Download from selected text"
  • The hotkey reads whatever text you have highlighted (using Ctrl+C simulation that preserves your full clipboard)
  • If the highlighted text is a valid BZ://code, it downloads automatically

Installer Improvements

  • The installer now prefers the BuzzInstaller.zip bundle asset over the legacy single .exe
  • Fresh installs and updates extract the entire onedir directory
  • Deletion removes the entire installation directory (not just the exe)

Verified

  • All 80+ tests pass
  • Background process starts and stays running from the onedir distribution
  • No _MEI* directories created on launch
  • BuzzInstaller.exe --versionBuzzInstaller 1.1.1

HUGE OPTIMIZATIONS!

Choose a tag to compare

@MapleSyrupLover MapleSyrupLover released this 08 Aug 00:06

BuzzInstaller 1.1.0 — Release Notes

Executive Summary

This release delivers two major improvements: a 81% reduction in executable size for both BuzzInstaller.exe and BuzzInstallerInstaller.exe, and critical stability fixes for the PyInstaller onefile cleanup, background process lifecycle, and Windows shortcut integration.


1. Executable Size Comparison

BuzzInstaller.exe

Metric Before After Change
Size (bytes) 256,744,993 49,408,266 -207,336,727
Size (MiB) ~245 MiB ~47 MiB -81%

BuzzInstallerInstaller.exe

Metric Before After Change
Size (bytes) ~250,000,000 46,773,568 -203,226,432
Size (MiB) ~240 MiB ~45 MiB -81%

Combined savings: ~410 MB across both executables

Why was it so large?

Both build scripts used --collect-all PySide6, which instructs PyInstaller to bundle every PySide6 module and plugin — including dozens of optional Qt modules that neither application uses:

  • QtWebEngine (~70 MB) — full Chromium browser engine
  • Qt3D (~30 MB) — 3D rendering framework
  • QtQuick/QtQml/QtDeclarative (~20 MB) — QML engine
  • QtCharts + QtDataVisualization (~15 MB) — data visualization
  • QtPdf (~10 MB) — PDF rendering
  • QtBluetooth/QtNfc/QtSerialPort/QtSensors (~15 MB) — hardware interfaces
  • QtQuick3D/QtSpatialAudio/QtMultimedia/QtWebSockets (~25 MB) — multimedia/3D/audio
  • Plus ~30 more optional modules

Neither BuzzInstaller nor BuzzInstallerInstaller uses any of these — both are pure QtWidgets applications (buttons, labels, progress bars, file dialogs).

What changed

src/BuzzInstaller/build/build_exe.py and src/BuzzInstallerInstaller/build/build_installer.py:

  • Removed --collect-all PySide6 — the primary fix
  • PyInstaller's standard hook-PySide6.py now collects only the actually imported modules (QtWidgets, QtCore, QtGui, QtNetwork) plus the required Qt plugins (platforms, imageformats, styles)
  • Removed unnecessary hidden imports (PySide6.QtXml, PySide6.QtMultimedia) from BuzzInstaller
  • Added system.background_launcher to hidden imports (new module from the handoff fix)
  • No functionality was removed — no modules were excluded because they were large; they were simply no longer force-collected when not imported

2. Fixes in this Release

Fix 1: PyInstaller "_MEI" Temporary Directory Cleanup Warning

Problem: When BuzzInstaller.exe (PyInstaller onefile) spawned --background, the child's bootloader inherited the parent's _MEIPASS2 environment variable and reused the parent's _MEI* extraction directory. The background process is intentionally long-lived, so it kept Qt DLLs loaded from the parent's directory — locking it. When the foreground exited, PyInstaller failed with:

Failed to remove temporary directory:
C:\Users\elial\AppData\Local\Temp\_MEIxxxxxx

Solution — background handoff mechanism:

src/BuzzInstaller/system/background_launcher.py (NEW):

  • A short-lived intermediary that waits for the foreground process to fully exit (via WaitForSingleObject — no fixed delays, no busy-wait)
  • Imports ONLY the standard library — holds no files from the parent's _MEI* directory
  • Strips _MEIPASS2 from the environment when launching the final --background process

src/BuzzInstaller/system/background_service.py (MODIFIED):

  • In frozen mode, --background is never spawned directly from the foreground
  • Instead, _launch_background_via_launcher() uses PowerShell as the intermediary (since sys.executable is the bundled exe, not python): waits via Wait-Process for the foreground PID, sets $env:_MEIPASS2 = $null, then launches BuzzInstaller.exe --background with -WindowStyle Hidden
  • Non-background launches (download UI) still spawn directly with _MEIPASS2 stripped
  • Source mode still spawns directly (no launcher needed)

Fix 2: Clean Shutdown Behavior

src/BuzzInstaller/core/buzzheavier_api.py (MODIFIED):

  • Added BuzzHeavierAPI.close() to release the requests.Session (connection pools/sockets) before process exit
  • Fixed get_download_url() to close HTTP responses with resp.close() in a finally block

src/BuzzInstaller/main.py (MODIFIED):

  • run_upload(): Added service.api.close() in worker's finally block; thread join after app.exec()
  • run_download(): Added worker_done Event, service.api.close() in finally block; thread join after app.exec()
  • Background mode: shutdown logging around svc.run() and svc.stop()
  • __main__: exit logging

Fix 3: Windows Shortcut Creation

src/BuzzInstallerInstaller/shortcut.py (NEW):

  • create_shortcut(), delete_shortcut(), get_shortcut_target() using PowerShell's WScript.Shell COM — creates real .lnk files, not text

src/BuzzInstallerInstaller/installer.py (MODIFIED):

  • create_shortcut_for_installed() creates C:\BuzzInstaller\BuzzInstaller.lnk after install/update — non-fatal on permission failure
  • delete_buzzinstaller() removes the shortcut, and only removes C:\BuzzInstaller if empty (unrelated files preserved)

3. Verification Results

Check Result
Version tests ✅ 10/10 PASS
Installer tests ✅ 24/24 PASS
Improvements tests ✅ 19/19 PASS
Shortcut tests ✅ 13/13 PASS
Background handoff tests ✅ 8/8 PASS
Total tests 74/74 PASS
BuzzInstaller.exe --version ✅ "BuzzInstaller 1.1.0"
BuzzInstaller.exe --background ✅ Idle event loop running
BuzzInstallerInstaller.exe UI ✅ Launched, real Qt GUI (69 MB working set)
Build compile checks ✅ All modified files compile

NOTE: ADD bz.cmd TO "C:\WINDOWS\System32\bz.cmd" FOR THE BZ CLI

BuzzInstaller FIXES

Choose a tag to compare

@MapleSyrupLover MapleSyrupLover released this 07 Aug 23:12

Summary of All Changes

Part 1: PyInstaller _MEI Cleanup Fix (3 files)

Root cause: When BuzzInstaller.exe (PyInstaller onefile) spawns the --background process via subprocess.Popen([sys.executable, "--background"]), the child inherits the _MEIPASS2 environment variable set by the parent's C bootloader. The child's bootloader sees _MEIPASS2 already set and reuses the parent's _MEI* extraction directory instead of extracting its own copy. The background process is intentionally long-lived, keeping Qt DLLs loaded from the parent's _MEI* directory — locking it. When the foreground exits, PyInstaller's cleanup fails.

1. src/BuzzInstaller/system/background_service.py — PRIMARY FIX

  • Strips _MEIPASS2 from the child's environment when spawning subprocesses while frozen, forcing the child to extract its own _MEI* directory.

2. src/BuzzInstaller/core/buzzheavier_api.py — NETWORK CLEANUP

  • Added BuzzHeavierAPI.close() to release the requests.Session (connection pools/sockets).
  • Fixed get_download_url() to properly close HTTP responses with resp.close() in a finally block.

3. src/BuzzInstaller/main.py — SHUTDOWN LOGGING + CLEANUP

  • run_upload(): Added service.api.close() in worker's finally block, thread join after app.exec().
  • run_download(): Added worker_done Event, service.api.close() in finally block, thread join.
  • main() background mode: Added shutdown logging around svc.run() and svc.stop().
  • __main__: Added exit logging.

Part 2: Shortcut Creation (2 new files, 1 modified)

4. src/BuzzInstallerInstaller/shortcut.py — NEW FILE

  • create_shortcut(exe_path, shortcut_path) — Creates/updates a real .lnk file using PowerShell's WScript.Shell COM object.
  • delete_shortcut(shortcut_path) — Removes a shortcut.
  • get_shortcut_target(shortcut_path) — Reads the target of an existing shortcut.

5. src/BuzzInstallerInstaller/installer.py — SHORTCUT INTEGRATION

  • create_shortcut_for_installed() — Creates C:\BuzzInstaller\BuzzInstaller.lnk after install/update.
  • delete_buzzinstaller() — Removes the shortcut on delete (only removes C:\BuzzInstaller dir if empty).
  • Installer.run() — Creates shortcut after successful install/update (best-effort, non-fatal on failure).

6. src/BuzzInstallerInstaller/tests/test_shortcut.py — NEW FILE

  • 13 tests covering: create, update, target path, working directory, permission failure, delete, missing shortcut, installer integration, unrelated file preservation.

Test Results

  • test_version.py: 10/10 PASS
  • test_installer.py: 24/24 PASS
  • test_improvements.py: 19/19 PASS
  • test_shortcut.py: 13/13 PASS
  • Total: 66/66 tests PASS
  • One-file PyInstaller build: SUCCESS (256 MB executable)

1.0.1

Choose a tag to compare

@MapleSyrupLover MapleSyrupLover released this 07 Aug 21:17

Release: v1.0.1 — Settings Label Cleanup

What's New

This patch release cleans up the Settings window label for dark mode.

Changes

  • Settings UI — The dark mode checkbox label was shortened from "Dark mode (system = auto)" to just "Dark mode". The three-state behavior is unchanged (checked = dark, unchecked = light, partially checked = system auto) — only the visible text was simplified.

Assets

  • BuzzInstaller.exe — the main application (v1.0.1)
  • BuzzInstallerInstaller.exe — the separate installer/updater

Versioning

Tag: v1.0.1 — follows the vMAJOR.MINOR.PATCH convention.

AUTOINSTALL

Choose a tag to compare

@MapleSyrupLover MapleSyrupLover released this 07 Aug 21:11

Release Description: v1.0.0 - Initial Release with Installer/Updater

What's New

This release introduces BuzzInstallerInstaller.exe - a separate, lightweight installer & updater that installs and keeps BuzzInstaller up to date from GitHub Releases.

BuzzInstallerInstaller Features

  • One-click Install — Downloads the latest release, installs to your chosen location, registers the BZ:// protocol and Explorer context menu, and launches BuzzInstaller.
  • Installation Location Selection:
    • Install to PATH — installs to %LOCALAPPDATA%\BuzzInstaller\ and adds it to your user PATH so bz works from any terminal (no admin required).
    • Custom directory — use the Browse button to pick any folder.
  • Automatic Version Check — checks GitHub Releases on startup and displays the current state (not installed / up to date / update available / newer installed).
  • Semantic Version Comparison1.10.0 correctly sorts newer than 1.9.0.
  • Safe Replacement — downloads to a temp file first, verifies it, waits for BuzzInstaller to close, then replaces. Never deletes the old executable before the new one is ready.
  • Download Progress — shows percentage and size (e.g. 180 MB / 264 MB).
  • Delete BuzzInstaller — removes the executable, PATH entry, and Windows integration with confirmation.
  • No Downgrades — won't downgrade if your installed version is newer than the latest release.

BuzzInstaller Changes

  • Settings label updated: "Dark mode" (removed "(system = auto)").
  • Config save hardened against PermissionError — cross-process lock, retry mechanism, atomic writes, preserves existing config on failure.

Assets

  • BuzzInstallerInstaller.exe — the separate installer/updater
  • BuzzInstaller.exe — the main application

Versioning

Releases use the vMAJOR.MINOR.PATCH convention (e.g. v1.0.0). The GitHub Release tag is the authoritative source for the newest published version.

Testing

53 tests pass across version comparison, installation detection, error handling, PATH management, metadata, deletion, and config concurrency.