Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
<!-- IF BUILD FAILS DUE TO MISSING Microsoft.Management.Deployment NAMESPACE,
TOGGLE THE LAST NUMBER OF THE LINE BELOW 1 UNIT UP OR DOWN, AND REBUILD-->
<WindowsSdkPackageVersion>10.0.26100.57</WindowsSdkPackageVersion>
<WindowsSdkPackageVersion>10.0.26100.56</WindowsSdkPackageVersion>

<SdkVersion>8.0.407</SdkVersion>
<Authors>Martí Climent and the contributors</Authors>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
"si": "Sinhala - සිංහල",
"sl": "Slovene - Slovenščina",
"sv": "Swedish - Svenska",
"ta": "Tamil - தமிழ்",
"tg": "Tagalog - Tagalog",
"th": "Thai - ภาษาไทย",
"tr": "Turkish - Türkçe",
Expand Down
9 changes: 8 additions & 1 deletion src/UniGetUI.PAckageEngine.Interfaces/IPackage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using UniGetUI.Core.Tools;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Classes.Serializable;
using UniGetUI.PackageEngine.Serializable;
using UniGetUI.PackageEngine.Structs;

namespace UniGetUI.PackageEngine.Interfaces
Expand Down Expand Up @@ -118,7 +119,7 @@ public interface IPackage : INotifyPropertyChanged, IEquatable<IPackage>
/// Returns the corresponding installed Package object. Will return null if not applicable
/// </summary>
/// <returns>a Package object if found, null if not</returns>
public IPackage? GetInstalledPackage();
public IReadOnlyList<IPackage> GetInstalledPackages();

/// <summary>
/// Returns the corresponding available Package object. Will return null if not applicable
Expand Down Expand Up @@ -155,6 +156,12 @@ public interface IPackage : INotifyPropertyChanged, IEquatable<IPackage>
/// <returns>False if the update is a major update or the update doesn't exist, true if it's a minor update</returns>
public bool IsUpdateMinor();

/// <summary>
/// Gets the applicable install options for this package
/// </summary>
/// <returns>The package install options, or, if not overriden, the manager install options</returns>
public Task<InstallOptions> GetInstallOptions();

public Task<SerializablePackage> AsSerializableAsync();

public SerializableIncompatiblePackage AsSerializable_Incompatible();
Expand Down
4 changes: 3 additions & 1 deletion src/UniGetUI.PackageEngine.Operations/PackageOperations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,9 +263,11 @@ protected override Task HandleFailure()
protected override async Task HandleSuccess()
{
Package.SetTag(PackageTag.Default);
Package.GetInstalledPackage()?.SetTag(PackageTag.Default);
Package.GetAvailablePackage()?.SetTag(PackageTag.AlreadyInstalled);

foreach (var p in Package.GetInstalledPackages())
p.SetTag(PackageTag.Default);

UpgradablePackagesLoader.Instance.Remove(Package);

if (Settings.Get(Settings.K.AskToDeleteNewDesktopShortcuts))
Expand Down
55 changes: 55 additions & 0 deletions src/UniGetUI.PackageEngine.PackageEngine/PEInterface.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using UniGetUI.PackageEngine.Managers.ScoopManager;
using UniGetUI.PackageEngine.Managers.WingetManager;
using UniGetUI.PackageEngine.Managers.VcpkgManager;
using UniGetUI.PackageEngine.PackageClasses;
using UniGetUI.PackageEngine.PackageLoader;

namespace UniGetUI.PackageEngine
Expand Down Expand Up @@ -74,4 +75,58 @@ public static void Initialize()
}
}
}




