Skip to content

Commit 443c89f

Browse files
authored
Merge pull request #2671 from marticliment/get-package-install-location
Open package install location
2 parents 2dc1fb8 + bec0ad0 commit 443c89f

File tree

20 files changed

+248
-16
lines changed

20 files changed

+248
-16
lines changed

src/UniGetUI.PAckageEngine.Interfaces/ManagerProviders/IPackageDetailsProvider.cs

+7
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,12 @@ public interface IPackageDetailsProvider
3636
/// <param name="package">The package from which to load the screenshots</param>
3737
/// <returns>An array with valid URIs to the screenshots</returns>
3838
public abstract Task<Uri[]> GetPackageScreenshotsUrl(IPackage package);
39+
40+
/// <summary>
41+
/// Returns the location where the package is installed, or null if the location cannot be loaded.
42+
/// </summary>
43+
/// <param name="package">The package for which to get the location</param>
44+
/// <returns>A valid path in the form of a string or a null object</returns>
45+
public abstract string? GetPackageInstallLocation(IPackage package);
3946
}
4047
}

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

+22
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,27 @@ protected override async Task<string[]> GetPackageVersions_Unsafe(IPackage packa
4949

5050
return versions.ToArray();
5151
}
52+
53+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
54+
{
55+
string portable_path = Manager.Status.ExecutablePath.Replace("choco.exe", $"bin\\{package.Id}.exe");
56+
if (File.Exists(portable_path))
57+
return Path.GetDirectoryName(portable_path);
58+
59+
foreach (var base_path in new string[]
60+
{
61+
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
62+
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
63+
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs"),
64+
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
65+
})
66+
{
67+
var path_with_id = Path.Join(base_path, package.Id);
68+
if (Directory.Exists(path_with_id)) return path_with_id;
69+
}
70+
71+
return Path.Join(Path.GetDirectoryName(Manager.Status.ExecutablePath), "lib", package.Id);
72+
73+
}
5274
}
5375
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using UniGetUI.PackageEngine.Enums;
1010
using UniGetUI.PackageEngine.ManagerClasses.Classes;
1111
using UniGetUI.PackageEngine.ManagerClasses.Manager;
12+
using UniGetUI.PackageEngine.Managers.Chocolatey;
1213
using UniGetUI.PackageEngine.Managers.PowerShellManager;
1314
using UniGetUI.PackageEngine.PackageClasses;
1415
using UniGetUI.PackageEngine.Structs;
@@ -58,6 +59,7 @@ public DotNet()
5859
KnownSources = [new ManagerSource(this, "nuget.org", new Uri("https://www.nuget.org/api/v2"))],
5960
};
6061

62+
PackageDetailsProvider = new DotNetDetailsProvider(this);
6163
OperationProvider = new DotNetOperationProvider(this);
6264
}
6365

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
using System.Diagnostics;
2+
using UniGetUI.PackageEngine.Enums;
3+
using UniGetUI.PackageEngine.Interfaces;
4+
using UniGetUI.PackageEngine.ManagerClasses.Classes;
5+
using UniGetUI.PackageEngine.Managers.PowerShellManager;
6+
7+
namespace UniGetUI.PackageEngine.Managers.Chocolatey
8+
{
9+
public class DotNetDetailsProvider : BaseNuGetDetailsProvider
10+
{
11+
public DotNetDetailsProvider(BaseNuGet manager) : base(manager)
12+
{ }
13+
14+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
15+
{
16+
return Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".dotnet", "tools");
17+
}
18+
}
19+
}

src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGet.cs

