在版本控制系统中,如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...”菜单项。