好的...我认为我找到了一个解决方案,虽然它有些笨重,说实话我也不确定它是如何工作的。但是,在这里我分享一下——也许会指引某个人朝着正确的方向前进。
var associatedWorkItems = new List<WorkItem>();
IList<Changeset> associatedChangesets = context.GetValue(BuildAssociatedChangesets);
if (associatedChangesets.Count > 0)
{
var projectCollection =
new TfsTeamProjectCollection(new Uri("http://localhost:8080/tfs/DefaultCollection"));
VersionControlServer versionControlServer = projectCollection.GetService<VersionControlServer>();
foreach (var changeset in associatedChangesets)
{
Changeset localChangeset = versionControlServer.GetChangeset(changeset.ChangesetId);
foreach (Change change in localChangeset.Changes)
{
ChangesetMerge[] mergedChangesets = versionControlServer.QueryMerges(
null,
null,
change.Item.ServerItem,
new ChangesetVersionSpec(localChangeset.ChangesetId),
new ChangesetVersionSpec(localChangeset.ChangesetId),
null,
RecursionType.Full);
foreach (var changesetMerge in mergedChangesets)
{
Changeset actualChange = versionControlServer.GetChangeset(changesetMerge.SourceVersion);
foreach (WorkItem item in actualChange.WorkItems)
{
if (!associatedWorkItems.Exists(w => w.Id == item.Id))
{
associatedWorkItems.Add(item);
}
}
}
}
}
}
不要问我
QueryMerges
的具体工作方式,但这里我所做的就是告诉它显示作为变更集合一部分合并的内容。您会注意到参数
ChangesetVersionSpec
是相同的 - 这意味着我们只查看来自此一个变更集的合并。
您将从
QueryMerges()
获得一个
ChangesetMerge
对象数组。在
ChangesetMerge
类中有一个叫做
SourceVersion
的属性 - 这是合并的原始变更集的
ChangesetId
。一旦我们获得了这个,我们就可以使用
VersionControlServer.GetChangeset()
方法加载单个集并提取
WorkItem
。然后将其添加到
WorkItems
列表中,可以按任何想要的方式进行操作(在我的情况下是电子邮件)。我还使用了
.Exists()
检查以确保不会重复记录相同的
WorkItem
。
请注意,即使您拥有构建工作流程中的
associatedChangesets
集合,由于某种原因(至少对我而言),
associatedChangesets
内部的
Changes[]
属性从未填充过(因此使用
VersionControlServer.GetChangeset()
方法加载每个单独的变更集,因为这似乎实际上填充了我们需要的所有字段。
就像我说的那样,1. 这是一个笨拙的解决方案(很多循环 - 其中一些可能是不必要的),2. 我并不完全理解它是如何工作的,尽管它似乎产生了所需的结果 - 我通过进行大量测试和调试得出了这个结论),最后 - 这是我根据微软提供的糟糕文档想出的最好方法。
希望对某人有所帮助!