+1-10
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,6 @@ namespace UniGetUI.PackageEngine.Managers.PowerShellManager
1111
{
1212
public abstract class BaseNuGet : PackageManager
1313
{
14-
public static new string[] FALSE_PACKAGE_NAMES = [""];
15-
public static new string[] FALSE_PACKAGE_IDS = [""];
16-
public static new string[] FALSE_PACKAGE_VERSIONS = [""];
17-
18-
public BaseNuGet()
19-
{
20-
PackageDetailsProvider = new BaseNuGetDetailsProvider(this);
21-
}
22-
2314
public sealed override async Task InitializeAsync()
2415
{
2516
if (PackageDetailsProvider is not BaseNuGetDetailsProvider)
@@ -62,7 +53,7 @@ protected sealed override async Task<Package[]> FindPackages_UnSafe(string query
6253
{
6354
sources = [ Properties.DefaultSource ];
6455
}
65-
56+
6657
foreach(IManagerSource source in sources)
6758
{
6859
Uri SearchUrl = new($"{source.Url}/Search()?searchTerm=%27{HttpUtility.UrlEncode(query)}%27&targetFramework=%27%27&includePrerelease=false");

src/UniGetUI.PackageEngine.Managers.Generic.NuGet/BaseNuGetDetailsProvider.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace UniGetUI.PackageEngine.Managers.PowerShellManager
1313
{
14-
public class BaseNuGetDetailsProvider : BasePackageDetailsProvider<PackageManager>
14+
public abstract class BaseNuGetDetailsProvider : BasePackageDetailsProvider<PackageManager>
1515
{
1616
public BaseNuGetDetailsProvider(BaseNuGet manager) : base(manager) { }
1717

@@ -145,6 +145,7 @@ protected override Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage package)
145145
throw new NotImplementedException();
146146
}
147147

148+
148149
protected override async Task<string[]> GetPackageVersions_Unsafe(IPackage package)
149150
{
150151
Uri SearchUrl = new($"{package.Source.Url}/FindPackagesById()?id='{package.Id}'");

src/UniGetUI.PackageEngine.Managers.Npm/Providers/NpmPackageDetailsProvider.cs

+10
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using UniGetUI.Core.Logging;
44
using UniGetUI.Core.Tools;
55
using UniGetUI.PackageEngine.Classes.Manager.BaseProviders;
6+
using UniGetUI.PackageEngine.Enums;
67
using UniGetUI.PackageEngine.Interfaces;
78
using UniGetUI.PackageEngine.ManagerClasses.Classes;
89
using UniGetUI.PackageEngine.ManagerClasses.Manager;
@@ -110,6 +111,15 @@ protected override Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage package)
110111
throw new NotImplementedException();
111112
}
112113

114+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
115+
{
116+
if (package.OverridenOptions.Scope is PackageScope.Local)
117+
return Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "node_modules", package.Id);
118+
else
119+
return Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Roaming", "npm",
120+
"node_modules", package.Id);
121+
}
122+
113123
protected override async Task<string[]> GetPackageVersions_Unsafe(IPackage package)
114124
{
115125
Process p = new()

src/UniGetUI.PackageEngine.Managers.Pip/Providers/PipPackageDetailsProvider.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using UniGetUI.Core.IconEngine;
55
using UniGetUI.Core.Tools;
66
using UniGetUI.PackageEngine.Classes.Manager.BaseProviders;
7+
using UniGetUI.PackageEngine.Enums;
78
using UniGetUI.PackageEngine.Interfaces;
89
using UniGetUI.PackageEngine.ManagerClasses.Classes;
910
using UniGetUI.PackageEngine.ManagerClasses.Manager;
@@ -136,7 +137,6 @@ protected override async Task GetPackageDetails_Unsafe(IPackageDetails details)
136137
catch (Exception ex) { logger.Error("Can't load installer data: " + ex); }
137138

138139
logger.Close(0);
139-
return;
140140
}
141141

142142
protected override Task<CacheableIcon?> GetPackageIcon_Unsafe(IPackage package)
@@ -149,6 +149,12 @@ protected override Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage package)
149149
throw new NotImplementedException();
150150
}
151151

152+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
153+
{
154+
var full_path = Path.Join(Path.GetDirectoryName(Manager.Status.ExecutablePath), "Lib", "site-packages", package.Id);
155+
return Directory.Exists(full_path) ? full_path : Path.GetDirectoryName(full_path);
156+
}
157+
152158
protected override async Task<string[]> GetPackageVersions_Unsafe(IPackage package)
153159
{
154160
Process p = new()

src/UniGetUI.PackageEngine.Managers.PowerShell/PowerShell.cs

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using UniGetUI.PackageEngine.Enums;
99
using UniGetUI.PackageEngine.ManagerClasses.Classes;
1010
using UniGetUI.PackageEngine.ManagerClasses.Manager;
11+
using UniGetUI.PackageEngine.Managers.Chocolatey;
1112
using UniGetUI.PackageEngine.PackageClasses;
1213

1314
namespace UniGetUI.PackageEngine.Managers.PowerShellManager
@@ -49,6 +50,7 @@ public PowerShell()
4950
DefaultSource = new ManagerSource(this, "PSGallery", new Uri("https://www.powershellgallery.com/api/v2")),
5051
};
5152

