From e72734b16a2c11e2e1726a0bc7e4515a09b472b1 Mon Sep 17 00:00:00 2001 From: Paul Hebble Date: Tue, 2 Jul 2019 02:10:15 +0000 Subject: [PATCH 1/2] Auto-epoch based on queue message attribute --- Core/Versioning/ModuleVersion.cs | 8 +++ Netkan/Processors/Inflator.cs | 5 +- Netkan/Processors/QueueHandler.cs | 10 +++- Netkan/Program.cs | 2 +- Netkan/Transformers/EpochTransformer.cs | 24 ++++++++- Netkan/Transformers/ITransformer.cs | 9 ++-- Spec.md | 21 +++++++- Tests/NetKAN/MainClass.cs | 2 +- Tests/NetKAN/NetkanOverride.cs | 2 +- .../Transformers/AvcKrefTransformerTests.cs | 2 +- .../Transformers/AvcTransformerTests.cs | 2 +- .../Transformers/CurseTransformerTests.cs | 2 +- .../DownloadAttributeTransformerTests.cs | 2 +- .../Transformers/EpochTransformerTests.cs | 49 +++++++++++++++++++ .../GeneratedByTransformerTests.cs | 2 +- .../Transformers/GithubTransformerTests.cs | 2 +- .../Transformers/HttpTransformerTests.cs | 2 +- .../InternalCkanTransformerTests.cs | 2 +- .../MetaNetkanTransformerTests.cs | 2 +- .../Transformers/SpacedockTransformerTests.cs | 2 +- .../StripNetkanMetadataTransformerTests.cs | 2 +- .../VersionEditTransformerTests.cs | 2 +- 22 files changed, 132 insertions(+), 24 deletions(-) create mode 100644 Tests/NetKAN/Transformers/EpochTransformerTests.cs diff --git a/Core/Versioning/ModuleVersion.cs b/Core/Versioning/ModuleVersion.cs index 5c99d4d525..b316b693f9 100644 --- a/Core/Versioning/ModuleVersion.cs +++ b/Core/Versioning/ModuleVersion.cs @@ -59,6 +59,14 @@ public ModuleVersion(string version) _string = version; } + /// + /// New module version with same version as 'this' but with one greater epoch + /// + public ModuleVersion IncrementEpoch() + { + return new ModuleVersion($"{_epoch + 1}:{_version}"); + } + /// /// Converts the value of the current object to its equivalent /// representation. diff --git a/Netkan/Processors/Inflator.cs b/Netkan/Processors/Inflator.cs index 1a8abc86fb..8ddccdd338 100644 --- a/Netkan/Processors/Inflator.cs +++ b/Netkan/Processors/Inflator.cs @@ -5,6 +5,7 @@ using Autofac; using log4net; using CKAN.Configuration; +using CKAN.Versioning; using CKAN.NetKAN.Model; using CKAN.NetKAN.Services; using CKAN.NetKAN.Transformers; @@ -30,7 +31,7 @@ public Inflator(string cacheDir, bool overwriteCache, string githubToken, bool p transformer = new NetkanTransformer(http, fileService, moduleService, githubToken, prerelease); } - internal IEnumerable Inflate(string filename, Metadata netkan, int? releases) + internal IEnumerable Inflate(string filename, Metadata netkan, int? releases, ModuleVersion previousHighVer) { log.DebugFormat("Inflating {0}", filename); try @@ -42,7 +43,7 @@ internal IEnumerable Inflate(string filename, Metadata netkan, int? re log.Info("Input successfully passed pre-validation"); IEnumerable ckans = transformer - .Transform(netkan, new TransformOptions(releases)) + .Transform(netkan, new TransformOptions(releases, previousHighVer)) .ToList(); log.Info("Finished transformation"); diff --git a/Netkan/Processors/QueueHandler.cs b/Netkan/Processors/QueueHandler.cs index 9c7da53ce2..cb8fb25d24 100644 --- a/Netkan/Processors/QueueHandler.cs +++ b/Netkan/Processors/QueueHandler.cs @@ -9,6 +9,7 @@ using log4net; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using CKAN.Versioning; using CKAN.NetKAN.Model; namespace CKAN.NetKAN.Processors @@ -103,13 +104,20 @@ private IEnumerable Inflate(Message msg) releases = int.Parse(releasesAttr.StringValue); } + ModuleVersion highVer = null; + MessageAttributeValue highVerAttr; + if (msg.MessageAttributes.TryGetValue("HighestVersion", out highVerAttr)) + { + highVer = new ModuleVersion(highVerAttr.StringValue); + } + log.InfoFormat("Inflating {0}", netkan.Identifier); IEnumerable ckans = null; bool caught = false; string caughtMessage = null; try { - ckans = inflator.Inflate($"{netkan.Identifier}.netkan", netkan, releases); + ckans = inflator.Inflate($"{netkan.Identifier}.netkan", netkan, releases, highVer); } catch (Exception e) { diff --git a/Netkan/Program.cs b/Netkan/Program.cs index 82ed85b9a9..12d0e48f7e 100644 --- a/Netkan/Program.cs +++ b/Netkan/Program.cs @@ -87,7 +87,7 @@ public static int Main(string[] args) Options.GitHubToken, Options.PreRelease ); - var ckans = inf.Inflate(Options.File, netkan, ParseReleases(Options.Releases)); + var ckans = inf.Inflate(Options.File, netkan, ParseReleases(Options.Releases), null); foreach (Metadata ckan in ckans) { WriteCkan(ckan); diff --git a/Netkan/Transformers/EpochTransformer.cs b/Netkan/Transformers/EpochTransformer.cs index d4a8577fad..e11c9fb7bd 100644 --- a/Netkan/Transformers/EpochTransformer.cs +++ b/Netkan/Transformers/EpochTransformer.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; -using CKAN.NetKAN.Model; using log4net; using Newtonsoft.Json.Linq; +using CKAN.Versioning; +using CKAN.NetKAN.Model; namespace CKAN.NetKAN.Transformers { @@ -38,8 +39,27 @@ public IEnumerable Transform(Metadata metadata, TransformOptions opts) } else { - throw new BadMetadataKraken(null, "Invalid epoch: " + epoch + "In " + json["identifier"]); + throw new BadMetadataKraken(null, "Invalid epoch: " + epoch + " In " + json["identifier"]); + } + } + + JToken allowOOO; + if (json.TryGetValue("x_netkan_allow_out_of_order", out allowOOO) && (bool)allowOOO) + { + Log.Debug("Out of order versions enabled in netkan, skipping OOO check"); + } + else if (opts.HighestVersion != null) + { + // Ensure we are greater or equal to the previous max + ModuleVersion currentV = new ModuleVersion((string)json["version"]); + while (currentV < opts.HighestVersion) + { + Log.DebugFormat("Auto-epoching out of order version: {0} < {1}", + currentV, opts.HighestVersion); + // Increment epoch if too small + currentV = currentV.IncrementEpoch(); } + json["version"] = currentV.ToString(); } yield return new Metadata(json); diff --git a/Netkan/Transformers/ITransformer.cs b/Netkan/Transformers/ITransformer.cs index fda7a8c608..bace038be3 100644 --- a/Netkan/Transformers/ITransformer.cs +++ b/Netkan/Transformers/ITransformer.cs @@ -1,16 +1,19 @@ using System.Collections.Generic; using CKAN.NetKAN.Model; +using CKAN.Versioning; namespace CKAN.NetKAN.Transformers { internal class TransformOptions { - public TransformOptions(int? releases) + public TransformOptions(int? releases, ModuleVersion highVer) { - Releases = releases; + Releases = releases; + HighestVersion = highVer; } - public readonly int? Releases; + public readonly int? Releases; + public readonly ModuleVersion HighestVersion; } /// diff --git a/Spec.md b/Spec.md index 774c615d65..f972de3ce9 100644 --- a/Spec.md +++ b/Spec.md @@ -855,9 +855,12 @@ If (and only if) no mod version number has been identified (eg a `#/ckan/http/:u ##### `x_netkan_epoch` -The `x_netkan_epoch` field is used to specify a particular `epoch` number in the `version` field. Its value should be +The `x_netkan_epoch` field is used to specify a minimum `epoch` number manually in the `version` field. Its value should be an unsigned 32-bit integer. +Note that an epoch can be added without this property or incremented automatically, if the auto-indexer detects an out-of-order +release. + An example `.netkan` excerpt: ```json { @@ -865,6 +868,22 @@ An example `.netkan` excerpt: } ``` +##### `x_netkan_allow_out_of_order` + +If true, then this module allows a freshly released version to have a version number smaller than previously existing releases. + +This should be used for modules that intentionally release "backport" versions, to disable automatic incrementing of epochs for +out of order releases. +Typical mods should not use this property, to allow their version epochs to be automatically incremented if they release an out +of order version. + +An example `.netkan` excerpt: +```json +{ + "x_netkan_allow_out_of_order": true +} +``` + ##### `x_netkan_force_v` The `x_netkan_force_v` field is used to specify that a `v` should be prepended to the `version` field. It is a diff --git a/Tests/NetKAN/MainClass.cs b/Tests/NetKAN/MainClass.cs index f883e492d9..23e4d04b56 100644 --- a/Tests/NetKAN/MainClass.cs +++ b/Tests/NetKAN/MainClass.cs @@ -12,7 +12,7 @@ namespace Tests.NetKAN [TestFixture] public class MainClassTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void FixVersionStringsUnharmed() diff --git a/Tests/NetKAN/NetkanOverride.cs b/Tests/NetKAN/NetkanOverride.cs index df1e56e530..3c37312427 100644 --- a/Tests/NetKAN/NetkanOverride.cs +++ b/Tests/NetKAN/NetkanOverride.cs @@ -11,7 +11,7 @@ namespace Tests.NetKAN public class NetkanOverride { JObject such_metadata; - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [SetUp] public void Setup() diff --git a/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs b/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs index c990d23123..d654f58c24 100644 --- a/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs +++ b/Tests/NetKAN/Transformers/AvcKrefTransformerTests.cs @@ -12,7 +12,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class AvcKrefTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test, TestCase( diff --git a/Tests/NetKAN/Transformers/AvcTransformerTests.cs b/Tests/NetKAN/Transformers/AvcTransformerTests.cs index 2025d72fdc..c9db2a741a 100644 --- a/Tests/NetKAN/Transformers/AvcTransformerTests.cs +++ b/Tests/NetKAN/Transformers/AvcTransformerTests.cs @@ -14,7 +14,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class AvcTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void AddsMissingVersionInfo() diff --git a/Tests/NetKAN/Transformers/CurseTransformerTests.cs b/Tests/NetKAN/Transformers/CurseTransformerTests.cs index 59f61291dd..0b84d67259 100644 --- a/Tests/NetKAN/Transformers/CurseTransformerTests.cs +++ b/Tests/NetKAN/Transformers/CurseTransformerTests.cs @@ -12,7 +12,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class CurseTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); // GH #199: Don't pre-fill KSP version fields if we see a ksp_min/max [Test] diff --git a/Tests/NetKAN/Transformers/DownloadAttributeTransformerTests.cs b/Tests/NetKAN/Transformers/DownloadAttributeTransformerTests.cs index 43b085f405..316d1f8d04 100644 --- a/Tests/NetKAN/Transformers/DownloadAttributeTransformerTests.cs +++ b/Tests/NetKAN/Transformers/DownloadAttributeTransformerTests.cs @@ -13,7 +13,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class DownloadAttributeTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void AddsDownloadAttributes() diff --git a/Tests/NetKAN/Transformers/EpochTransformerTests.cs b/Tests/NetKAN/Transformers/EpochTransformerTests.cs new file mode 100644 index 0000000000..7d20945ee3 --- /dev/null +++ b/Tests/NetKAN/Transformers/EpochTransformerTests.cs @@ -0,0 +1,49 @@ +using System.Linq; +using Newtonsoft.Json.Linq; +using NUnit.Framework; +using CKAN.Versioning; +using CKAN.NetKAN.Model; +using CKAN.NetKAN.Transformers; + +namespace Tests.NetKAN.Transformers +{ + [TestFixture] + public sealed class EpochTransformerTests + { + [Test, + TestCase("1.1", null, "1.1"), + TestCase("1.1", "1.1", "1.1"), + TestCase("1.1", "1.2", "1:1.1"), + TestCase("1.1", "5:1.1", "5:1.1"), + TestCase("1.1", "5:1.2", "6:1.1"), + TestCase("0.7", "0.65", "1:0.7"), + TestCase("2.5", "v2.4", "1:2.5"), + TestCase("2.5", "V2.4", "1:2.5"), + TestCase("v2.5", "vV2.4", "1:v2.5"), + ] + public void Transform_WithHighVersionParam_MatchesExpected(string version, string highVer, string expected) + { + // Arrange + var json = new JObject() + { + { "spec_version", "v1.4" }, + { "identifier", "AwesomeMod" }, + { "version", version }, + }; + ITransformer sut = new EpochTransformer(); + TransformOptions opts = new TransformOptions( + 1, + string.IsNullOrEmpty(highVer) + ? null + : new ModuleVersion(highVer) + ); + + // Act + var result = sut.Transform(new Metadata(json), opts).First(); + var transformedJson = result.Json(); + + // Assert + Assert.AreEqual(expected, (string)transformedJson["version"]); + } + } +} diff --git a/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs b/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs index d419894c4c..761d84096f 100644 --- a/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs +++ b/Tests/NetKAN/Transformers/GeneratedByTransformerTests.cs @@ -9,7 +9,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class GeneratedByTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void AddsGeneratedByProperty() diff --git a/Tests/NetKAN/Transformers/GithubTransformerTests.cs b/Tests/NetKAN/Transformers/GithubTransformerTests.cs index 148e650278..31e17e7ae7 100644 --- a/Tests/NetKAN/Transformers/GithubTransformerTests.cs +++ b/Tests/NetKAN/Transformers/GithubTransformerTests.cs @@ -14,7 +14,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class GithubTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void CalculatesRepositoryUrlCorrectly() diff --git a/Tests/NetKAN/Transformers/HttpTransformerTests.cs b/Tests/NetKAN/Transformers/HttpTransformerTests.cs index aae15680d4..9d70efaae1 100644 --- a/Tests/NetKAN/Transformers/HttpTransformerTests.cs +++ b/Tests/NetKAN/Transformers/HttpTransformerTests.cs @@ -9,7 +9,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class HttpTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [TestCase("#/ckan/github/foo/bar")] [TestCase("#/ckan/netkan/http://awesomemod.example/awesomemod.netkan")] diff --git a/Tests/NetKAN/Transformers/InternalCkanTransformerTests.cs b/Tests/NetKAN/Transformers/InternalCkanTransformerTests.cs index a67395dbd7..627133d355 100644 --- a/Tests/NetKAN/Transformers/InternalCkanTransformerTests.cs +++ b/Tests/NetKAN/Transformers/InternalCkanTransformerTests.cs @@ -12,7 +12,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class InternalCkanTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void AddsMiddingProperties() diff --git a/Tests/NetKAN/Transformers/MetaNetkanTransformerTests.cs b/Tests/NetKAN/Transformers/MetaNetkanTransformerTests.cs index d57d80b6c9..f8e4ccfbcf 100644 --- a/Tests/NetKAN/Transformers/MetaNetkanTransformerTests.cs +++ b/Tests/NetKAN/Transformers/MetaNetkanTransformerTests.cs @@ -13,7 +13,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class MetaNetkanTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void DoesNothingWhenNoMatch() diff --git a/Tests/NetKAN/Transformers/SpacedockTransformerTests.cs b/Tests/NetKAN/Transformers/SpacedockTransformerTests.cs index ddf94aa06c..f5baf1364b 100644 --- a/Tests/NetKAN/Transformers/SpacedockTransformerTests.cs +++ b/Tests/NetKAN/Transformers/SpacedockTransformerTests.cs @@ -14,7 +14,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class SpacedockTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); // GH #199: Don't pre-fill KSP version fields if we see a ksp_min/max [Test] diff --git a/Tests/NetKAN/Transformers/StripNetkanMetadataTransformerTests.cs b/Tests/NetKAN/Transformers/StripNetkanMetadataTransformerTests.cs index 4cebfcb527..472fdebdec 100644 --- a/Tests/NetKAN/Transformers/StripNetkanMetadataTransformerTests.cs +++ b/Tests/NetKAN/Transformers/StripNetkanMetadataTransformerTests.cs @@ -10,7 +10,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class StripNetkanMetadataTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [TestCaseSource("StripNetkanMetadataTestCaseSource")] public void StripNetkanMetadata(string json, string expected) diff --git a/Tests/NetKAN/Transformers/VersionEditTransformerTests.cs b/Tests/NetKAN/Transformers/VersionEditTransformerTests.cs index 6ab405362a..d5ac5c5732 100644 --- a/Tests/NetKAN/Transformers/VersionEditTransformerTests.cs +++ b/Tests/NetKAN/Transformers/VersionEditTransformerTests.cs @@ -10,7 +10,7 @@ namespace Tests.NetKAN.Transformers [TestFixture] public sealed class VersionEditTransformerTests { - private TransformOptions opts = new TransformOptions(1); + private TransformOptions opts = new TransformOptions(1, null); [Test] public void DoesNothingWhenNoMatch() From baf51deaaba76275ee259070e81780094d99b066 Mon Sep 17 00:00:00 2001 From: Paul Hebble Date: Wed, 27 Nov 2019 22:19:31 -0600 Subject: [PATCH 2/2] Turn on staging for auto-epoched modules --- Netkan/Processors/Inflator.cs | 4 ++-- Netkan/Processors/QueueHandler.cs | 21 ++++++++++++++------- Netkan/Program.cs | 2 +- Netkan/Transformers/EpochTransformer.cs | 3 +++ Netkan/Transformers/ITransformer.cs | 2 ++ 5 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Netkan/Processors/Inflator.cs b/Netkan/Processors/Inflator.cs index 8ddccdd338..b9adfe2613 100644 --- a/Netkan/Processors/Inflator.cs +++ b/Netkan/Processors/Inflator.cs @@ -31,7 +31,7 @@ public Inflator(string cacheDir, bool overwriteCache, string githubToken, bool p transformer = new NetkanTransformer(http, fileService, moduleService, githubToken, prerelease); } - internal IEnumerable Inflate(string filename, Metadata netkan, int? releases, ModuleVersion previousHighVer) + internal IEnumerable Inflate(string filename, Metadata netkan, TransformOptions opts) { log.DebugFormat("Inflating {0}", filename); try @@ -43,7 +43,7 @@ internal IEnumerable Inflate(string filename, Metadata netkan, int? re log.Info("Input successfully passed pre-validation"); IEnumerable ckans = transformer - .Transform(netkan, new TransformOptions(releases, previousHighVer)) + .Transform(netkan, opts) .ToList(); log.Info("Finished transformation"); diff --git a/Netkan/Processors/QueueHandler.cs b/Netkan/Processors/QueueHandler.cs index cb8fb25d24..ba3638e10a 100644 --- a/Netkan/Processors/QueueHandler.cs +++ b/Netkan/Processors/QueueHandler.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; using CKAN.Versioning; +using CKAN.NetKAN.Transformers; using CKAN.NetKAN.Model; namespace CKAN.NetKAN.Processors @@ -115,9 +116,10 @@ private IEnumerable Inflate(Message msg) IEnumerable ckans = null; bool caught = false; string caughtMessage = null; + var opts = new TransformOptions(releases, highVer); try { - ckans = inflator.Inflate($"{netkan.Identifier}.netkan", netkan, releases, highVer); + ckans = inflator.Inflate($"{netkan.Identifier}.netkan", netkan, opts); } catch (Exception e) { @@ -130,20 +132,25 @@ private IEnumerable Inflate(Message msg) } if (caught) { - yield return inflationMessage(null, netkan, false, caughtMessage); + yield return inflationMessage(null, netkan, opts, false, caughtMessage); } if (ckans != null) { foreach (Metadata ckan in ckans) { log.InfoFormat("Sending {0}-{1}", ckan.Identifier, ckan.Version); - yield return inflationMessage(ckan, netkan, true); + yield return inflationMessage(ckan, netkan, opts, true); } } } - private SendMessageBatchRequestEntry inflationMessage(Metadata ckan, Metadata netkan, bool success, string err = null) + private SendMessageBatchRequestEntry inflationMessage(Metadata ckan, Metadata netkan, TransformOptions opts, bool success, string err = null) { + bool staged = netkan.Staged || opts.Staged; + string stagingReason = + !string.IsNullOrEmpty(netkan.StagingReason) ? netkan.StagingReason + : !string.IsNullOrEmpty(opts.StagingReason) ? opts.StagingReason + : null; var attribs = new Dictionary() { { @@ -159,7 +166,7 @@ private SendMessageBatchRequestEntry inflationMessage(Metadata ckan, Metadata ne new MessageAttributeValue() { DataType = "String", - StringValue = netkan.Staged.ToString() + StringValue = staged.ToString() } }, { @@ -201,14 +208,14 @@ private SendMessageBatchRequestEntry inflationMessage(Metadata ckan, Metadata ne } ); } - if (netkan.Staged && !string.IsNullOrEmpty(netkan.StagingReason)) + if (staged && stagingReason != null) { attribs.Add( "StagingReason", new MessageAttributeValue() { DataType = "String", - StringValue = netkan.StagingReason + StringValue = stagingReason, } ); } diff --git a/Netkan/Program.cs b/Netkan/Program.cs index 12d0e48f7e..7f1b62815e 100644 --- a/Netkan/Program.cs +++ b/Netkan/Program.cs @@ -87,7 +87,7 @@ public static int Main(string[] args) Options.GitHubToken, Options.PreRelease ); - var ckans = inf.Inflate(Options.File, netkan, ParseReleases(Options.Releases), null); + var ckans = inf.Inflate(Options.File, netkan, new TransformOptions(ParseReleases(Options.Releases), null)); foreach (Metadata ckan in ckans) { WriteCkan(ckan); diff --git a/Netkan/Transformers/EpochTransformer.cs b/Netkan/Transformers/EpochTransformer.cs index e11c9fb7bd..1171fb7081 100644 --- a/Netkan/Transformers/EpochTransformer.cs +++ b/Netkan/Transformers/EpochTransformer.cs @@ -56,6 +56,9 @@ public IEnumerable Transform(Metadata metadata, TransformOptions opts) { Log.DebugFormat("Auto-epoching out of order version: {0} < {1}", currentV, opts.HighestVersion); + // Tell the Indexer to be careful + opts.Staged = true; + opts.StagingReason = $"Auto-epoching out of order version: {currentV} < {opts.HighestVersion}"; // Increment epoch if too small currentV = currentV.IncrementEpoch(); } diff --git a/Netkan/Transformers/ITransformer.cs b/Netkan/Transformers/ITransformer.cs index bace038be3..06d16ca0ae 100644 --- a/Netkan/Transformers/ITransformer.cs +++ b/Netkan/Transformers/ITransformer.cs @@ -14,6 +14,8 @@ public TransformOptions(int? releases, ModuleVersion highVer) public readonly int? Releases; public readonly ModuleVersion HighestVersion; + public bool Staged; + public string StagingReason; } ///