Skip to content

Commit 63abb29

Browse files
committed
Fix a bug where duplicate packages would appear on installed packages page (fix #4100)
1 parent 36c7fd7 commit 63abb29

File tree

3 files changed

+109
-77
lines changed

3 files changed

+109
-77
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,6 @@ InstallerExtras/MsiCreator/UniGetUISetup.msi
8787
src/global.json
8888
UniGetUI.Installer.ms-store-test.exe
8989
UniGetUI Installer_winget-fix-test.exe
90-
InstallerExtras/uninst-*.e32
90+
InstallerExtras/uninst-*.e32
91+
src/.idea/.idea.UniGetUI/.idea/copilot.data.migration.edit.xml
92+
src/.idea/.idea.UniGetUI/.idea/copilot.data.migration.agent.xml

src/UniGetUI.PackageEngine.PackageLoader/AbstractPackageLoader.cs

Lines changed: 61 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Concurrent;
2+
using UniGetUI.Core.Logging;
23
using UniGetUI.Core.Tools;
34
using UniGetUI.PackageEngine.Interfaces;
45

@@ -119,71 +120,89 @@ protected void InvokeFinishedLoadingEvent()
119120
/// </summary>
120121
public virtual async Task ReloadPackages()
121122
{
122-
if (DISABLE_RELOAD)
123+
try
123124
{
124-
InvokePackagesChangedEvent(false, [], []);
125-
return;
126-
}
127-
128-
ClearPackages(emitFinishSignal: false);
129-
LoadOperationIdentifier = new Random().Next();
130-
int current_identifier = LoadOperationIdentifier;
131-
IsLoading = true;
132-
StartedLoading?.Invoke(this, EventArgs.Empty);
125+
if (DISABLE_RELOAD)
126+
{
127+
InvokePackagesChangedEvent(false, [], []);
128+
return;
129+
}
133130

134-
if (REQUIRES_INTERNET)
135-
{
136-
await CoreTools.WaitForInternetConnection();
137-
}
131+
if (IsLoading)
132+
{
133+
Logger.Debug($"[{this.GetType()}] Packages are already being loaded!!!");
134+
return;
135+
}
138136

139-
List<Task<IReadOnlyList<IPackage>>> tasks = [];
137+
ClearPackages(emitFinishSignal: false);
138+
LoadOperationIdentifier = new Random().Next();
139+
int current_identifier = LoadOperationIdentifier;
140+
IsLoading = true;
141+
StartedLoading?.Invoke(this, EventArgs.Empty);
140142

141-
foreach (IPackageManager manager in Managers)
142-
{
143-
if (manager.IsReady())
143+
if (REQUIRES_INTERNET)
144144
{
145-
Task<IReadOnlyList<IPackage>> task = Task.Run(() => LoadPackagesFromManager(manager));
146-
tasks.Add(task);
145+
await CoreTools.WaitForInternetConnection();
147146
}
148-
}
149147

150-
while (tasks.Count > 0)
151-
{
152-
foreach (Task<IReadOnlyList<IPackage>> task in tasks.ToArray())
148+
List<Task<IReadOnlyList<IPackage>>> tasks = [];
149+
150+
foreach (IPackageManager manager in Managers)
153151
{
154-
if (!task.IsCompleted)
152+
if (manager.IsReady())
155153
{
156-
await Task.Delay(100).ConfigureAwait(false);
154+
Task<IReadOnlyList<IPackage>> task = Task.Run(() => LoadPackagesFromManager(manager));
155+
tasks.Add(task);
157156
}
157+
}
158158

159-
if (task.IsCompleted)
159+
while (tasks.Count > 0)
160+
{
161+
foreach (Task<IReadOnlyList<IPackage>> task in tasks.ToArray())
160162
{
161-
if (LoadOperationIdentifier == current_identifier && task.IsCompletedSuccessfully)
163+
if (!task.IsCompleted)
162164
{
163-
var toAdd = new List<IPackage>();
164-
foreach (IPackage package in task.Result)
165+
await Task.Delay(100).ConfigureAwait(false);
166+
}
167+
168+
if (task.IsCompleted)
169+
{
170+
if (LoadOperationIdentifier == current_identifier && task.IsCompletedSuccessfully)
165171
{
166-
if (Contains(package) || !await IsPackageValid(package))
172+
var toAdd = new List<IPackage>();
173+
foreach (IPackage package in task.Result)
167174
{
168-
continue;
175+
if (Contains(package) || !await IsPackageValid(package))
176+
{
177+
continue;
178+
}
179+
180+
toAdd.Add(package);
181+
await AddPackage(package);
169182
}
170183

171-
toAdd.Add(package);
172-
await AddPackage(package);
184+
InvokePackagesChangedEvent(true, toAdd, []);
173185
}
174-
InvokePackagesChangedEvent(true, toAdd, []);
186+
187+
tasks.Remove(task);
175188
}
176-
tasks.Remove(task);
177189
}
178190
}
179-
}
180191

181-
if (LoadOperationIdentifier == current_identifier)
192+
if (LoadOperationIdentifier == current_identifier)
193+
{
194+
InvokeFinishedLoadingEvent();
195+
IsLoaded = true;
196+
}
197+
198+
IsLoading = false;
199+
}
200+
catch (Exception ex)
182201
{
183-
InvokeFinishedLoadingEvent();
184-
IsLoaded = true;
202+
Logger.Error(ex);
203+
IsLoading = false;
204+
throw;
185205
}
186-
IsLoading = false;
187206
}
188207

