Skip to content

Commit 59e92b1

Browse files
authored
Merge pull request #4075 from marticliment/hot-reload-package-managers
2 parents e1015cb + fda67fa commit 59e92b1

File tree

35 files changed

+586
-546
lines changed

35 files changed

+586
-546
lines changed

src/UniGetUI.Core.IconStore/IconDatabase.cs

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,11 @@ public struct IconCount
1919
public IconCount() { }
2020
}
2121

22-
private static IconDatabase? __instance;
2322

23+
private static IconDatabase? __instance;
2424
public static IconDatabase Instance
2525
{
26-
get
27-
{
28-
if (__instance is null)
29-
{
30-
Logger.Error("IconStore.Instance was not initialized, creating an empty instance.");
31-
InitializeInstance();
32-
return Instance;
33-
}
34-
return __instance;
35-
}
36-
}
37-
38-
public static void InitializeInstance()
39-
{
40-
__instance = new();
26+
get => __instance ??= new();
4127
}
4228

4329
/// <summary>
@@ -51,10 +37,12 @@ public static void InitializeInstance()
5137
/// </summary>
5238
public async Task LoadIconAndScreenshotsDatabaseAsync()
5339
{
54-
string IconsAndScreenshotsFile = Path.Join(CoreData.UniGetUICacheDirectory_Data, "Icon Database.json");
5540
try
5641
{
57-
Uri DownloadUrl = new("https://github.com/marticliment/UniGetUI/raw/refs/heads/main/WebBasedData/screenshot-database-v2.json");
42+
string IconsAndScreenshotsFile = Path.Join(CoreData.UniGetUICacheDirectory_Data, "Icon Database.json");
43+
Uri DownloadUrl =
44+
new(
45+
"https://github.com/marticliment/UniGetUI/raw/refs/heads/main/WebBasedData/screenshot-database-v2.json");
5846
if (Settings.Get(Settings.K.IconDataBaseURL))
5947
{
6048
DownloadUrl = new Uri(Settings.GetValue(Settings.K.IconDataBaseURL));
@@ -69,29 +57,29 @@ public async Task LoadIconAndScreenshotsDatabaseAsync()
6957

7058
Logger.ImportantInfo("Downloaded new icons and screenshots successfully!");
7159

60+
61+
if (!File.Exists(IconsAndScreenshotsFile))
62+
{
63+
Logger.Error("Icon Database file not found");
64+
return;
65+
}
7266
}
7367
catch (Exception e)
7468
{
7569
Logger.Warn("Failed to download icons and screenshots");
7670
Logger.Warn(e);
7771
}
7872

79-
if (!File.Exists(IconsAndScreenshotsFile))
80-
{
81-
Logger.Error("Icon Database file not found");
82-
return;
83-
}
84-
8573
// Update data with new cached file
8674
await LoadFromCacheAsync();
8775
}
8876

8977

9078
public async Task LoadFromCacheAsync()
9179
{
92-
string IconsAndScreenshotsFile = Path.Join(CoreData.UniGetUICacheDirectory_Data, "Icon Database.json");
9380
try
9481
{
82+
string IconsAndScreenshotsFile = Path.Join(CoreData.UniGetUICacheDirectory_Data, "Icon Database.json");
9583
IconScreenshotDatabase_v2 JsonData = JsonSerializer.Deserialize<IconScreenshotDatabase_v2>(
9684
await File.ReadAllTextAsync(IconsAndScreenshotsFile),
9785
SerializationHelpers.DefaultOptions

src/UniGetUI.Interface.BackgroundApi/BackgroundApi.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using UniGetUI.Interface.Enums;
1313
using UniGetUI.PackageEngine;
1414
using UniGetUI.PackageEngine.Interfaces;
15+
using UniGetUI.PackageEngine.PackageLoader;
1516

1617
namespace UniGetUI.Interface
1718
{
@@ -128,18 +129,18 @@ private async Task WIDGETS_V1_GetUpdates(HttpContext context)
128129
return;
129130
}
130131

131-
if (!PEInterface.UpgradablePackagesLoader.IsLoaded && !PEInterface.UpgradablePackagesLoader.IsLoading)
132+
if (!UpgradablePackagesLoader.Instance.IsLoaded && !UpgradablePackagesLoader.Instance.IsLoading)
132133
{
133-
_ = PEInterface.UpgradablePackagesLoader.ReloadPackages();
134+
_ = UpgradablePackagesLoader.Instance.ReloadPackages();
134135
}
135136

136-
while (PEInterface.UpgradablePackagesLoader.IsLoading)
137+
while (UpgradablePackagesLoader.Instance.IsLoading)
137138
{
138139
await Task.Delay(100);
139140
}
140141

141142
StringBuilder packages = new();
142-
foreach (IPackage package in PEInterface.UpgradablePackagesLoader.Packages)
143+
foreach (IPackage package in UpgradablePackagesLoader.Instance.Packages)
143144
{
144145
if (package.Tag is PackageTag.OnQueue or PackageTag.BeingProcessed) continue;
145146

@@ -247,7 +248,7 @@ private async Task WIDGETS_V2_GetIconForPackage(HttpContext context)
247248

248249
string iconPath = Path.Join(CoreData.UniGetUIExecutableDirectory, "Assets", "Images", "package_color.png");
249250

250-
IPackage? package = PEInterface.UpgradablePackagesLoader.GetPackageForId(packageId, packageSource);
251+
IPackage? package = UpgradablePackagesLoader.Instance.GetPackageForId(packageId, packageSource);
251252
if (package != null)
252253
{
253254
var iconUrl = await Task.Run(package.GetIconUrl);

src/UniGetUI.PAckageEngine.Interfaces/IPackageManager.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ public interface IPackageManager
1414
public string Name { get; }
1515
public string DisplayName { get; }
1616
public IManagerSource DefaultSource { get; }
17-
public bool ManagerReady { get; }
1817
public IManagerLogger TaskLogger { get; }
1918
public IMultiSourceHelper SourcesHelper { get; }
2019
public IPackageDetailsHelper DetailsHelper { get; }
Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
namespace UniGetUI.PackageEngine.Classes.Manager.ManagerHelpers
22
{
3-
public struct ManagerStatus
3+
public class ManagerStatus
44
{
55
public string Version = "";
6-
public bool Found = false;
6+
public bool Found;
77
public string ExecutablePath = "";
8-
public string ExecutableCallArgs { get; set; } = "Unset";
9-
public ManagerStatus()
10-
{ }
8+
public string ExecutableCallArgs = "Unset";
119
}
1210
}

src/UniGetUI.PackageEngine.Managers.Cargo/Cargo.cs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -138,30 +138,23 @@ protected override IReadOnlyList<Package> GetInstalledPackages_UnSafe()
138138
}
139139

140140
public override IReadOnlyList<string> FindCandidateExecutableFiles()
141+
=> CoreTools.WhichMultiple("cargo.exe");
142+
143+
protected override void _loadManagerExecutableFile(out bool found, out string path, out string callArguments)
141144
{
142-
return CoreTools.WhichMultiple("cargo.exe");
145+
var (_found, _executablePath) = GetExecutableFile();
146+
found = _found;
147+
path = _executablePath;
148+
callArguments = "";
143149
}
144150

145-
protected override ManagerStatus LoadManager()
151+
protected override void _loadManagerVersion(out string version)
146152
{
147-
var (found, executablePath) = GetExecutableFile();
148-
if (!found)
149-
{
150-
return new(){ ExecutablePath = executablePath, Found = false, Version = ""};
151-
}
152-
153-
Status = new() { ExecutablePath = executablePath, Found = found, Version = "", ExecutableCallArgs = ""};
154-
155-
using Process p = GetProcess(executablePath, "--version");
153+
using Process p = GetProcess(Status.ExecutablePath, "--version");
156154
p.Start();
157-
string version = p.StandardOutput.ReadToEnd().Trim();
155+
version = p.StandardOutput.ReadToEnd().Trim();
158156
string error = p.StandardError.ReadToEnd();
159-
if (!string.IsNullOrEmpty(error))
160-
{
161-
Logger.Error("cargo version error: " + error);
162-
}
163-
164-
return new() { ExecutablePath = executablePath, Found = found, Version = version, ExecutableCallArgs = ""};
157+
if (!string.IsNullOrEmpty(error)) Logger.Error("cargo version error: " + error);
165158
}
166159

167160
private IReadOnlyList<Package> GetPackages(LoggableTaskType taskType)

src/UniGetUI.PackageEngine.Managers.Chocolatey/Chocolatey.cs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ public override IReadOnlyList<string> FindCandidateExecutableFiles()
204204
return candidates;
205205
}
206206

207-
protected override ManagerStatus LoadManager()
207+
protected override void _loadManagerExecutableFile(out bool found, out string path, out string callArguments)
208208
{
209209
if (!Directory.Exists(OldChocoPath))
210210
{
@@ -293,19 +293,19 @@ protected override ManagerStatus LoadManager()
293293
}
294294
}
295295

296-
var (found, executable) = GetExecutableFile();
297-
ManagerStatus status = new() { Found = found, ExecutablePath = executable, ExecutableCallArgs = "", };
298-
299-
if (!status.Found)
300-
{
301-
return status;
302-
}
296+
var (_found, _path) = GetExecutableFile();
297+
found = _found;
298+
path = _path;
299+
callArguments = "";
300+
}
303301

302+
protected override void _loadManagerVersion(out string version)
303+
{
304304
Process process = new()
305305
{
306306
StartInfo = new ProcessStartInfo
307307
{
308-
FileName = status.ExecutablePath,
308+
FileName = Status.ExecutablePath,
309309
Arguments = "--version " + GetProxyArgument(),
310310
UseShellExecute = false,
311311
RedirectStandardOutput = true,
@@ -315,19 +315,21 @@ protected override ManagerStatus LoadManager()
315315
}
316316
};
317317
process.Start();
318-
status.Version = process.StandardOutput.ReadToEnd().Trim();
318+
version = process.StandardOutput.ReadToEnd().Trim();
319+
}
319320

321+
protected override void _performExtraLoadingSteps()
322+
{
320323
// If the user is running bundled chocolatey and chocolatey is not in path, add chocolatey to path
321-
if (!Settings.Get(Settings.K.UseSystemChocolatey)
322-
&& !File.Exists("C:\\ProgramData\\Chocolatey\\bin\\choco.exe"))
323-
/* && Settings.Get(Settings.K.ShownWelcomeWizard)) */
324+
if (!Settings.Get(Settings.K.UseSystemChocolatey) && !File.Exists("C:\\ProgramData\\Chocolatey\\bin\\choco.exe"))
325+
/* && Settings.Get(Settings.K.ShownWelcomeWizard)) */
324326
{
325327
string? path = Environment.GetEnvironmentVariable("PATH", EnvironmentVariableTarget.User);
326-
if (!path?.Contains(status.ExecutablePath.Replace("\\choco.exe", "\\bin")) ?? false)
328+
if (!path?.Contains(Status.ExecutablePath.Replace("\\choco.exe", "\\bin")) ?? false)
327329
{
328330
Logger.ImportantInfo("Adding chocolatey to path since it was not on path.");
329-
Environment.SetEnvironmentVariable("PATH", $"{status.ExecutablePath.Replace("\\choco.exe", "\\bin")};{path}", EnvironmentVariableTarget.User);
330-
Environment.SetEnvironmentVariable("chocolateyinstall", Path.GetDirectoryName(status.ExecutablePath), EnvironmentVariableTarget.User);
331+
Environment.SetEnvironmentVariable("PATH", $"{Status.ExecutablePath.Replace("\\choco.exe", "\\bin")};{path}", EnvironmentVariableTarget.User);
332+
Environment.SetEnvironmentVariable("chocolateyinstall", Path.GetDirectoryName(Status.ExecutablePath), EnvironmentVariableTarget.User);
331333
}
332334
else
333335
{
@@ -336,14 +338,12 @@ protected override ManagerStatus LoadManager()
336338
}
337339

338340
// Trick chocolatey into using the wanted installation
339-
var choco_dir = Path.GetDirectoryName(status.ExecutablePath)?.Replace('/', '\\').Trim('\\') ?? "";
341+
var choco_dir = Path.GetDirectoryName(Status.ExecutablePath)?.Replace('/', '\\').Trim('\\') ?? "";
340342
if (choco_dir.EndsWith("bin"))
341343
{
342344
choco_dir = choco_dir[..^3].Trim('\\');
343345
}
344346
Environment.SetEnvironmentVariable("chocolateyinstall", choco_dir, EnvironmentVariableTarget.Process);
345-
346-
return status;
347347
}
348348
}
349349
}

src/UniGetUI.PackageEngine.Managers.Dotnet/DotNet.cs

Lines changed: 19 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -126,31 +126,23 @@ protected override IReadOnlyList<Package> _getInstalledPackages_UnSafe()
126126
}
127127

128128
public override IReadOnlyList<string> FindCandidateExecutableFiles()
129-
{
130-
return CoreTools.WhichMultiple("dotnet.exe");
131-
}
129+
=> CoreTools.WhichMultiple("dotnet.exe");
132130

133-
protected override ManagerStatus LoadManager()
131+
protected override void _loadManagerExecutableFile(out bool found, out string path, out string callArguments)
134132
{
135-
var (found, path) = GetExecutableFile();
136-
ManagerStatus status = new()
137-
{
138-
ExecutablePath = path,
139-
Found = found,
140-
ExecutableCallArgs = "tool "
141-
};
142-
143-
if (!status.Found)
144-
{
145-
return status;
146-
}
147-
148-
Process process = new()
133+
var (_found, _path) = GetExecutableFile();
134+
found = _found;
135+
path = _path;
136+
callArguments = "tool ";
137+
138+
// Ensure .NET SDK is installed
139+
if (!found) return;
140+
var process = new Process()
149141
{
150142
StartInfo = new ProcessStartInfo
151143
{
152-
FileName = status.ExecutablePath,
153-
Arguments = status.ExecutableCallArgs + "-h",
144+
FileName = path,
145+
Arguments = callArguments + "-h",
154146
UseShellExecute = false,
155147
RedirectStandardOutput = true,
156148
RedirectStandardError = true,
@@ -160,17 +152,16 @@ protected override ManagerStatus LoadManager()
160152
};
161153
process.Start();
162154
process.WaitForExit();
163-
if (process.ExitCode != 0)
164-
{
165-
status.Found = false;
166-
return status;
167-
}
155+
found = process.ExitCode is 0;
156+
}
168157

169-
process = new()
158+
protected override void _loadManagerVersion(out string version)
159+
{
160+
var process = new Process()
170161
{
171162
StartInfo = new ProcessStartInfo
172163
{
173-
FileName = status.ExecutablePath,
164+
FileName = Status.ExecutablePath,
174165
Arguments = "--version",
175166
UseShellExecute = false,
176167
RedirectStandardOutput = true,
@@ -181,9 +172,7 @@ protected override ManagerStatus LoadManager()
181172
};
182173

183174
process.Start();
184-
status.Version = process.StandardOutput.ReadToEnd().Trim();
185-
186-
return status;
175+
version = process.StandardOutput.ReadToEnd().Trim();
187176
}
188177
}
189178
}

0 commit comments

Comments
 (0)