public class PackageBundlesLoader : PackageBundlesLoader_A
{
public PackageBundlesLoader(IReadOnlyList<IPackageManager> managers): base(managers)
{
}

public override async Task AddPackagesAsync(IReadOnlyList<IPackage> foreign_packages)
{
List<IPackage> added = new();
foreach (IPackage foreign in foreign_packages)
{
IPackage? package = null;

if (foreign is not ImportedPackage && foreign is Package native)
{
if (native.Source.IsVirtualManager)
{
Logger.Debug($"Adding native package with id={native.Id} to bundle as an INVALID package...");
package = new InvalidImportedPackage(native.AsSerializable_Incompatible(), NullSource.Instance);
}
else
{
Logger.Debug($"Adding native package with id={native.Id} to bundle as a VALID package...");
package = new ImportedPackage(await native.AsSerializableAsync(), native.Manager, native.Source);
}
}
else if (foreign is ImportedPackage imported)
{
Logger.Debug($"Adding loaded imported package with id={imported.Id} to bundle...");
package = imported;
}
else if (foreign is InvalidImportedPackage invalid)
{
Logger.Debug($"Adding loaded incompatible package with id={invalid.Id} to bundle...");
package = invalid;
}
else
{
Logger.Error($"An IPackage instance id={foreign.Id} did not match the types Package, ImportedPackage or InvalidImportedPackage. This should never be the case");
}

if (package is not null)
{ // Here, AddForeign is not used so a single PackagesChangedEvent can be invoked.
await AddPackage(package);
added.Add(package);
}
}
InvokePackagesChangedEvent(true, added, []);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ protected override Task WhenAddingPackage(IPackage package)
{
package.SetTag(PackageTag.IsUpgradable);
}
else if (package.GetInstalledPackage() is not null)
else if (package.GetInstalledPackages().Any())
{
package.SetTag(PackageTag.AlreadyInstalled);
}
Expand Down
56 changes: 8 additions & 48 deletions src/UniGetUI.PackageEngine.PackageLoader/PackageBundlesLoader.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
using UniGetUI.Core.Logging;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Interfaces;
using UniGetUI.PackageEngine.PackageClasses;

namespace UniGetUI.PackageEngine.PackageLoader
{
public class PackageBundlesLoader : AbstractPackageLoader
public abstract class PackageBundlesLoader_A : AbstractPackageLoader
{
public static PackageBundlesLoader Instance = null!;
public static PackageBundlesLoader_A Instance = null!;

public PackageBundlesLoader(IReadOnlyList<IPackageManager> managers)
public PackageBundlesLoader_A(IReadOnlyList<IPackageManager> managers)
: base(managers,
identifier: "PACKAGE_BUNDLES",
AllowMultiplePackageVersions: true,
Expand Down Expand Up @@ -44,49 +42,11 @@ protected override Task WhenAddingPackage(IPackage package)
return Task.CompletedTask;
}

public async Task AddPackagesAsync(IReadOnlyList<IPackage> foreign_packages)
{
List<IPackage> added = new();
foreach (IPackage foreign in foreign_packages)
{
IPackage? package = null;

if (foreign is not ImportedPackage && foreign is Package native)
{
if (native.Source.IsVirtualManager)
{
Logger.Debug($"Adding native package with id={native.Id} to bundle as an INVALID package...");
package = new InvalidImportedPackage(native.AsSerializable_Incompatible(), NullSource.Instance);
}
else
{
Logger.Debug($"Adding native package with id={native.Id} to bundle as a VALID package...");
package = new ImportedPackage(await native.AsSerializableAsync(), native.Manager, native.Source);
}
}
else if (foreign is ImportedPackage imported)
{
Logger.Debug($"Adding loaded imported package with id={imported.Id} to bundle...");
package = imported;
}
else if (foreign is InvalidImportedPackage invalid)
{
Logger.Debug($"Adding loaded incompatible package with id={invalid.Id} to bundle...");
package = invalid;
}
else
{
Logger.Error($"An IPackage instance id={foreign.Id} did not match the types Package, ImportedPackage or InvalidImportedPackage. This should never be the case");
}

if (package is not null)
{ // Here, AddForeign is not used so a single PackagesChangedEvent can be invoked.
await AddPackage(package);
added.Add(package);
}
}
InvokePackagesChangedEvent(true, added, []);
}
/*
* This method required access to the Package, ImportedPackage and InvalidPackage classes,
* but they are not defined here yet. This class will be inherited on PEInterface, with the missing member
*/
public abstract Task AddPackagesAsync(IReadOnlyList<IPackage> foreign_packages);

public void RemoveRange(IReadOnlyList<IPackage> packages)
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">



<ItemGroup>
<ProjectReference Include="..\UniGetUI.Core.Classes\UniGetUI.Core.Classes.csproj" />
<ProjectReference Include="..\UniGetUI.Core.Data\UniGetUI.Core.Data.csproj" />
<ProjectReference Include="..\UniGetUI.Core.Logger\UniGetUI.Core.Logging.csproj" />
<ProjectReference Include="..\UniGetUI.Core.Settings\UniGetUI.Core.Settings.csproj" />
<ProjectReference Include="..\UniGetUI.Core.Tools\UniGetUI.Core.Tools.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Enums\UniGetUI.PackageEngine.Structs.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Cargo\UniGetUI.PackageEngine.Managers.Cargo.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Chocolatey\UniGetUI.PackageEngine.Managers.Chocolatey.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Dotnet\UniGetUI.PackageEngine.Managers.Dotnet.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Generic.NuGet\UniGetUI.PackageEngine.Managers.Generic.NuGet.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Npm\UniGetUI.PackageEngine.Managers.Npm.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Pip\UniGetUI.PackageEngine.Managers.Pip.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.PowerShell\UniGetUI.PackageEngine.Managers.PowerShell.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.Scoop\UniGetUI.PackageEngine.Managers.Scoop.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.Managers.WinGet\UniGetUI.PackageEngine.Managers.WinGet.csproj" />
<ProjectReference Include="..\UniGetUI.PackageEngine.PackageManagerClasses\UniGetUI.PackageEngine.Classes.csproj" />
<ProjectReference Include="..\UniGetUI.PAckageEngine.Interfaces\UniGetUI.PackageEngine.Interfaces.csproj" />
</ItemGroup>

<ItemGroup>
<Compile Include="..\SharedAssemblyInfo.cs" Link="SharedAssemblyInfo.cs" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="PhotoSauce.MagicScaler" Version="0.15.0" />
</ItemGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using UniGetUI.Core.SettingsEngine;
using UniGetUI.Interface.Enums;
using UniGetUI.PackageEngine.Interfaces;
using UniGetUI.PackageEngine.PackageClasses;

namespace UniGetUI.PackageEngine.PackageLoader
{
Expand Down Expand Up @@ -31,18 +30,24 @@ public UpgradablePackagesLoader(IReadOnlyList<IPackageManager> managers)

protected override async Task<bool> IsPackageValid(IPackage package)
{
if (package.VersionString == package.NewVersionString) return false;
if (await package.HasUpdatesIgnoredAsync(package.NewVersionString))
if (package.VersionString == package.NewVersionString)
return false;

if (package.NewerVersionIsInstalled())
return false;

if (package.IsUpdateMinor() && (await package.GetInstallOptions()).SkipMinorUpdates)
{
IgnoredPackages[package.Id] = package;
Logger.Info($"Ignoring package {package.Id} because it is a minor update ({package.VersionString} -> {package.NewVersionString}) and SkipMinorUpdates is set to true.");
return false;
}
if ((await InstallOptionsFactory.LoadApplicableAsync(package)).SkipMinorUpdates && package.IsUpdateMinor())

if (await package.HasUpdatesIgnoredAsync(package.NewVersionString))
{
Logger.Info($"Ignoring package {package.Id} because it is a minor update ({package.VersionString} -> {package.NewVersionString}) and SkipMinorUpdates is set to true.");
IgnoredPackages[package.Id] = package;
return false;
}
if (package.NewerVersionIsInstalled()) return false;

return true;
}

Expand All @@ -53,7 +58,9 @@ protected override IReadOnlyList<IPackage> LoadPackagesFromManager(IPackageManag
protected override Task WhenAddingPackage(IPackage package)
{
package.GetAvailablePackage()?.SetTag(PackageTag.IsUpgradable);
package.GetInstalledPackage()?.SetTag(PackageTag.IsUpgradable);

foreach(var p in package.GetInstalledPackages())
p.SetTag(PackageTag.IsUpgradable);

return Task.CompletedTask;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,13 +213,8 @@ private IReadOnlyList<IPackage> _findPackages(string query, bool SecondAttempt)
task.Wait();
}

Package[] packages = task.GetAwaiter().GetResult().ToArray();

for (int i = 0; i < packages.Length; i++)
{
packages[i] = PackageCacher.GetAvailablePackage(packages[i]);
}
Logger.Info($"Found {packages.Length} available packages from {Name} with the query {query}");
var packages = task.GetAwaiter().GetResult();
Logger.Info($"Found {packages.Count} available packages from {Name} with the query {query}");
return packages;
}
catch (Exception e)
Expand Down Expand Up @@ -263,14 +258,8 @@ private IReadOnlyList<IPackage> _getAvailableUpdates(bool SecondAttempt)
task.Wait();
}

Package[] packages = task.GetAwaiter().GetResult().ToArray();

for (int i = 0; i < packages.Length; i++)
{
packages[i] = PackageCacher.GetUpgradablePackage(packages[i]);
}

Logger.Info($"Found {packages.Length} available updates from {Name}");
var packages = task.GetAwaiter().GetResult();
Logger.Info($"Found {packages.Count} available updates from {Name}");
return packages;
}
catch (Exception e)
Expand Down Expand Up @@ -312,14 +301,8 @@ private IReadOnlyList<IPackage> _getInstalledPackages(bool SecondAttempt)
task.Wait();
}

Package[] packages = task.GetAwaiter().GetResult().ToArray();

for (int i = 0; i < packages.Length; i++)
{
packages[i] = PackageCacher.GetInstalledPackage(packages[i]);
}

Logger.Info($"Found {packages.Length} installed packages from {Name}");
var packages = task.GetAwaiter().GetResult();
Logger.Info($"Found {packages.Count} installed packages from {Name}");
return packages;
}
catch (Exception e)
Expand Down Expand Up @@ -370,9 +353,12 @@ public virtual void RefreshPackageIndexes()
Logger.Debug($"Manager {Name} has not implemented RefreshPackageIndexes");
}

/// <summary>
/// Attempt a live, fast, repair method when an exception occurs (for example, reconnect to COM Server)
/// </summary>
public virtual void AttemptFastRepair()
{
// Implementing this method is optional
Logger.Debug($"Manager {Name} has not implemented AttemptFastRepair");
}
}
}
Loading
Loading