diff --git a/Adaptation/FileHandlers/ADO/ProcessData.cs b/Adaptation/FileHandlers/ADO/ProcessData.cs index 9c7639f..b1d7307 100644 --- a/Adaptation/FileHandlers/ADO/ProcessData.cs +++ b/Adaptation/FileHandlers/ADO/ProcessData.cs @@ -214,15 +214,21 @@ public class ProcessData : IProcessData results.Add(string.Empty); results.Add($"## {record.WorkItem.Title}"); results.Add(string.Empty); - foreach (Record r in record.Children) - results.Add($"- [{r.WorkItem.Id}]({url}{r.WorkItem.Id})"); + if (record.Children is not null) + { + foreach (Record r in record.Children) + results.Add($"- [{r.WorkItem.Id}]({url}{r.WorkItem.Id})"); + } results.Add(string.Empty); results.Add("```bash"); - foreach (Record r in record.Children) + if (record.Children is not null) { - link = Path.Combine(jsonDirectory, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}"); - target = Path.Combine(iterationPathDirectory, r.WorkItem.WorkItemType, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}", r.WorkItem.Id.ToString()); - results.Add($"mklink /J \"{link}\" \"{target}\""); + foreach (Record r in record.Children) + { + link = Path.Combine(jsonDirectory, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}"); + target = Path.Combine(iterationPathDirectory, r.WorkItem.WorkItemType, $"{r.WorkItem.Id}-{r.WorkItem.WorkItemType}", r.WorkItem.Id.ToString()); + results.Add($"mklink /J \"{link}\" \"{target}\""); + } } results.Add("```"); results.Add(string.Empty); @@ -236,20 +242,23 @@ public class ProcessData : IProcessData string directory; Record? childRecord; ReadOnlyCollection childrenDirectories; - foreach (Record r in record.Children) + if (record.Children is not null) { - // if (record.WorkItem.Id == 110730) - // continue; - // if (record.WorkItem.Id == 110732) - // continue; - directory = Path.Combine(parentDirectory, $"{r.WorkItem.WorkItemType.Substring(0, 1)}-{r.WorkItem.Id}-{r.WorkItem.Title.Trim().Substring(0, 1)}"); - results.Add(directory); - if (!keyValuePairs.TryGetValue(r.WorkItem.Id, out childRecord)) - continue; - if (nests.Count > 99) - break; - childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, childRecord); - results.AddRange(childrenDirectories); + foreach (Record r in record.Children) + { + // if (record.WorkItem.Id == 110730) + // continue; + // if (record.WorkItem.Id == 110732) + // continue; + directory = Path.Combine(parentDirectory, $"{r.WorkItem.WorkItemType.Substring(0, 1)}-{r.WorkItem.Id}-{r.WorkItem.Title.Trim().Substring(0, 1)}"); + results.Add(directory); + if (!keyValuePairs.TryGetValue(r.WorkItem.Id, out childRecord)) + continue; + if (nests.Count > 99) + break; + childrenDirectories = GetChildrenDirectories(keyValuePairs, nests, directory, childRecord); + results.AddRange(childrenDirectories); + } } return new(results); } diff --git a/Adaptation/FileHandlers/Markdown/ProcessData.cs b/Adaptation/FileHandlers/Markdown/ProcessData.cs index 4603760..9c9a5b0 100644 --- a/Adaptation/FileHandlers/Markdown/ProcessData.cs +++ b/Adaptation/FileHandlers/Markdown/ProcessData.cs @@ -261,7 +261,7 @@ public class ProcessData : IProcessData results.Add($"## {record.WorkItem.AssignedTo} - {record.WorkItem.Id} - {record.WorkItem.Title}"); results.Add(string.Empty); results.Add($"- [{record.WorkItem.Id}]({url}{record.WorkItem.Id})"); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) results.Add(string.Empty); else { @@ -300,12 +300,15 @@ public class ProcessData : IProcessData string line; spaces.Add('\t'); WorkItem workItem; - foreach (Record child in record.Children) + if (record.Children is not null) { - workItem = child.WorkItem; - line = GetLine(spaces, workItem, child, condensed, sprintOnly).TrimEnd(); - lines.Add(line); - AppendLines(spaces, lines, child, condensed, sprintOnly); + foreach (Record child in record.Children) + { + workItem = child.WorkItem; + line = GetLine(spaces, workItem, child, condensed, sprintOnly).TrimEnd(); + lines.Add(line); + AppendLines(spaces, lines, child, condensed, sprintOnly); + } } spaces.RemoveAt(0); } @@ -358,12 +361,15 @@ public class ProcessData : IProcessData private static void FilterChildren(ReadOnlyCollection workItemTypes, Record record, List results) { - foreach (Record r in record.Children) + if (record.Children is not null) { - if (!workItemTypes.Contains(r.WorkItem.WorkItemType)) - continue; - results.Add(r); - FilterChildren(workItemTypes, r, results); + foreach (Record r in record.Children) + { + if (!workItemTypes.Contains(r.WorkItem.WorkItemType)) + continue; + results.Add(r); + FilterChildren(workItemTypes, r, results); + } } } @@ -414,7 +420,7 @@ public class ProcessData : IProcessData if (record.WorkItem.WorkItemType != workItemType) continue; collection.Clear(); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) continue; records = FilterChildren(workItemTypes, record); maxIterationPath = GetMaxIterationPath122508(records); @@ -462,7 +468,7 @@ public class ProcessData : IProcessData continue; collection.Clear(); violations.Clear(); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) continue; if (string.IsNullOrEmpty(record.WorkItem.Tags)) recordsNotMatching = new(new Record[] { record }); @@ -521,7 +527,7 @@ public class ProcessData : IProcessData continue; collection.Clear(); violations.Clear(); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) continue; records = FilterChildren(workItemTypes, record); recordsNotMatching = GetWorkItemsNotMatching126169(record, records); @@ -653,7 +659,7 @@ public class ProcessData : IProcessData continue; collection.Clear(); violations.Clear(); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) continue; records = FilterChildren(workItemTypes, record); recordsNotMatching = GetWorkItemsNotMatching123066(record, records); @@ -691,7 +697,7 @@ public class ProcessData : IProcessData continue; collection.Clear(); violations.Clear(); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) continue; records = FilterChildren(workItemTypes, record); recordsNotMatching = GetWorkItemsNotMatching123067(record, records); @@ -729,7 +735,7 @@ public class ProcessData : IProcessData continue; collection.Clear(); violations.Clear(); - if (record.Children.Length == 0) + if (record.Children is null || record.Children.Length == 0) continue; if (record.WorkItem.StartDate is null) continue; diff --git a/Adaptation/FileHandlers/json/WorkItems/Record.cs b/Adaptation/FileHandlers/json/WorkItems/Record.cs index d7a9ba6..94cc23c 100644 --- a/Adaptation/FileHandlers/json/WorkItems/Record.cs +++ b/Adaptation/FileHandlers/json/WorkItems/Record.cs @@ -12,7 +12,7 @@ internal class Record #nullable enable [JsonConstructor] - public Record(WorkItem workItem, WorkItem? parent, Record[] children, Record[] related, Record[] successors) + public Record(WorkItem workItem, WorkItem? parent, Record[]? children, Record[]? related, Record[]? successors) { WorkItem = workItem; Parent = parent; @@ -23,9 +23,9 @@ internal class Record [JsonPropertyName("WorkItem")] public WorkItem WorkItem { get; set; } [JsonPropertyName("Parent")] public WorkItem? Parent { get; set; } - [JsonPropertyName("Children")] public Record[] Children { get; set; } - [JsonPropertyName("Related")] public Record[] Related { get; set; } - [JsonPropertyName("Successors")] public Record[] Successors { get; set; } + [JsonPropertyName("Children")] public Record[]? Children { get; set; } + [JsonPropertyName("Related")] public Record[]? Related { get; set; } + [JsonPropertyName("Successors")] public Record[]? Successors { get; set; } internal static Record GetWithoutNesting(Record record, string? violation) { @@ -65,25 +65,47 @@ internal class Record private static Record Get(Record record, bool keepRelations) { Record result; + Record[]? childRecords; + Record[]? relatedRecords; + Record[]? successorRecords; + List relationRecords; WorkItem? parentWorkItem = keepRelations ? record.Parent : WorkItem.GetWithOutRelations(record.Parent); WorkItem? workItem = keepRelations ? record.WorkItem : WorkItem.GetWithOutRelations(record.WorkItem) ?? throw new Exception(); - List childRecords = new(); - List relatedRecords = new(); - List successorRecords = new(); - foreach (Record r in record.Children) - childRecords.Add(Get(r, keepRelations)); - foreach (Record r in record.Related) - relatedRecords.Add(Get(r, keepRelations)); - foreach (Record r in record.Successors) - successorRecords.Add(Get(r, keepRelations)); - result = new(workItem, parentWorkItem, childRecords.ToArray(), relatedRecords.ToArray(), successorRecords.ToArray()); + if (record.Children is null) + childRecords = null; + else + { + relationRecords = new(); + foreach (Record r in record.Children) + relationRecords.Add(Get(r, keepRelations)); + childRecords = relationRecords.ToArray(); + } + if (record.Related is null) + relatedRecords = null; + else + { + relationRecords = new(); + foreach (Record r in record.Related) + relationRecords.Add(Get(r, keepRelations)); + relatedRecords = relationRecords.ToArray(); + } + if (record.Successors is null) + successorRecords = null; + else + { + relationRecords = new(); + foreach (Record r in record.Successors) + relationRecords.Add(Get(r, keepRelations)); + successorRecords = relationRecords.ToArray(); + } + result = new(workItem, parentWorkItem, childRecords, relatedRecords, successorRecords); return result; } - internal static Record Get(WorkItem workItem, WorkItem? parent, ReadOnlyCollection children, ReadOnlyCollection related, ReadOnlyCollection successors, bool keepRelations) + internal static Record Get(WorkItem workItem, WorkItem? parent, ReadOnlyCollection? children, ReadOnlyCollection? related, ReadOnlyCollection? successors, bool keepRelations) { Record result; - Record record = new(workItem, parent, children.ToArray(), related.ToArray(), successors.ToArray()); + Record record = new(workItem, parent, children?.ToArray(), related?.ToArray(), successors?.ToArray()); result = Get(record, keepRelations); return result; } @@ -96,9 +118,9 @@ internal class Record WorkItem? parentWorkItem; WorkItem? relationWorkItem; List collection = new(); - ReadOnlyCollection childRecords; - ReadOnlyCollection relatedRecords; - ReadOnlyCollection successorRecords; + ReadOnlyCollection? childRecords; + ReadOnlyCollection? relatedRecords; + ReadOnlyCollection? successorRecords; if (workItem.Relations is not null && workItem.Relations.Length > 0) { collection.Clear(); @@ -115,17 +137,16 @@ internal class Record collection = (from l in collection orderby l.State != "Closed", l.Id select l).ToList(); foreach (WorkItem w in collection) { - if (nests.Count > 99) + if (nests.Count > 500) break; if (w.Parent is null) parentWorkItem = null; else _ = keyValuePairs.TryGetValue(w.Parent.Value, out parentWorkItem); childRecords = GetKeyValuePairs(keyValuePairs, w, "Child", nests, keepRelations); // Forward - // successorRecords = GetKeyValuePairs(keyValuePairs, w, "Successor", nests); // Forward - successorRecords = new(Array.Empty()); - // predecessorRecords = GetKeyValuePairs(keyValuePairs, w, "Predecessor", nests); // Reverse - relatedRecords = GetKeyValuePairs(keyValuePairs, w, "Related", nests, keepRelations); // Related + relatedRecords = null; // GetKeyValuePairs(keyValuePairs, w, "Related", nests, keepRelations); // Related + successorRecords = null; // GetKeyValuePairs(keyValuePairs, w, "Successor", nests, keepRelations); // Forward + // predecessorRecords = GetKeyValuePairs(keyValuePairs, w, "Predecessor", nests, keepRelations); // Reverse record = Get(w, parentWorkItem, childRecords, relatedRecords, successorRecords, keepRelations); results.Add(record); }