diff --git a/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs b/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs index 30e69e77..da814ec6 100644 --- a/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs +++ b/uSync.BackOffice/SyncHandlers/SyncHandlerContainerBase.cs @@ -229,6 +229,7 @@ protected override IList GetLevelOrderedFiles(string folder, IList< var nodes = new Dictionary(); var graph = new List>(); + var renames = new List(); foreach (var file in files) { @@ -236,19 +237,33 @@ protected override IList GetLevelOrderedFiles(string folder, IList< if (node == null) continue; var key = node.GetKey(); - nodes.Add(key, new LeveledFile + + var leveledFile = new LeveledFile { Alias = node.GetAlias(), File = file, Level = node.GetLevel(), - }); + }; + + if (node.IsEmptyItem()) { + renames.Add(leveledFile); + continue; + } - // you can have circular dependencies in structure :( - // graph.AddRange(GetStructure(node).Select(x => GraphEdge.Create(key, x))); + if (nodes.TryAdd(key, leveledFile)) + { + graph.AddRange(GetCompositions(node).Select(x => GraphEdge.Create(key, x))); + } + else + { + logger.LogWarning("Failed to add key when sorting, possible duplicate? {key} {alias} {file} old sort method will be used (may require additional pass)", + key, node.GetAlias(), file); - graph.AddRange(GetCompositions(node).Select(x => GraphEdge.Create(key, x))); + // fall back to the old way. + return base.GetLevelOrderedFiles(folder, actions); + } } - + var cleanGraph = graph.Where(x => x.Node != x.Edge).ToList(); var sortedList = nodes.Keys.TopologicalSort(cleanGraph); @@ -261,8 +276,11 @@ protected override IList GetLevelOrderedFiles(string folder, IList< if (nodes.ContainsKey(key)) result.Add(nodes[key]); } - return result; + if (renames.Any()) + result.AddRange(renames); + + return result; } public IEnumerable GetGraphIds(XElement node)