Как мне перечислить список исходных файлов с ожидающими изменениями и получить их расположение на сервере? - PullRequest
2 голосов
/ 15 июля 2010

Я пытаюсь написать макрос, который будет генерировать простой текстовый список файлов, измененных на основе списка файлов на панели «Ожидающие изменения», но я не могу понять, как это сделать. Расположение файла на сервере - это свойство, отформатированное так:

$/TfsName/SomeSolution/Web/SomeFolder/SomeFile1.aspx
$/TfsName/SomeSolution/Web/SomeFolder/SomeFile2.aspx

Самое близкое, что я могу получить, - это открыть свойства выбранного элемента на панели, что не очень полезно:

DTE.ExecuteCommand ("TeamFoundationContextMenus.SourceControlPendingChangesSourceFiles.TfsContextPendingCheckinsPendingCheckinsProperties")

Редактировать: вот весь код макроса, который у меня есть, в TODO мне нужна помощь:

Public Class Pending

    Public Shared Sub Pending()
        OutputClear()
        OutputWriteLine("Files Changed:")

        Dim outInfo As String = ""
        DTE.Windows.Item("{2456BD12-ECF7-4988-A4A6-67D49173F564}").Activate() 'Pending Changes - Source Files

        'TODO: loop through each changed file
        'TODO: get TFS server location of each file
        outInfo &= "some file name"

        OutputWriteLine(outInfo)
    End Sub

    ' snip: other supporting functions

End Class

1 Ответ

2 голосов
/ 16 июля 2010

Ну, я еще не смог понять, как это сделать с помощью макроса, но благодаря Бобу Хардистеру в твиттере я могу использовать эту команду, чтобы получить то, что я ищу:

"C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\tf.exe" status $/ProjectName/SubDir/ /recursive

... но еще лучше работает приложение командной строки, которое использует этот код:

const string TFSSERVER = "http://TfsServer:8080";
static void Main(string[] args)
{
    //http://blogs.msdn.com/b/buckh/archive/2006/03/15/552288.aspx
    //http://blogs.msdn.com/b/jmanning/archive/2005/12/01/499033.aspx
    string projectName = args[0];
    TeamFoundationServer tfs = new TeamFoundationServer(TFSSERVER);
    VersionControlServer versionControl = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));
    PendingSet[] sets = versionControl.GetPendingSets(new String[] { "$/Projects/" + projectName }, RecursionType.Full);
    Console.WriteLine(versionControl.AuthenticatedUser + " pending changes for " + projectName + ":");

    foreach (PendingSet set in sets)
    {
        if (set.Type == PendingSetType.Workspace && set.OwnerName == versionControl.AuthenticatedUser)
        {
            foreach (PendingChange pc in set.PendingChanges)
            {
                Console.WriteLine(pc.ServerItem);
            }
        }
    }
}

Затем я просто добавил скомпилированный вызов EXE в меню «Внешние инструменты» и использовал его внутри VS.

Бонусное редактирование: Вот версия VSS (не такая хорошая):

const string SSDIR = @"\\VssServer\VssShare";
static void Main(string[] args)
{
    string projectName = args[0];
    string userName = "user";

    VSSDatabaseClass vss = new VSSDatabaseClass();
    vss.Open(SSDIR + @"\srcsafe.ini", userName, userName);
    VSSItem sourceItem = vss.get_VSSItem("$/Projects/" + projectName, false);

    Console.WriteLine(userName + " pending checkins for " + projectName + ":");
    int total = GetItems(sourceItem);
    Console.WriteLine(total.ToString() + " total changes.");

}

const int VSSFILE_CHECKEDOUT_ME = 2;
const int VSSITEM_PROJECT = 0;
const int VSSITEM_FILE = 1;
public static int GetItems(IVSSItem originalItem)
{
    int total = 0;
    foreach (IVSSItem subItem in originalItem.get_Items(false))
    {
        if (subItem.Type == VSSITEM_FILE && subItem.IsCheckedOut == VSSFILE_CHECKEDOUT_ME)
        {
            Console.WriteLine(subItem.Spec);
            total++;
        }
        else if (subItem.Type == VSSITEM_PROJECT)
        {
            total += GetItems(subItem);
        }
    }
    return total;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...