Программная проверка файлов в TFS, получая больше, чем ожидалось - PullRequest
4 голосов
/ 26 марта 2009


Итак, у меня есть приложение .NET, которое анализирует и генерирует серию файлов, выводит их в локальный каталог и затем определяет, нужно ли ему обновить существующий файл или добавить новый файл в проект TFS (Team Foundation Server).
У меня есть одно рабочее пространство на локальном компьютере, и есть 10 различных рабочих папок, которые являются другими проектами кодирования, над которыми я работал с этой конкретной машиной. Моя проблема возникает, когда я проверяю, существует ли файл в проекте TFS и требуется ли обновление или его нужно добавить в проект в качестве нового файла.
snipet:

static string TFSProject = @"$/SQLScripts/";
static WorkspaceInfo wsInfo;
static VersionControlServer versionControl;
static string argPath = "E:\\SQLScripts\\";

wsInfo = Workstation.Current.GetLocalWorkspaceInfo(argPath);
TeamFoundationServer tfs = new TeamFoundationServer(wsInfo.ServerUri.AbsoluteUri);
versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

Workspace workspace = versionControl.GetWorkspace(wsInfo);
workspace.GetLocalItemForServerItem(TFSProject);


На этом этапе я проверяю, существует ли файл, и делаю одно из двух. если файл существует, я помечаю файл для EDIT, а затем записываю файл в локальный каталог, в противном случае я сначала запишу файл, а затем добавлю файл в рабочую область. Меня не волнует, идентичен ли физический файл тому, который я генерирую, поскольку я делаю это как требование SAS70 для «отслеживания изменений»

Если он существует, я делаю:
workspace.PendEdit (имя файла, RecurisionType.Full);
scriptoutthefile (имя файла);

или если его не существует
scriptoutthefilename (имя файла);
workspace.PendAdd (имя файла, правда);

Хорошо, все это, чтобы добраться до проблемы. Когда я проверяю ожидающие изменения в ПРОЕКТЕ, я получаю все ожидающие изменения для всех проектов, которые есть на моем локальном компьютере в рабочей области.

// Show our pending changes. 
PendingChange[] pendingChanges = workspace.GetPendingChanges();
foreach (PendingChange pendingChange in pendingChanges)
{
    dosomething...
}

Я подумал, что, установив рабочее пространство в workspace.GetLocalItemForServerItem (TFSProject), он даст мне ТОЛЬКО объекты для этой конкретной рабочей папки.

Есть ли способ заставить объект рабочей области работать только с определенной рабочей папкой?

Это имело смысл? Заранее спасибо ...

Ответы [ 3 ]

5 голосов
/ 10 августа 2010

с помощью LINQ вы можете получить ожидающие изменения определенной папки

PendingChange[] pendingChanges = workspace
    .GetPendingChanges()
    .Where(x => x.LocalOrServerFolder.Contains(argPath))
    .ToArray();
2 голосов
/ 27 мая 2009

Вот еще один способ обновить кеш рабочей области:

тф рабочих пространств / с: http://SomeTFSServer:8080/

Кроме того, в Workspace есть метод UpdateWorkspaceInfoCache (..), который, кажется, делает то же самое. Хотя я не проверял это.

1 голос
/ 01 апреля 2009

Хорошо, оказалось, что на моей машине поврежден кеш рабочего пространства TFS. Вот решение (из командной строки):

SET AppDataTF=%USERPROFILE%\Local Settings\Application Data\Microsoft\Team Foundation
SET AppDataVS=%APPDATA%\Microsoft\VisualStudio
IF EXIST "%AppDataTF%\1.0\Cache" rd /s /q "%AppDataTF%\1.0\Cache" > NUL
IF EXIST "%AppDataTF%\2.0\Cache" rd /s /q "%AppDataTF%\2.0\Cache" > NUL
IF EXIST "%AppDataVS%\8.0\Team Explorer" rd /s /q "%AppDataVS%\8.0\Team Explorer" > NUL
IF EXIST "%AppDataVS%\9.0\Team Explorer" rd /s /q "%AppDataVS%\9.0\Team Explorer" > NUL

Другая часть проблемы заключается в том, что если папка проекта находится в той же рабочей области, она будет извлекать все ожидающие изменения из других проектов. Я создал вторичное рабочее пространство только с проектом SQLScripts и локальной папкой, и все работает как шарм.

Может быть, кто-то найдет это полезным ...

...