Skip to content

[Bug]: About, App Updates — updating a winget copy from About leaves winget on the old version, so SysManager offers its own update again and runs it on itself #2889

Open

Description

@laurentiu021

Problem

The README's install line is winget install laurentiu021.SysManager, a portable package, and About's startup check (on unless the user turns it off) sees a new GitHub release hours or days before winget-pkgs accepts it. So a winget-installed copy is usually offered Download and Install first. UpdateApplier then moves the new build over Environment.ProcessPath in place. Nothing in the update path knows the copy belongs to winget: no .cs file names the laurentiu021.SysManager package or the WinGet\Packages folder, so winget keeps recording the version it installed.

Once winget-pkgs has the release:

  • winget upgrade reports SysManager as out of date, and WingetService.ParseUpgradeTable lists every row, SysManager's own included. App Updates shows "SysManager → " and the Dashboard's app-updates alert counts it, while About says it is up to date on the new version.
  • Upgrade selected on that row, and the Dashboard's Update All Apps (winget upgrade --all), ask winget to replace the exe SysManager is running from.

The same happens with no in-app update at all: a winget copy that is one release behind lists itself in App Updates, and upgrading it there targets the running file.

Steps to reproduce

  1. Install with winget install laurentiu021.SysManager and start it, while an older version is the newest in winget.
  2. When a newer GitHub release appears, use About's Download and Install update.
  3. After winget-pkgs accepts that release, open App Updates: SysManager is listed as needing the update it already has.

Expected behavior

One update channel per copy: SysManager never offers its own package in App Updates or the Dashboard, and a winget-managed copy is updated through winget, so the file and winget's record agree.

Proposed fix

  • Keep SysManager's winget id in one constant next to UpdateService.Owner/Repo, and drop rows with that id in ParseUpgradeTable, since About owns self-update. Run Update All as per-id upgrades over the listed rows so it never targets the running exe.
  • Detect a winget-managed copy (Environment.ProcessPath under %LOCALAPPDATA%\Microsoft\WinGet\Packages\laurentiu021.SysManager_*, or the per-machine WinGet\Packages folder) and, for it, either run winget upgrade --id laurentiu021.SysManager -e after the old process exits or replace Install with "Installed through winget, update it with winget".
  • Tests: an upgrade table that contains SysManager's own row lists everything except that row, and a process path under WinGet\Packages takes the winget route.

Affected tab

About, App Updates, Dashboard.

Activity

  1. laurentiu021 commented on Oct 21, 2026

    @laurentiu021
    OwnerAuthor

    The App Updates and Dashboard half is fixed in 1.130.29 (#2916).

    • App Updates no longer lists SysManager's own winget package, and the Dashboard no longer counts it. UpdateService.WingetPackageId names the package once, beside Owner and Repo.
    • Update All Apps upgrades the listed apps one by one, by id, instead of winget upgrade --all, so winget is never asked to replace the SysManager that is running. An app whose installed version winget cannot read stays out, as --all left it, and any failure still ends as "Some apps could not be updated". If the list of upgrades cannot be read, nothing is upgraded and the card says why.
    • Files: Services/UpdateService.cs, Services/WingetService.cs, Services/IWingetService.cs, with tests in WingetParserDeepTests.

    Still open here: what About does for a copy winget installed. About replaces the exe in place, so winget keeps the version it installed. Either About notices a copy under WinGet\Packages and updates it through winget, or it says that winget manages this copy and leaves the update to winget.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions