Handle comments when merging yaml

This commit is contained in:
Gustas
2025-08-20 13:38:09 +03:00
committed by Gustas Kažukauskas
parent cde5208c54
commit bd53aa734e
2 changed files with 42 additions and 0 deletions

View File

@@ -506,6 +506,9 @@ namespace OpenRA
var ret = new List<MiniYamlNode>(existingNodes.Count); var ret = new List<MiniYamlNode>(existingNodes.Count);
foreach (var n in existingNodes) foreach (var n in existingNodes)
{ {
if (n.Key == null)
continue;
if (keys.Add(n.Key)) if (keys.Add(n.Key))
ret.Add(n); ret.Add(n);
else else
@@ -529,6 +532,9 @@ namespace OpenRA
for (var i = 0; i < nodes.Count; i++) for (var i = 0; i < nodes.Count; i++)
{ {
var node = nodes[i]; var node = nodes[i];
if (node.Key == null)
continue;
if (node.Key.StartsWith('-')) if (node.Key.StartsWith('-'))
{ {
if (ret == null) if (ret == null)
@@ -599,6 +605,9 @@ namespace OpenRA
void MergeNode(MiniYamlNode node) void MergeNode(MiniYamlNode node)
{ {
if (node.Key == null)
return;
// Append Removal nodes to the result. // Append Removal nodes to the result.
// Therefore: we know the remainder of the method deals with a plain node. // Therefore: we know the remainder of the method deals with a plain node.
if (node.Key.StartsWith('-')) if (node.Key.StartsWith('-'))

View File

@@ -859,6 +859,39 @@ Test:
"MiniYaml.Merge, duplicate values found for the following keys: Child2: [Child2 (at test-filename:4),Child2 (at test-filename:5)]")); "MiniYaml.Merge, duplicate values found for the following keys: Child2: [Child2 (at test-filename:4),Child2 (at test-filename:5)]"));
} }
[TestCase(TestName = "Merging may be done on yaml that was not sanitised from comments.")]
public void TestMergeComments()
{
const string BaseYaml = @"
# Random comment
T:
Test2:
MockString:
MockString2:
MockString3:
Child1:
# Random comment
# Random comment
MockString4:
# Random comment
# Random comment
T:
Test2:
MockString:
-MockString2:
MockString3:
# Random comment
-Child1:
# Random comment
MockString4:
# Random comment
# Random comment
";
static void Merge() => MiniYaml.Merge(new[] { BaseYaml }.Select(s => MiniYaml.FromString(s, "test-filename", false)));
Assert.That(Merge, Throws.Nothing, "Merging yaml with comments should not throw an exception.");
}
[TestCase(TestName = "Comments are correctly separated from values")] [TestCase(TestName = "Comments are correctly separated from values")]
public void TestEscapedHashInValues() public void TestEscapedHashInValues()
{ {