Skip to content

Commit 78da8c2

Browse files
authored
Fix empty WinGet update list on fresh launch + bump pinget to 0.9.0 (#4913)
1 parent cd26228 commit 78da8c2

7 files changed

Lines changed: 40 additions & 3 deletions

File tree

src/UniGetUI.Avalonia/UniGetUI.Avalonia.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@
138138
<PackageReference Include="Octokit" Version="14.0.0" />
139139
<PackageReference Include="Avalonia.Controls.WebView" Version="12.0.0" />
140140
<PackageReference Include="Tmds.DBus.Protocol" Version="0.92.0" />
141-
<PackageReference Include="Devolutions.Pinget.Cli.Rust" Version="0.8.2" GeneratePathProperty="true" ExcludeAssets="build;buildTransitive;native" />
141+
<PackageReference Include="Devolutions.Pinget.Cli.Rust" Version="0.9.0" GeneratePathProperty="true" ExcludeAssets="build;buildTransitive;native" />
142142
</ItemGroup>
143143

144144
<ItemGroup>

src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/PingetCliHelper.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details)
178178

179179
private T RunJson<T>(LoggableTaskType taskType, string arguments)
180180
{
181+
using var _cliLock = WinGet.AcquireCliLock();
181182
using Process process = new()
182183
{
183184
StartInfo = new ProcessStartInfo

src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/PingetPackageDetailsProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ private static IReadOnlyList<string> BuildShowArguments(PackageQuery query, stri
149149

150150
private string RunPinget(IReadOnlyList<string> arguments, INativeTaskLogger logger)
151151
{
152+
using var _cliLock = WinGet.AcquireCliLock();
152153
using Process process = new()
153154
{
154155
StartInfo = new ProcessStartInfo

src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/WinGetCliHelper.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ IPingetPackageDetailsProvider packageDetailsProvider
4040

4141
public IReadOnlyList<Package> GetAvailableUpdates_UnSafe()
4242
{
43+
using var _cliLock = WinGet.AcquireCliLock();
4344
List<Package> Packages = [];
4445
using Process p = new()
4546
{
@@ -175,6 +176,7 @@ public IReadOnlyList<Package> GetAvailableUpdates_UnSafe()
175176

176177
public IReadOnlyList<Package> GetInstalledPackages_UnSafe()
177178
{
179+
using var _cliLock = WinGet.AcquireCliLock();
178180
List<Package> Packages = [];
179181
using Process p = new()
180182
{
@@ -307,6 +309,7 @@ public IReadOnlyList<Package> GetInstalledPackages_UnSafe()
307309

308310
public IReadOnlyList<Package> FindPackages_UnSafe(string query)
309311
{
312+
using var _cliLock = WinGet.AcquireCliLock();
310313
List<Package> Packages = [];
311314
using Process p = new()
312315
{
@@ -435,6 +438,7 @@ public void GetPackageDetails_UnSafe(IPackageDetails details)
435438

436439
public IReadOnlyList<string> GetInstallableVersions_Unsafe(IPackage package)
437440
{
441+
using var _cliLock = WinGet.AcquireCliLock();
438442
using Process p = new()
439443
{
440444
StartInfo = new ProcessStartInfo
@@ -498,6 +502,7 @@ public IReadOnlyList<string> GetInstallableVersions_Unsafe(IPackage package)
498502

499503
public IReadOnlyList<IManagerSource> GetSources_UnSafe()
500504
{
505+
using var _cliLock = WinGet.AcquireCliLock();
501506
List<IManagerSource> sources = [];
502507

503508
using Process p = new()

src/UniGetUI.PackageEngine.Managers.WinGet/UniGetUI.PackageEngine.Managers.WinGet.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
</ItemGroup>
2525

2626
<ItemGroup>
27-
<PackageReference Include="Devolutions.Pinget.Core" Version="0.8.2" />
27+
<PackageReference Include="Devolutions.Pinget.Core" Version="0.9.0" />
2828
<PackageReference Include="PhotoSauce.MagicScaler" Version="0.15.0" />
2929
</ItemGroup>
3030
</Project>

src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,35 @@ public class WinGet : PackageManager
5959
internal WinGetCliToolKind SelectedCliToolKind { get; private set; } =
6060
WinGetCliToolKind.SystemWinGet;
6161

62+
// winget's local index isn't safe under concurrent process access: a `source update` (writer)
63+
// running alongside list/upgrade/search (readers) yields partial or empty results. The COM
64+
// backend serialized this implicitly; the CLI backends (winget.exe / pinget.exe) must do it
65+
// explicitly. Reentrant (Monitor) so same-thread nested invocations don't self-deadlock.
66+
private static readonly object _cliInvocationLock = new();
67+
68+
// Safety valve: never wait on the CLI lock longer than this, so a hung process can't freeze all WinGet queries.
69+
private static readonly TimeSpan CliLockTimeout = TimeSpan.FromSeconds(120);
70+
71+
internal static IDisposable AcquireCliLock()
72+
{
73+
bool taken = false;
74+
Monitor.TryEnter(_cliInvocationLock, CliLockTimeout, ref taken);
75+
if (!taken)
76+
Logger.Warn("WinGet CLI lock not acquired within timeout; proceeding unserialized to avoid a hang.");
77+
return new CliLockReleaser(taken);
78+
}
79+
80+
private sealed class CliLockReleaser(bool taken) : IDisposable
81+
{
82+
private bool _released;
83+
public void Dispose()
84+
{
85+
if (_released || !taken) return;
86+
_released = true;
87+
Monitor.Exit(_cliInvocationLock);
88+
}
89+
}
90+
6291
public WinGet()
6392
{
6493
Capabilities = new ManagerCapabilities
@@ -719,6 +748,7 @@ private static void TryRepairTempFolderPermissions()
719748

720749
public override void RefreshPackageIndexes()
721750
{
751+
using var _cliLock = AcquireCliLock();
722752
using Process p = new()
723753
{
724754
StartInfo = new ProcessStartInfo

src/UniGetUI/UniGetUI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@
221221
<PackageReference Include="IdentityModel.OidcClient" Version="6.0.0" />
222222
<PackageReference Include="Octokit" Version="14.0.0" />
223223
<PackageReference Include="Devolutions.UniGetUI.Elevator" Version="2.6.1.3" GeneratePathProperty="true" ExcludeAssets="build;buildTransitive;native" />
224-
<PackageReference Include="Devolutions.Pinget.Cli.Rust" Version="0.8.2" GeneratePathProperty="true" ExcludeAssets="build;buildTransitive;native" />
224+
<PackageReference Include="Devolutions.Pinget.Cli.Rust" Version="0.9.0" GeneratePathProperty="true" ExcludeAssets="build;buildTransitive;native" />
225225

226226
<Manifest Include="$(ApplicationManifest)" />
227227
</ItemGroup>

0 commit comments

Comments
 (0)