Ensure artifact dependency keeps correct mode, ordering and checksum values (#15500)

This commit is contained in:
Ronald Barendse
2023-12-21 14:55:43 +01:00
committed by GitHub
parent 5b29843b9f
commit f705479767
3 changed files with 92 additions and 15 deletions

View File

@@ -34,7 +34,7 @@ public class ArtifactDependency
/// <value>
/// <c>true</c> if the dependency is included when building a dependency tree and gets deployed in the correct order; otherwise, <c>false</c>.
/// </value>
public bool Ordering { get; }
public bool Ordering { get; internal set; }
/// <summary>
/// Gets the dependency mode.
@@ -42,7 +42,7 @@ public class ArtifactDependency
/// <value>
/// The dependency mode.
/// </value>
public ArtifactDependencyMode Mode { get; }
public ArtifactDependencyMode Mode { get; internal set; }
/// <summary>
/// Gets or sets the checksum.

View File

@@ -21,25 +21,39 @@ public class ArtifactDependencyCollection : ICollection<ArtifactDependency>
/// <inheritdoc />
public void Add(ArtifactDependency item)
{
if (item.Mode == ArtifactDependencyMode.Exist &&
_dependencies.TryGetValue(item.Udi, out ArtifactDependency? existingItem) &&
existingItem.Mode == ArtifactDependencyMode.Match)
if (_dependencies.TryGetValue(item.Udi, out ArtifactDependency? existingItem))
{
// Don't downgrade dependency mode from Match to Exist
return;
}
// Update existing item
if (existingItem.Mode is ArtifactDependencyMode.Exist)
{
// Allow updating dependency mode from Exist to Match
existingItem.Mode = item.Mode;
}
_dependencies[item.Udi] = item;
if (existingItem.Ordering is false)
{
// Allow updating non-ordering to ordering
existingItem.Ordering = item.Ordering;
}
if (string.IsNullOrEmpty(item.Checksum) is false)
{
// Allow updating checksum if set
existingItem.Checksum = item.Checksum;
}
}
else
{
// Add new item
_dependencies[item.Udi] = item;
}
}
/// <inheritdoc />
public void Clear() => _dependencies.Clear();
/// <inheritdoc />
public bool Contains(ArtifactDependency item)
=> _dependencies.TryGetValue(item.Udi, out ArtifactDependency? existingItem) &&
// Check whether it has the same or higher dependency mode
(existingItem.Mode == item.Mode || existingItem.Mode == ArtifactDependencyMode.Match);
public bool Contains(ArtifactDependency item) => _dependencies.ContainsKey(item.Udi);
/// <inheritdoc />
public void CopyTo(ArtifactDependency[] array, int arrayIndex) => _dependencies.Values.CopyTo(array, arrayIndex);

View File

@@ -1,8 +1,6 @@
// Copyright (c) Umbraco.
// See LICENSE for more details.
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using NUnit.Framework;
using Umbraco.Cms.Core;
@@ -49,6 +47,71 @@ public class ArtifactBaseTests
string.Join(",", artifact.Dependencies.Select(x => x.Udi.ToString())));
}
[Test]
public void Dependencies_Correctly_Updates_Mode()
{
var udi = Udi.Create(Constants.UdiEntityType.AnyGuid, Guid.NewGuid());
var dependencies = new ArtifactDependencyCollection
{
// Keep Match
new ArtifactDependency(udi, false, ArtifactDependencyMode.Match),
new ArtifactDependency(udi, false, ArtifactDependencyMode.Exist),
};
Assert.AreEqual(1, dependencies.Count);
var dependency = dependencies.First();
Assert.AreEqual(udi, dependency.Udi);
Assert.AreEqual(false, dependency.Ordering);
Assert.AreEqual(ArtifactDependencyMode.Match, dependency.Mode);
Assert.AreEqual(null, dependency.Checksum);
}
[Test]
public void Dependencies_Correctly_Updates_Ordering()
{
var udi = Udi.Create(Constants.UdiEntityType.AnyGuid, Guid.NewGuid());
var dependencies = new ArtifactDependencyCollection
{
// Keep ordering (regardless of mode)
new ArtifactDependency(udi, false, ArtifactDependencyMode.Match),
new ArtifactDependency(udi, false, ArtifactDependencyMode.Exist),
new ArtifactDependency(udi, true, ArtifactDependencyMode.Match),
new ArtifactDependency(udi, true, ArtifactDependencyMode.Exist),
new ArtifactDependency(udi, false, ArtifactDependencyMode.Match),
new ArtifactDependency(udi, false, ArtifactDependencyMode.Exist),
};
Assert.AreEqual(1, dependencies.Count);
var dependency = dependencies.First();
Assert.AreEqual(udi, dependency.Udi);
Assert.AreEqual(true, dependency.Ordering);
Assert.AreEqual(ArtifactDependencyMode.Match, dependency.Mode);
Assert.AreEqual(null, dependency.Checksum);
}
[Test]
public void Dependencies_Correctly_Updates_Checksum()
{
var udi = Udi.Create(Constants.UdiEntityType.AnyGuid, Guid.NewGuid());
var dependencies = new ArtifactDependencyCollection
{
// Keep checksum
new ArtifactDependency(udi, true, ArtifactDependencyMode.Match, "123"),
new ArtifactDependency(udi, true, ArtifactDependencyMode.Match, string.Empty),
new ArtifactDependency(udi, true, ArtifactDependencyMode.Match),
};
Assert.AreEqual(1, dependencies.Count);
var dependency = dependencies.First();
Assert.AreEqual(udi, dependency.Udi);
Assert.AreEqual(true, dependency.Ordering);
Assert.AreEqual(ArtifactDependencyMode.Match, dependency.Mode);
Assert.AreEqual("123", dependency.Checksum);
}
private class TestArtifact : ArtifactBase<GuidUdi>
{
public TestArtifact(GuidUdi udi, IEnumerable<ArtifactDependency> dependencies = null)