如何以编程方式确定包含哪些待签入项目?

2023-12-27

我可以查询 PendingSets 和候选 PendingSets,并且似乎无法区分包含的挂起更改和排除的挂起更改。

我在包含的更改中包含一个文件,可以通过 Visual Studio 团队资源管理器签入。

使用 Tfs dll 查询,我得到有 112 个待处理的,和 145 个 CandidatePending:

var tfsServer = Macros.TfsModule.GetTfsServerFromEnvironment();

var tfs =new Macros.TFS(tfsServer,"Development", null);
var vcs= tfs.Tfs.GetService<Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer>();
var searchBase=vcs.GetItem("$/");
//vcs.Dump();
var workspace = vcs.GetWorkspace(Environment.ExpandEnvironmentVariables("%devroot%"));

// vcs.QueryWorkspaces(null,null,null).Dump("workspaces");
var itemSpecs = new []{new ItemSpec(searchBase.ServerItem,RecursionType.Full)};

vcs.QueryPendingSets(itemSpecs, workspace.Name, workspace.OwnerName, false, true)
    .Select(ps=>new {Pending=ps.PendingChanges.Select(pc=>new{ pc.LocalOrServerItem,PendingChange=Util.OnDemand("PendingChange",()=> pc)}), ps.CandidatePendingChanges})
    .First()
    .Dump();

workspace.Dump();

112 值确实与“包含+排除”一致。 465 值与检测到的添加值一致。

但是我完全无法弄清楚当前包含哪些更改。我尝试过 Tfs dll 查询,并且EnvDte用了几个小时。

我可以通过编程方式获取当前包含的更改列表(更好的是,更改包含/排除列表)?


在我看来,您请求的功能(获取/修改包含和排除的更改集)是“待处理更改”窗口本身的一部分,而不是 TFS API 的一部分。看这个帖子 https://social.msdn.microsoft.com/Forums/vstudio/en-US/a4066695-dfec-48cf-8743-eef6088923cf/programmatically-open-pending-changes-window-and-add-work-item?forum=vsx有关如何与“待更改”窗口交互的示例(部分通过反射)。也许这是进一步探索的一个重要起点。

EDIT

我只是进一步探索了这一点并提出了以下代码。它主要利用接口Microsoft.TeamFoundation.VersionControl.Controls.PendingChanges.IPendingChangesDataProvider,位于程序集内部Microsoft.TeamFoundation.VersionControl.Controls.dll.