53+
PackageDetailsProvider = new PowerShellDetailsProvider(this);
5254
SourceProvider = new PowerShellSourceProvider(this);
5355
OperationProvider = new PowerShellOperationProvider(this);
5456
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Diagnostics;
2+
using Windows.ApplicationModel.Core;
3+
using UniGetUI.PackageEngine.Enums;
4+
using UniGetUI.PackageEngine.Interfaces;
5+
using UniGetUI.PackageEngine.ManagerClasses.Classes;
6+
using UniGetUI.PackageEngine.Managers.PowerShellManager;
7+
8+
namespace UniGetUI.PackageEngine.Managers.Chocolatey
9+
{
10+
public class PowerShellDetailsProvider : BaseNuGetDetailsProvider
11+
{
12+
public PowerShellDetailsProvider(BaseNuGet manager) : base(manager)
13+
{ }
14+
15+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
16+
{
17+
var user_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
18+
"WindowsPowerShell", "Modules", package.Id);
19+
if (Directory.Exists(user_path)) return user_path;
20+
21+
var system_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
22+
"WindowsPowerShell", "Modules", package.Id);
23+
if (Directory.Exists(system_path)) return system_path;
24+
25+
return null;
26+
}
27+
}
28+
}

src/UniGetUI.PackageEngine.Managers.PowerShell7/PowerShell7.cs

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using UniGetUI.PackageEngine.Enums;
99
using UniGetUI.PackageEngine.ManagerClasses.Classes;
1010
using UniGetUI.PackageEngine.ManagerClasses.Manager;
11+
using UniGetUI.PackageEngine.Managers.Chocolatey;
1112
using UniGetUI.PackageEngine.Managers.PowerShellManager;
1213
using UniGetUI.PackageEngine.PackageClasses;
1314

@@ -50,6 +51,7 @@ public PowerShell7()
5051
DefaultSource = new ManagerSource(this, "PSGallery", new Uri("https://www.powershellgallery.com/api/v2")),
5152
};
5253

54+
PackageDetailsProvider = new PowerShell7DetailsProvider(this);
5355
SourceProvider = new PowerShell7SourceProvider(this);
5456
OperationProvider = new PowerShell7OperationProvider(this);
5557
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System.Diagnostics;
2+
using UniGetUI.PackageEngine.Enums;
3+
using UniGetUI.PackageEngine.Interfaces;
4+
using UniGetUI.PackageEngine.ManagerClasses.Classes;
5+
using UniGetUI.PackageEngine.Managers.PowerShellManager;
6+
7+
namespace UniGetUI.PackageEngine.Managers.Chocolatey
8+
{
9+
public class PowerShell7DetailsProvider : BaseNuGetDetailsProvider
10+
{
11+
public PowerShell7DetailsProvider(BaseNuGet manager) : base(manager)
12+
{
13+
}
14+
15+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
16+
{
17+
var user_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
18+
"PowerShell", "Modules", package.Id);
19+
if (Directory.Exists(user_path)) return user_path;
20+
21+
var system_path = Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
22+
"PowerShell", "Modules", package.Id);
23+
if (Directory.Exists(system_path)) return system_path;
24+
25+
return null;
26+
}
27+
}
28+
}

src/UniGetUI.PackageEngine.Managers.Scoop/Providers/ScoopPackageDetailsProvider.cs

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Diagnostics;
22
using System.Text.Json.Nodes;
3+
using Windows.System;
34
using UniGetUI.Core.IconEngine;
45
using UniGetUI.Core.Logging;
56
using UniGetUI.Core.Tools;
@@ -198,6 +199,12 @@ protected override Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage package)
198199
throw new NotImplementedException();
199200
}
200201

