Программно получить список исходных папок и создать одну, если она отсутствует - 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, пожалуйста, проверьте решение здесь: