Ensure artifact dependency keeps correct mode, ordering and checksum values (#15500)
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user