202+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
203+
{
204+
return Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "scoop", "apps",
205+
package.Id, "current");
206+
}
207+
201208
#pragma warning disable
202209
protected override async Task<string[]> GetPackageVersions_Unsafe(IPackage package)
203210
{

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

+28
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using System.Globalization;
22
using System.Net;
33
using System.Text.RegularExpressions;
4+
using ABI.Windows.UI.Composition;
45
using UniGetUI.Core.IconEngine;
56
using UniGetUI.Core.Logging;
67
using UniGetUI.PackageEngine.Classes.Manager.BaseProviders;
78
using UniGetUI.PackageEngine.Interfaces;
9+
using UniGetUI.PackageEngine.PackageClasses;
810
using UniGetUIManagers = UniGetUI.PackageEngine.ManagerClasses.Manager;
911

1012
namespace UniGetUI.PackageEngine.Managers.WingetManager
@@ -91,6 +93,32 @@ protected override async Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage packa
9193
return FoundIcons.ToArray();
9294
}
9395

96+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
97+
{
98+
foreach (var base_path in new string[]
99+
{
100+
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles),
101+
Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86),
102+
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Programs"),
103+
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "WinGet", "Packages"),
104+
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "WinGet", "Packages"),
105+
Path.Join(Environment.GetFolderPath(Environment.SpecialFolder.Programs), "WinGet", "Packages"),
106+
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
107+
})
108+
{
109+
var path_with_name = Path.Join(base_path, package.Name);
110+
if (Directory.Exists(path_with_name)) return path_with_name;
111+
112+
var path_with_id = Path.Join(base_path, package.Id);
113+
if (Directory.Exists(path_with_id)) return path_with_id;
114+
115+
var path_with_source = Path.Join(base_path, $"{package.Id}_{package.Source.Name}");
116+
if (Directory.Exists(path_with_source)) return path_with_source;
117+
}
118+
119+
return null;
120+
}
121+
94122
private static async Task<string?> GetMicrosoftStorePackageManifest(IPackage package)
95123
{
96124
if (__msstore_package_manifests.TryGetValue(package.Id, out var manifest))

src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/BaseProviders/BasePackageDetailsProvider.cs

+24
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,29 @@ public async Task<Uri[]> GetPackageScreenshotsUrl(IPackage package)
102102
protected abstract Task<string[]> GetPackageVersions_Unsafe(IPackage package);
103103
protected abstract Task<CacheableIcon?> GetPackageIcon_Unsafe(IPackage package);
104104
protected abstract Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage package);
105+
protected abstract string? GetPackageInstallLocation_Unsafe(IPackage package);
106+
107+
public string? GetPackageInstallLocation(IPackage package)
108+
{
109+
try
110+
{
111+
string? path = GetPackageInstallLocation_Unsafe(package);
112+
if (path is not null && !Directory.Exists(path))
113+
{
114+
Logger.Warn($"Path returned by the package manager \"{path}\" did not exist while loading package install location for package Id={package.Id} with Manager={package.Manager.Name}");
115+
return null;
116+
}
117+
118+
return path;
119+
}
120+
catch (Exception ex)
121+
{
122+
Logger.Error($"An error occurred while loading package install location for package Id={package.Id} with Manager={package.Manager.Name}");
123+
Logger.Error(ex);
124+
return null;
125+
}
126+
}
127+
128+
105129
}
106130
}

src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/Classes/NullPackageManager.cs

+5
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ public Task<Uri[]> GetPackageScreenshotsUrl(IPackage package)
117117
throw new NotImplementedException();
118118
}
119119

120+
public string? GetPackageInstallLocation(IPackage package)
121+
{
122+
throw new NotImplementedException();
123+
}
124+
120125
public Task<string[]> GetPackageVersions(IPackage package)
121126
{
122127
throw new NotImplementedException();

src/UniGetUI.PackageEngine.PackageManagerClasses/Manager/PackageManager.cs

+10
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,11 @@ public async Task<Uri[]> GetPackageScreenshotsUrl(IPackage package)
413413
return [];
414414
}
415415
}
416+
417+
public string? GetPackageInstallLocation(IPackage package)
418+
{
419+
return PackageDetailsProvider.GetPackageInstallLocation(package);
420+
}
416421
// END PACKAGEDETAILS-RELATED METHODS
417422

418423

@@ -503,6 +508,11 @@ protected override async Task<Uri[]> GetPackageScreenshots_Unsafe(IPackage packa
503508
return [];
504509
}
505510

511+
protected override string? GetPackageInstallLocation_Unsafe(IPackage package)
512+
{
513+
return null;
514+
}
515+
506516
protected override async Task<string[]> GetPackageVersions_Unsafe(IPackage package)
507517
{
508518
return [];

0 commit comments

Comments
 (0)