using System;
using System.Collections.Generic;
using System.Reflection;
using Microsoft.TeamFoundation.Controls;
using Microsoft.TeamFoundation.Controls.WPF.TeamExplorer;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace PrettyFlyForANamespace
{
    public class PendingChangesInclusion
    {
        private readonly Action<IList<PendingChange>> _includeChanges;
        private readonly Action<IList<PendingChange>> _excludeChanges;
        private readonly Func<IList<PendingChange>> _getIncludedChanges;
        private readonly Func<IList<PendingChange>> _getExcludedChanges;

        public IList<PendingChange> IncludedChanges
        {
            get
            {
                return _getIncludedChanges();
            }
        }

        public IList<PendingChange> ExcludedChanges
        {
            get
            {
                return _getExcludedChanges();
            }
        }

        public PendingChangesInclusion(ITeamExplorer teamExplorer)
        {
            var pendingChangesPage = (TeamExplorerPageBase)teamExplorer.NavigateToPage(new Guid(TeamExplorerPageIds.PendingChanges), null);

            var model = pendingChangesPage.Model;
            var p = model.GetType().GetProperty("DataProvider", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);

            var dataProvider = p.GetValue(model); // IPendingChangesDataProvider is internal;
            var dataProviderType = dataProvider.GetType();

            p = dataProviderType.GetProperty("IncludedChanges", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
            var m = p.GetMethod;
            _getIncludedChanges = (Func<IList<PendingChange>>)m.CreateDelegate(typeof(Func<IList<PendingChange>>), dataProvider);

            p = dataProviderType.GetProperty("ExcludedChanges", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
            m = p.GetMethod;
            _getExcludedChanges = (Func<IList<PendingChange>>)m.CreateDelegate(typeof(Func<IList<PendingChange>>), dataProvider);

            m = dataProviderType.GetMethod("IncludeChanges", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
            _includeChanges = (Action<IList<PendingChange>>)m.CreateDelegate(typeof(Action<IList<PendingChange>>), dataProvider);

            m = dataProviderType.GetMethod("ExcludeChanges", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy);
            _excludeChanges = (Action<IList<PendingChange>>)m.CreateDelegate(typeof(Action<IList<PendingChange>>), dataProvider);
        }

        public void IncludeChanges(IList<PendingChange> changes)
        {
            _includeChanges(changes);
        }

        public void ExcludeChanges(IList<PendingChange> changes)
        {
            _excludeChanges(changes);
        }
    }
}

如果要从 VS Package 对象中调用上面的代码,可以使用以下代码:

var teamExplorer = (ITeamExplorer)GetService(typeof(ITeamExplorer));
var psi = new PendingChangesInclusion(teamExplorer);

// To see if this works, include all excluded pending changes.
psi.IncludeChanges(psi.ExcludedChanges);

您将需要使用“浏览”对话框包含以下程序集:

  • C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Client.dll
  • C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v4.5\Microsoft.TeamFoundation.Controls.dll
  • C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Client.dll
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式确定包含哪些待签入项目? 的相关文章

随机推荐

  • 参数类型中的这三个点是什么[重复]

    这个问题在这里已经有答案了 可能的重复 该方法签名中的省略号代表什么 https stackoverflow com questions 2367398 what is the ellipsis for in this method sig
  • 如何使 QListWidget 项目可编辑

    我是 PyQt 的新手 我首先在Qt Designer中制作了一个对话框 并在QListWidget中实现了简单的添加 删除 向上 向下操作 除了编辑之外的所有操作都很有效 所以我做了很多关于如何使项目可编辑的搜索 但结果并不令人满意 我能
  • Imageview 不显示圆角

    我试图使我的布局像这样 但我无法使我的图像视图像这样带有圆角 它在 Android studio 的布局编辑器中完美显示 但在真实设备中我得到的是平角 我厌倦了 XML 和代码 但没有一个对我有用 请帮助我使我的布局像这个示例图像一样 我的
  • Python:基于 Pandas 中的 2 列进行分箱

    寻找一种基于 Pandas 中的 2 列的快速而优雅的分类方式 这是我的数据框 filename height width 0 shopfronts 23092017 3 285 jpg 750 0 560 0 1 shopfronts 2
  • Ruby on Rails - 生成 bit.ly 样式标识符

    我正在尝试生成与 bit ly url 样式相同的 UUID 例如 http bit dot ly aUekJP 或 cloudapp 的 http cl dot ly 1hVU 甚至更小 我该怎么做 我现在正在为 ruby 使用 UUID
  • DTM - s.t函数与页面加载规则关系

    我不清楚动态标签管理器 DTM 如何执行 Adob e Analytics 页面加载规则 特别是它何时触发 Adob e Analytics 请求 s t 函数 Adobe 提供了此图 https marketing adobe com r
  • MVVM INotifyPropertyChanged 与自动属性名称实现

    根据我的理解 我们可以在 MVVM 风格的应用程序中使用 INofityProperty 代码类似于以下内容 object SelectedPerson public object SelectedPerson get return Sel
  • sp_send_dbmail 因附件而失败

    我需要发送带有文件附件的电子邮件 附件必须来自图像类型数据字段 在查询窗口和存储过程中运行以下代码时 不会发送电子邮件 在查询窗口中 它只显示 命令成功完成 但没有电子邮件 EXEC msdb dbo sp send dbmail reci
  • 在 TypeScript 中,将类括在尖括号“<>”中意味着什么?

    我对 TypeScript 非常陌生 并且非常喜欢它 尤其是在 Javascript 中进行 OOP 是多么容易 然而 当涉及到使用尖括号时 我一直试图弄清楚语义 从他们的文档中 我看到了几个例子 例如 interface Counter
  • 减去 POSIXct 时如何使相同单位的时间差

    我想减去 POSIXct 我可以做到这一点 但根据第一行 我猜 差异将以秒或分钟为单位 下面您可以看到第一个差异以秒为单位 第二个差异以分钟为单位 因为我更改了第一行中的时间差 diff in seconds because 1st row
  • 在 Python 中的 SELECT 语句中传递列名

    if count 1 cursor execute SELECT FROM PacketManager WHERE filters 0 parameters 0 all rows cursor fetchall elif count 2 c
  • 理解和构建社交网络算法

    我不确定这是否是提出这个问题的正确平台 但我的问题陈述是 我有一家书店 客户数量为 x x 很大 客户可以告诉我一本书是好还是坏 不推荐 我有一个将书籍放在一起的内在逻辑 所以如果客户说一本书不好 他是在说类似的书也不好 但不要向他展示这一
  • 如何在 Intellij Idea 11 上运行 scala 代码?

    我是 intellij idea 的新手 我决定转变 因为我发现 eclipse 上的 scala 插件有烦人的 bug 但是 听说很好用的intellij idea 看起来很难用 我浏览了scala 插件页面入门 http conflue
  • Tsrange - 计算两个范围之间的差异

    我有两张桌子free time and appointment 两者都包含 tsrange 如何编写一个查询 或函数 来确定 减去 差异后的实际空闲时间appointment来自freetime INSERT INTO free time
  • Django:为 request.user 使用自定义类?

    我已经扩展了 Django 的默认用户类 如下所示 class CustomUser User friends models ManyToManyField self symmetrical False 但现在我想在任何地方使用它而不是默认
  • Symfony/PHPUnit 模拟服务

    我正在使用 PHPUnit 为 Symfony 编写功能测试 但我的模拟不起作用 我可能误解了它们的工作原理 在我的单元测试中setUp 方法我有这个代码 Create a stub stub this gt getMockBuilder
  • 如何处理“太多 HTTP 重定向”错误

    当我将网站加载到可可应用程序的 Web 视图中时 就会出现此问题 我的问题描述 错误域 NSURLErrorDomain代码 1007 HTTP重定向太多 用户信息 0x18d17d56 NSErrorFailingURLStringKey
  • FormData 构造函数丢失 Edge 中的文本区域值

    我有一个文本区域
  • ggplot 时间序列绘图:按日期分组

    我想在同一个面板图上绘制多个时间序列 而不是在单独的面板上 我从以下位置获取了 R 代码另一个 stackoverflow 帖子 https stackoverflow com questions 14136703 ggplot2 time
  • 如何以编程方式确定包含哪些待签入项目?

    我可以查询 PendingSets 和候选 PendingSets 并且似乎无法区分包含的挂起更改和排除的挂起更改 我在包含的更改中包含一个文件 可以通过 Visual Studio 团队资源管理器签入 使用 Tfs dll 查询 我得到有