Как уничтожить ветку в TFVC с помощью REST API?

#powershell #azure-devops #azure-devops-rest-api #tfvc

Вопрос:

Я хочу удалить, а затем уничтожить ветвь в TFVC (в Azure Devops) с помощью REST API и Powershell, но после проверки документации я должен спросить: возможно ли это с помощью API?

Используя документацию GET в качестве руководства, я мог бы сделать предположение об этом и выполнить что-то похожее на следующее:

УДАЛИТЬ https://dev.azure.com/{организация}/{проект}/_apis/tfvc/филиалы?путь={путь} и api-версия=6.0

но, учитывая разрушительный характер этих звонков, я неохотно догадываюсь. И нет очевидного способа вызвать функцию уничтожения.

В качестве альтернативы, есть ли способ отследить вызов API, который должен (вероятно?) быть выполнен, если я должен был запустить командную строку tf vc destroy "$/MyBranch/Path" ? Или для этого мне придется прибегнуть к использованию оснастки Powershell?

Комментарии:

1. Можете ли вы использовать API предварительного просмотра версий 6.1/6.2? Похоже, что удаление ветки пока документировано только для ветвей git. Вы всегда можете использовать wireshark и настроить расшифровку ssl, но, вероятно, это не стоит усилий для этого. Вы можете получить более подробные ответы на форумах сообщества разработчиков: developercommunity.visualstudio.com/t/…

Ответ №1:

Почему бы не использовать tf vc destroy из powershell? Большая часть TFVC обрабатывается старым API SOAP и не имеет эквивалента REST. Инвестиции в дополнительные API REST для TFVC маловероятны. Вы можете вызывать tf vc из powershell, если на компьютере установлен Team Explorer.

Кроме того, вы можете загрузить клиентскую объектную модель непосредственно в PowerShell и вызвать из нее вызовы destroy. Вызов довольно прост. Таким образом, Объектная модель клиента будет выполнять всю борьбу с API. Вы можете получить сборки из NuGet без установки Team Explorer на компьютер.

Чтобы получить экземпляр класса VersionControlServer, вы можете посмотреть мои задачи TFVC. Приведенный ниже код непроверен, но должен подвести вас очень близко:

 [System.Reflection.Assembly]::LoadFrom("Newtonsoft.Json.dll") 
[System.Reflection.Assembly]::LoadFrom("Microsoft.TeamFoundation.Client")
[System.Reflection.Assembly]::LoadFrom("Microsoft.TeamFoundation.Common")
[System.Reflection.Assembly]::LoadFrom("Microsoft.TeamFoundation.VersionControl.Client")
[System.Reflection.Assembly]::LoadFrom("Microsoft.TeamFoundation.WorkItemTracking.Client")
[System.Reflection.Assembly]::LoadFrom("Microsoft.TeamFoundation.Diff")

$OnNonFatalError = [Microsoft.TeamFoundation.VersionControl.Client.ExceptionEventHandler] {
    param($sender, $e)

    if ($e.Exception -ne $null -and $e.Exception.Message -ne $null)
    {
        Write-Message -Type Warning  $e.Exception.Message
    }
    if ($e.Failure -ne $null -and $e.Failure.Message -ne $null)
    {
        Write-Message -Type Warning  $e.Failure.Message
        if ($e.Failure.Warnings -ne $null -and $e.Failure.Warnings.Length -gt 0)
        {
            foreach ($warning in $e.Failure.Warnings)
            {
                Write-Message -Type Warning $warning.ParentOrChildTask 
            }
        }
    }
}

function Get-TfsVersionControlServer()
{
    [cmdletbinding()]
    param(
        [string] $ProjectCollectionUri
    )
        
    $collection = New-Object Microsoft.TeamFoundation.Client.TfsTeamProjectCollection(
        $ProjectCollectionUri)
    $collection.EnsureAuthenticated()

    $versionControlServer = 
$provider.TfsTeamProjectCollection.GetService([Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer])
    $versionControlServer.add_NonFatalError($OnNonFatalError)
    return $versionControlServer 
}

Get-TfsVersionControlServer().Destroy(...)
 

Затем вызовите оттуда функцию уничтожения.

Ответ №2:

Я также просмотрел документацию по API. По моему опыту, Azure довольно хорошо обновляет свои документы API. Отсутствие операции УДАЛЕНИЯ в их документации указывает на то, что операция УДАЛЕНИЯ еще не поддерживается. Даже если бы это «сработало», я бы не стал использовать его, пока он не будет поддержан в их API — особенно в том, что касается контроля версий.