Программно получить список исходных папок и создать одну, если она отсутствует - C# + VSTS 2017

Я пытаюсь автоматизировать некоторые процессы, чтобы немного облегчить жизнь. У нас есть несколько запросов от команды на создание папки в TFS 2017 (у них нет разрешений), а затем настроить связанные сборки для этой папки управления версиями. Часть создания сборки, я думаю, у меня есть способ сделать, но запрос нашего локального сервера TFS 2017 для получения списка папок по определенному пути оказывается непростым. Пока у меня проблемы даже с подключением к серверу, в первую очередь:

 var collectionUri = "http://tfs-server:8080/tfs/DefaultCollection/";
 var teamProjectName = "MYPROJECT";

 Uri uri = new Uri(collectionUri);

 var clientCredentials = new VssCredentials(new WindowsCredential(new NetworkCredential("USERNAME", "PASSWORD", "COLLECTIONNAME")));
 var connection = new VssConnection(uri, clientCredentials);
 var sourceControlServer = connection.GetClient<TfvcHttpClient>();

Это вызывает исключение: Ошибка преобразования значения "System.Security.Principal.WindowsIdentity;" набрать 'Microsoft.VisualStudio.Services.Identity.IdentityDescriptor'

Может кто-нибудь помочь мне сначала подключиться к серверу! Документацию по этому поводу очень сложно найти, и я не вижу реально работающих примеров.

Далее я хотел создать папку, если она не существует. Не знаю, как это сделать, возможно, используя

sourceControlServer.GetBranchAsync(teamProjectName + FolderName);

Благодаря!

РЕДАКТИРОВАТЬ: Хорошо, я понял, что при создании соединения не возникает ошибки, вместо этого:

Uri uri = new Uri("http://tfs-server:8080/tfs/DefaultCollection/");

var clientCredentials = new VssCredentials(new WindowsCredential(new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN")));

var buildServer = new BuildHttpClient(uri, clientCredentials);
var sourceControlServer = new TfvcHttpClient(uri, clientCredentials);

Итак, теперь нужно просто выяснить, как составлять список и создавать папки из TFS и создавать сборки!

РЕДАКТИРОВАТЬ:

Итак, у меня есть запросы, поэтому я могу проверить, существует ли папка по такому пути:

var teamProjectName = "USA";
Uri uri = new Uri("http://tfs-server:8080/tfs/DefaultCollection/");
var clientCredentials = new VssCredentials(new WindowsCredential(new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN")));

TfvcHttpClient sourceControlServer = new TfvcHttpClient(uri, clientCredentials);

List<TfvcItem> branchItems;
using (sourceControlServer) {
      branchItems = sourceControlServer.GetItemsAsync("$/USA/Development/NewFolder", VersionControlRecursionType.OneLevel).Result;
}
            
 return branchItems.Count > 0;

Это найдет все элементы в этой папке. Поэтому, если папки нет, он вернет 0, поэтому я могу продолжить и создать эту папку. Итак, следующая проблема - как создать папку. Использование CreateChangesetAsync.

1 ответ

Обновить:

Чтобы использовать клиентский API и метод CreateChangesetAsync для создания файлов в TFVC, вы можете обратиться к примеру консольного приложения ниже:

using Microsoft.TeamFoundation.SourceControl.WebApi;
using Microsoft.VisualStudio.Services.Common;
using Microsoft.VisualStudio.Services.WebApi;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    internal class Program
    {
        internal static async Task Main(string[] args)
        {
            var orgUrl = new Uri(args[0]);
            string serverPath = args[1];
            string localPath = args[2];
            string contentType = args[3];
            string pat = args[4];

            var changes = new List<TfvcChange>()
            {
                new TfvcChange()
                {
                    ChangeType = VersionControlChangeType.Add,
                    Item = new TfvcItem()
                    {
                        Path = serverPath,
                        ContentMetadata = new FileContentMetadata()
                        {
                            Encoding = Encoding.UTF8.WindowsCodePage,
                            ContentType = contentType,
                        }
                    },
                    NewContent = new ItemContent()
                    {
                        Content = Convert.ToBase64String(File.ReadAllBytes(localPath)),
                        ContentType = ItemContentType.Base64Encoded
                    }
                }
            };
            var changeset = new TfvcChangeset()
            {
                Changes = changes,
                Comment = $"Added {serverPath} from {localPath}"
            };

            var connection = new VssConnection(orgUrl, new VssBasicCredential(string.Empty, pat));
            var tfvcClient = connection.GetClient<TfvcHttpClient>();
            await tfvcClient.CreateChangesetAsync(changeset);
        }
    }
}

Кроме того, вместо использования командной строки tf, пожалуйста, проверьте решение здесь:

C# TFS API: показать структуру проекта с папками и файлами, включая их ChangeType (извлечено, удалено, переименовано), как в Visual Studio

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