From 40eda285e08c2809c6372eda4fddcfba96c854ef Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Thu, 21 Mar 2024 19:15:48 +0000 Subject: [PATCH 1/9] Dependency Checking: Fast Return Empty if no Dependencies Missing --- source/Reloaded.Mod.Launcher.Lib/Update.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Reloaded.Mod.Launcher.Lib/Update.cs b/source/Reloaded.Mod.Launcher.Lib/Update.cs index 5c4289cf..ff0b7a26 100644 --- a/source/Reloaded.Mod.Launcher.Lib/Update.cs +++ b/source/Reloaded.Mod.Launcher.Lib/Update.cs @@ -257,7 +257,9 @@ public static async Task GetMissingDependenciesToDow { // Get missing dependencies for this update loop. var missingDeps = CheckMissingDependencies(); - + if (missingDeps.AllAvailable) + return ModDependencyResolveResult.Combine(Enumerable.Empty()); + // Get Dependencies var resolver = DependencyResolverFactory.GetInstance(IoC.Get()); From 7c37101ecb17fed64ecb3f8e04df23bee3bf2980 Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Thu, 21 Mar 2024 19:18:32 +0000 Subject: [PATCH 2/9] Fixed: Unused Parameter in Index Builder --- source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs b/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs index 30b6d96a..e94ef0ec 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs @@ -22,7 +22,7 @@ public class IndexBuilder Directory.CreateDirectory(outputFolder); var index = new Structures.Index(); index.BaseUrl = new Uri($"{outputFolder}/"); - return await UpdateAsync(index); + return await UpdateAsync(index, writeToFile); } /// From a5b8f95703258340eea58a010e34f11dac499c0e Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Thu, 21 Mar 2024 20:25:37 +0000 Subject: [PATCH 3/9] Added: Index can now produce an AllPackages.json.br file. --- .../Index/BuildIndex.cs | 20 ++++++++++++++++++ .../Index/IndexApi.cs | 9 ++++++++ .../Index/IndexBuilder.cs | 21 ++++++++++++++++--- .../Index/Routes.cs | 5 +++++ .../Index/Structures/Index.cs | 20 ++++++++++++++++++ .../Services/IndexBuilderService.cs | 2 +- 6 files changed, 73 insertions(+), 4 deletions(-) diff --git a/source/Reloaded.Mod.Loader.Tests/Index/BuildIndex.cs b/source/Reloaded.Mod.Loader.Tests/Index/BuildIndex.cs index 04de67a9..7eee2c12 100644 --- a/source/Reloaded.Mod.Loader.Tests/Index/BuildIndex.cs +++ b/source/Reloaded.Mod.Loader.Tests/Index/BuildIndex.cs @@ -42,6 +42,26 @@ public async Task BuildCombinedIndex() Assert.True(index.TryGetGameBananaSourcePath(heroesGameId, out _)); Assert.True(Directory.Exists(index.BaseUrl.LocalPath)); } + + [Fact] + public async Task BuildAllPackages() + { + const string outputFolder = "BuildAllPackagesTest"; + const int heroesGameId = 6061; + + // Arrange + var builder = new IndexBuilder(); + builder.Sources.Add(new IndexSourceEntry(TestNuGetFeedUrl)); + builder.Sources.Add(new IndexSourceEntry(heroesGameId)); + + // Act + var index = await builder.BuildAsync(outputFolder); + + // Assert + var api = new IndexApi(index.BaseUrl.ToString()); + var packages = await api.GetAllPackagesAsync(); + Assert.True(packages.Packages.Count > 0); + } [Fact] public async Task BuildGbIndex() diff --git a/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs b/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs index d3375c23..8efa6eab 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs @@ -36,6 +36,15 @@ public IndexApi(string indexUrl = "https://reloaded-project.github.io/Reloaded-I index.BaseUrl = IndexUrl; return index; } + + /// + /// Returns all packages from the index. + /// + public async Task GetAllPackagesAsync() + { + var uri = new Uri(IndexUrl, Routes.AllPackages); + return await Web.DownloadAndDeserialize(uri); + } } /// diff --git a/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs b/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs index e94ef0ec..13db3602 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs @@ -86,7 +86,10 @@ public Structures.Index RemoveNotInBuilder(Structures.Index index) await Task.WhenAll(tasks); if (writeToFile) + { await WriteToDiskAsync(index); + await WriteToDiskAsync(index.BaseUrl, await index.GetPackagesFromAllSourcesAsync()); + } index.BaseUrl = new Uri(outputFolder, UriKind.Absolute); return index; @@ -102,16 +105,27 @@ public async Task WriteToDiskAsync(Structures.Index index) await File.WriteAllBytesAsync(Path.Combine(index.BaseUrl.LocalPath, Routes.Index), compressedIndex); } + /// + /// Writes an existing package list to disk, in a specified folder. + /// + /// The list containing all packages. + /// The 'base URL' where the Index is contained. + public async Task WriteToDiskAsync(Uri baseUrl, PackageList list) + { + var compressedPackageList = Compression.Compress(JsonSerializer.SerializeToUtf8Bytes(list, Serializer.Options)); + await File.WriteAllBytesAsync(Path.Combine(baseUrl.LocalPath, Routes.AllPackages), compressedPackageList); + } + private async Task BuildNuGetSourceAsync(Structures.Index index, IndexSourceEntry indexSourceEntry, string outputFolder) { // Number of items to grab at once. - const int Take = 500; + const int take = 500; var provider = new NuGetPackageProvider(NugetRepository.FromSourceUrl(indexSourceEntry.NuGetUrl!), null, false); var packagesList = PackageList.Create(); - await SearchForAllResults(Take, provider, packagesList); + await SearchForAllResults(take, provider, packagesList); var relativePath = Routes.Build.GetNuGetPackageListPath(indexSourceEntry.NuGetUrl!); var path = Path.Combine(outputFolder, relativePath); @@ -121,7 +135,8 @@ private async Task BuildNuGetSourceAsync(Structures.Index index, IndexSourceEntr index.Sources[Routes.Source.GetNuGetIndexKey(indexSourceEntry.NuGetUrl!)] = relativePath; } - private async Task BuildGameBananaSourceAsync(Structures.Index index, IndexSourceEntry indexSourceEntry, string outputFolder) + private async Task BuildGameBananaSourceAsync(Structures.Index index, IndexSourceEntry indexSourceEntry, + string outputFolder) { // Max for GameBanana const int take = 50; diff --git a/source/Reloaded.Mod.Loader.Update/Index/Routes.cs b/source/Reloaded.Mod.Loader.Update/Index/Routes.cs index badbbd0b..1ad96ebc 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/Routes.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/Routes.cs @@ -19,6 +19,11 @@ public static class Routes /// Link to the index containing the mappings /// public const string Index = $"Index{FileExtension}{CompressionExtension}"; + + /// + /// Link to the index containing all packages + /// + public const string AllPackages = $"AllPackages{FileExtension}{CompressionExtension}"; /// /// Contains the code to determine locations of output files diff --git a/source/Reloaded.Mod.Loader.Update/Index/Structures/Index.cs b/source/Reloaded.Mod.Loader.Update/Index/Structures/Index.cs index b1541e92..396b1245 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/Structures/Index.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/Structures/Index.cs @@ -17,6 +17,26 @@ public class Index [JsonIgnore] public Uri BaseUrl { get; internal set; } = null!; + + /// + /// [Slow if over network/internet !!] + /// Retrieves all the packages from all the sources. + /// + public async Task GetPackagesFromAllSourcesAsync() + { + var result = new List(); + foreach (var source in Sources) + { + var fromSource = await Web.DownloadAndDeserialize(new Uri(BaseUrl, source.Value)); + result.AddRange(fromSource.Packages); + } + + return new PackageList + { + Packages = result + }; + } + /// /// Tries to get the package list for a given NuGet URL. /// diff --git a/source/Tools/Reloaded.AutoIndexBuilder/Services/IndexBuilderService.cs b/source/Tools/Reloaded.AutoIndexBuilder/Services/IndexBuilderService.cs index 3b2555d1..685e3012 100644 --- a/source/Tools/Reloaded.AutoIndexBuilder/Services/IndexBuilderService.cs +++ b/source/Tools/Reloaded.AutoIndexBuilder/Services/IndexBuilderService.cs @@ -120,7 +120,7 @@ private async Task ExecuteInternal(IJobExecutionContext context) // Update Index var indexApi = new IndexApi(_settings.GitRepoPath); var index = await indexApi.GetOrCreateLocalIndexAsync(); - index = await builder.UpdateAsync(index, false); + index = await builder.UpdateAsync(index); // Delete Unused var cleanupBuilder = new IndexBuilder(); From a9a0d508ef8c704f933d92869144ef799be13a08 Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Thu, 21 Mar 2024 21:33:10 +0000 Subject: [PATCH 4/9] Added: Resolve Missing Packages via Index --- .../Index/IndexDependencyResolverTests.cs | 46 ++++++++++++++++++ .../DependencyResolverFactory.cs | 10 ++-- .../Index/IndexDependencyResolver.cs | 47 +++++++++++++++++++ .../Reloaded.Mod.Loader.Update.csproj | 2 +- 4 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 source/Reloaded.Mod.Loader.Tests/Update/Providers/Index/IndexDependencyResolverTests.cs create mode 100644 source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs diff --git a/source/Reloaded.Mod.Loader.Tests/Update/Providers/Index/IndexDependencyResolverTests.cs b/source/Reloaded.Mod.Loader.Tests/Update/Providers/Index/IndexDependencyResolverTests.cs new file mode 100644 index 00000000..db0dc12f --- /dev/null +++ b/source/Reloaded.Mod.Loader.Tests/Update/Providers/Index/IndexDependencyResolverTests.cs @@ -0,0 +1,46 @@ +using Reloaded.Mod.Loader.Update.Providers.Index; + +namespace Reloaded.Mod.Loader.Tests.Update.Providers.Index; + +public class IndexDependencyResolverTests +{ + [Fact] + public async Task ResolveAsync_WithExistingPackage_ReturnsPackages() + { + // Act + var resolver = new IndexDependencyResolver(); + var result = await resolver.ResolveAsync("reloaded.universal.redirector"); + + // Assert + Assert.NotEmpty(result.FoundDependencies); + Assert.Empty(result.NotFoundDependencies); + } + + [Fact] + public async Task ResolveAsync_WithExistingPackage_CanDownloadPackage() + { + // Act + using var outputDirectory = new TemporaryFolderAllocation(); + var resolver = new IndexDependencyResolver(); + var result = await resolver.ResolveAsync("reloaded.universal.redirector"); + var downloadedPackagePath = await result.FoundDependencies[0].DownloadAsync(outputDirectory.FolderPath, null); + + // Assert + Assert.True(Directory.Exists(downloadedPackagePath)); + Assert.True(File.Exists(Path.Combine(downloadedPackagePath, ModConfig.ConfigFileName))); + } + + [Fact] + public async Task ResolveAsync_WithNoPackage_ReturnsMissing() + { + // Arrange + var resolver = new IndexDependencyResolver(); + + // Act + var result = await resolver.ResolveAsync("this.package.does.not.exist"); + + // Assert + Assert.NotEmpty(result.NotFoundDependencies); + Assert.Empty(result.FoundDependencies); + } +} \ No newline at end of file diff --git a/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs b/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs index 69a613a5..923d5187 100644 --- a/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs +++ b/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs @@ -1,3 +1,5 @@ +using Reloaded.Mod.Loader.Update.Providers.Index; + namespace Reloaded.Mod.Loader.Update; /// @@ -10,11 +12,11 @@ public static class DependencyResolverFactory /// public static IDependencyResolver GetInstance(AggregateNugetRepository repository) { - return new AggregateDependencyResolver(new IDependencyResolver[] - { + return new AggregateDependencyResolver([ new NuGetDependencyResolver(repository), new GameBananaDependencyResolver(), - new GitHubDependencyResolver() - }); + new GitHubDependencyResolver(), + new IndexDependencyResolver() + ]); } } \ No newline at end of file diff --git a/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs b/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs new file mode 100644 index 00000000..78d3603f --- /dev/null +++ b/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs @@ -0,0 +1,47 @@ +using Reloaded.Mod.Loader.Update.Index; + +namespace Reloaded.Mod.Loader.Update.Providers.Index; + +/// +/// Resolver that uses the (Reloaded-II index) +/// to find missing packages. +/// +/// +/// This is a last resort and has security implications. We use this, if no other method succeeds. +/// +public class IndexDependencyResolver : IDependencyResolver +{ + private PackageList _packages; + + /// + public IndexDependencyResolver() + { + Task.Run(async () => + { + var indexApi = new IndexApi(); + _packages = await indexApi.GetAllPackagesAsync(); + }).Wait(); + } + + /// + public Task ResolveAsync(string packageId, Dictionary? pluginData = null, CancellationToken token = default) + { + // Note: PackageList is a flat list of all packages. + // A single package may appear multiple times. + // Submit the highest version. + var matchingPackages = new List(); + foreach (var package in _packages.Packages) + { + if (package.Id == packageId) + matchingPackages.Add(package); + } + + var result = new ModDependencyResolveResult(); + if (matchingPackages.Count > 0) + result.FoundDependencies.Add(matchingPackages.OrderByDescending(x => x.Version).First()); + else + result.NotFoundDependencies.Add(packageId); + + return Task.FromResult(result); + } +} \ No newline at end of file diff --git a/source/Reloaded.Mod.Loader.Update/Reloaded.Mod.Loader.Update.csproj b/source/Reloaded.Mod.Loader.Update/Reloaded.Mod.Loader.Update.csproj index 1e28403e..3c52aafc 100644 --- a/source/Reloaded.Mod.Loader.Update/Reloaded.Mod.Loader.Update.csproj +++ b/source/Reloaded.Mod.Loader.Update/Reloaded.Mod.Loader.Update.csproj @@ -7,7 +7,7 @@ enable CS0067 true - 2.1.4 + 2.2.0 true true Sewer56 From 41d457246b73f3054d04cfc57462e3c7547e7ac6 Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Thu, 21 Mar 2024 21:52:13 +0000 Subject: [PATCH 5/9] Added: Specialized Endpoint for Dependency Info --- .../Index/IndexApi.cs | 9 +++++++++ .../Index/IndexBuilder.cs | 10 +++++++--- .../Index/Routes.cs | 8 ++++++++ .../Index/Structures/Package.cs | 19 +++++++++++++++++++ .../Index/Structures/PackageList.cs | 11 +++++++++++ .../Index/IndexDependencyResolver.cs | 2 +- 6 files changed, 55 insertions(+), 4 deletions(-) diff --git a/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs b/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs index 8efa6eab..ca3b368b 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/IndexApi.cs @@ -45,6 +45,15 @@ public async Task GetAllPackagesAsync() var uri = new Uri(IndexUrl, Routes.AllPackages); return await Web.DownloadAndDeserialize(uri); } + + /// + /// Returns all packages from the index. + /// + public async Task GetAllDependenciesAsync() + { + var uri = new Uri(IndexUrl, Routes.AllDependencies); + return await Web.DownloadAndDeserialize(uri); + } } /// diff --git a/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs b/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs index 13db3602..e336344e 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/IndexBuilder.cs @@ -88,7 +88,10 @@ public Structures.Index RemoveNotInBuilder(Structures.Index index) if (writeToFile) { await WriteToDiskAsync(index); - await WriteToDiskAsync(index.BaseUrl, await index.GetPackagesFromAllSourcesAsync()); + var allPackages = await index.GetPackagesFromAllSourcesAsync(); + await WriteToDiskAsync(index.BaseUrl, allPackages, Routes.AllPackages); + allPackages.RemoveNonDependencyInfo(); + await WriteToDiskAsync(index.BaseUrl, allPackages, Routes.AllDependencies); } index.BaseUrl = new Uri(outputFolder, UriKind.Absolute); @@ -110,10 +113,11 @@ public async Task WriteToDiskAsync(Structures.Index index) /// /// The list containing all packages. /// The 'base URL' where the Index is contained. - public async Task WriteToDiskAsync(Uri baseUrl, PackageList list) + /// The route where this package list goes. + public async Task WriteToDiskAsync(Uri baseUrl, PackageList list, string route) { var compressedPackageList = Compression.Compress(JsonSerializer.SerializeToUtf8Bytes(list, Serializer.Options)); - await File.WriteAllBytesAsync(Path.Combine(baseUrl.LocalPath, Routes.AllPackages), compressedPackageList); + await File.WriteAllBytesAsync(Path.Combine(baseUrl.LocalPath, route), compressedPackageList); } private async Task BuildNuGetSourceAsync(Structures.Index index, IndexSourceEntry indexSourceEntry, diff --git a/source/Reloaded.Mod.Loader.Update/Index/Routes.cs b/source/Reloaded.Mod.Loader.Update/Index/Routes.cs index 1ad96ebc..efcf02b3 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/Routes.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/Routes.cs @@ -25,6 +25,14 @@ public static class Routes /// public const string AllPackages = $"AllPackages{FileExtension}{CompressionExtension}"; + /// + /// Link to the index containing all dependencies + /// + /// + /// This is same as but with information omitted to reduce bandwidth. + /// + public const string AllDependencies = $"AllDependencies{FileExtension}{CompressionExtension}"; + /// /// Contains the code to determine locations of output files /// diff --git a/source/Reloaded.Mod.Loader.Update/Index/Structures/Package.cs b/source/Reloaded.Mod.Loader.Update/Index/Structures/Package.cs index 0a55c6e1..a2b9455e 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/Structures/Package.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/Structures/Package.cs @@ -88,4 +88,23 @@ public async Task DownloadAsync(string packageFolder, IProgress? this.Adapt(webPackage); return await webPackage.DownloadAsync(packageFolder, progress, token); } + + /// + /// Removes all information that is not needed in dependency resolution. + /// + public void RemoveNonDependencyInfo() + { + Authors = null; + Submitter = null; + Description = null; + MarkdownReadme = null; + Images = null; + ProjectUri = null; + LikeCount = null; + ViewCount = null; + DownloadCount = null; + Published = null; + Changelog = null; + Tags = null; + } } \ No newline at end of file diff --git a/source/Reloaded.Mod.Loader.Update/Index/Structures/PackageList.cs b/source/Reloaded.Mod.Loader.Update/Index/Structures/PackageList.cs index 0602a1d1..6f051126 100644 --- a/source/Reloaded.Mod.Loader.Update/Index/Structures/PackageList.cs +++ b/source/Reloaded.Mod.Loader.Update/Index/Structures/PackageList.cs @@ -22,4 +22,15 @@ public static PackageList Create() Packages = new List() }; } + + /// + /// Removes the info that is not needed for dependency resolution. + /// + public void RemoveNonDependencyInfo() + { + foreach (var package in Packages) + { + package.RemoveNonDependencyInfo(); + } + } } \ No newline at end of file diff --git a/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs b/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs index 78d3603f..3bd03a8f 100644 --- a/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs +++ b/source/Reloaded.Mod.Loader.Update/Providers/Index/IndexDependencyResolver.cs @@ -19,7 +19,7 @@ public IndexDependencyResolver() Task.Run(async () => { var indexApi = new IndexApi(); - _packages = await indexApi.GetAllPackagesAsync(); + _packages = await indexApi.GetAllDependenciesAsync(); }).Wait(); } From af5be694f7e230608bf5041fda0ffd7babb71dc2 Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Fri, 22 Mar 2024 16:16:29 +0000 Subject: [PATCH 6/9] Improved: Don't erase dependency update info if we have missing deps --- source/Reloaded.Mod.Launcher.Lib/Setup.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/source/Reloaded.Mod.Launcher.Lib/Setup.cs b/source/Reloaded.Mod.Launcher.Lib/Setup.cs index e3746131..b109bf06 100644 --- a/source/Reloaded.Mod.Launcher.Lib/Setup.cs +++ b/source/Reloaded.Mod.Launcher.Lib/Setup.cs @@ -125,7 +125,7 @@ public static bool TryGetIncompatibleMods(PathTuple applicati /// Quickly checks for any missing dependencies amongst available mods /// and opens a menu allowing to download if mods are unavailable. /// - /// + /// True if there are missing deps, else false. public static async Task CheckForMissingModDependenciesAsync() { var deps = Update.CheckMissingDependencies(); @@ -310,8 +310,12 @@ private static void SetLoaderPaths(LoaderConfig config, string launcherDirectory /// private static async Task CheckForUpdatesAsync() { - await CheckForMissingModDependenciesAsync(); // in case DependencyMetadataWriterFactory deletes one after unsuccessful pull from 1 click - await DependencyMetadataWriterFactory.ExecuteAllAsync(IoC.Get()); + // The action below is destructive. + // It may remove update metadata for missing dependencies. + // Don't run this unless we have all the mods. + if (Update.CheckMissingDependencies().AllAvailable) + await DependencyMetadataWriterFactory.ExecuteAllAsync(IoC.Get()); + await Update.CheckForLoaderUpdatesAsync(); await Task.Run(Update.CheckForModUpdatesAsync); await CheckForMissingModDependenciesAsync(); From 96b6ef2f14b42463d41b1d7baeaf21a7f7c4160c Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Fri, 22 Mar 2024 16:19:00 +0000 Subject: [PATCH 7/9] Improved: Force Update Mod Metadata Before Publish --- .../Commands/Mod/PublishModCommand.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/Reloaded.Mod.Launcher.Lib/Commands/Mod/PublishModCommand.cs b/source/Reloaded.Mod.Launcher.Lib/Commands/Mod/PublishModCommand.cs index 5c6cb7cf..b964a926 100644 --- a/source/Reloaded.Mod.Launcher.Lib/Commands/Mod/PublishModCommand.cs +++ b/source/Reloaded.Mod.Launcher.Lib/Commands/Mod/PublishModCommand.cs @@ -21,6 +21,9 @@ public PublishModCommand(PathTuple? modTuple) /// public void Execute(object? parameter) { + if (Update.CheckMissingDependencies().AllAvailable) + Task.Run(async () => await DependencyMetadataWriterFactory.ExecuteAllAsync(IoC.Get())).Wait(); + if (!NuGetVersion.TryParse(_modTuple!.Config.ModVersion, out var version)) { Actions.DisplayMessagebox(Resources.ErrorInvalidModConfigTitle.Get(), Resources.ErrorInvalidModConfigDescription.Get()); From fd643415dcb2f8dc889f8df09c983eea1de45751 Mon Sep 17 00:00:00 2001 From: sewer56lol Date: Fri, 22 Mar 2024 18:36:37 +0000 Subject: [PATCH 8/9] Bugfix: DependencyResolveResult Combine No Longer Returns False Missing Deps --- .../Interfaces/IDependencyResolver.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/Reloaded.Mod.Loader.Update/Interfaces/IDependencyResolver.cs b/source/Reloaded.Mod.Loader.Update/Interfaces/IDependencyResolver.cs index eef03e81..34ec9dcf 100644 --- a/source/Reloaded.Mod.Loader.Update/Interfaces/IDependencyResolver.cs +++ b/source/Reloaded.Mod.Loader.Update/Interfaces/IDependencyResolver.cs @@ -61,6 +61,10 @@ public static ModDependencyResolveResult Combine(IEnumerable Date: Fri, 22 Mar 2024 18:36:56 +0000 Subject: [PATCH 9/9] Improved: Search Index is now used as fallback if all else fails. --- source/Reloaded.Mod.Launcher.Lib/Update.cs | 14 +++++++++++++- .../DependencyResolverFactory.cs | 3 +-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/source/Reloaded.Mod.Launcher.Lib/Update.cs b/source/Reloaded.Mod.Launcher.Lib/Update.cs index ff0b7a26..98a086ca 100644 --- a/source/Reloaded.Mod.Launcher.Lib/Update.cs +++ b/source/Reloaded.Mod.Launcher.Lib/Update.cs @@ -1,4 +1,5 @@ using Reloaded.Mod.Loader.Update.Providers.GitHub; +using Reloaded.Mod.Loader.Update.Providers.Index; using Constants = Reloaded.Mod.Launcher.Lib.Misc.Constants; using Version = Reloaded.Mod.Launcher.Lib.Utility.Version; @@ -271,7 +272,18 @@ public static async Task GetMissingDependenciesToDow await Task.WhenAll(results); // Merge Results - return ModDependencyResolveResult.Combine(results.Select(x => x.Result));; + var result = ModDependencyResolveResult.Combine(results.Select(x => x.Result));; + if (result.NotFoundDependencies.Count <= 0) + return result; + + // Fallback to using Index Resolver if we couldn't find the package otherwise. + var indexResolver = new IndexDependencyResolver(); + var indexResults = new List(); + foreach (var notFound in result.NotFoundDependencies) + indexResults.Add(await indexResolver.ResolveAsync(notFound, null, token)); + + indexResults.Add(result); + return ModDependencyResolveResult.Combine(indexResults); } /// diff --git a/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs b/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs index 923d5187..4966c29c 100644 --- a/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs +++ b/source/Reloaded.Mod.Loader.Update/DependencyResolverFactory.cs @@ -15,8 +15,7 @@ public static IDependencyResolver GetInstance(AggregateNugetRepository repositor return new AggregateDependencyResolver([ new NuGetDependencyResolver(repository), new GameBananaDependencyResolver(), - new GitHubDependencyResolver(), - new IndexDependencyResolver() + new GitHubDependencyResolver() ]); } } \ No newline at end of file