Skip to content

v1.0.4 — Self-updater hotfixes

Choose a tag to compare

@noschmarrn noschmarrn released this 19 May 14:03
Immutable release. Only release title and notes can be modified.

What's new

Emergency maintenance release after v1.0.3. The self-updater had two critical bugs that only surfaced in real-world use of v1.0.3. If you already installed v1.0.3: apply this update without fail, otherwise future auto-updates won't work correctly either.

Changes

The updater now unpacks wrapper ZIPs correctly

The release ZIPs contain a top-level versioned wrapper folder (e.g. schneespur-1.0.3/). The previous self-updater staged that wrapper as-is and then copied blindly — so the new files landed under <install>/schneespur-X.Y.Z/ instead of overwriting the live files. The state file reported success while the live code stayed on the old version.

Fixed with defensive common-prefix stripping in SchneespurUpdater::extractAndStage, mirroring the module-installer logic from v1.0.3. ZIPs with or without a wrapper folder are now both unpacked correctly.

Rollback guard no longer fires after a successful update

The rollback-protection check (counter <= last_counter) ran before same-version detection. As a result, after a successful install the next "check" against the same manifest threw a "rollback attempt" exception instead of cleanly saying "up to date".

The order is reversed — the same-version check runs first and returns null cleanly. The counter check only fires on a real manifest change.

Build packed flat

build.sh now produces ZIPs without a wrapper folder. This way the v1.0.4 update works even on v1.0.3 installs that still have the buggy old updater — the ZIPs unpack flat and overlay the live files correctly.

Recovery for v1.0.3 installs with stranded files

If a schneespur-1.0.3/ subfolder ended up on your test/live server (see bug above), clean up via FTP:

  1. Delete the schneespur-1.0.3/ subfolder in the install root (those are the never-activated v1.0.3 files).
  2. Delete bootstrap/cache/config.php (it still holds the old version; it's rebuilt on the next request).
  3. Open storage/app/schneespur_update_state.json, reset current_version to "1.0.2" and last_counter to the v1.0.2 value (typically 3) — otherwise the updater thinks you're already on 1.0.3 and won't offer v1.0.4.
  4. Click "Check for updates" in the admin — v1.0.4 should be offered and this time install cleanly.

Upgrading from v1.0.2 (clean, no history)

  1. Download the ZIP
  2. Copy the contents over the existing installation via FTP (overwrite files)
  3. Do not overwrite .env and storage/app/installed.lock
  4. If available: php artisan view:clear && php artisan config:clear
  5. Done — no DB migration needed

Or via auto-update — now works correctly too.

Requirements

  • PHP 8.3+ with ext-sodium, ext-pdo_mysql
  • MySQL/MariaDB 10.6+ or PostgreSQL 13+
  • Web hosting with write access to storage/ and bootstrap/cache/