构建自己的Team Foundation Sidekick

版本控制系统中,如SourceSafe、Source Gear、CVS、Subversion等,经常需要管理文件版本、用户权限以及在项目中创建分支等。Team Foundation Version Control (TFVC) 引入了一些新特性,例如“暂存和取消暂存更改”、“签入策略”以及“独占或共享签出”。使用TFVC时,可能会涉及到许多任务,比如管理工作区、设置用户权限、查找锁定文件的用户、比较文件历史、从TFS销毁版本控制文件/文件夹等。有些特性仅通过命令行界面可用,因此,可能需要编写大量的命令行。这时,“Team Foundation Sidekicks”工具就派上用场了。

在寻找一个图形化工具来处理上述常见任务时,发现了一个网站,它描述了其产品为“一套为Microsoft Team Foundation Server管理员和高级用户提供的工具,提供了一个图形用户界面,用于在多用户TFS环境中执行管理和高级版本控制任务”。最好的部分是,它是免费软件套件,可以在该许可证下用于商业或非商业目的。

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

问题

有时,需要永久删除TFVC中的文件/文件夹(销毁文件/文件夹),以满足磁盘空间要求;删除了一些可能为测试目的创建的项目等。这个功能仅通过命令行界面可用。这取决于文件/文件夹在项目结构中的深度。可能最终需要编写一个长路径来实现目标。因此,拥有一个文件资源管理器(类似于Windows资源管理器用于文件系统)将允许销毁不需要的文件/文件夹。让尝试为TFVC中的“销毁”文件/文件夹创建一个用户友好的界面。

首先,需要下载并安装Team Foundation Sidekick工具(需要在计算机上安装Team Explorer 2005或2008才能运行应用程序,请参阅实施说明)。安装Team Explorer和Team Foundation Sidekick后,将拥有扩展Team Foundation Version Control特性的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方法,在每次通过点击菜单或工具栏项将控件加载到主窗体时,创建控制器类实例。

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是分配给文件/文件夹的。

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

一旦可以创建ItemSpec类的实例:

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

关于Destroy方法的更多信息可以在这里找到。然后,只需要编译控件以构建将加载到Team Foundation Sidekick框架中的程序集,使用“Add Sidekick...”菜单项。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485