Devolutions / Devolutions/UniGetUI

[BUG] Homebrew updates hidden when installed formula has a revision suffix (e.g. 18.4_1) — version parser merges revision into minor version

Closed
#5,293 0 comments 0 reactions 1 assignee Claimed by @GabrielDuf View on GitHub
ready-for-release
Dominant language
C#
Stars
26.1k
Forks
924
Avg merge
15h 52m
Merged PRs (30d)
52

Description

### Please confirm these before moving forward

- [x] I have searched for my issue and have not found a work-in-progress/duplicate/resolved issue.
- [x] I have tested that this issue has not been fixed in the latest [(beta or stable) release](https://github.com/Devolutions/UniGetUI/releases/).
- [x] I have checked the [FAQ](https://github.com/Devolutions/UniGetUI#frequently-asked-questions) section for solutions.
- [x] This issue is about a bug (if it is not, please use the [correct template](https://github.com/Devolutions/UniGetUI/issues/new/choose)).

### UniGetUI Version

2026.2.7 (Build 107)

### Windows version, edition, and architecture

macOS 27.0.0, Apple Silicon (Arm64)

### Describe your issue

When an installed Homebrew formula has a revision suffix in its version string (e.g. `18.4_1`, produced by a Homebrew revision bump), UniGetUI detects the available update but never displays it in the UI.

Root cause: `CoreTools.VersionStringToStruct()` only treats `.`, `-`, `/`, `#` as segment separators. The underscore in `18.4_1` is silently skipped, so the revision digit `1` is concatenated into the current segment:

- `18.4_1` → parsed as Version(18, **41**, 0, 0)
- available update `18.6` → parsed as Version(18, **6**, 0, 0)

Then `Package.NewerVersionIsInstalled()` evaluates `18.41 >= 18.6` as true, and `UpgradablePackagesLoader.IsPackageValid()` silently discards the update (this branch has no log output). The manager reports the update (`Found 1 available updates from Homebrew`) but the package never reaches the UI — no details load, no log line, regardless of settings like minimum update age.

This affects any formula that has received a Homebrew revision bump (`_1`, `_2`, ...), which is common (e.g. `postgresql@18` was rebuilt as `18.4_1` on the same day 18.6 was released, making its update invisible).

### Steps to reproduce the issue

1. Have a formula installed whose version has a revision suffix, e.g. `brew list --versions` shows `postgresql@18 18.4_1`
2. Have a newer upstream version available: `brew outdated --verbose` shows `postgresql@18 (18.4_1) < 18.6`
3. Open UniGetUI → Software Updates
4. Log shows `Found 1 available updates from Homebrew`, but the updates list is empty and no further log entry mentions the package

### UniGetUI Log

```
[18.08.2026 12:14:12] Found 195 installed packages from Homebrew
[18.08.2026 12:14:13] Found 1 available updates from Homebrew
# ... no subsequent entry for postgresql@18: no "Loaded details", no "Suppressing update", nothing
```

### Package Managers Logs

```
$ brew outdated --verbose
postgresql@18 (18.4_1) < 18.6
```

### Relevant information

Relevant code paths (on `main`):

- `src/UniGetUI.Core.Tools/Tools.cs` → `VersionStringToStruct()` — `separators = ['.', '-', '/', '#']`, missing `'_'`
- `src/UniGetUI.PackageEngine.PackageManagerClasses/Packages/Package.cs` → `NewerVersionIsInstalled()` — returns true because `18.41 >= 18.6`
- `src/UniGetUI.PackageEngine.PackageLoader/UpgradablePackagesLoader.cs` → `IsPackageValid()` — drops the update silently

A possible fix is to add `'_'` to the separator list in `VersionStringToStruct()` (Homebrew revisions like `18.4_1` would then parse as 18.4.1, correctly comparing `< 18.6`). Note this may affect other managers whose version strings contain underscores, so it may be worth checking those first.

### Screenshots and videos

N/A (the bug is the absence of a UI entry)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.