Получить содержимое файла Tfs Shelveset из командной строки? - PullRequest
7 голосов
/ 02 июля 2011

Я заинтересован в получении содержимого shelveset из командной строки.Теперь вы можете подумать, что такой командлет, как Get-TfsShelveset, доступный в TFS Power Tools, сделает это.Вы также можете подумать, что "tf.exe shelvesets" сделает это.

Однако, если я ничего не пропустил, я потрясен сообщать, что ни один из этих случаев не подходит.Вместо этого каждая команда требует, чтобы вы дали ей имя набора полок, а затем просто срыгивает отдельную позицию для этого набора полок вместе с некоторыми метаданными о наборе полок, такими как дата создания, отображаемое имя и т. Д. Но, насколько я могу судить, никоим образомсказать, что на самом деле на полке.

Это особенно отвратительно для Get-TfsShelveset, который имеет возможность включать массив файловых дескрипторов вместе с объектом Shelveset, который он возвращает.Я даже пытался проявить смекалку, думая, что я могу собрать имена файлов с помощью -WhatIf с Restore-TfsShelveset, но, к сожалению, Restore-TfsShelveset не реализует -WhatIf.

Пожалуйста, кто-то скажет мне, что янеправильно об этом!

Ответы [ 5 ]

11 голосов
/ 01 мая 2012
tf status /shelveset:name

выведет список содержимого указанного шельфета (вы также можете указать поставщика: см. tf help status).

С оснасткой PowerShell для TFS PowerToy:

Get-TfsPendingChange -Shelveset name

для той же информации.

5 голосов
/ 12 июля 2011

Можно создать небольшое приложение командной строки, использующее TFS SDK, которое возвращает список файлов, содержащихся в заданном наборе полок.
В приведенном ниже примере предполагается знание имени полка и его владельца:

using System;
using System.IO;
using System.Collections.ObjectModel;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.Framework.Client;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace ShelvesetDetails
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri tfsUri = (args.Length < 1) ? new Uri("TFS_URI") : new Uri(args[0]);

            TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);

            ReadOnlyCollection<CatalogNode> collectionNodes = configurationServer.CatalogNode.QueryChildren(
                new[] { CatalogResourceTypes.ProjectCollection },
                false, CatalogQueryOptions.None);

            CatalogNode collectionNode = collectionNodes[0];

            Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
            TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);

            var vcServer = teamProjectCollection.GetService<VersionControlServer>();

            Shelveset[] shelves = vcServer.QueryShelvesets(
                "SHELVESET_NAME", "SHELVESET_OWNER");
            Shelveset shelveset = shelves[0];

            PendingSet[] sets = vcServer.QueryShelvedChanges(shelveset);
            foreach (PendingSet set in sets)
            {
                PendingChange[] changes = set.PendingChanges;
                foreach (PendingChange change in changes)
                {
                    Console.WriteLine(change.FileName);
                }
            }
        }
    }
}

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

3 голосов
/ 02 июля 2011

Попробуйте:

tfpt review / shelveset: shelvesetName; userName

Вам также может потребоваться добавить на сервер параметр, например:

tfpt обзор / shelveset: Code Review; jim / sever: компания-источник

Я думаю, это то, что вы ищете.

2 голосов
/ 19 июля 2011

Это то, что я закончил, основываясь на коде Пентелифа и методике в статье на http://akutz.wordpress.com/2010/11/03/get-msi/, указанной в моем комментарии.

function Get-TfsShelvesetItems
{
    [CmdletBinding()]
    param
    (
        [string] $ShelvesetName = $(throw "-ShelvesetName must be specified."),
        [string] $ShelvesetOwner = "$env:USERDOMAIN\$env:USERNAME",
        [string] $ServerUri = $(throw "-ServerUri must be specified."),
        [string] $Collection = $(throw "-Collection must be specified.")
    )

    $getShelvesetItemsClassDefinition = @'
    public IEnumerable<PendingChange> GetShelvesetItems(string shelvesetName, string shelvesetOwner, string tfsUriString, string tfsCollectionName)
    {
        Uri tfsUri = new Uri(tfsUriString);
        TfsConfigurationServer configurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
        ReadOnlyCollection<CatalogNode> collectionNodes = configurationServer.CatalogNode.QueryChildren( new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None);
        CatalogNode collectionNode = collectionNodes.Where(node => node.Resource.DisplayName == tfsCollectionName).SingleOrDefault();
        Guid collectionId = new Guid(collectionNode.Resource.Properties["InstanceId"]);
        TfsTeamProjectCollection teamProjectCollection = configurationServer.GetTeamProjectCollection(collectionId);
        var vcServer = teamProjectCollection.GetService<VersionControlServer>();
        var changes = new List<PendingChange>();
        foreach (Shelveset shelveset in vcServer.QueryShelvesets(shelvesetName, shelvesetOwner))
        {
            foreach (PendingSet set in vcServer.QueryShelvedChanges(shelveset))
            {
                foreach ( PendingChange change in set.PendingChanges )
                {
                    changes.Add(change);
                }
            }
        }
        return changes.Count == 0 ? null : changes;
    }
'@;

    $getShelvesetItemsType = Add-Type `
        -MemberDefinition $getShelvesetItemsClassDefinition `
        -Name "ShelvesetItemsAPI" `
        -Namespace "PowerShellTfs" `
        -Language CSharpVersion3 `
        -UsingNamespace System.IO, `
                        System.Linq, `
                        System.Collections.ObjectModel, `
                        System.Collections.Generic, `
                        Microsoft.TeamFoundation.Client, `
                        Microsoft.TeamFoundation.Framework.Client, `
                        Microsoft.TeamFoundation.Framework.Common, `
                        Microsoft.TeamFoundation.VersionControl.Client `
        -ReferencedAssemblies "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Client.dll", `
                                "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.Common.dll", `
                                "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ReferenceAssemblies\v2.0\Microsoft.TeamFoundation.VersionControl.Client.dll" `
        -PassThru;

    # Initialize an instance of the class.
    $getShelvesetItems = New-Object -TypeName "PowerShellTfs.ShelvesetItemsAPI";

    # Emit the pending changes to the pipeline.
    $getShelvesetItems.GetShelvesetItems($ShelvesetName, $ShelvesetOwner, $ServerUri, $Collection);
}
1 голос
/ 01 мая 2012

Потратил несколько дней, пытаясь сделать это, это всегда появлялось в Google, поэтому вот что я нашел, чтобы помочь будущим поколениям:

Чтобы получить содержимое полки (по крайней мере, с Team Explorer Everywhere),
используйте команду: tf difference /shelveset:<Shelveset name>

Это распечатает содержимое shelveset и даст имена файлов в виде:
<Changetype>: <server file path>; C<base change number><br> Shelved Change: <server file path again>;<shelveset name>

Так что, если ваш файл contents/test.txt
в наборе shelve1 (с базовой версией 1) вы увидите:
edit: $/contents/file.txt;C1<br> Shelved Change: $/contents/file.txt;shelve1

После этого с помощью команды tf print
(или посмотрите, не используете ли вы TEE) на $/contents/file.txt;shelve1, вы получите содержимое:

tf print $/contents/file.txt;shelve1

Показывает, что находится в file.txt в полвсете shelve1

...