TFS API拉取某个IterationId的变更集

时间:2016-02-09 18:43:07

标签: c# tfs tfs2012 tfs-sdk

我正在尝试从Team Foundation Server提取工作项信息。我有一个工作程序,可以提取所有 WorkItems。我试图只提取属于特定迭代(IterationId)的WorkItems

我尝试过的一种方法是生成所有WorkItem的列表,然后过滤出与用户给定迭代匹配的IterationID的行。这个问题是需要很长时间才能完成所有更改。我的大多数迭代只包含5-10个WorkItems。

我的程序拉所有更改:

Uri tfsUri = new Uri(projectCollection.Uri.ToString());
        VersionControlServer controlServer = projectCollection.GetService<VersionControlServer>();
        var hHistory = controlServer.QueryHistory("$/MyPath/",
                                                    VersionSpec.Latest,
                                                    0,
                                                    RecursionType.Full,
                                                    String.Empty,
                                                    null,
                                                    VersionSpec.Latest,
                                                    int.MaxValue,
                                                    false,
                                                    false,
                                                    true);
foreach (Changeset change in hHistory)
{
    cfChangedFiles = change.Changes;
    foreach (WorkItem wi in change.WorkItems)
    {
        strInput = Encoding.GetEncoding(1252).GetString(GetStreamAsByteArray(cfChangedFiles[i].Item.DownloadFile()));
        Console.WriteLine("Iteration ID: " + wi.IterationId.ToString());
        Console.WriteLine("Title: " + wi.Title.ToString());
        Console.WriteLine("ChangesetID: " + change.ChangesetId.ToString());
        Console.WriteLine("SourceText:\t\t" + strInput); //EDIT NEW
        //...Print Other Things...
    }
}

我还尝试使用WorkItemStore.Query

来提取信息
WorkItemStore workItemStore = (WorkItemStore)projectCollection.GetService(typeof(WorkItemStore));
// Run a query.
WorkItemCollection queryResults = workItemStore.Query(
    "Select [State], [Title] " +
    "From WorkItems Where [System.IterationId] ='73'");
foreach(WorkItem wi in queryResults)
{
    Console.WriteLine("Iteration ID: " + wi.IterationId.ToString());
    /*...Print Other Things...
}

上面代码的问题在于我无法提取某些内容(例如源文本)。

类似问题: TFS API - slow foreach changeset iteration - 这个问题类似于OP的程序加载速度非常慢。但是,给出的答案已在我的程序中实现。这仍然会拉所有更改。

2 个答案:

答案 0 :(得分:1)

我可能会使用选项2,对该迭代路径中的所有工作项运行查询,然后查找任何关联的更改集。我认为它会更快。

在你的foreach循环中,wi.Links应该允许你获得ChangesetId。

来自:How can I query work items and their linked changesets in TFS?

foreach (WorkItem workItem in workItemCollection)
{
    Console.WriteLine("WI: {0}, Title: {1}", workItem.Id, workItem.Title);
    foreach (var changeset in
        workItem.Links
            .OfType<ExternalLink>()
            .Select(link => artifactProvider
                .GetChangeset(new Uri(link.LinkedArtifactUri))))
    {
        Console.WriteLine(
            "CS: {0}, Comment: {1}",
            changeset.ChangesetId,
            changeset.Comment);
    }
}

答案 1 :(得分:0)

我找到了解决问题的方法。 QueryHistory的第6个和第7个参数是起始变更集ID和结束变更集ID。

Uri tfsUri = new Uri(projectCollection.Uri.ToString());
    VersionControlServer controlServer = projectCollection.GetService<VersionControlServer>();
    var hHistory = controlServer.QueryHistory("$/MyPath/",
                                                VersionSpec.Latest,
                                                0,
                                                RecursionType.Full,
                                                String.Empty,
                                                VersionSpec.ParseSingleSpec(changeset.ChangesetId.ToString(), null),
                                                VersionSpec.ParseSingleSpec(changeset.ChangesetId.ToString(), null),
                                                int.MaxValue,
                                                false,
                                                false,
                                                true);

我使用WIQL选择与给定IterationID相对应的所有ChangesetID。然后,我为每个ChangesetID循环上面的代码。这允许我的应用程序仅加载我给定的ChangesetID的更改。