From b2960c318671fc0d32a57a7a60be09599a8e11bf Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:51:27 +0200 Subject: [PATCH 1/3] feat: add value equality collection with generic collection type --- .../ValueEqualityCollections/Extensions.cs | 21 ++ .../ValueEqualityCollection.cs | 165 ++++++-- .../TestValueEqualityCollection.cs | 354 ++++++++++++------ 3 files changed, 403 insertions(+), 137 deletions(-) diff --git a/R4Utils/ValueEqualityCollections/Extensions.cs b/R4Utils/ValueEqualityCollections/Extensions.cs index dfb6161..bfc63cf 100644 --- a/R4Utils/ValueEqualityCollections/Extensions.cs +++ b/R4Utils/ValueEqualityCollections/Extensions.cs @@ -18,4 +18,25 @@ public static ValueEqualityCollection AsOrderedValueEqualityCollection(thi /// public static ValueEqualityCollection AsValueEqualityCollection(this ICollection collection) where T : IEquatable => new(collection, ValueEqualityCollection.OrderMode.Ignore); + + /// + /// Transform this collection into a collection that performs value equality on its items for deducing collection equality. + ///

+ /// The resulting will consider ordering whenever compared to another instance also considering ordering. + ///
+ public static ValueEqualityCollection + AsGenericOrderedValueEqualityCollection(this TCollection collection) + where T : IEquatable where TCollection : IList => + new(collection, ValueEqualityCollection.OrderMode.Consider); + + /// + /// Transform this collection into a collection that performs value equality on its items for deducing collection equality. + ///

+ /// As the underlying does not support ordering (does not inherit ), + /// the resulting will ignore ordering whenever it is compared. + ///
+ public static ValueEqualityCollection + AsGenericValueEqualityCollection(this TCollection collection) + where T : IEquatable where TCollection : ICollection => + new(collection, ValueEqualityCollection.OrderMode.Ignore); } diff --git a/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs b/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs index c7e2a64..3b0a89f 100644 --- a/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs +++ b/R4Utils/ValueEqualityCollections/ValueEqualityCollection.cs @@ -3,6 +3,37 @@ namespace R4Utils.ValueEqualityCollections; +file static class Helpers +{ + // Source: https://stackoverflow.com/a/3670089/13849454 + public static bool ScrambledEquals(ICollection collection1, ICollection collection2) where T : notnull + { + var cnt = new Dictionary(); + // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator + foreach (var s in collection1) + { + if (!cnt.TryAdd(s, 1)) + { + cnt[s]++; + } + } + + foreach (var s in collection2) + { + if (cnt.TryGetValue(s, out var value)) + { + cnt[s] = --value; + } + else + { + return false; + } + } + + return cnt.Values.All(c => c == 0); + } +} + /// /// A wrapper around an that uses value equality of its elements for equality of the collections. /// @@ -73,40 +104,11 @@ private bool EqualityDispatch(ValueEqualityCollection other) return OrderedEquality(list1, list2); } - return ScrambledEquals(Collection, other.Collection); + return Helpers.ScrambledEquals(Collection, other.Collection); } private static bool OrderedEquality(IList list1, IList list2) => list1.SequenceEqual(list2); - // Source: https://stackoverflow.com/a/3670089/13849454 - private static bool ScrambledEquals(ICollection collection1, ICollection collection2) - { - var cnt = new Dictionary(); - // ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator - foreach (var s in collection1) - { - if (!cnt.TryAdd(s, 1)) - { - cnt[s]++; - } - } - - foreach (var s in collection2) - { - if (cnt.TryGetValue(s, out var value)) - { - cnt[s] = --value; - } - else - { - return false; - } - } - - return cnt.Values.All(c => c == 0); - } - - // ICollection implementation public IEnumerator GetEnumerator() => Collection.GetEnumerator(); @@ -119,7 +121,7 @@ public override bool Equals(object? obj) } // TODO: Look into this, this might in fact be wrong. - public override int GetHashCode() => Collection.Aggregate(0, HashCode.Combine); + public override int GetHashCode() => HashCode.Combine(Collection.Aggregate(0, HashCode.Combine), Ordering); public void Add(T item) => Collection.Add(item); @@ -135,3 +137,104 @@ public override bool Equals(object? obj) public bool IsReadOnly => Collection.IsReadOnly; } + +/// +/// A wrapper around a that uses value equality of its elements for equality of the collections. +/// +public class ValueEqualityCollection : ICollection, + IEquatable>, + IEqualityOperators, ValueEqualityCollection, bool> + where T : IEquatable where TCollection : ICollection +{ + public override bool Equals(object? obj) + { + if (obj is null) return false; + if (ReferenceEquals(this, obj)) return true; + if (obj.GetType() != GetType()) return false; + return Equals((ValueEqualityCollection)obj); + } + + // TODO: Look into this, this might in fact be wrong. + public override int GetHashCode() => HashCode.Combine(Underlying.Aggregate(0, HashCode.Combine), Ordering); + + /// + /// Defines strategies of dealing with ordering when comparing two instances. + /// + public enum OrderMode + { + /// + /// Consider ordering when comparing this instance with another one. + /// + Consider, + + /// + /// Ignore ordering when comparing this instance with another one. + ///

+ /// If any of the compared instances has this set, the ordering will be ignored. + ///
+ Ignore, + } + + /// + /// The collection used to create this instance. + /// + public TCollection Underlying { get; } + + /// + /// Whether to consider ordering when comparing this instance with another one. + ///