189208
/// <summary>
@@ -310,16 +329,7 @@ public IReadOnlyList<IPackage> GetEquivalentPackages(IPackage? package)
310329
return [];
311330
}
312331

313-
List<IPackage> result = [];
314-
long hash_to_match = package.GetHash();
315-
foreach (IPackage local_package in Packages)
316-
{
317-
if (local_package.GetHash() == hash_to_match)
318-
{
319-
result.Add(local_package);
320-
}
321-
}
322-
return result;
332+
return Packages.Where(p => p.IsEquivalentTo(package)).ToArray();
323333
}
324334

325335
public IPackage? GetPackageForId(string id, string? sourceName = null)

src/UniGetUI.PackageEngine.PackageLoader/InstalledPackagesLoader.cs

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -46,51 +46,71 @@ protected override async Task WhenAddingPackage(IPackage package)
4646

4747
public async Task ReloadPackagesSilently()
4848
{
49-
IsLoading = true;
50-
InvokeStartedLoadingEvent();
51-
52-
List<Task<IReadOnlyList<IPackage>>> tasks = [];
53-
54-
foreach (IPackageManager manager in Managers)
49+
if (IsLoading)
5550
{
56-
if (manager.IsEnabled() && manager.Status.Found)
57-
{
58-
Task<IReadOnlyList<IPackage>> task = Task.Run(() => LoadPackagesFromManager(manager));
59-
tasks.Add(task);
60-
}
51+
Logger.Debug($"[{this.GetType()}] Packages are already being loaded!!!");
52+
return;
6153
}
6254

63-
while (tasks.Count > 0)
55+
try
6456
{
65-
foreach (Task<IReadOnlyList<IPackage>> task in tasks.ToArray())
57+
IsLoading = true;
58+
InvokeStartedLoadingEvent();
59+
60+
List<Task<IReadOnlyList<IPackage>>> tasks = [];
61+
62+
foreach (IPackageManager manager in Managers)
6663
{
67-
if (!task.IsCompleted)
64+
if (manager.IsEnabled() && manager.Status.Found)
6865
{
69-
await Task.Delay(100);
66+
Task<IReadOnlyList<IPackage>> task = Task.Run(() => LoadPackagesFromManager(manager));
67+
tasks.Add(task);
7068
}
69+
}
7170

72-
if (task.IsCompleted)
71+
while (tasks.Count > 0)
72+
{
73+
foreach (Task<IReadOnlyList<IPackage>> task in tasks.ToArray())
7374
{
74-
if (task.IsCompletedSuccessfully)
75+
if (!task.IsCompleted)
7576
{
76-
foreach (IPackage package in task.Result)
77+
await Task.Delay(100);
78+
}
79+
80+
if (task.IsCompleted)
81+
{
82+
if (task.IsCompletedSuccessfully)
7783
{
78-
if (!Contains(package))
84+
var toAdd = new List<IPackage>();
85+
foreach (IPackage package in task.Result)
7986
{
87+
if (Contains(package) || !await IsPackageValid(package))
88+
{
89+
continue;
90+
}
91+
8092
Logger.ImportantInfo($"Adding missing package {package.Id} to installed packages list");
93+
toAdd.Add(package);
8194
await AddPackage(package);
8295
}
96+
97+
InvokePackagesChangedEvent(true, toAdd, []);
8398
}
84-
InvokePackagesChangedEvent(true, task.Result.ToArray(), []);
99+
100+
tasks.Remove(task);
85101
}
86-
tasks.Remove(task);
87102
}
88103
}
89-
}
90-
91-
InvokeFinishedLoadingEvent();
92-
IsLoading = false;
93104

105+
InvokeFinishedLoadingEvent();
106+
IsLoading = false;
107+
}
108+
catch (Exception ex)
109+
{
110+
Logger.Error(ex);
111+
IsLoading = false;
112+
throw;
113+
}
94114
}
95115
}
96116
}

0 commit comments

Comments
 (0)