Skip to content

fix: prune orphaned staged updates before downloading a new one#309

Closed
MarshallOfSound wants to merge 1 commit into
sam/patch-nskeyedarchiverfrom
sam/patch-prune-orphans
Closed

fix: prune orphaned staged updates before downloading a new one#309
MarshallOfSound wants to merge 1 commit into
sam/patch-nskeyedarchiverfrom
sam/patch-prune-orphans

Conversation

@MarshallOfSound

Copy link
Copy Markdown
Collaborator

Stacked on #307.

Upstreams fix_clean_up_orphaned_staged_updates_before_downloading_new_update.patch. Two specs (unit test of removeUpdateDirectoriesInStorageURL:excludingURL:, end-to-end bounded-count across 3 checks); replaces the previously-xit'd prune test. "quitAndInstall while 2nd check in flight" punted — needs more harness than the e2e bound provides.


Part of upstreaming electron/patches/squirrel.mac/ into this repo.

@MarshallOfSound MarshallOfSound force-pushed the sam/patch-prune-orphans branch from 7a29303 to cd65c1e Compare May 3, 2026 00:08
@MarshallOfSound MarshallOfSound force-pushed the sam/patch-nskeyedarchiver branch 2 times, most recently from 371aa09 to 5d04c6b Compare May 3, 2026 00:09
@MarshallOfSound MarshallOfSound force-pushed the sam/patch-prune-orphans branch from cd65c1e to 0b81aca Compare May 3, 2026 00:09
[upstream] electron/patches/squirrel.mac/fix_clean_up_orphaned_staged_updates_before_downloading_new_update.patch

When checkForUpdates is called while an update is already staged,
Squirrel created a new temporary directory for the download without
cleaning up the old one. Chain a pruneOrphanedUpdateDirectories step
before uniqueTemporaryDirectoryForUpdate that reads the current
ShipItState.plist, preserves the directory it references, and deletes
every other update.* directory — keeping the on-disk footprint bounded
while quitAndInstall remains safe to call.

Adds specs:
- removeUpdateDirectoriesInStorageURL:excludingURL: deletes all
  update.* dirs except the excluded one and leaves non-prefixed files
  alone
- end-to-end via TestApplication: 3 sequential checks leave at most 2
  update directories on disk

Replaces the previously-xit'd 'should remove downloaded archives after
updating' (asserted 0, never matched the 7dffc4b semantics).
@MarshallOfSound

Copy link
Copy Markdown
Collaborator Author

Folded into #312.

@MarshallOfSound MarshallOfSound deleted the branch sam/patch-nskeyedarchiver May 3, 2026 09:25
@MarshallOfSound MarshallOfSound deleted the sam/patch-prune-orphans branch May 3, 2026 09:25
MarshallOfSound added a commit that referenced this pull request May 3, 2026
Upstreams the remaining `electron/patches/squirrel.mac/` patches into
this repo so Electron can eventually drop them. Six commits, **8 files,
+537/−51**, **63 → 74 tests**.

| Commit | Upstreams | Tests added |
|---|---|---|
| `feat: SquirrelMacEnableDirectContentsWrite` |
`feat_add_new_squirrel_mac_bundle_installation_method_behind_flag` |
parent-dir-untouched e2e |
| `fix: abort install if app running; resolve target path once` |
`fix_abort_installation_attempt_at_the_final_mile_if_the_app_is` +
`fix_resolve_target_bundle_path_once_at_start_of_install` |
symlink-target rejected, abort-if-running |
| `feat: ElectronSquirrelPreventDowngrades` |
`feat_add_ability_to_prevent_version_downgrades` |
`+isVersionAllowedForUpdate:from:` units |
| `refactor: harden ShipIt launch` |
`refactor_use_posix_spawn_instead_of_nstask…` +
`fix_trigger_shipit_mach_service_after_smjobsubmit…` +
`chore_turn_off_launchapplicationaturl_deprecation…` | (existing
remote-ShipIt spec exercises new path) |
| `refactor: non-deprecated NSKeyedArchiver` |
`refactor_use_non-deprecated_nskeyedarchiver_apis` |
`SQRLInstallerOwnedBundle` round-trip |
| `fix: prune orphaned staged updates` |
`fix_clean_up_orphaned_staged_updates_before_downloading_new_update` |
unit prune + e2e bounded-count; replaces `xit` |

Fixes #124. Fixes #196. Fixes #264.

> [!NOTE]
> Two adaptations should be backported to Electron's patches:
> - `SQRLUpdater.m`: `BOOL launchPrivileged = !targetWritable` in the
original `direct-contents-write` patch shadowed the outer var — it was a
dead store
> - `SQRLInstaller.m`: `runningApplicationsWithBundleIdentifier:` throws
on `nil`; guarded it

Replaces the stacked #303 / #304 / #305 / #306 / #307 / #309. #302
(strict codesign validation) stays separate — it touches only
`SQRLCodeSignature.m`.
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