65.9K
CodeProject 正在变化。 阅读更多。
Home

使用“Team Foundation Sidekicks”管理 Microsoft Team Foundation 版本控制 (TFVC)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2008年10月7日

CPOL

4分钟阅读

viewsIcon

57990

downloadIcon

603

一个插件,允许您使用“Team Foundation Sidekicks”工具从 TFVC 中“销毁”项。

概述

Team Foundation 版本控制 (TFVC) 拥有版本控制系统 (例如:SourceSafe、Source Gear、CVS、Subversion 等) 最常见的功能,如文件版本管理、与源代码关联的用户和权限管理,或者在项目中创建分支。TFVC 还引入了新功能,如“挂起和解除挂起更改”、“签入策略”以及“独占或共享签出”(更多信息:MSDN)。

在使用 TFVC 时,您将涉及许多任务,例如:管理工作区、设置用户权限、查找是谁锁定了文件、比较文件历史记录、从 TFS 中销毁版本控制文件/文件夹等。其中一些功能只能通过命令行使用,因此,最终您可能会写很多命令行。这时,“Team Foundation Sidekicks”工具就派上用场了。

我在网上搜索处理上述常见任务的图形化工具时,发现一个网站,该网站将其一款产品描述为“一套面向 Microsoft Team Foundation Server 管理员和高级用户的工具,为多用户 TFS 环境中的管理和高级版本控制任务提供图形用户界面”。而且,最棒的是它是一款免费软件套件,并可根据此许可证用于商业或非商业用途。

因此,我在 TFS 中创建了一个测试项目,并开始评估该产品的所有功能,在此处查看更多信息。经过一段时间的试用,我发现了很多很酷的功能,但最吸引我的是一个标有“Add Sidekick..”的菜单项。于是,我想,也许我可以编写自己的 TFS sidekick 并将其插入到该工具中。

问题所在

有时,出于磁盘空间考虑,我需要永久删除 TFVC 中的文件/文件夹(销毁文件/文件夹);我删除了可能为测试目的创建的项目等。此功能只能通过命令行界面使用。这取决于文件/文件夹在项目结构中的深度。我可能需要写很长的路径才能达到我的目的。因此,有一个文件浏览器(类似于文件系统的 Windows Explorer)可以让我销毁不需要的文件/文件夹,那将是很棒的。让我们尝试为从 TFVC“销毁”文件/文件夹创建一个用户友好的界面。

构建自己的 Team Foundation Sidekick

您需要做的第一件事是下载并安装 Team Foundation Sidekick 工具(必须在计算机上安装 Team Explorer 2005 或 2008 才能运行该应用程序,请参阅实现说明)。安装了 Team Explorer 和 Team Foundation Sidekick 后,您将获得用于扩展 Team Foundation 版本控制功能的 API。Team Foundation Sidekicks 控件必须继承自 BaseSidekickControl 基类,并且还必须重写公共 Image 属性,以便为您的 sidekick 入口点创建菜单和工具栏项,并初始化公共 Name 属性以为此类项命名。

namespace MySidekick.Control
{
    public partial class DestroyFilesAndFoldersViewControl : BaseSidekickControl
    { 
        DestroyFilesAndFoldersController _controller = null;
        public DestroyFilesAndFoldersViewControl()
        {
            InitializeComponent();
            base.Name = "Destroy Sidekick";
        } 

        public override Image Image
        {
            get
            {
                return new Bitmap(@"c:\Test\Resources\Destroy.bmp");
            }
        }
    }
}

还建议我们创建一个派生自 TfsController 的“Controller”类,以便安全地使用 Team Foundation Sidekick 应用程序提供的连接和安全上下文。在此类中,我们将编写所有必要的方法来实现我们的目标。

namespace MySidekick.Controller
{
    public class DestroyFilesAndFoldersController : TfsController
    {
        public DestroyFilesAndFoldersController(TfsController 
               baseController) : base(baseController)
        {
        }
    }
}

然后,我们需要重写 Initialize 方法,以便在主窗体通过单击菜单或工具栏项加载控件时,在 DestroyFilesAndFoldersViewControlClass 中创建您的控制器类的实例。

namespace MySidekick.Control
{
    public partial class DestroyFilesAndFoldersViewControl : 
                         BaseSidekickControl
    { 
        DestroyFilesAndFoldersController _controller = null;
        public DestroyFilesAndFoldersViewControl()
        {
            InitializeComponent();
            base.Name = "Destroy Sidekick";
        } 

        public override Image Image
        {
            get
            {
                return new Bitmap(@"c:\Test\Resources\Destroy.bmp");
            }
        }

        public override void Initialize(TfsController controller)
        {
            this._controller = new DestroyFilesAndFoldersController(controller);
        }
    }
}

此时,我们只需要编写实际从 TFVC 销毁文件/文件夹的方法。如果我们探索 Microsoft.TeamFoundation.VersionControl.Client 程序集中的 VersionControlServer 类,我们可以看到一个名为 Destroy 的方法。

public Item[] Destroy(ItemSpec itemSpec, VersionSpec versionSpec, 
       VersionSpec stopAt, DestroyFlags flags);

但是,在 Team Foundation Server 的 SDK 参考中,没有关于 Destroy 方法的信息。我们也可以尝试获取有关传递给该方法的参数(如 ItemSpec)的信息。我们得到的所有信息是“此 API 支持 Team Foundation Server 基础结构,不应用于直接从您的代码中使用”。所有这些信息缺失是有道理的,因为 Destroy 是一个非常危险的操作;因此,我们需要消除关于将销毁哪些项的所有可能的歧义。(当然,我们需要在该项目上拥有管理员权限)。也许,最好只销毁我们先前已从项目中删除的文件。

public ItemSpec(string item, RecursionType recursionType, int deletionId);

在这里,item 是要销毁的项或文件夹的完整服务器路径(不允许本地文件路径),而 deletionId 则分配给文件/文件夹。

一旦我们可以创建一个 ItemSpec 类的实例

public ItemSpec GetItemsSpec(string path, int deletionID)
{
   return new ItemSpec( path, RecursionType.Full, deletionID);
}

我们所要做的就是使用基类调用 Destroy 方法并满足其所有参数。

public void Destroy(string path, int deletionID)
{
    base.VersionControl.Destroy(GetItemsSpec(path, deletionID), 
         VersionSpec.Latest, null, DestroyFlags.None);           
}

有关 Destroy 方法的更多信息,请在此处查阅。

然后,我们只需编译该控件以构建程序集,然后使用“Add Sidekick..”菜单项将其加载到 Team Foundation Sidekick 框架中。

Adding Sidekick

如下图所示,我们有了一个新的菜单项,标有“Destroy Sidekick”。

Destroy ToolBarItem

单击它,我们将看到以下屏幕。现在,我们只需要搜索要删除的文件/文件夹,然后在键盘上按 Delete 键。

Deleting Files/Folders

就是这样,希望您喜欢这篇文章。

© . All rights reserved.