gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:18:47 25 4
gpt4 key购买 nike

我需要在TFS 2010中完成构建后发送电子邮件,其中详细说明了与已作为此构建的一部分进行编译的 checkin 关联的工作项。通过使用构建工作流程中可用的associatedChangesets变量,此方法没有问题。

但是,在生产情况下,我们会将开发分支中的更改合并到发布分支中。在这一点上,该构建认为只有一个更改-这就是前面提到的Development与Release的合并。显然,这是没有用的,因为我们需要找出合并分支中的哪些更改以及关联的工作项

有谁知道如何使用TFS 2010 API来完成此任务?从API角度来看,它的文档似乎很少。我知道您可以在VS2010中扩展“合并历史记录”节点,但是显然这不好,因为需要以编程方式收集此数据,以便可以发送报告电子邮件。

最佳答案

好的...我想我找到了一个解决方案,尽管它很笨拙,但实际上我不确定它是如何工作的。但是,这里走了-也许它将为某个人指明正确的方向。

var associatedWorkItems = new List<WorkItem>();

//Passed in from the build workflow (this variable is available under the 'Run On Agent' sequence as 'associatedChangesets'
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)
{
//In order to view the individual changes, load the changeset directly from the VCS.
Changeset localChangeset = versionControlServer.GetChangeset(changeset.ChangesetId);

foreach (Change change in localChangeset.Changes)
{
//Find out what was merged in.
ChangesetMerge[] mergedChangesets = versionControlServer.QueryMerges(
null,
null,
change.Item.ServerItem,
new ChangesetVersionSpec(localChangeset.ChangesetId),
new ChangesetVersionSpec(localChangeset.ChangesetId),
null,
RecursionType.Full);

//Extract work item information from changesets being identified as merged.
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参数是相同的-这意味着我们只是从这个变更集中查看合并。

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

请注意,即使您从构建工作流中获得了 associatedChangesets集合,出于某种原因(至少对我而言), Changes[]内的 associatedChangesets属性也从未填充过(因此,使用 VersionControlServer.GetChangeset()方法加载每个单独的变更集,因为这似乎实际上填充了所有我们需要的领域。

就像我说的那样:1.这是一个笨拙的解决方案(很多循环-其中有些可能是不必要的),2.尽管它似乎产生了所需的结果,但我并不完全理解它是如何工作的-我得出的结论是进行大量的测试和调试),最后-基于Microsoft提供的糟糕文档,这是我能想到的最好的方法。

希望它能对某人有所帮助!

关于version-control - TFS 2010 API-从合并中获取工作项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7555028/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com