用于TFS的Visual Studio插件:标记要删除的文件

本文关键字:删除 文件 插件 TFS Visual Studio 用于 | 更新日期: 2023-09-27 18:02:02

我一直在为我的公司编写一个VB插件,它将进入TFS并自动标记以".delete"结尾的文件以进行删除。为此,我想创建一个工作空间"Temp",它映射到我本地的D:'TFSTemp和TFS中的一个文件夹。然后,我想只下载。delete文件到我的本地(以避免在服务器上获得最新的所有文件),将它们从我的本地映射到服务器,将它们标记为删除(workspace.PendDelete()),然后一次检查它们。

我的问题是我不确定我是否设置了所需的正确映射。我能够下载所有的.delete文件,但是当我调用Workspace.GetPendingChanges()时,数组没有被填充,这就是为什么我怀疑我可能没有正确设置它的原因。

我知道这是一个复杂的插件,所以如果我的代码对你没有意义,请问我问题。

//establish connection to tfs
                TeamFoundationServer server = new TeamFoundationServer(TFS1);
                //test file to output to
                StreamWriter xw = new StreamWriter(@"C:'Documents and Settings'A087649'Desktop'FileList.txt");
                //get a working object in tfs
                VersionControlServer sourceControl = server.GetService(typeof(VersionControlServer)) as VersionControlServer;
                int numberOfFiles = 0;
                int numToDelete = 0;
                try
                {
                    //load config file
                     //LoadConfig();
                    //path where we are going to look in tfs          
                    String path = @"$/PAIT_ECOMPARE/Dev/TFSTool/Prod/Offeringdata/AU/CT";
                    //array of item objects in that path
                    ItemSet items = sourceControl.GetItems(path, RecursionType.Full);
                    numberOfFiles = items.Items.Length;
                    Workspace workspace = sourceControl.CreateWorkspace("Temp");
                    WorkingFolder workingFolder = new WorkingFolder(path, @"D:'TFSTemp'");
                    workspace.CreateMapping(workingFolder);
                    //instance of own created class that represents the progressbar and log output
                    TFSToolLoad ProgressBar = new TFSToolLoad();
                    ProgressBar.SetValues(numberOfFiles);
                    ProgressBar.TopMost = true;

                    foreach (Item item in items.Items)
                    {
                        ProgressBar.Show();
                        //get only the file path to the file
                        serverPath = item.ServerItem;
                        //get changeset Id
                        changeSetID = item.ChangesetId;                            
                        if (serverPath.EndsWith(".delete"))
                        {
                            //get file name only and local path
                            fileName = Path.GetFileName(serverPath);
                            localPath = @"D:'TFSTemp'"+ fileName;
                            //get latest on the file
                            workspace.Get(new GetRequest(serverPath, RecursionType.None, VersionSpec.Latest), GetOptions.None);
                            workspace.PendDelete(serverPath, RecursionType.None);
                            numToDelete++;
                         }
                        ProgressBar.Step();
                    }
                    ProgressBar.SetText
                       ("Number of Files Marked for Delete: " + numToDelete+"'n");
                    //if there are any pending changes, check them in and merge them into staging
                    if (numToDelete > 0)
                    {
                        //check in all the changes
                        ProgressBar.SetText("Checking in changes...'n");
                        PendingChange[] pendingChanges = workspace.GetPendingChanges();
                        //if there are any pending changes, check them in and merge them into staging
                        workspace.CheckIn(pendingChanges, "Automated TFS tool cleanup");
                        ProgressBar.SetText("Done'n Merging changes into Staging...");
                        //merge
                        //set up merge by changeset id
                        ChangesetVersionSpec changeSet = new ChangesetVersionSpec(changeSetID);
                       //map to target server path before merging, otherwise it won't work
                        Workspace eCompareAdmin = sourceControl.GetWorkspace(@"D:'PAIT_ECOMPARE");
                        string mainPath = @"$/PAIT_ECOMPARE/Dev/TFSTool";
                        string stagingPath = @"$/PAIT_ECOMPARE/Dev/TFSToolStaging";
//Problem:
                        eCompareAdmin.Merge(mainPath, stagingPath, changeSet, changeSet);
                        PendingChange[] mergeChanges = eCompareAdmin.GetPendingChanges();
                        workspace.CheckIn(mergeChanges, "Automated TFS Cleanup");
                        ProgressBar.SetText("Done'n");

用于TFS的Visual Studio插件:标记要删除的文件

在将条目放入本地工作区之前,不能暂停删除。

您当前正在执行DownloadFile,它将简单地获取文件的内容-它不会更新您的工作空间以反映您在本地拥有该文件。您应该在挂起删除之前为该文件调用Workspace.Get

另一项:您不应该对文件使用完全递归(没有意识到后果),您可能应该使用RecursionType.None。对文件的完全递归执行模式匹配,并将包括给定路径下具有该文件名的所有文件。(例如,$/file.txt的完整递归将匹配$/file.txt, $/A/file.txt, $/A/B/file.txt等)