internal static void FixBugsAreaPaths( string tfsUrl, Dictionary<int, int> bugsWithLinks, Action<int> progressReportHandler) { using (var wiqlAccessor = new TfsWiqlAccessor(tfsUrl)) { var ids = bugsWithLinks.Values.Concat(bugsWithLinks.Keys).ToList(); var items = wiqlAccessor.QueryWorkItemsByIds( ids, null, progressReportHandler == null ? null : new Action<int>(x => progressReportHandler(x * LoadingPart / 100))); var dict = items.ToDictionary(i => i.Id); int ind = 0; foreach (var pair in bugsWithLinks) { string areaPath = dict[pair.Value].AreaPath; var bug = dict[pair.Key]; bug.AreaPath = areaPath; bug.Save(); if (progressReportHandler != null) progressReportHandler(LoadingPart + ind * (100 - LoadingPart) / bugsWithLinks.Count); ++ind; } } }
public List<WorkItem> QueryWorkItems(string queryPath, Action<int> progressReportHandler) { List<string> paths = queryPath.Split(Path.DirectorySeparatorChar).ToList(); if (paths.Count == 1) paths = queryPath.Split(Path.AltDirectorySeparatorChar).ToList(); Project project = m_workItemStore.Projects[paths[0]]; paths.RemoveAt(0); QueryItem item = project.QueryHierarchy; foreach (string path in paths) { var queryFolder = item as QueryFolder; item = queryFolder[path]; } if (item == null) throw new InvalidOperationException("Invalid Query Path."); string queryText = m_workItemStore.GetQueryDefinition(item.Id).QueryText.Replace("@project", "'" + project.Name + "'"); var query = new Query(m_workItemStore, queryText); if (query.IsLinkQuery) { var queryResults = query.RunLinkQuery(); var workItemIds = new List<int>(); foreach (var queryResult in queryResults) { workItemIds.Add(queryResult.SourceId); workItemIds.Add(queryResult.TargetId); } using (var wiqlAccessor = new TfsWiqlAccessor(m_tfsAccessor)) { return wiqlAccessor.QueryWorkItemsByIds(workItemIds, progressReportHandler); } } var qResult = query.RunQuery(); var result = new List<WorkItem>(qResult.Count); for (int i = 0; i < qResult.Count; i++) { result.Add(qResult[i]); } return result; }
private void AppendTasks( List<int> childrenIds, int? rootLeadTasskId, DataContainer dataContainer, TfsWiqlAccessor wiqlAccessor, Action<int> progressReportHandler) { if (childrenIds.Count == 0) return; var childrenTasks = wiqlAccessor.QueryWorkItemsByIds( childrenIds, progressReportHandler == null ? null : new Action<int>(x => progressReportHandler(LoadingPart * x / 100))); for (int i = 0; i < childrenTasks.Count; i++) { WorkItem task = childrenTasks[i]; if (!dataContainer.WiDict.ContainsKey(task.Id)) dataContainer.WiDict.Add(task.Id, task); if (task.IsClosed()) continue; if (task.Type.Name != WorkItemType.Task) continue; List<int> taskBlockersIds = WorkItemParser.GetRelationsByType(task, WorkItemLinkType.BlockedBy); if (taskBlockersIds.Count > 0) dataContainer.BlockersDict.Add(task.Id, taskBlockersIds); var taskLinkDict = WorkItemParser.ParseLinks(task); int? currentParentLtId = rootLeadTasskId; if (currentParentLtId == null && taskLinkDict.ContainsKey(WorkItemLinkType.Parent)) { int ltId = taskLinkDict[WorkItemLinkType.Parent][0]; if (dataContainer.LeadTaskChildrenDict.ContainsKey(ltId)) currentParentLtId = ltId; } if (currentParentLtId != null) { var ltChildren = dataContainer.LeadTaskChildrenDict[currentParentLtId.Value]; if (!ltChildren.Contains(task.Id)) ltChildren.Add(task.Id); } if (taskLinkDict.ContainsKey(WorkItemLinkType.Child)) AppendTasks( taskLinkDict[WorkItemLinkType.Child], currentParentLtId, dataContainer, wiqlAccessor, null); if (progressReportHandler != null) progressReportHandler(LoadingPart + (100 - LoadingPart) * i / childrenTasks.Count); } }
private void InitExternalBlockers(DataContainer dataContainer, TfsWiqlAccessor wiqlAccessor) { if (dataContainer.BlockersDict.Count == 0) return; var notFound = new HashSet<int>(); foreach (var pair in dataContainer.BlockersDict) { foreach (int blockerId in pair.Value.Where(i => !dataContainer.WiDict.ContainsKey(i))) { notFound.Add(blockerId); } } if (notFound.Count == 0) return; var workItems = wiqlAccessor.QueryWorkItemsByIds(notFound, null); for (int i = 0; i < workItems.Count; i++) { WorkItem workItem = workItems[i]; dataContainer.WiDict[workItem.Id] = workItem; } }
private void CleanDict( Dictionary<int, List<int>> dict, Dictionary<int, WorkItem> wiDict, bool deleteEmpty, bool useResolvedLinkedfWorkItems, TfsWiqlAccessor wiqlAccessor) { var notFoundIdsDict = new Dictionary<int, List<List<int>>>(dict.Keys.Count); foreach (var dictKey in dict.Keys) { var idsToRemove = new HashSet<int>(); var values = dict[dictKey]; foreach (int id in values) { if (wiDict.ContainsKey(id)) { if (wiDict[id].IsClosed()) idsToRemove.Add(id); } else { if (notFoundIdsDict.ContainsKey(id)) notFoundIdsDict[id].Add(values); else notFoundIdsDict.Add(id, new List<List<int>>(1) { values }); } } foreach (int id in idsToRemove) { values.Remove(id); } } if (notFoundIdsDict.Keys.Count > 0) { var workItems = wiqlAccessor.QueryWorkItemsByIds(notFoundIdsDict.Keys.ToList(), null); for (int i = 0; i < workItems.Count; i++) { WorkItem workItem = workItems[i]; if (!workItem.IsClosed() && (useResolvedLinkedfWorkItems || !workItem.IsResolved())) continue; foreach (List<int> ids in notFoundIdsDict[workItem.Id]) { ids.Remove(workItem.Id); } } } if (deleteEmpty) { var emptyKeys = dict.Keys.Where(k => dict[k].Count == 0).ToList(); emptyKeys.ForEach(k => dict.Remove(k)); } }
internal static List<WorkItem> GetNoShipBugs( string tfsUrl, string areaPath, string iterarion, Action<int> progressReportHandler) { var strBuilder = new StringBuilder(); strBuilder.Append("SELECT [System.Id] FROM WorkItemLinks"); strBuilder.Append(" WHERE Source.[System.WorkItemType] = 'Bug'"); strBuilder.Append(" AND Source.[System.AreaPath] UNDER '" + areaPath + "'"); strBuilder.Append(" AND Source.[System.IterationPath] UNDER '" + iterarion + "'"); strBuilder.Append(" AND Source.[System.State] <> 'Proposed'"); strBuilder.Append(" AND Source.[System.State] <> 'Active'"); strBuilder.Append(" AND Source.[System.Reason] <> 'Converted to Requirement'"); strBuilder.Append(" AND Source.[Completed Work] > 0"); strBuilder.Append(" AND Target.[System.WorkItemType] = 'Ship'"); strBuilder.Append(" MODE (DoesNotContain)"); List<WorkItem> result; using (var wiqlAccessor = new TfsWiqlAccessor(tfsUrl)) { var ids = wiqlAccessor.QueryIdsFromLinks( strBuilder.ToString(), null, null, null); if (ids.Count == 0) return new List<WorkItem>(0); strBuilder.Clear(); strBuilder.Append("SELECT [System.Id] FROM WorkItemLinks"); strBuilder.Append(" WHERE Source.[System.Id] IN (" + string.Join(",", ids.Keys) + ")"); strBuilder.Append(" AND [System.Links.LinkType] = 'Child'"); strBuilder.Append(" AND Target.[System.WorkItemType] = 'LeadTask'"); strBuilder.Append(" AND Target.[Microsoft.VSTS.Common.Discipline] = 'Development'"); strBuilder.Append(" MODE (DoesNotContain)"); ids = wiqlAccessor.QueryIdsFromLinks( strBuilder.ToString(), null, null, null); if (ids.Count == 0) return new List<WorkItem>(0); result = wiqlAccessor.QueryWorkItemsByIds( ids.Keys, "ORDER BY [Completed Work] DESC", progressReportHandler); } return result; }
private static List<WorkItem> GetBugs( string tfsUrl, string areaPath, string iterarion, bool newFunc, bool sd, Action<int> progressReportHandler) { var strBuilder = new StringBuilder(); strBuilder.Append("SELECT [System.Id] FROM WorkItemLinks"); strBuilder.Append(" WHERE Source.[System.WorkItemType] = 'Bug'"); strBuilder.Append(" AND Source.[System.AreaPath] UNDER '" + areaPath + "'"); strBuilder.Append(" AND Source.[System.IterationPath] UNDER '" + iterarion + "'"); strBuilder.Append(" AND Source.[System.State] <> 'Proposed'"); strBuilder.Append(" AND Source.[System.State] <> 'Active'"); if (!sd) { strBuilder.Append(" AND Source.[Found On Level] <> '6 Product Testing'"); strBuilder.Append(" AND Source.[Regress] = '" + (newFunc ? "No" : "Yes") + "'"); } strBuilder.Append(" AND Source.[Service Desk] "+ (sd ? "=" : "<>") + " 'Yes'"); strBuilder.Append(" AND Source.[System.Reason] NOT IN ('Rejected', 'Deferred', 'Duplicate', 'Cannot Reproduce', 'Converted to Requirement')"); strBuilder.Append(" AND Target.[System.WorkItemType] = 'LeadTask'"); strBuilder.Append(" AND Target.[Microsoft.VSTS.Common.Discipline] = 'Development'"); strBuilder.Append(" AND [System.Links.LinkType] = 'Child'"); strBuilder.Append(" MODE (DoesNotContain)"); List<WorkItem> result; using (var wiqlAccessor = new TfsWiqlAccessor(tfsUrl)) { var ids = wiqlAccessor.QueryIdsFromLinks( strBuilder.ToString(), null, null, null); if (ids.Count == 0) return new List<WorkItem>(0); strBuilder.Clear(); strBuilder.Append("SELECT [System.Id] FROM WorkItemLinks"); strBuilder.Append(" WHERE Source.[System.Id] IN (" + string.Join(",", ids.Keys) + ")"); strBuilder.Append(" AND Target.[System.WorkItemType] = 'Ship'"); strBuilder.Append(" AND Target.[System.AreaPath] UNDER '" + areaPath + "'"); strBuilder.Append(" AND Target.[System.IterationPath] UNDER '" + iterarion + "'"); strBuilder.Append(" MODE (MustContain)"); ids = wiqlAccessor.QueryIdsFromLinks( strBuilder.ToString(), null, null, null); if (ids.Count == 0) return new List<WorkItem>(0); result = wiqlAccessor.QueryWorkItemsByIds( ids.Keys, "ORDER BY [Completed Work] DESC", progressReportHandler); } return result; }
internal static List<WorkItem> GetWorkItemsByIds(string tfsUrl, List<int> ids) { using (var wiqlAccessor = new TfsWiqlAccessor(tfsUrl)) { return wiqlAccessor.QueryWorkItemsByIds( ids, null, null); } }