+ /// This is always unless inherits . + ///
+ public OrderMode Ordering { get; } + + internal ValueEqualityCollection(TCollection underlying, OrderMode ordering) + { + Underlying = underlying; + Ordering = underlying is IList ? ordering : OrderMode.Ignore; + } + + // Equality + public bool Equals(ValueEqualityCollection? other) + { + if (other is null) return false; + return ReferenceEquals(this, other) || EqualityDispatch(other); + } + + private bool EqualityDispatch(ValueEqualityCollection other) + { + if (Ordering is OrderMode.Consider && other.Ordering is OrderMode.Consider && Underlying is IList list1 && + other.Underlying is IList list2) + { + return OrderedEquality(list1, list2); + } + + return Helpers.ScrambledEquals(Underlying, other.Underlying); + } + + private static bool OrderedEquality(IList list1, IList list2) => list1.SequenceEqual(list2); + + public static bool operator ==(ValueEqualityCollection? left, + ValueEqualityCollection? right) => right?.Equals(left) ?? left is null; + + public static bool operator !=(ValueEqualityCollection? left, + ValueEqualityCollection? right) => !(left == right); + + // Collection + public IEnumerator GetEnumerator() => Underlying.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)Underlying).GetEnumerator(); + + public void Add(T item) => Underlying.Add(item); + + public void Clear() => Underlying.Clear(); + + public bool Contains(T item) => Underlying.Contains(item); + + public void CopyTo(T[] array, int arrayIndex) => Underlying.CopyTo(array, arrayIndex); + + public bool Remove(T item) => Underlying.Remove(item); + + public int Count => Underlying.Count; + + public bool IsReadOnly => Underlying.IsReadOnly; +} diff --git a/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs b/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs index c108f99..2ee87e4 100644 --- a/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs +++ b/R4UtilsTester/ValueEqualityCollections/TestValueEqualityCollection.cs @@ -8,136 +8,278 @@ namespace R4UtilsTester.ValueEqualityCollections; [TestFixture] public class TestValueEqualityCollection { - private static void AssertEqual(ValueEqualityCollection wrapper1, ValueEqualityCollection wrapper2, - bool unequal = false) where T : IEquatable + public class NonGeneric { - if (unequal) + private static void AssertEqual(ValueEqualityCollection wrapper1, ValueEqualityCollection wrapper2, + bool unequal = false) where T : IEquatable { - Assert.AreNotEqual(wrapper1, wrapper2); - Assert.IsFalse(wrapper1.Equals(wrapper2)); - Assert.IsFalse(wrapper1 == wrapper2); - Assert.IsTrue(wrapper1 != wrapper2); + if (unequal) + { + Assert.AreNotEqual(wrapper1, wrapper2); + Assert.IsFalse(wrapper1.Equals(wrapper2)); + Assert.IsFalse(wrapper1 == wrapper2); + Assert.IsTrue(wrapper1 != wrapper2); + } + else + { + Assert.AreEqual(wrapper1, wrapper2); + Assert.IsTrue(wrapper1.Equals(wrapper2)); + Assert.IsTrue(wrapper1 == wrapper2); + Assert.IsFalse(wrapper1 != wrapper2); + } } - else + + [Test] + public void TestEqualArraysEqual() { - Assert.AreEqual(wrapper1, wrapper2); - Assert.IsTrue(wrapper1.Equals(wrapper2)); - Assert.IsTrue(wrapper1 == wrapper2); - Assert.IsFalse(wrapper1 != wrapper2); + int[] data1 = [1, 2, 3]; + int[] data2 = [1, 2, 3]; + var wrapper1 = data1.AsOrderedValueEqualityCollection(); + var wrapper2 = data2.AsOrderedValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2); } - } - - [Test] - public void TestEqualArraysEqual() - { - int[] data1 = [1, 2, 3]; - int[] data2 = [1, 2, 3]; - var wrapper1 = data1.AsOrderedValueEqualityCollection(); - var wrapper2 = data2.AsOrderedValueEqualityCollection(); - AssertEqual(wrapper1, wrapper2); - } - [Test] - public void TestConsidersOrderingOfElements() - { - int[] data1 = [1, 2, 3]; - int[] data2 = [2, 1, 3]; - var wrapper1 = data1.AsOrderedValueEqualityCollection(); - var wrapper2 = data2.AsOrderedValueEqualityCollection(); - AssertEqual(wrapper1, wrapper2, true); - } + [Test] + public void TestConsidersOrderingOfElements() + { + int[] data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1.AsOrderedValueEqualityCollection(); + var wrapper2 = data2.AsOrderedValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2, true); + } - [Test] - public void TestHandlesSetsCorrectly() - { - HashSet data1 = [1, 2, 3]; - HashSet data2 = [2, 1, 3]; - var wrapper1 = data1.AsValueEqualityCollection(); - var wrapper2 = data2.AsValueEqualityCollection(); - AssertEqual(wrapper1, wrapper2); - } + [Test] + public void TestHandlesSetsCorrectly() + { + HashSet data1 = [1, 2, 3]; + HashSet data2 = [2, 1, 3]; + var wrapper1 = data1.AsValueEqualityCollection(); + var wrapper2 = data2.AsValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2); + } - [Test] - public void TestHandlesSetsMixedWithArraysCorrectly() - { - HashSet data1 = [1, 2, 3]; - int[] data2 = [2, 1, 3]; - var wrapper1 = data1.AsValueEqualityCollection(); - var wrapper2 = data2.AsOrderedValueEqualityCollection(); - AssertEqual(wrapper1, wrapper2); - } + [Test] + public void TestHandlesSetsMixedWithArraysCorrectly() + { + HashSet data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1.AsValueEqualityCollection(); + var wrapper2 = data2.AsOrderedValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2); + } - [Test] - public void TestIgnoreOrdering() - { - bool[] bools = [true, false]; - foreach (var data1IgnoreOrdering in bools) + [Test] + public void TestIgnoreOrdering() { - foreach (var data2IgnoreOrdering in bools) + bool[] bools = [true, false]; + foreach (var data1IgnoreOrdering in bools) { - int[] data1 = [1, 2, 3]; - int[] data2 = [2, 1, 3]; - var wrapper1 = data1IgnoreOrdering - ? data1.AsValueEqualityCollection() - : data1.AsOrderedValueEqualityCollection(); - var wrapper2 = data2IgnoreOrdering - ? data2.AsValueEqualityCollection() - : data2.AsOrderedValueEqualityCollection(); - Assert.AreEqual(wrapper1.Ordering, - data1IgnoreOrdering - ? ValueEqualityCollection.OrderMode.Ignore - : ValueEqualityCollection.OrderMode.Consider); - Assert.AreEqual(wrapper2.Ordering, - data2IgnoreOrdering - ? ValueEqualityCollection.OrderMode.Ignore - : ValueEqualityCollection.OrderMode.Consider); - if (data1IgnoreOrdering || data2IgnoreOrdering) + foreach (var data2IgnoreOrdering in bools) { - AssertEqual(wrapper1, wrapper2); + int[] data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1IgnoreOrdering + ? data1.AsValueEqualityCollection() + : data1.AsOrderedValueEqualityCollection(); + var wrapper2 = data2IgnoreOrdering + ? data2.AsValueEqualityCollection() + : data2.AsOrderedValueEqualityCollection(); + Assert.AreEqual(wrapper1.Ordering, + data1IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + Assert.AreEqual(wrapper2.Ordering, + data2IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + if (data1IgnoreOrdering || data2IgnoreOrdering) + { + AssertEqual(wrapper1, wrapper2); + } + else + { + AssertEqual(wrapper1, wrapper2, true); + } } - else + } + } + + [Test] + public void TestRecursiveWrapper() + { + HashSet data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1.AsValueEqualityCollection().AsValueEqualityCollection(); + var wrapper2 = data2.AsOrderedValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2); + } + + [Test] + public void TestDuplicateElements() + { + bool[] bools = [true, false]; + foreach (var data1IgnoreOrdering in bools) + { + foreach (var data2IgnoreOrdering in bools) { + int[] data1 = [1, 2, 3]; + int[] data2 = [1, 2, 3, 3]; + var wrapper1 = data1IgnoreOrdering + ? data1.AsValueEqualityCollection() + : data1.AsOrderedValueEqualityCollection(); + var wrapper2 = data2IgnoreOrdering + ? data2.AsValueEqualityCollection() + : data2.AsOrderedValueEqualityCollection(); + Assert.AreEqual(wrapper1.Ordering, + data1IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + Assert.AreEqual(wrapper2.Ordering, + data2IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); AssertEqual(wrapper1, wrapper2, true); } } } } - [Test] - public void TestRecursiveWrapper() + public class Generic { - HashSet data1 = [1, 2, 3]; - int[] data2 = [2, 1, 3]; - var wrapper1 = data1.AsValueEqualityCollection().AsValueEqualityCollection(); - var wrapper2 = data2.AsOrderedValueEqualityCollection(); - AssertEqual(wrapper1, wrapper2); - } + private static void AssertEqual(ValueEqualityCollection wrapper1, + ValueEqualityCollection wrapper2, + bool unequal = false) where T : IEquatable where TCollection : ICollection + { + if (unequal) + { + Assert.AreNotEqual(wrapper1, wrapper2); + Assert.IsFalse(wrapper1.Equals(wrapper2)); + Assert.IsFalse(wrapper1 == wrapper2); + Assert.IsTrue(wrapper1 != wrapper2); + } + else + { + Assert.AreEqual(wrapper1, wrapper2); + Assert.IsTrue(wrapper1.Equals(wrapper2)); + Assert.IsTrue(wrapper1 == wrapper2); + Assert.IsFalse(wrapper1 != wrapper2); + } + } - [Test] - public void TestDuplicateElements() - { - bool[] bools = [true, false]; - foreach (var data1IgnoreOrdering in bools) + [Test] + public void TestEqualArraysEqual() + { + int[] data1 = [1, 2, 3]; + int[] data2 = [1, 2, 3]; + var wrapper1 = data1.AsGenericOrderedValueEqualityCollection(); + var wrapper2 = data2.AsGenericOrderedValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2); + } + + [Test] + public void TestConsidersOrderingOfElements() + { + int[] data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1.AsGenericOrderedValueEqualityCollection(); + var wrapper2 = data2.AsGenericOrderedValueEqualityCollection(); + AssertEqual(wrapper1, wrapper2, true); + } + + [Test] + public void TestHandlesSetsCorrectly() { - foreach (var data2IgnoreOrdering in bools) + HashSet data1 = [1, 2, 3]; + HashSet data2 = [2, 1, 3]; + var wrapper1 = data1.AsGenericValueEqualityCollection>(); + var wrapper2 = data2.AsGenericValueEqualityCollection>(); + AssertEqual(wrapper1, wrapper2); + } + + [Test] + public void TestHandlesSetsMixedWithArraysCorrectly() + { + HashSet data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1.AsGenericValueEqualityCollection>(); + var wrapper2 = data2.AsGenericValueEqualityCollection>(); + AssertEqual(wrapper1, wrapper2); + } + + [Test] + public void TestIgnoreOrdering() + { + bool[] bools = [true, false]; + foreach (var data1IgnoreOrdering in bools) { - int[] data1 = [1, 2, 3]; - int[] data2 = [1, 2, 3, 3]; - var wrapper1 = data1IgnoreOrdering - ? data1.AsValueEqualityCollection() - : data1.AsOrderedValueEqualityCollection(); - var wrapper2 = data2IgnoreOrdering - ? data2.AsValueEqualityCollection() - : data2.AsOrderedValueEqualityCollection(); - Assert.AreEqual(wrapper1.Ordering, - data1IgnoreOrdering - ? ValueEqualityCollection.OrderMode.Ignore - : ValueEqualityCollection.OrderMode.Consider); - Assert.AreEqual(wrapper2.Ordering, - data2IgnoreOrdering - ? ValueEqualityCollection.OrderMode.Ignore - : ValueEqualityCollection.OrderMode.Consider); - AssertEqual(wrapper1, wrapper2, true); + foreach (var data2IgnoreOrdering in bools) + { + int[] data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1IgnoreOrdering + ? data1.AsGenericValueEqualityCollection() + : data1.AsGenericOrderedValueEqualityCollection(); + var wrapper2 = data2IgnoreOrdering + ? data2.AsGenericValueEqualityCollection() + : data2.AsGenericOrderedValueEqualityCollection(); + Assert.AreEqual(wrapper1.Ordering, + data1IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + Assert.AreEqual(wrapper2.Ordering, + data2IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + if (data1IgnoreOrdering || data2IgnoreOrdering) + { + AssertEqual(wrapper1, wrapper2); + } + else + { + AssertEqual(wrapper1, wrapper2, true); + } + } + } + } + + [Test] + public void TestRecursiveWrapper() + { + HashSet data1 = [1, 2, 3]; + int[] data2 = [2, 1, 3]; + var wrapper1 = data1.AsGenericValueEqualityCollection>() + .AsGenericValueEqualityCollection>(); + var wrapper2 = data2.AsGenericValueEqualityCollection>(); + AssertEqual(wrapper1, wrapper2); + } + + [Test] + public void TestDuplicateElements() + { + bool[] bools = [true, false]; + foreach (var data1IgnoreOrdering in bools) + { + foreach (var data2IgnoreOrdering in bools) + { + int[] data1 = [1, 2, 3]; + int[] data2 = [1, 2, 3, 3]; + var wrapper1 = data1IgnoreOrdering + ? data1.AsGenericValueEqualityCollection() + : data1.AsGenericOrderedValueEqualityCollection(); + var wrapper2 = data2IgnoreOrdering + ? data2.AsGenericValueEqualityCollection() + : data2.AsGenericOrderedValueEqualityCollection(); + Assert.AreEqual(wrapper1.Ordering, + data1IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + Assert.AreEqual(wrapper2.Ordering, + data2IgnoreOrdering + ? ValueEqualityCollection.OrderMode.Ignore + : ValueEqualityCollection.OrderMode.Consider); + AssertEqual(wrapper1, wrapper2, true); + } } } } From 7c4bdcf9cbcb9a5e3049276dac46e46aefd55651 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:52:35 +0200 Subject: [PATCH 2/3] update: bump version to 1.2.1 --- .github/workflows/build-test-publish.yml | 6 +++--- R4Utils/R4Utils.csproj | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-test-publish.yml b/.github/workflows/build-test-publish.yml index 12dcd08..12e62cd 100644 --- a/.github/workflows/build-test-publish.yml +++ b/.github/workflows/build-test-publish.yml @@ -49,7 +49,7 @@ jobs: - name: Pack run: dotnet pack --no-build --no-dependencies -c Debug -p:PackageId=R4UtilsDev --version-suffix $SUFFIX - name: Push - run: dotnet nuget push R4Utils/bin/Debug/R4UtilsDev.1.2.0-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate + run: dotnet nuget push R4Utils/bin/Debug/R4UtilsDev.1.2.1-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate publish-pre: runs-on: ubuntu-latest @@ -73,7 +73,7 @@ jobs: - name: Pack run: dotnet pack -c Release --no-build --no-dependencies --version-suffix $SUFFIX - name: Push - run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.0-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate + run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.1-$SUFFIX.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate publish-production: runs-on: ubuntu-latest @@ -95,4 +95,4 @@ jobs: - name: Pack run: dotnet pack -c Release --no-build --no-dependencies - name: Push - run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.0.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate + run: dotnet nuget push R4Utils/bin/Release/R4Utils.1.2.1.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate diff --git a/R4Utils/R4Utils.csproj b/R4Utils/R4Utils.csproj index ffd9c75..7051670 100644 --- a/R4Utils/R4Utils.csproj +++ b/R4Utils/R4Utils.csproj @@ -5,7 +5,7 @@ enable enable R4Utils - 1.2.0 + 1.2.1 Ronto4 13 https://github.com/Ronto4/R4Utils From a473233ce38fd30544809fcdc881926dfaae74f6 Mon Sep 17 00:00:00 2001 From: Ronto4 <34981840+Ronto4@users.noreply.github.com> Date: Sat, 12 Jul 2025 19:02:42 +0200 Subject: [PATCH 3/3] fix: Nuget version tags may not be longer than 64 characters --- .github/workflows/build-test-publish.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-test-publish.yml b/.github/workflows/build-test-publish.yml index 12e62cd..712e622 100644 --- a/.github/workflows/build-test-publish.yml +++ b/.github/workflows/build-test-publish.yml @@ -45,7 +45,9 @@ jobs: - name: Build Debug run: dotnet build -c Debug R4Utils - name: Create Name - run: echo "SUFFIX=dev.$(tr /- .. <<<$GITHUB_REF).${GITHUB_RUN_ID}" >> $GITHUB_ENV + run: | + export RAW_SUFFIX="dev.$(tr /- .. <<<$GITHUB_REF)" + echo "SUFFIX=${RAW_SUFFIX:0:44}.${GITHUB_RUN_ID}" >> $GITHUB_ENV - name: Pack run: dotnet pack --no-build --no-dependencies -c Debug -p:PackageId=R4UtilsDev --version-suffix $SUFFIX - name: Push