private static string ConvertRelease(AzureWorkItem azureNode) { // Release : Dev16 // Milestone : 16.8 // // ---> // // VS 16.8 var release = azureNode.Release; if (release != null) { if (release.StartsWith("Dev", StringComparison.OrdinalIgnoreCase)) { release = "VS"; } else if (release.StartsWith("NET", StringComparison.OrdinalIgnoreCase) || release.StartsWith(".NET", StringComparison.OrdinalIgnoreCase)) { release = ".NET SDK"; } } var milestone = azureNode.Milestone; var result = string.Join(" ", release, milestone).Trim(); if (result.Length == 0) { return(null); } return(result); }
private static string ConvertMilestone(AzureWorkItem azureNode) { // Milestone : 16.8 // Target : Preview 2 // // ---> // // 16.8 P2 var milestone = azureNode.Milestone; var target = azureNode.Target; if (target != null) { target = target.Replace(".NET", "", StringComparison.OrdinalIgnoreCase) .Replace("Preview ", "P", StringComparison.OrdinalIgnoreCase) .Replace("Preview", "P", StringComparison.OrdinalIgnoreCase); } var result = string.Join(" ", milestone, target).Trim(); if (result.Length == 0) { return(null); } return(result); }
private static TreeNode ConvertNode(AzureWorkItem azureNode) { var treeNode = new TreeNode { Id = $"azdo#{azureNode.Id}", IsPrivate = true, IsBottomUp = IsBottomUp(azureNode), CreatedAt = azureNode.CreatedAt, CreatedBy = azureNode.CreatedBy, IsClosed = ConvertIsClosed(azureNode), Title = azureNode.Title, Milestone = ConvertMilestone(azureNode), Priority = ConvertPriority(azureNode.Priority), Cost = ConvertCost(azureNode.Cost), Teams = ConvertTeams(azureNode.Tags), Assignees = string.IsNullOrEmpty(azureNode.AssignedTo) ? Array.Empty <string>() : new[] { azureNode.AssignedTo }, Labels = CreateLabels(azureNode), Kind = ConvertKind(azureNode.Type), ReleaseInfo = new TreeNodeStatus { Release = ConvertRelease(azureNode), Status = azureNode.State }, Url = azureNode.Url }; return(treeNode); }
public void AdicionarWorkItem(AzureWorkItem workItem) { _azureWorkItemRepository.Add(workItem); }
private static bool ConvertIsClosed(AzureWorkItem azureNode) { var closedStates = new[] { "Cut", "Completed" }; return(closedStates.Any(s => string.Equals(azureNode.State, s, StringComparison.OrdinalIgnoreCase))); }
private static IReadOnlyList <TreeNodeLabel> CreateLabels(AzureWorkItem azureNode) { var result = new List <TreeNodeLabel>(); var kind = ConvertKind(azureNode.Type); var cost = ConvertCost(azureNode.Cost); // Kind if (kind == TreeNodeKind.Epic) { result.Add(new TreeNodeLabel { Name = "Epic", BackgroundColor = "c6415a", }); } else if (kind == TreeNodeKind.UserStory) { result.Add(new TreeNodeLabel { Name = "User Story", BackgroundColor = "0e8a16", }); } // Priorities if (azureNode.Priority == 0) { result.Add(new TreeNodeLabel { Name = $"Priority:0", BackgroundColor = "b60205", }); } else if (azureNode.Priority == 1) { result.Add(new TreeNodeLabel { Name = $"Priority:1", BackgroundColor = "d93f0b", }); } else if (azureNode.Priority == 2) { result.Add(new TreeNodeLabel { Name = $"Priority:2", BackgroundColor = "e99695", }); } else if (azureNode.Priority == 3) { result.Add(new TreeNodeLabel { Name = $"Priority:3", BackgroundColor = "f9d0c4", }); } // Cost if (cost == TreeNodeCost.Small) { result.Add(new TreeNodeLabel { Name = $"Cost:S", BackgroundColor = "bfdadc", }); } else if (cost == TreeNodeCost.Medium) { result.Add(new TreeNodeLabel { Name = $"Cost:M", BackgroundColor = "c2e0c6", }); } else if (cost == TreeNodeCost.Large) { result.Add(new TreeNodeLabel { Name = $"Cost:L", BackgroundColor = "0e8a16", }); } else if (cost == TreeNodeCost.ExtraLarge) { result.Add(new TreeNodeLabel { Name = $"Cost:XL", BackgroundColor = "006b75", }); } // Tags foreach (var tag in azureNode.Tags) { result.Add(new TreeNodeLabel { Name = tag, BackgroundColor = "c5def5", }); } return(result.ToArray()); }
private static bool IsBottomUp(AzureWorkItem azureNode) { return(azureNode.Tags.Any(t => string.Equals(t, ThemesOfDotNetConstants.LabelBottomUpWork, StringComparison.OrdinalIgnoreCase) || string.Equals(t, ThemesOfDotNetConstants.LabelContinuousImprovement, StringComparison.OrdinalIgnoreCase))); }
private async Task <IReadOnlyList <AzureWorkItem> > GetWorkItemRootsAsync() { var azureDevOpsUrl = _configuration["AzureDevOpsUrl"]; if (string.IsNullOrEmpty(azureDevOpsUrl)) { return(new List <AzureWorkItem>()); } var url = new Uri(azureDevOpsUrl); var token = _configuration["AzureDevOpsToken"]; var connection = new VssConnection(url, new VssBasicCredential(string.Empty, token)); var client = connection.GetClient <WorkItemTrackingHttpClient>(); var itemQueryResults = await client.QueryByIdAsync(new Guid(_configuration["AzureDevOpsQueryId"])); var itemIds = itemQueryResults.WorkItemRelations.Select(rel => rel.Target) .Concat(itemQueryResults.WorkItemRelations.Select(rel => rel.Source)) .Where(r => r != null) .Select(r => r.Id) .ToHashSet(); var items = await GetWorkItemsAsync(client, itemIds); var workItemById = new Dictionary <int, AzureWorkItem>(); foreach (var item in items) { var workItem = new AzureWorkItem(); workItem.Id = item.Id.Value; workItem.Type = item.Fields["System.WorkItemType"].ToString(); workItem.Title = item.Fields["System.Title"].ToString(); workItem.State = item.Fields["System.State"].ToString(); if (item.Fields.TryGetValue <long>("Microsoft.VSTS.Common.Priority", out var priority)) { workItem.Priority = priority; } if (item.Fields.TryGetValue <string>("Microsoft.DevDiv.TshirtCosting", out var cost)) { workItem.Cost = cost; } if (item.Fields.TryGetValue <string>("Microsoft.eTools.Bug.Release", out var release)) { workItem.Release = release; } if (item.Fields.TryGetValue <string>("Microsoft.DevDiv.Target", out var target)) { workItem.Target = target; } if (item.Fields.TryGetValue <string>("Microsoft.DevDiv.Milestone", out var milestone)) { workItem.Milestone = milestone; } if (item.Fields.TryGetValue <IdentityRef>("System.AssignedTo", out var assignedTo)) { workItem.AssignedTo = GetAlias(assignedTo); } workItem.CreatedAt = (DateTime)item.Fields["System.CreatedDate"]; workItem.CreatedBy = GetAlias((IdentityRef)item.Fields["System.CreatedBy"]); workItem.Url = item.Links.Links.Where(l => l.Key == "html") .Select(l => l.Value) .OfType <ReferenceLink>() .Select(l => l.Href) .SingleOrDefault(); if (item.Fields.TryGetValue <string>("System.Tags", out var tagText)) { workItem.Tags = tagText.Split(';'); } else { workItem.Tags = Array.Empty <string>(); } workItemById.Add(workItem.Id, workItem); } foreach (var link in itemQueryResults.WorkItemRelations) { if (link.Source == null || link.Target == null) { continue; } if (link.Rel != "System.LinkTypes.Hierarchy-Forward") { continue; } var parentId = link.Source.Id; var childId = link.Target.Id; if (workItemById.TryGetValue(childId, out var child) && workItemById.TryGetValue(parentId, out var parent)) { child.Parent = parent; parent.Children.Add(child); } } return(workItemById.Values.OrderBy(v => v.Id) .Where(n => n.Parent == null) .ToArray()); }