TFS API 拉取某个 IterationId 的变更集
TFS API Pulling changesets of a certain IterationId
我正在尝试从 Team Foundation Server 中提取工作项信息。我有一个可以提取 all WorkItems 的工作程序。我试图只提取属于特定迭代 (IterationId
).
的工作项
我尝试过的一种方法是生成所有工作项的列表,然后过滤掉具有与用户给定迭代相匹配的 IterationID
的行。这样做的问题是拉取所有更改需要很长时间。我的大部分迭代仅包含 5-10 个工作项。
我拉取 all 的程序更改:
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 的程序加载速度非常慢。但是,给出的答案已经在我的程序中实现了。这也仍然拉动 all 变化。
我可能会选择选项 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);
}
}
我找到了问题的解决方案。 QueryHistory 的第 6 个和第 7 个参数是 starting ChangesetID 和 ending ChangesetID。
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 到 select 所有与给定 IterationID 相对应的 ChangesetID。然后,我为每个 ChangesetID 循环了上面的代码。这允许我的应用程序仅加载给定 ChangesetID 的更改。
我正在尝试从 Team Foundation Server 中提取工作项信息。我有一个可以提取 all WorkItems 的工作程序。我试图只提取属于特定迭代 (IterationId
).
我尝试过的一种方法是生成所有工作项的列表,然后过滤掉具有与用户给定迭代相匹配的 IterationID
的行。这样做的问题是拉取所有更改需要很长时间。我的大部分迭代仅包含 5-10 个工作项。
我拉取 all 的程序更改:
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 的程序加载速度非常慢。但是,给出的答案已经在我的程序中实现了。这也仍然拉动 all 变化。
我可能会选择选项 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);
}
}
我找到了问题的解决方案。 QueryHistory 的第 6 个和第 7 个参数是 starting ChangesetID 和 ending ChangesetID。
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 到 select 所有与给定 IterationID 相对应的 ChangesetID。然后,我为每个 ChangesetID 循环了上面的代码。这允许我的应用程序仅加载给定 ChangesetID 的更改。