Надстройка Visual Studio для TFS: маркировка файлов для удаления - PullRequest
2 голосов
/ 15 июля 2011

Я пишу надстройку 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");

1 Ответ

1 голос
/ 15 июля 2011

Вы не можете дождаться удаления, пока не получите элемент в локальном рабочем пространстве.

В настоящее время вы делаете DownloadFile, который просто получит содержимое файла.- он не обновит ваше рабочее пространство, чтобы отразить, что у вас есть файл локально.Вместо этого вам следует позвонить Workspace.Get для этого файла, прежде чем вы удалите его.

Еще один пункт: вам не следует использовать полную рекурсию для файлов (не зная о последствиях), вам, вероятно, следует использовать RecursionType.None.Полная рекурсия для файла выполняет сопоставление с шаблоном и включает все файлы с таким именем файла по указанному пути.(То есть полная рекурсия для $ / file.txt будет соответствовать $ / file.txt, $ / A / file.txt, $ / A / B / file.txt и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...