【问题标题】:TFS .NET client libraries finding merge related work items查找合并相关工作项的 TFS .NET 客户端库
【发布时间】:2018-07-11 12:48:59
【问题描述】:

我想构建一个查询应用程序,它将查询 TFS 中的一个分支,并检索所有工作项并将其显示为主从报告:

User Story:30669    [Closed]    Ongoing Support and Maintenance
    Task:31566      [Closed]    Upgrade latest version of client libraries
    Bug:30905       [Closed]    Executing Error "The given Key was not present in the dictionary"
User Story:30351    [Closed]    Add new Function
    Task:28188      [Closed]    Implement new Function

这会让我们很好地了解我们在给定分支上做了哪些工作,以及如果我们选择构建,构建中会包含什么。

所以目前我可以检索日期之间分支的所有工作项,不包括合并。我想包含合并,但我很难理解 TFS 客户端界面。

这是我目前所拥有的:BranchModelChangesetModelUserStoriesTaskBugs 是帮助我为输出报告安排 WorkItem 对象的类:

        const String c_collectionUri = "http://tfsServer:81/tfs/ProjectCollection";
        const String c_projectName = "Project";

        using (TfsTeamProjectCollection tpc = 
               new TfsTeamProjectCollection(new Uri(c_collectionUri)))
        {
            VersionControlServer vcServer =
                 tpc.GetService<VersionControlServer>();
            WorkItemStore workItemStore = tpc.GetService<WorkItemStore>();

            // Fetch the branch history
            var history = vcServer.QueryHistory(@"$/ProjectCollection/Project/Branch1/Source", RecursionType.Full)
                .Where(h => h.CreationDate >= new DateTime(2018, 1, 1) && h.CreationDate <= new DateTime(2018, 1, 5));

            BranchModel branch = new BranchModel("Branch1");

            // Get the changesets, for from the fetched history
            List<Changeset> changesets = new List<Changeset>();
            foreach (Changeset changeset in history)
            {
                changesets.Add(changeset);

                // TODO: Add code to get Changesets related to merge
            }

            // Get the WorkItems from Changesets Fetched 
            foreach (Changeset changeset in changesets)
            {
                ChangesetModel changesetModel = branch.AddChangeset(changeset);

                foreach (WorkItem workItem in changeset.WorkItems)
                {
                    //  Fetch the UserStory for a Bug/Task
                    foreach (var linkedItem in workItem.Links)
                    {
                        RelatedLink relatedItem = linkedItem as RelatedLink;
                        WorkItem userStory = null;

                        if (relatedItem != null)
                            userStory = GetWorkItem(workItemStore, c_projectName, relatedItem.RelatedWorkItemId);

                        if (userStory != null)
                        {
                            var userStoryModel = branch.AddUserStory(userStory);
                            var taskBugModel = userStoryModel.Add(workItem);
                        }
                    }
                }

            }

            // Finally print the report
            Console.WriteLine();
            Console.WriteLine("Related Work:");
            Console.WriteLine("=".PadLeft(80, '='));

            foreach (var userStory in branch.UserStories)
            {
                Console.WriteLine(userStory.Value.ToString());

                foreach (var taskBug in userStory.Value.TaskBugs)
                {
                    Console.WriteLine(taskBug.Value.ToString());
                }
            }

以及GetWorkItem的方法:

    void WorkItem GetWorkItem(WorkItemStore workItemStore, string c_projectName, int workitemID)
    {
        return workItemStore.Projects[c_projectName].Store.GetWorkItem(workitemID);
    }

我想知道,对于恰好是合并的Changeset,如何获取与该合并相关的相关工作项。

【问题讨论】:

    标签: c# tfs tfs-2015 tfs-workitem workitem


    【解决方案1】:

    您无法直接从合并变更集中获取相关工作项。您需要获取合并历史记录(version fromversion to),然后从 version fromversion to 变更集中检索相关工作项。

    您可以使用VersionControlServer.GetChangesForChangeset 方法获取合并变更集的合并历史记录。然后从历史 Changesets Fetched 中获取 WorkItems。

    以下示例供您参考以获取合并变更集历史记录:

    static void Main(string[] args)
            {
                TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://server:8080/tfs/DefaultCollection"));
                new System.Net.NetworkCredential("username", "password");
                tpc.EnsureAuthenticated();
                VersionControlServer vcs = tpc.GetService<VersionControlServer>();
    
                int cid = 376;
    
                //List<IChangesetSummary> changeSets = InformationNodeConverters.GetAssociatedChangesets(build);
                IEnumerable<Change> changes = vcs.GetChangesForChangeset(cid, false, Int32.MaxValue, null, null, true);
    
                foreach (Change change in changes)
                {
                    if ((change.ChangeType & ChangeType.Merge) == 0) continue;
                    foreach (var m in change.MergeSources)
                    {
                        Console.WriteLine("{0} {1} {2} {3}", change.Item.ChangesetId, m.ServerItem, m.VersionFrom, m.VersionTo);
                    }                   
                }
                Console.ReadLine();
            }
    

    【讨论】:

    • 谢谢@Andy,你的回答就是我的问题的答案。但只是我正在开发的最终解决方案的一部分。对于那些阅读这只是一个仅供参考的人。
    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2020-01-04
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2016-08-01
    • 2020-03-27
    相关资源
    最近更新 更多