Version control TFS 2010 API-从合并中获取工作项

Version control TFS 2010 API-从合并中获取工作项,version-control,merge,tfsbuild,Version Control,Merge,Tfsbuild,我需要在TFS 2010中的构建完成后发送一封电子邮件,其中详细说明了与作为此构建一部分编译的签入相关的工作项。通过使用构建工作流中可用的associatedChangesets变量,这不会产生任何问题 但是,在生产环境中,我们将把开发分支中的更改合并到发布分支中。在这一点上,构建认为只有一个变化——即前面提到的将开发合并到发布中。显然,这是相当无用的,因为我们需要找出在合并的分支中进行了哪些更改,以及相关的工作项 有人知道如何使用TFS2010 API实现这一点吗?从API的角度来看,它的文档

我需要在TFS 2010中的构建完成后发送一封电子邮件,其中详细说明了与作为此构建一部分编译的签入相关的工作项。通过使用构建工作流中可用的
associatedChangesets
变量,这不会产生任何问题

但是,在生产环境中,我们将把开发分支中的更改合并到发布分支中。在这一点上,构建认为只有一个变化——即前面提到的将开发合并到发布中。显然,这是相当无用的,因为我们需要找出在合并的分支中进行了哪些更改,以及相关的工作项


有人知道如何使用TFS2010 API实现这一点吗?从API的角度来看,它的文档记录似乎相当糟糕。我知道您可以在VS2010中扩展“合并历史记录”节点,但显然这不好,因为需要通过编程方式收集这些数据,以便发送报告电子邮件。

好的。。。我想我找到了解决这个问题的办法,尽管它很笨重,说实话,我不确定它是如何工作的。但这是事实——也许它会为某人指明正确的方向

var associatedWorkItems=new List();
//从生成工作流传入(此变量在“代理上运行”序列下作为“关联变更集”可用)
IList associatedChangesets=context.GetValue(BuildAssociatedChangesets);
如果(associatedChangesets.Count>0)
{
var项目集合=
新TfsTeamProjectCollection(新Uri(“http://localhost:8080/tfs/DefaultCollection"));
VersionControlServer VersionControlServer=projectCollection.GetService();
foreach(关联变更集中的变量变更集)
{
//要查看单个更改,请直接从VCS加载更改集。
Changeset localChangeset=versionControlServer.GetChangeset(Changeset.ChangesetId);
foreach(localChangeset.Changes中的更改)
{
//找出合并的内容。
ChangesetMerge[]mergedChangesets=versionControlServer.QueryMerges(
无效的
无效的
change.Item.ServerItem,
新的ChangesetVersionSpec(localChangeset.ChangesetId),
新的ChangesetVersionSpec(localChangeset.ChangesetId),
无效的
RecursionType.Full);
//从标识为合并的变更集中提取工作项信息。
foreach(在mergedChangesets中的var changesetMerge)
{
Changeset actualChange=versionControlServer.GetChangeset(changesetMerge.SourceVersion);
foreach(实际更改.工作项中的工作项)
{
如果(!associatedWorkItems.Exists(w=>w.Id==item.Id))
{
关联的工作项。添加(项);
}
}
}
}
}
}
不要确切地问我
QueryMerges
是如何工作的,但我在这里所做的只是告诉我作为变更集签入的一部分合并了什么。您会注意到参数
ChangesetVersionSpec
是相同的-这意味着我们只是从这一变更集中查看合并

您将从
QueryMerges()
中获得
ChangesetMerge
对象数组。在
ChangesetMerge
类中,有一个名为
SourceVersion
的属性-这是合并的原始变更集的
ChangesetId
。一旦获得该属性,我们就可以使用
VersionControlServer.GetChangeset())
方法加载单个集合并提取
工作项
。然后将其添加到
工作项的列表中,该列表可以以任何方式进行操作(在我的示例中是电子邮件)。我还使用了
.Exists()
检查以确保相同的
工作项
不会被记录两次

请注意,即使您拥有来自生成工作流的集合
associatedChangesets
,但出于某种原因(至少对我而言),
associatedChangesets
中的
Changes[]
属性从未填充(因此使用
VersionControlServer.GetChangeset()加载每个单独的变更集)
方法,因为这似乎实际上填充了我们需要的所有字段

就像我说的,1.这是一个笨拙的解决方案(大量的循环-其中一些可能是不必要的),2.我不完全理解它是如何工作的,尽管它似乎产生了所需的结果-我通过大量的测试和调试得出了这个结论)最后,根据微软提供的糟糕文档,这是我能想到的最好的方法


希望它能帮助别人!

它可能是以下内容的重复/子集: