Программная проверка файлов в TFS, получая больше, чем ожидалось


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

статическая строка TFSProject = @"$/SQLScripts/";
static WorkspaceInfo wsInfo;
static VersionControlServer versionControl;
статическая строка 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 (имя файла, правда);

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

// Показать наши ожидающие изменения. 
PendingChange[] pendingChanges = workspace.GetPendingChanges();
foreach (PendingChange pendingChange в pendingChanges)
{
    сделай что-нибудь...
}

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

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

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

3 ответа

Решение

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

SET AppDataTF =% USERPROFILE% \ Локальные настройки \ Данные приложения \Microsoft\Team Foundation
SET AppDataVS=%APPDATA%\Microsoft\VisualStudio
ЕСЛИ СУЩЕСТВУЕТ "%AppDataTF%\1.0\Cache" rd /s /q "%AppDataTF%\1.0\Cache" > NUL
ЕСЛИ СУЩЕСТВУЕТ "%AppDataTF%\2.0\Cache" rd /s /q "%AppDataTF%\2.0\Cache" > NUL
ЕСЛИ СУЩЕСТВУЕТ "%AppDataVS%\8.0\Team Explorer" rd /s /q "%AppDataVS%\8.0\Team Explorer" > NUL
ЕСЛИ СУЩЕСТВУЕТ "%AppDataVS%\9.0\Team Explorer" rd /s /q "%AppDataVS%\9.0\Team Explorer" > NUL

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

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

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

PendingChange[] pendingChanges = workspace
    .GetPendingChanges()
    .Where(x => x.LocalOrServerFolder.Contains(argPath))
    .ToArray();

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

Рабочие пространства tf / s: http://sometfsserver:8080/

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

Другие вопросы по тегам