Skip to content

Commit

Permalink
Added: Ability to allow package provider to set its own extractor.
Browse files Browse the repository at this point in the history
  • Loading branch information
Sewer56 committed Feb 5, 2022
1 parent 690b558 commit 7cac673
Show file tree
Hide file tree
Showing 11 changed files with 129 additions and 11 deletions.
8 changes: 8 additions & 0 deletions source/Reloaded.Mod.Loader.Tests/Update/UpdaterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,10 @@
using Reloaded.Mod.Loader.Update.Packaging;
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.DeltaPatchGenerator.Lib.Utility;
using Sewer56.Update.Extractors.SevenZipSharp;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Packaging.Extractors;
using Sewer56.Update.Packaging.Interfaces;
using Sewer56.Update.Resolvers;
using Sewer56.Update.Structures;
using Xunit;
Expand Down Expand Up @@ -133,6 +135,12 @@ public void Dispose()
[ExcludeFromCodeCoverage]
public class LocalPackageUpdateResolverFactory : IUpdateResolverFactory
{

private static IPackageExtractor _extractor = new SevenZipSharpExtractor();

/// <inheritdoc />
public IPackageExtractor Extractor { get; } = _extractor;

public string ResolverId { get; } = "LocalPackageResolver";
public string FriendlyName { get; } = "LocalPackageResolver";
public string Directory { get; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<PackageReference Include="Sewer56.Update.Extractors.SevenZipSharp" Version="1.1.1" GeneratePathProperty="true" />
<PackageReference Include="Sewer56.Update.Packaging" Version="2.1.1" />
<PackageReference Include="Sewer56.Update.Resolvers.NuGet" Version="1.1.0" />
<PackageReference Include="Sewer56.Update.Resolvers.GameBanana" Version="1.2.2" />
<PackageReference Include="Sewer56.Update.Resolvers.GameBanana" Version="1.2.3" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Reloaded.Mod.Loader.IO.Structs;
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Packaging.Interfaces;

namespace Reloaded.Mod.Loader.Update.Interfaces;

Expand All @@ -11,6 +12,11 @@ namespace Reloaded.Mod.Loader.Update.Interfaces;
/// </summary>
public interface IUpdateResolverFactory
{
/// <summary>
/// The extractor to use with this resolver.
/// </summary>
IPackageExtractor Extractor { get; }

/// <summary>
/// Returns the unique ID of the resolver.
/// </summary>
Expand Down
12 changes: 9 additions & 3 deletions source/Reloaded.Mod.Loader.Update/PackageResolverFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@
using Reloaded.Mod.Loader.IO.Config;
using Reloaded.Mod.Loader.IO.Structs;
using Reloaded.Mod.Loader.Update.Interfaces;
using Reloaded.Mod.Loader.Update.Providers;
using Reloaded.Mod.Loader.Update.Providers.GameBanana;
using Reloaded.Mod.Loader.Update.Providers.GitHub;
using Reloaded.Mod.Loader.Update.Providers.NuGet;
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Packaging.Interfaces;
using Sewer56.Update.Resolvers;

namespace Reloaded.Mod.Loader.Update;
Expand Down Expand Up @@ -36,7 +38,7 @@ public static class PackageResolverFactory
/// <param name="userConfig">Contains user configuration for this mod in question.</param>
/// <param name="data">All data passed to the updater.</param>
/// <returns>A resolver that can handle the mod, else null.</returns>
public static AggregatePackageResolver? GetResolver(PathTuple<ModConfig> mod, PathTuple<ModUserConfig>? userConfig, UpdaterData data)
public static AggregatePackageResolverEx? GetResolver(PathTuple<ModConfig> mod, PathTuple<ModUserConfig>? userConfig, UpdaterData data)
{
// Migrate first
foreach (var factory in All)
Expand All @@ -50,15 +52,19 @@ public static class PackageResolverFactory
data.CommonPackageResolverSettings.MetadataFileName = mod.Config.ReleaseMetadataFileName;

// Create resolvers.
var resolvers = new List<IPackageResolver>();
var resolvers = new List<IPackageResolver>();
var extractors = new Dictionary<IPackageResolver, IPackageExtractor>();
foreach (var factory in All)
{
var resolver = factory.GetResolver(mod, userConfig, data);
if (resolver != null)
{
resolvers.Add(resolver);
extractors[resolver] = factory.Extractor;
}
}

return resolvers.Count > 0 ? new AggregatePackageResolver(resolvers) : null;
return resolvers.Count > 0 ? new AggregatePackageResolverEx(resolvers, extractors) : null;
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Versioning;
using Sewer56.Update.Extractors.SevenZipSharp;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Packaging.Interfaces;
using Sewer56.Update.Resolvers;

namespace Reloaded.Mod.Loader.Update.Providers;

/// <summary>
/// Aggregate package resolver.
/// </summary>
public class AggregatePackageResolverEx : AggregatePackageResolver
{
private readonly Dictionary<IPackageResolver, IPackageExtractor> _packageExtractors;

/// <summary/>
public AggregatePackageResolverEx(List<IPackageResolver> resolvers, Dictionary<IPackageResolver, IPackageExtractor> packageExtractors) : base(resolvers)
{
_packageExtractors = packageExtractors;
}

/// <summary>
/// Retrieves the package extractor to be used for removing packages.
/// </summary>
public async Task<IPackageExtractor> GetExtractorAsync(NuGetVersion version)
{
var resolver = await GetResolverForVersionAsync(version, CancellationToken.None);
if (_packageExtractors.TryGetValue(resolver.Resolver, out var extractor))
return extractor;

// Fallback
return new SevenZipSharpExtractor();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
using Reloaded.Mod.Loader.IO.Utility;
using Reloaded.Mod.Loader.Update.Interfaces;
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.Update.Extractors.SevenZipSharp;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Packaging.Interfaces;
using Sewer56.Update.Resolvers.GameBanana;

namespace Reloaded.Mod.Loader.Update.Providers.GameBanana;
Expand All @@ -15,6 +17,11 @@ namespace Reloaded.Mod.Loader.Update.Providers.GameBanana;
/// </summary>
public class GameBananaUpdateResolverFactory : IUpdateResolverFactory
{
private static IPackageExtractor _extractor = new SevenZipSharpExtractor();

/// <inheritdoc />
public IPackageExtractor Extractor { get; } = _extractor;

/// <inheritdoc />
public string ResolverId { get; } = "GameBanana";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
using Reloaded.Mod.Loader.IO.Utility;
using Reloaded.Mod.Loader.Update.Interfaces;
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.Update.Extractors.SevenZipSharp;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Packaging.Interfaces;
using Sewer56.Update.Resolvers.GitHub;

namespace Reloaded.Mod.Loader.Update.Providers.GitHub;
Expand All @@ -15,6 +17,11 @@ namespace Reloaded.Mod.Loader.Update.Providers.GitHub;
/// </summary>
public class GitHubReleasesUpdateResolverFactory : IUpdateResolverFactory
{
private static IPackageExtractor _extractor = new SevenZipSharpExtractor();

/// <inheritdoc />
public IPackageExtractor Extractor { get; } = _extractor;

/// <inheritdoc />
public string ResolverId { get; } = "GitHubRelease";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.Update.Interfaces;
using Sewer56.Update.Misc;
using Sewer56.Update.Packaging.Interfaces;
using Sewer56.Update.Resolvers;
using Sewer56.Update.Resolvers.NuGet;
using Sewer56.Update.Resolvers.NuGet.Utilities;
Expand All @@ -20,6 +21,11 @@ namespace Reloaded.Mod.Loader.Update.Providers.NuGet;
/// </summary>
public class NuGetUpdateResolverFactory : IUpdateResolverFactory
{
private static IPackageExtractor _extractor = new NuGetPackageExtractor();

/// <inheritdoc />
public IPackageExtractor Extractor { get; } = _extractor;

/// <inheritdoc />
public string ResolverId { get; } = "NuGet";

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Sewer56.Update.Packaging.Interfaces;

namespace Reloaded.Mod.Loader.Update.Providers;

/// <summary>
/// Package extractor that wraps a mutable inner extractor.
/// </summary>
public class ProxyPackageExtractor : IPackageExtractor
{
/// <summary>
/// The extractor wrapped by this proxy.
/// </summary>
public IPackageExtractor Extractor { get; set; }

/// <summary>
/// A proxy package extractor what wraps an external extractor.
/// </summary>
public ProxyPackageExtractor(IPackageExtractor extractor) => Extractor = extractor;

/// <inheritdoc />
public async Task ExtractPackageAsync(string sourceFilePath, string destDirPath, IProgress<double>? progress = null,
CancellationToken cancellationToken = new CancellationToken())
{
await Extractor.ExtractPackageAsync(sourceFilePath, destDirPath, progress, cancellationToken);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Reloaded.Mod.Loader.IO.Config;
using Reloaded.Mod.Loader.IO.Structs;
using Reloaded.Mod.Loader.Update.Providers;
using Sewer56.Update.Resolvers;

namespace Reloaded.Mod.Loader.Update.Structures;
Expand All @@ -12,15 +13,15 @@ public class ResolverModPair
/// <summary>
/// The package resolver.
/// </summary>
public AggregatePackageResolver Resolver { get; set; }
public AggregatePackageResolverEx Resolver { get; set; }

/// <summary>
/// The individual mod bound to the resolver.
/// </summary>
public PathTuple<ModConfig> ModTuple { get; set; }

/// <summary/>
public ResolverModPair(AggregatePackageResolver resolver, PathTuple<ModConfig> modTuple)
public ResolverModPair(AggregatePackageResolverEx resolver, PathTuple<ModConfig> modTuple)
{
Resolver = resolver;
ModTuple = modTuple;
Expand Down
18 changes: 13 additions & 5 deletions source/Reloaded.Mod.Loader.Update/Updater.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,10 @@
using NuGet.Versioning;
using Reloaded.Mod.Loader.IO.Config;
using Reloaded.Mod.Loader.IO.Services;
using Reloaded.Mod.Loader.Update.Providers;
using Reloaded.Mod.Loader.Update.Structures;
using Sewer56.Update;
using Sewer56.Update.Extensions;
using Sewer56.Update.Extractors.SevenZipSharp;
using Sewer56.Update.Misc;
using Sewer56.Update.Packaging.Structures;
Expand Down Expand Up @@ -52,7 +54,7 @@ public async Task<ModUpdateSummary> GetUpdateDetails()
var faultedModSets = new List<ModConfig>();
var resolverManagerPairs = new List<ManagerModResultPair>();
var resolverTuples = GetResolvers();
var extractor = new SevenZipSharpExtractor();
var extractor = new ProxyPackageExtractor(new SevenZipSharpExtractor());

foreach (var resolverTuple in resolverTuples)
{
Expand All @@ -63,7 +65,7 @@ public async Task<ModUpdateSummary> GetUpdateDetails()
var baseDirectory = Path.GetDirectoryName(modTuple.Path);

var metadata = new ItemMetadata(NuGetVersion.Parse(modTuple.Config.ModVersion), filePath, baseDirectory);
var manager = await UpdateManager<Empty>.CreateAsync(metadata, resolverTuple.Resolver, extractor);
var manager = await UpdateManager<Empty>.CreateAsync(metadata, resolverTuple.Resolver, extractor);
var updateResult = await manager.CheckForUpdatesAsync();

if (updateResult.CanUpdate)
Expand Down Expand Up @@ -95,10 +97,16 @@ public async Task Update(ModUpdateSummary summary, IProgress<double> progressHan
var slice = progressMixer.Slice(singleItemProgress);
var pair = summary.ManagerModResultPairs[x];
var manager = pair.Manager;
var version = pair.Result.LastVersion;
var version = pair.Result.LastVersion;
var resolver = pair.Manager.Resolver;
var extractor = pair.Manager.Extractor;

await manager.PrepareUpdateAsync(version, slice);
await manager.StartUpdateAsync(version, new OutOfProcessOptions(), new UpdateOptions() { CleanupAfterUpdate = true });
// Set package extractor via proxy.
if (resolver is AggregatePackageResolverEx resolverEx && extractor is ProxyPackageExtractor proxyExtractor)
proxyExtractor.Extractor = await resolverEx.GetExtractorAsync(version!);

await manager.PrepareUpdateAsync(version!, slice);
await manager.StartUpdateAsync(version!, new OutOfProcessOptions(), new UpdateOptions() { CleanupAfterUpdate = true });
}
}

Expand Down

0 comments on commit 7cac673

Please sign in to comment.