From 763ae7370b9fb82f3a48456d7fd11a71d75e6651 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 11:38:53 -0500 Subject: [PATCH 01/24] Modify verbose output to clarify where we are --- AzDevOps/azdevops/public/InvokeEndpoint.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AzDevOps/azdevops/public/InvokeEndpoint.ps1 b/AzDevOps/azdevops/public/InvokeEndpoint.ps1 index cb002e2..6cb38f7 100644 --- a/AzDevOps/azdevops/public/InvokeEndpoint.ps1 +++ b/AzDevOps/azdevops/public/InvokeEndpoint.ps1 @@ -19,7 +19,7 @@ function Invoke-Endpoint ) begin { - Write-Verbose "InvokeRestMethod : Begin Processing"; + Write-Verbose "InvokeEndpoint : Begin Processing"; Write-Verbose " Uri : $($Uri.AbsoluteUri)"; Write-Verbose " Method : $($Method)"; Write-Verbose " Headers : $($Headers)"; From 934604250f73e10c80c4e286b95cf2848c0892ff Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 12:33:41 -0500 Subject: [PATCH 02/24] This represents the changes that will be coming to all the functions as we work through this issue --- AzDevOps/build/builds/public/GetBuild.ps1 | 87 ++++++++++++++++------- 1 file changed, 60 insertions(+), 27 deletions(-) diff --git a/AzDevOps/build/builds/public/GetBuild.ps1 b/AzDevOps/build/builds/public/GetBuild.ps1 index 6936d34..12af92c 100644 --- a/AzDevOps/build/builds/public/GetBuild.ps1 +++ b/AzDevOps/build/builds/public/GetBuild.ps1 @@ -2,61 +2,94 @@ function Get-Build { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/build/blob/master/docs/Get-AdoBuild.md#get-adobuild', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [int]$BuildId, + [Parameter(Mandatory = $false)] [ValidateSet('5.1', '7.1-preview.7')] [string]$ApiVersion = '7.1-preview.7' ) + begin { - Write-Verbose "GetBuild : Begin Processing"; + Write-Verbose "Get-AdoBuild: Begin Processing" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "Project URL: $($Project.url)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " BuildId : $($BuildId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "BuildId: $($BuildId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) + { + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/builds" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/builds" + } + + Write-Verbose "BaseUri: $BaseUri" + + $Uri = if ($BuildId) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/builds?api-version=$($ApiVersion)"; - if ($BuildId) - { - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/builds/$($BuildId)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); - } - else - { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; - } + "$BaseUri/$BuildId?api-version=$ApiVersion" + } + else + { + "$BaseUri?api-version=$ApiVersion" + } + + Write-Verbose "Uri: $Uri" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($BuildId) + { + return $Response + } + else + { + return $Response.Value } } catch { - throw $_; + Write-Error "Error retrieving build(s): $_" + throw $_ } } + + end + { + Write-Verbose "Get-AdoBuild: End Processing" + } } \ No newline at end of file From b7ff4559037e5b5c1418a5ab5ed907dcca894479 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 12:36:10 -0500 Subject: [PATCH 03/24] Updated to the latest API --- AzDevOps/build/builds/public/GetBuild.ps1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AzDevOps/build/builds/public/GetBuild.ps1 b/AzDevOps/build/builds/public/GetBuild.ps1 index 12af92c..2943523 100644 --- a/AzDevOps/build/builds/public/GetBuild.ps1 +++ b/AzDevOps/build/builds/public/GetBuild.ps1 @@ -17,8 +17,8 @@ function Get-Build [int]$BuildId, [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.7')] - [string]$ApiVersion = '7.1-preview.7' + [ValidateSet('5.1', '7.1-preview.7', '7.2-preview.7')] + [string]$ApiVersion = '7.2-preview.7' ) begin From 835c5aba1691343b18ffb197a22b80da401c21af Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 14:14:01 -0500 Subject: [PATCH 04/24] removed recursive calls --- AzDevOps/build/builds/public/GetBuildLog.ps1 | 86 ++++++++++++++------ 1 file changed, 63 insertions(+), 23 deletions(-) diff --git a/AzDevOps/build/builds/public/GetBuildLog.ps1 b/AzDevOps/build/builds/public/GetBuildLog.ps1 index 80f7f70..c07daef 100644 --- a/AzDevOps/build/builds/public/GetBuildLog.ps1 +++ b/AzDevOps/build/builds/public/GetBuildLog.ps1 @@ -2,68 +2,108 @@ function Get-BuildLog { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/build/blob/master/docs/Get-AdoBuildLog.md#get-adobuildlog', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Project')] [object]$Project, + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Project')] [object]$Build, + [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [int]$BuildId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [int]$LogId, + [Parameter(Mandatory = $false)] [ValidateSet('5.1', '7.1-preview.2')] [string]$ApiVersion = '7.1-preview.2' ) - process + + begin { - Write-Verbose "GetBuildLog : Process Record"; + Write-Verbose "Get-BuildLog: Begin Processing" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectID : $($Project.Id)"; - Write-Verbose " BuildId : $($Build.Id)"; + Write-Verbose "Project URL: $($Project.url)" + Write-Verbose "Build ID: $($Build.Id)" } else { - Write-Verbose " ProjectID : $($ProjectId)"; - Write-Verbose " BuildId : $($BuildId)"; + Write-Verbose "ProjectId: $($ProjectId)" + Write-Verbose "BuildId: $($BuildId)" } - Write-Verbose " LogId : $($LogId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "LogId: $($LogId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + if ($PSCmdlet.ParameterSetName -eq 'Project') + { + $BaseUri = "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/builds/$($Build.Id)/logs" + if ($LogId) + { + $Uri = "$($BaseUri)/$($LogId)?api-version=$($ApiVersion)" + } + else { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - $Build = Get-AdoBuild -ProjectId $Project.id -BuildId $BuildId -Verbose:$VerbosePreference; + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" } - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/builds/$($Build.Id)/logs?api-version=$($ApiVersion)"; + } + else + { + $BaseUri = "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/builds/$($BuildId)/logs" if ($LogId) { - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/builds/$($Build.Id)/logs/$($LogId)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); + $Uri = "$($BaseUri)/$($LogId)?api-version=$($ApiVersion)" } else { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" } } + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($LogId) + { + return $Response + } + else + { + return $Response.Value + } } catch { - throw $_; + Write-Error "Error retrieving build log(s): $_" + throw $_ } } + + end + { + Write-Verbose "Get-BuildLog: End Processing" + } } \ No newline at end of file From 4dda88cc4a67c69e3e09bbf46be6876869061b4a Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 14:38:34 -0500 Subject: [PATCH 05/24] Removed recursive calls --- AzDevOps/build/builds/public/RemoveBuild.ps1 | 73 ++++++++++++-------- 1 file changed, 44 insertions(+), 29 deletions(-) diff --git a/AzDevOps/build/builds/public/RemoveBuild.ps1 b/AzDevOps/build/builds/public/RemoveBuild.ps1 index ede0893..1f01fe6 100644 --- a/AzDevOps/build/builds/public/RemoveBuild.ps1 +++ b/AzDevOps/build/builds/public/RemoveBuild.ps1 @@ -7,64 +7,79 @@ function Remove-Build param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $true, ParameterSetName = 'Project')] [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [int]$BuildId, + [Parameter(Mandatory = $false)] [ValidateSet('5.1', '7.1-preview.7')] [string]$ApiVersion = '7.1-preview.7' ) + process { - Write-Verbose "RemoveBuild : Process Record"; + Write-Verbose "Remove-Build: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectID : $($Project.Id)"; - Write-Verbose " BuildId : $($Build.Id)"; + Write-Verbose "Project URL: $($Project.url)" + Write-Verbose "Build ID: $($BuildId)" } else { - Write-Verbose " ProjectID : $($ProjectId)"; - Write-Verbose " BuildId : $($BuildId)"; + Write-Verbose "ProjectId: $($ProjectId)" + Write-Verbose "BuildId: $($BuildId)" } - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - $Build = Get-AdoBuild -ProjectId $Project.Id -BuildId $BuildId -Verbose:$VerbosePreference; - } - if (!($Build.deleted)) + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/builds/$($BuildId)" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/builds/$($BuildId)" + } + + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Delete", "Remove Build $($BuildId) from Azure DevOps Project")) + { + $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Delete -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if (-not $Result) { - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/builds/$($Build.Id)?api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("Delete", "Remove Build $($Build.Id) from $($Project.name) Azure Devops Projects")) + if ($PSCmdlet.ParameterSetName -eq 'Project') { - $Result = (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Delete -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); + return "Build: $($BuildId) removed from Project: $($Project.name)" } - if (!($Result)) + else { - return "Build : $($Build.id) removed from Project : $($Project.name)" + return "Build: $($BuildId) removed from Project ID: $($ProjectId)" } } - else - { - return "Build : $($Build.id) was deleted on $(Get-Date ($Build.deletedDate)) by $($Build.deletedBy.displayName)" - } } } catch { - throw $_; + Write-Error "Error removing build: $_" + throw $_ } } -} \ No newline at end of file +} From 0886e92eb8574e2266b61ba15f7d378eeb46119b Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:08:51 -0500 Subject: [PATCH 06/24] Removed recursion and fixed some string issues --- AzDevOps/build/builds/public/GetBuild.ps1 | 8 +- AzDevOps/build/builds/public/StartBuild.ps1 | 118 +++++++++++++------- 2 files changed, 80 insertions(+), 46 deletions(-) diff --git a/AzDevOps/build/builds/public/GetBuild.ps1 b/AzDevOps/build/builds/public/GetBuild.ps1 index 2943523..eb55d9b 100644 --- a/AzDevOps/build/builds/public/GetBuild.ps1 +++ b/AzDevOps/build/builds/public/GetBuild.ps1 @@ -26,7 +26,7 @@ function Get-Build Write-Verbose "Get-AdoBuild: Begin Processing" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose "Project URL: $($Project.url)" + Write-Verbose "ProjectId: $($Project.id)" } else { @@ -61,14 +61,14 @@ function Get-Build $Uri = if ($BuildId) { - "$BaseUri/$BuildId?api-version=$ApiVersion" + "$($BaseUri)/$($BuildId)?api-version=$($ApiVersion)" } else { - "$BaseUri?api-version=$ApiVersion" + "$($BaseUri)?api-version=$($ApiVersion)" } - Write-Verbose "Uri: $Uri" + Write-Verbose "Uri: $($Uri)" $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference diff --git a/AzDevOps/build/builds/public/StartBuild.ps1 b/AzDevOps/build/builds/public/StartBuild.ps1 index 929120d..63b1e86 100644 --- a/AzDevOps/build/builds/public/StartBuild.ps1 +++ b/AzDevOps/build/builds/public/StartBuild.ps1 @@ -7,92 +7,126 @@ function Start-Build param ( [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Project')] [object]$Project, + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Project')] [object]$Definition, + [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [int]$DefinitionId, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [hashtable[]]$Variables, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [switch]$Wait, + [Parameter(Mandatory = $false)] [ValidateSet('5.1', '7.1-preview.7')] [string]$ApiVersion = '7.1-preview.7' ) + process { - Write-Verbose "StartBuild : Process Record"; + Write-Verbose "StartBuild: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectID : $($Project.Id)"; - Write-Verbose " DefinitionId : $($Definition.Id)"; + Write-Verbose "Project URL: $($Project.url)" + Write-Verbose "Definition ID: $($Definition.Id)" } else { - Write-Verbose " ProjectID : $($ProjectId)"; - Write-Verbose " DefinitionId : $($DefinitionId)"; + Write-Verbose "ProjectId: $($ProjectId)" + Write-Verbose "DefinitionId: $($DefinitionId)" } - Write-Verbose " Variables : $([string]::Join(',',$Variables.Keys))"; - Write-Verbose " Wait : $($Wait)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + if ($Variables) + { + Write-Verbose "Variables: $([string]::Join(',', $Variables.Keys))" + } + Write-Verbose "Wait: $($Wait)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - $Definition = Get-AdoBuildDefinition -ProjectId $Project.Id -DefinitionId $DefinitionId -Verbose:$VerbosePreference; - } - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/builds?api-version=$($ApiVersion)"; - # - # Check that variables exist in defintion - # + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/builds" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/builds" + } + + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + if ($Variables) + { + # Check that variables exist in definition foreach ($key in $Variables.keys) { if (!($Definition.variables | Get-Member -MemberType NoteProperty | Select-Object -ExpandProperty Name).Contains($key)) { $PSCmdlet.ThrowTerminatingError( [System.Management.Automation.ErrorRecord]::new( - ([System.Management.Automation.ItemNotFoundException]"One or more variables not found in Build Definition"), + ([System.Management.Automation.ItemNotFoundException] "One or more variables not found in Build Definition"), 'Projects.Functions', [System.Management.Automation.ErrorCategory]::OpenError, - $MyObject + $MyInvocation ) - ); + ) } } - $Body = New-Object -TypeName psobject; - Add-Member -InputObject $Body -MemberType NoteProperty -Name definition -Value $Definition; - $Parameters = New-Object -TypeName psobject; - foreach ($item in $Variables) { Add-Member -InputObject $parameters -MemberType NoteProperty -Name $item.Keys -Value $item[$item.Keys][0] }; - Add-Member -InputObject $Body -MemberType NoteProperty -Name parameters -Value ($Parameters | ConvertTo-Json -Compress); - if ($PSCmdlet.ShouldProcess("Start", "Qeue Build $($Build.Id) from $($Project.name) Azure Devops Projects")) + } + + $Body = New-Object -TypeName psobject -Property @{ + definition = (New-Object -TypeName psobject -Property @{ id = $Definition.id }) + } + + if ($Variables) + { + $Parameters = [PSCustomObject]@{} + foreach ($item in $Variables) { - $Result = Invoke-AdoEndpoint -Method POST -Uri ([System.Uri]::new(($Uri))) -Headers $Global:azDevOpsHeader -ContentType 'application/json' -Body ($Body | ConvertTo-Json -Compress -Depth 10) -Verbose:$VerbosePreference; - if ($Wait) + $Parameters | Add-Member -MemberType NoteProperty -Name $item.Keys -Value $item[$item.Keys][0] + } + $Body | Add-Member -MemberType NoteProperty -Name parameters -Value ($Parameters | ConvertTo-Json -Compress) + } + + if ($PSCmdlet.ShouldProcess("Start", "Queue Build $($Definition.Id) from $($Project.name) Azure DevOps Projects")) + { + Write-Verbose "Body: $($Body |ConvertTo-Json -Depth 99 -Compress)" + $Result = Invoke-AdoEndpoint -Method POST -Uri ([System.Uri]::new($Uri)) -Headers $Global:azDevOpsHeader -ContentType 'application/json' -Body ($Body | ConvertTo-Json -Compress -Depth 10) -Verbose:$VerbosePreference + + if ($Wait) + { + do { - do - { - Get-AdoBuild -Project $Project -BuildId $Result.id | out-null; - } until ((Get-AdoBuild -Project $Project -BuildId $Result.id -Verbose:$VerbosePreference).status -eq 'completed') - } - return Get-AdoBuild -Project $Project -BuildId $Result.id -Verbose:$VerbosePreference; + Start-Sleep -Seconds 5 + $BuildStatus = (Get-AdoBuild -Project $Project -BuildId $Result.id -Verbose:$VerbosePreference).status + } until ($BuildStatus -eq 'completed') } + + return Get-AdoBuild -Project $Project -BuildId $Result.id -Verbose:$VerbosePreference } } catch { - throw $_; + throw $_ } } -} \ No newline at end of file +} From 95613a931ae76e67aeb3904e53ed932aa98370de Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:10:16 -0500 Subject: [PATCH 07/24] Updated API Version --- AzDevOps/build/builds/public/GetBuildLog.ps1 | 4 ++-- AzDevOps/build/builds/public/RemoveBuild.ps1 | 4 ++-- AzDevOps/build/builds/public/StartBuild.ps1 | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AzDevOps/build/builds/public/GetBuildLog.ps1 b/AzDevOps/build/builds/public/GetBuildLog.ps1 index c07daef..06a7a25 100644 --- a/AzDevOps/build/builds/public/GetBuildLog.ps1 +++ b/AzDevOps/build/builds/public/GetBuildLog.ps1 @@ -23,8 +23,8 @@ function Get-BuildLog [int]$LogId, [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.2')] - [string]$ApiVersion = '7.1-preview.2' + [ValidateSet('5.1', '7.1-preview.2','7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) begin diff --git a/AzDevOps/build/builds/public/RemoveBuild.ps1 b/AzDevOps/build/builds/public/RemoveBuild.ps1 index 1f01fe6..fef6b31 100644 --- a/AzDevOps/build/builds/public/RemoveBuild.ps1 +++ b/AzDevOps/build/builds/public/RemoveBuild.ps1 @@ -16,8 +16,8 @@ function Remove-Build [int]$BuildId, [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.7')] - [string]$ApiVersion = '7.1-preview.7' + [ValidateSet('5.1', '7.1-preview.7','7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) process diff --git a/AzDevOps/build/builds/public/StartBuild.ps1 b/AzDevOps/build/builds/public/StartBuild.ps1 index 63b1e86..13e7154 100644 --- a/AzDevOps/build/builds/public/StartBuild.ps1 +++ b/AzDevOps/build/builds/public/StartBuild.ps1 @@ -26,8 +26,8 @@ function Start-Build [switch]$Wait, [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.7')] - [string]$ApiVersion = '7.1-preview.7' + [ValidateSet('5.1', '7.1-preview.7','7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) process From 2004320ccbd406752682fe502fe15a51665ce9b4 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:16:55 -0500 Subject: [PATCH 08/24] Removed recusion --- .../definitions/public/GetBuildDefinition.ps1 | 88 ++++++++++++------- 1 file changed, 57 insertions(+), 31 deletions(-) diff --git a/AzDevOps/build/definitions/public/GetBuildDefinition.ps1 b/AzDevOps/build/definitions/public/GetBuildDefinition.ps1 index 8788558..bb9b304 100644 --- a/AzDevOps/build/definitions/public/GetBuildDefinition.ps1 +++ b/AzDevOps/build/definitions/public/GetBuildDefinition.ps1 @@ -2,71 +2,97 @@ function Get-BuildDefinition { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/build/blob/master/docs/Get-AdoBuildDefinition.md#get-Adobuilddefinition', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [int]$DefinitionId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [int]$Revision, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.7')] - [string]$ApiVersion = '7.1-preview.7' + [ValidateSet('5.1', '7.1-preview.7','7.2-preview.7')] + [string]$ApiVersion = '7.2-preview.7' ) + process { - Write-Verbose "GetBuildDefinition : Process Record"; + Write-Verbose "Get-BuildDefinition: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "Project URL: $($Project.url)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " DefinitionId : $($DefinitionId)"; - Write-Verbose " Revision : $($Revision)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "DefinitionId: $($DefinitionId)" + Write-Verbose "Revision: $($Revision)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/definitions?api-version=$($ApiVersion)"; - if ($DefinitionId) + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/definitions" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/definitions" + } + + if ($DefinitionId) + { + $Uri = "$($BaseUri)/$($DefinitionId)" + if ($Revision) { - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/definitions/$($DefinitionId)"; - if ($Revision) - { - $Uri = $Uri + "?revision=$($Revision)&api-version=$($ApiVersion)"; - } else { - $Uri = $Uri + "?api-version=$($ApiVersion)" - } - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); + $Uri += "?revision=$($Revision)&api-version=$($ApiVersion)" } else { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; + $Uri += "?api-version=$($ApiVersion)" } } + else + { + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" + } + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($DefinitionId) + { + return $Response + } + else + { + return $Response.Value + } } catch { - throw $_; + throw $_ } } } \ No newline at end of file From f41ba591e6923ba66b2f29bb77c2cb32e68793c9 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:24:32 -0500 Subject: [PATCH 09/24] Removed recursion --- AzDevOps/build/build.psd1 | 2 +- .../build/folders/public/GetBuildFolder.ps1 | 69 ++++++++++++------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/AzDevOps/build/build.psd1 b/AzDevOps/build/build.psd1 index 7940dd0..4a90cf8 100644 --- a/AzDevOps/build/build.psd1 +++ b/AzDevOps/build/build.psd1 @@ -12,7 +12,7 @@ RootModule = 'build.psm1' # Version number of this module. - ModuleVersion = '2.0.0' + ModuleVersion = '3.0.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/AzDevOps/build/folders/public/GetBuildFolder.ps1 b/AzDevOps/build/folders/public/GetBuildFolder.ps1 index c54b2cc..9e106f8 100644 --- a/AzDevOps/build/folders/public/GetBuildFolder.ps1 +++ b/AzDevOps/build/folders/public/GetBuildFolder.ps1 @@ -2,57 +2,74 @@ function Get-BuildFolder { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/build/blob/master/docs/Get-AdoBuildFolder.md#get-adobuildfolder', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [string]$Path, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.2', '7.1-preview.2')] - [string]$ApiVersion = '7.1-preview.2' + [ValidateSet('5.1-preview.2', '7.1-preview.2','7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) + process { - Write-Verbose "GetBuildFolder : Process Record"; + Write-Verbose "Get-BuildFolder: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "Project URL: $($Project.url)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " Path : $($Path)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "Path: $($Path)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/folders?api-version=$($ApiVersion)"; - if ($Path) - { - $Uri = $Uri + "&path=$($Path.Replace('\','/'))" - } - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/folders" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/folders" + } + + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" + if ($Path) + { + $Uri += "&path=$($Path.Replace('\', '/'))" + } + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + return $Response.Value } catch { - throw $_; + throw $_ } } -} \ No newline at end of file +} From 12d57033ca20b8b4fc2cb9329336b42d4ea90584 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:27:27 -0500 Subject: [PATCH 10/24] Removed recusion --- .../build/folders/public/NewBuildFolder.ps1 | 70 ++++++++++++------- 1 file changed, 43 insertions(+), 27 deletions(-) diff --git a/AzDevOps/build/folders/public/NewBuildFolder.ps1 b/AzDevOps/build/folders/public/NewBuildFolder.ps1 index 04634c7..ff2ad6c 100644 --- a/AzDevOps/build/folders/public/NewBuildFolder.ps1 +++ b/AzDevOps/build/folders/public/NewBuildFolder.ps1 @@ -7,58 +7,74 @@ function New-BuildFolder param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $true, ParameterSetName = 'Project')] [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [string]$Name, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [string]$Description, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.2', '7.1-preview.2')] - [string]$ApiVersion = '7.1-preview.2' + [ValidateSet('5.1-preview.2', '7.1-preview.2','7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) + process { - Write-Verbose "NewBuildFolder : Process Record"; + Write-Verbose "NewBuildFolder: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "ProjectId: $($Project.Id)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " Name : $($Path)"; - Write-Verbose " Description : $($Path)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "Name: $($Name)" + Write-Verbose "Description: $($Description)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Body = New-Object -TypeName psobject - if ($Name) { Add-Member -InputObject $Body -MemberType NoteProperty -Name Path -Value $Name.Replace('\', '/') }; - if ($Description) { Add-Member -InputObject $Body -MemberType NoteProperty -Name Description -Value $Description }; - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/folders?path=$($Name.Replace('\','/'))&api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("New", "Create Folder $($Name) in $($Project.name) Azure Devops Projects")) - { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method PUT -Headers $Global:azDevOpsHeader -Body ($Body | ConvertTo-Json) -ContentType 'application/json' -Verbose:$VerbosePreference); - } + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/folders" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/folders" + } + + $Uri = "$($BaseUri)?path=$($Name.Replace('\', '/'))&api-version=$($ApiVersion)" + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + $Body = [PSCustomObject]@{} + if ($Name) { $Body | Add-Member -MemberType NoteProperty -Name Path -Value $($Name.Replace('\', '/')) } + if ($Description) { $Body | Add-Member -MemberType NoteProperty -Name Description -Value $($Description) } + + if ($PSCmdlet.ShouldProcess("New", "Create Folder $($Name) in $($Project.name) Azure DevOps Projects")) + { + return Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method PUT -Headers $Global:azDevOpsHeader -Body ($Body | ConvertTo-Json) -ContentType 'application/json' -Verbose:$VerbosePreference } } catch { - throw $_; + throw $_ } } } \ No newline at end of file From 551f09a4ef818f6a197c3ae321d1c73d64d9d49a Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:29:35 -0500 Subject: [PATCH 11/24] Removed recursion --- .../folders/public/RemoveBuildFolder.ps1 | 63 +++++++++++-------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/AzDevOps/build/folders/public/RemoveBuildFolder.ps1 b/AzDevOps/build/folders/public/RemoveBuildFolder.ps1 index 8187948..3ba51d0 100644 --- a/AzDevOps/build/folders/public/RemoveBuildFolder.ps1 +++ b/AzDevOps/build/folders/public/RemoveBuildFolder.ps1 @@ -7,53 +7,66 @@ function Remove-BuildFolder param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $true, ParameterSetName = 'Project')] [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [string]$Name, + [Parameter(Mandatory = $false)] - [ValidateSet('5.0-preview.2', '7.1-preview.2')] - [string]$ApiVersion = '7.1-preview.2' + [ValidateSet('5.0-preview.2', '7.1-preview.2', '7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) + process { - Write-Verbose "RemoveBuildFolder : Process Record"; + Write-Verbose "RemoveBuildFolder: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "ProjectId: $($Project.Id)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " Name : $($Path)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "Name: $($Name)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Folder = Get-AdoBuildFolder -Project $Project -Path $Name -Verbose:$VerbosePreference; - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/build/folders/?api-version=$($ApiVersion)&path=$($Folder.Path)" - if ($PSCmdlet.ShouldProcess("Delete", "Remove Folder $($Name) from $($Project.name) Azure Devops Projects")) - { - Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method DELETE -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference; - $Project | Get-AdoBuildFolder -Verbose:$VerbosePreference; - } + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/build/folders" + } + else + { + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/build/folders" + } + + $Uri = "$($BaseUri)?api-version=$($ApiVersion)&path=$($Name.Replace('\', '/'))" + + Write-Verbose "BaseUri: $($BaseUri)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Delete", "Remove Folder $($Name) from $($Project.name) Azure DevOps Projects")) + { + Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method DELETE -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + Write-Output "Folder $($Name) removed from project $($Project.name)" } } catch { - throw $_; + throw $_ } } } \ No newline at end of file From 16491747e234ed25013fe7642b6c6eb5f79651eb Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:35:03 -0500 Subject: [PATCH 12/24] Removed recursion --- AzDevOps/core/processes/public/GetProcess.ps1 | 64 ++++++++++++------- 1 file changed, 41 insertions(+), 23 deletions(-) diff --git a/AzDevOps/core/processes/public/GetProcess.ps1 b/AzDevOps/core/processes/public/GetProcess.ps1 index d4c5e6a..05ac3f2 100644 --- a/AzDevOps/core/processes/public/GetProcess.ps1 +++ b/AzDevOps/core/processes/public/GetProcess.ps1 @@ -2,44 +2,62 @@ function Get-Process { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/processes/blob/master/docs/Get-AdoProcess.md#get-adoprocess', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(Mandatory = $false)] [Guid]$ProcessId, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.1')] - [string]$ApiVersion = '7.1-preview.1' + [ValidateSet('5.1', '7.1-preview.1','7.2-preview.1')] + [string]$ApiVersion = '7.2-preview.1' ) + begin { - Write-Verbose "GetProcess : Begin Processing"; - Write-Verbose " ProcessId : $($ProcessId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "GetProcess: Begin Processing" + Write-Verbose "ProcessId: $($ProcessId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) + { + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + if ($ProcessId) + { + $Uri = "$($Global:azDevOpsOrg)_apis/process/processes/$($ProcessId)?api-version=$($ApiVersion)" + } + else + { + $Uri = "$($Global:azDevOpsOrg)_apis/process/processes?api-version=$($ApiVersion)" + } + + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($ProcessId) + { + return $Response + } + else { - if ($ProcessId) - { - $Uri = $Global:azDevOpsOrg + "_apis/process/processes/$($ProcessId)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); - } - else - { - $Uri = $Global:azDevOpsOrg + "_apis/process/processes?api-version=$($ApiVersion)" - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; - } + return $Response.Value } } catch { - throw $_; + throw $_ } } } \ No newline at end of file From 74fd894331e821f3f20f2bbb2283643fc18fb51f Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:37:44 -0500 Subject: [PATCH 13/24] Removed recursion --- AzDevOps/core/processes/processes.psd1 | 2 +- AzDevOps/core/projects/projects.psd1 | 2 +- AzDevOps/core/projects/public/GetProject.ps1 | 65 +++++++++++++------- 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/AzDevOps/core/processes/processes.psd1 b/AzDevOps/core/processes/processes.psd1 index a2179e7..bf20c80 100644 --- a/AzDevOps/core/processes/processes.psd1 +++ b/AzDevOps/core/processes/processes.psd1 @@ -12,7 +12,7 @@ RootModule = 'processes.psm1' # Version number of this module. - ModuleVersion = '1.0.1' + ModuleVersion = '2.0.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/AzDevOps/core/projects/projects.psd1 b/AzDevOps/core/projects/projects.psd1 index 0243cae..8b6003b 100644 --- a/AzDevOps/core/projects/projects.psd1 +++ b/AzDevOps/core/projects/projects.psd1 @@ -12,7 +12,7 @@ RootModule = 'projects.psm1' # Version number of this module. - ModuleVersion = '1.0.1' + ModuleVersion = '2.0.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/AzDevOps/core/projects/public/GetProject.ps1 b/AzDevOps/core/projects/public/GetProject.ps1 index 0425e11..243fb42 100644 --- a/AzDevOps/core/projects/public/GetProject.ps1 +++ b/AzDevOps/core/projects/public/GetProject.ps1 @@ -2,44 +2,63 @@ function Get-Project { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/projects/blob/master/docs/Get-AdoProject.md#get-adoproject', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(Mandatory = $false)] [Guid]$ProjectId, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.4')] - [string]$ApiVersion = '7.1-preview.4' + [ValidateSet('5.1', '7.1-preview.4','7.2-preview.4')] + [string]$ApiVersion = '7.2-preview.4' ) + begin { - Write-Verbose "GetProject : Begin Processing"; - Write-Verbose " ProjectId : $($ProjectId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "GetProject: Begin Processing" + Write-Verbose "ProjectId: $($ProjectId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) + { + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + if ($ProjectId) + { + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($ProjectId)?api-version=$($ApiVersion)" + } + else + { + $Uri = "$($Global:azDevOpsOrg)_apis/projects?api-version=$($ApiVersion)" + } + + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($ProjectId) + { + return $Response + } + else { - if ($ProjectId) - { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($ProjectId)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); - } - else - { - $Uri = $Global:azDevOpsOrg + "_apis/projects?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; - } + return $Response.Value } } catch { - throw $_; + Write-Error "Error retrieving project(s): $($_)" + throw $_ } } } \ No newline at end of file From 133328fbdda535a677d6b476ee6fd0db66a09a82 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:43:22 -0500 Subject: [PATCH 14/24] removed recursion --- .../projects/public/GetProjectProperty.ps1 | 41 ++++++---- AzDevOps/core/projects/public/NewProject.ps1 | 82 +++++++++++-------- 2 files changed, 73 insertions(+), 50 deletions(-) diff --git a/AzDevOps/core/projects/public/GetProjectProperty.ps1 b/AzDevOps/core/projects/public/GetProjectProperty.ps1 index e0e478b..f477ec6 100644 --- a/AzDevOps/core/projects/public/GetProjectProperty.ps1 +++ b/AzDevOps/core/projects/public/GetProjectProperty.ps1 @@ -2,36 +2,47 @@ function Get-ProjectProperty { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/projects/blob/master/docs/Get-AdoProjectProperty.md#get-adoprojectproperty', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline)] [object]$Project, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.1', '7.1-preview.1')] - [string]$ApiVersion = '7.1-preview.1' + [ValidateSet('5.1-preview.1', '7.1-preview.1', '7.2-preview.1')] + [string]$ApiVersion = '7.2-preview.1' ) + begin { - Write-Verbose "GetBuild : Begin Processing"; - Write-Verbose " ProjectId : $($Project.Id)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "GetBuild: Begin Processing" + Write-Verbose "ProjectId: $($Project.Id)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.id)/properties?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." } + + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($Project.Id)/properties?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + return $Response.Value } catch { - throw $_; + throw $_ } } } \ No newline at end of file diff --git a/AzDevOps/core/projects/public/NewProject.ps1 b/AzDevOps/core/projects/public/NewProject.ps1 index 1c4d90f..81bee43 100644 --- a/AzDevOps/core/projects/public/NewProject.ps1 +++ b/AzDevOps/core/projects/public/NewProject.ps1 @@ -7,56 +7,68 @@ function New-Project param ( [Parameter(Mandatory = $true)] [string]$Name, + [Parameter(Mandatory = $false)] [string]$Description, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.4')] - [string]$ApiVersion = '7.1-preview.4' + [ValidateSet('5.1', '7.1-preview.4', '7.2-preview.4')] + [string]$ApiVersion = '7.2-preview.4' ) + begin { - Write-Verbose "NewProject : Begin Processing"; - Write-Verbose " Name : $($BuildId)"; - Write-Verbose " Description : $($BuildId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "NewProject: Begin Processing" + Write-Verbose "Name: $($Name)" + Write-Verbose "Description: $($Description)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Body = @{ - "name" = $Name - "description" = $Description - "capabilities" = @{ - "versioncontrol" = @{ - "sourceControlType" = "Git" - } - "processTemplate" = @{ - "templateTypeId" = "b8a3a935-7e91-48b8-a94c-606d37c3e9f2" - } + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $Body = @{ + "name" = $Name + "description" = $Description + "capabilities" = @{ + "versioncontrol" = @{ + "sourceControlType" = "Git" + } + "processTemplate" = @{ + "templateTypeId" = "b8a3a935-7e91-48b8-a94c-606d37c3e9f2" } - } | ConvertTo-Json -Depth 5 -Compress; - $Uri = $Global:azDevOpsOrg + "_apis/projects?api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("Create", "Create new project in $($Global:azDevOpsOrg) Azure Devops")) - { - $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method POST -Headers $Global:azDevOpsHeader -Body $Body -ContentType "application/json" -Verbose:$VerbosePreference; } - do - { - $Status = Get-AdoOperations -OperationId $Result.id -Verbose:$VerbosePreference; - Write-Verbose $Status.status; - } until ($Status.status -eq 'succeeded') - Start-Sleep -Seconds 1; - Get-AdoProject -Verbose:$VerbosePreference | Where-Object -Property name -eq $Name; + } | ConvertTo-Json -Depth 5 -Compress + + $Uri = "$($Global:azDevOpsOrg)_apis/projects?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Create", "Create new project in $($Global:azDevOpsOrg) Azure DevOps")) + { + $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method POST -Headers $Global:azDevOpsHeader -Body $Body -ContentType "application/json" -Verbose:$VerbosePreference } + + do + { + $Status = Get-AdoOperations -OperationId $Result.id -Verbose:$VerbosePreference + Write-Verbose "Status: $($Status.status)" + Start-Sleep -Seconds 1 + } until ($Status.status -eq 'succeeded') + + Get-AdoProject -Verbose:$VerbosePreference | Where-Object -Property name -eq $Name } catch { - throw $_; + throw $_ } } } \ No newline at end of file From b089d481ce3c31036e7eceaafa05ce151e415a91 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:46:45 -0500 Subject: [PATCH 15/24] Removed recursion --- .../core/projects/public/RemoveProject.ps1 | 57 +++++++++++-------- 1 file changed, 34 insertions(+), 23 deletions(-) diff --git a/AzDevOps/core/projects/public/RemoveProject.ps1 b/AzDevOps/core/projects/public/RemoveProject.ps1 index da58b11..82e9c0b 100644 --- a/AzDevOps/core/projects/public/RemoveProject.ps1 +++ b/AzDevOps/core/projects/public/RemoveProject.ps1 @@ -7,40 +7,51 @@ function Remove-Project param ( [Parameter(Mandatory = $true)] [object]$Project, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.4')] - [string]$ApiVersion = '7.1-preview.4' + [ValidateSet('5.1', '7.1-preview.4', '7.2-preview.4')] + [string]$ApiVersion = '7.2-preview.4' ) + begin { - Write-Verbose "RemoveProject : Begin Processing"; - Write-Verbose " ProjectId : $($Project.Id)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "RemoveProject: Begin Processing" + Write-Verbose "ProjectId: $($Project.Id)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.id)?api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("Remove", "Delete $($Project.Name) from $($Global:azDevOpsOrg) Azure Devops")) - { - $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Delete -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference; - } - do - { - $Status = Get-AdoOperations -OperationId $Result.id -Verbose:$VerbosePreference; - Write-Verbose $Status.status; - } until ($Status.status -eq 'succeeded') - return "Project $($Project.name) removed"; + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." } + + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($Project.Id)?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Remove", "Delete $($Project.Name) from $($Global:azDevOpsOrg) Azure DevOps")) + { + $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Delete -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + } + + do + { + $Status = Get-AdoOperation -OperationId $Result.id -Verbose:$VerbosePreference + Write-Verbose "Status: $($Status.status)" + Start-Sleep -Seconds 1 + } until ($Status.status -eq 'succeeded') + + return "Project $($Project.Name) removed" } catch { - throw $_; + throw $_ } } } \ No newline at end of file From 83615bc4060d08960508b305b8c7eefa81a7ccdc Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 16:50:12 -0500 Subject: [PATCH 16/24] Removed recursion --- .../core/projects/public/UpdateProject.ps1 | 71 +++++++++++-------- 1 file changed, 41 insertions(+), 30 deletions(-) diff --git a/AzDevOps/core/projects/public/UpdateProject.ps1 b/AzDevOps/core/projects/public/UpdateProject.ps1 index a8a85c0..7a601ea 100644 --- a/AzDevOps/core/projects/public/UpdateProject.ps1 +++ b/AzDevOps/core/projects/public/UpdateProject.ps1 @@ -7,52 +7,63 @@ function Update-Project param ( [Parameter(Mandatory = $false)] [string]$Name, + [Parameter(Mandatory = $false)] [string]$Description, + [Parameter(Mandatory = $true)] [object]$Project, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.4')] - [string]$ApiVersion = '7.1-preview.4' + [ValidateSet('5.1', '7.1-preview.4', '7.2-preview.4')] + [string]$ApiVersion = '7.2-preview.4' ) + begin { - Write-Verbose "UpdateProject : Begin Processing"; - Write-Verbose " Name : $($Name)"; - Write-Verbose " Description : $($Description)"; - Write-Verbose " ProjectId : $($Project.Id)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "UpdateProject: Begin Processing" + Write-Verbose "Name: $($Name)" + Write-Verbose "Description: $($Description)" + Write-Verbose "ProjectId: $($Project.Id)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Body = @{ - "name" = $Name - "description" = $Description - "capabilities" = @{ - "versioncontrol" = @{ - "sourceControlType" = "Git" - } - "processTemplate" = @{ - "templateTypeId" = "b8a3a935-7e91-48b8-a94c-606d37c3e9f2" - } + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $Body = @{ + "name" = $Name + "description" = $Description + "capabilities" = @{ + "versioncontrol" = @{ + "sourceControlType" = "Git" + } + "processTemplate" = @{ + "templateTypeId" = "b8a3a935-7e91-48b8-a94c-606d37c3e9f2" } - } | ConvertTo-Json -Depth 5 -Compress; - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.id)?api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("Modify", "Update $($Project.Name) values")) - { - Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method PATCH -Headers $Global:azDevOpsHeader -Body $Body -ContentType "application/json" -Verbose:$VerbosePreference; } + } | ConvertTo-Json -Depth 5 -Compress + + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($Project.Id)?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Modify", "Update $($Project.Name) values")) + { + Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method PATCH -Headers $Global:azDevOpsHeader -Body $Body -ContentType "application/json" -Verbose:$VerbosePreference } } catch { - throw $_; + throw $_ } } -} \ No newline at end of file +} From 14679017b384f8d8799fbe559bc75f2deddf3df9 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 17:08:32 -0500 Subject: [PATCH 17/24] Removed recursion --- AzDevOps/core/teams/public/GetTeam.ps1 | 91 +++++++++++--------- AzDevOps/core/teams/public/GetTeamMember.ps1 | 87 +++++++++++-------- AzDevOps/core/teams/public/NewTeam.ps1 | 54 +++++++----- AzDevOps/core/teams/public/RemoveTeam.ps1 | 50 ++++++----- AzDevOps/core/teams/public/UpdateTeam.ps1 | 57 ++++++------ AzDevOps/core/teams/teams.psd1 | 2 +- 6 files changed, 194 insertions(+), 147 deletions(-) diff --git a/AzDevOps/core/teams/public/GetTeam.ps1 b/AzDevOps/core/teams/public/GetTeam.ps1 index e2edbd0..c72fb31 100644 --- a/AzDevOps/core/teams/public/GetTeam.ps1 +++ b/AzDevOps/core/teams/public/GetTeam.ps1 @@ -2,72 +2,83 @@ function Get-Team { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/teams/blob/master/docs/Get-AdoTeam.md#get-adoteam', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$TeamId, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.3', '7.1-preview.3')] - [string]$ApiVersion = '7.1-preview.3' + [ValidateSet('5.1-preview.3', '7.1-preview.3', '7.2-preview.3')] + [string]$ApiVersion = '7.2-preview.3' ) + process { - Write-Verbose "GetTeam : Process Record"; + Write-Verbose "GetTeam: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "ProjectId: $($Project.Id)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " TeamId : $($TeamId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "TeamId: $($TeamId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - switch ($PSCmdlet.ParameterSetName) - { - 'Project' - { - if ($TeamId) - { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.Id)/teams/$($TeamId)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); - } - else - { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.Id)/teams/?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; - } - } - default - { - $Uri = $Global:azDevOpsOrg + "_apis/teams?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; - } - } + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)_apis/projects/$($Project.Id)/teams" + } + else + { + "$($Global:azDevOpsOrg)_apis/projects/$($ProjectId)/teams" + } + + if ($TeamId) + { + $Uri = "$($BaseUri)/$($TeamId)?api-version=$($ApiVersion)" + } + else + { + $Uri = "$($BaseUri)?api-version=$($ApiVersion)" + } + + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($TeamId) + { + return $Response + } + else + { + return $Response.Value } } catch { - throw $_; + throw $_ } } } \ No newline at end of file diff --git a/AzDevOps/core/teams/public/GetTeamMember.ps1 b/AzDevOps/core/teams/public/GetTeamMember.ps1 index 15db8c8..979ed0b 100644 --- a/AzDevOps/core/teams/public/GetTeamMember.ps1 +++ b/AzDevOps/core/teams/public/GetTeamMember.ps1 @@ -2,71 +2,84 @@ function Get-TeamMember { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/teams/blob/master/docs/Get-AdoTeamMember.md#get-adoteammember', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$TeamId, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.3', '7.1-preview.3')] - [string]$ApiVersion = '7.1-preview.3' + [ValidateSet('5.1-preview.3', '7.1-preview.3', '7.2-preview.2')] + [string]$ApiVersion = '7.2-preview.2' ) + process { - Write-Verbose "GetTeamMember : Process Record"; + Write-Verbose "GetTeamMember: Process Record" if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($Project.Id)"; + Write-Verbose "ProjectId: $($Project.Id)" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + Write-Verbose "ProjectId: $($ProjectId)" } - Write-Verbose " TeamId : $($TeamId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "TeamId: $($TeamId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Team = Get-AdoTeam -ProjectId $Project.Id -TeamId $TeamId -Verbose:$VerbosePreference; - switch ($PSCmdlet.ParameterSetName) + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') + { + "$($Global:azDevOpsOrg)_apis/projects/$($Project.Id)/teams" + } + else + { + "$($Global:azDevOpsOrg)_apis/projects/$($ProjectId)/teams" + } + + if ($TeamId) + { + $Uri = "$($BaseUri)/$($TeamId)/members?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value | Select-Object -ExpandProperty Identity + } + else + { + $TeamsUri = "$($BaseUri)?api-version=$($ApiVersion)" + Write-Verbose "TeamsUri: $($TeamsUri)" + $Teams = (Invoke-AdoEndpoint -Uri ([System.Uri]::new($TeamsUri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value + $Members = @() + + foreach ($Team in $Teams) { - 'Project' - { - if ($TeamId) - { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.id)/teams/$($Team.id)/members?api-version=$($ApiVersion)" - return ((Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value | Select-Object -ExpandProperty Identity); - } - else - { - foreach ($Team in Get-AdoTeam -ProjectId $Project.Id) - { - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.Id)/teams/$($Team.id)/members?api-version=$($ApiVersion)" - return ((Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value | Select-Object -ExpandProperty Identity); - } - } - } + $Uri = "$($BaseUri)/$($Team.id)/members?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + $Members += (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value | Select-Object -ExpandProperty Identity } + + return $Members } } catch { - throw $_; + throw $_ } } } \ No newline at end of file diff --git a/AzDevOps/core/teams/public/NewTeam.ps1 b/AzDevOps/core/teams/public/NewTeam.ps1 index f0e0ae9..b8d59cc 100644 --- a/AzDevOps/core/teams/public/NewTeam.ps1 +++ b/AzDevOps/core/teams/public/NewTeam.ps1 @@ -7,44 +7,52 @@ function New-Team param ( [Parameter(Mandatory = $true)] [string]$Name, + [Parameter(Mandatory = $false)] [string]$Description, + [Parameter(ValueFromPipeline)] [object]$Project, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.3', '7.1-preview.3')] - [string]$ApiVersion = '7.1-preview.3' + [ValidateSet('5.1-preview.3', '7.1-preview.3', '7.2-preview.3')] + [string]$ApiVersion = '7.2-preview.3' ) + process { - Write-Verbose "NewTeam : Process Record"; - Write-Verbose " Name : $($Name)"; - Write-Verbose " Description : $($Description)"; - Write-Verbose " ProjectId : $($Project.Id)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "NewTeam: Process Record" + Write-Verbose "Name: $($Name)" + Write-Verbose "Description: $($Description)" + Write-Verbose "ProjectId: $($Project.Id)" + Write-Verbose "ApiVersion: $($ApiVersion)" + try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Body = @{ - "name" = $Name - "description" = $Description - } | ConvertTo-Json -Depth 5 -Compress; - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.id)/teams/?api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("Create", "Create new team in $($Project.name) Azure Devops Projects")) - { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Post -Headers $Global:azDevOpsHeader -Body $Body -ContentType "application/json" -Verbose:$VerbosePreference); - } + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $Body = @{ + "name" = $Name + "description" = $Description + } | ConvertTo-Json -Depth 5 -Compress + + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($Project.Id)/teams/?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Create", "Create new team in $($Project.Name) Azure DevOps Projects")) + { + return Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Post -Headers $Global:azDevOpsHeader -Body $Body -ContentType "application/json" -Verbose:$VerbosePreference } } catch { - throw $_; + throw $_ } } } \ No newline at end of file diff --git a/AzDevOps/core/teams/public/RemoveTeam.ps1 b/AzDevOps/core/teams/public/RemoveTeam.ps1 index f487894..406fa6f 100644 --- a/AzDevOps/core/teams/public/RemoveTeam.ps1 +++ b/AzDevOps/core/teams/public/RemoveTeam.ps1 @@ -7,44 +7,50 @@ function Remove-Team param ( [Parameter(Mandatory = $true)] [Guid]$ProjectId, + [Parameter(Mandatory = $true)] [Guid]$TeamId, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.3', '7.1-preview.3')] - [string]$ApiVersion = '7.1-preview.3' + [ValidateSet('5.1-preview.3', '7.1-preview.3', '7.2-preview.3')] + [string]$ApiVersion = '7.2-preview.3' ) + begin { - Write-Verbose "RemoveTeam : Begin Processing"; - Write-Verbose " ProjectId : $($Project.Id)"; - Write-Verbose " TeamId : $($TeamId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "RemoveTeam: Begin Processing" + Write-Verbose "ProjectId: $($ProjectId)" + Write-Verbose "TeamId: $($TeamId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - $Team = Get-AdoTeam -ProjectId $ProjectId -TeamId $TeamId -Verbose:$VerbosePreference; + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Project.id)/teams/$($Team.id)?api-version=$($ApiVersion)" - if ($PSCmdlet.ShouldProcess("Delete", "Remove team $($Team.name) from $($Project.name) Azure Devops Projects")) + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($ProjectId)/teams/$($TeamId)?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Delete", "Remove team with ID $($TeamId) from project with ID $($ProjectId)")) + { + $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method DELETE -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + if (-not $Result) { - $Result = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method DELETE -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference; - if (!($Result)) - { - return "Team : $($Team.id) removed from Project : $($Project.id)"; - } + return "Team: $($TeamId) removed from Project: $($ProjectId)" } } } catch { - throw $_; + throw $_ } } } \ No newline at end of file diff --git a/AzDevOps/core/teams/public/UpdateTeam.ps1 b/AzDevOps/core/teams/public/UpdateTeam.ps1 index 9ea2eeb..497e0a8 100644 --- a/AzDevOps/core/teams/public/UpdateTeam.ps1 +++ b/AzDevOps/core/teams/public/UpdateTeam.ps1 @@ -7,46 +7,55 @@ function Update-Team param ( [Parameter(Mandatory = $false)] [string]$Name, + [Parameter(Mandatory = $false)] [string]$Description, + [Parameter(ValueFromPipeline)] [object]$Team, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1-preview.3', '7.1-preview.3')] - [string]$ApiVersion = '7.1-preview.3' + [ValidateSet('5.1-preview.3', '7.1-preview.3', '7.2-preview.3')] + [string]$ApiVersion = '7.2-preview.3' ) begin { - Write-Verbose "UpdateTeam : Process Record"; - Write-Verbose " Name : $($Name)"; - Write-Verbose " Description : $($Description)"; - Write-Verbose " TeamId : $($Team.Id)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; + Write-Verbose "UpdateTeam: Begin Processing" + Write-Verbose "Name: $($Name)" + Write-Verbose "Description: $($Description)" + Write-Verbose "TeamId: $($Team.Id)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process + { try { - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) + { + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $Body = @{ + "name" = $Name + "description" = $Description + } | ConvertTo-Json -Depth 5 -Compress + + $Uri = "$($Global:azDevOpsOrg)_apis/projects/$($Team.projectId)/teams/$($Team.Id)?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + if ($PSCmdlet.ShouldProcess("Update", "Update team in Azure DevOps Projects")) { - $Body = @{ - "name" = $Name - "description" = $Description - } | ConvertTo-Json -Depth 5 -Compress; - - $Uri = $Global:azDevOpsOrg + "_apis/projects/$($Team.projectid)/teams/$($Team.id)?api-version=$($ApiVersion)"; - if ($PSCmdlet.ShouldProcess("Update", "Update new team in $($Project.name) Azure Devops Projects")) - { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method PATCH -Body $Body -ContentType "application/json" -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); - } + return Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method PATCH -Body $Body -ContentType "application/json" -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference } } catch { - throw $_; + throw $_ } } } \ No newline at end of file diff --git a/AzDevOps/core/teams/teams.psd1 b/AzDevOps/core/teams/teams.psd1 index 62f40a7..8c07f14 100644 --- a/AzDevOps/core/teams/teams.psd1 +++ b/AzDevOps/core/teams/teams.psd1 @@ -12,7 +12,7 @@ RootModule = 'teams.psm1' # Version number of this module. - ModuleVersion = '1.0.1' + ModuleVersion = '2.0.0' # Supported PSEditions # CompatiblePSEditions = @() From 63f8460ca0323b2231a142d0710af3567cfdbbf4 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 22:38:17 -0500 Subject: [PATCH 18/24] Removed recursion --- AzDevOps/git/Git.psd1 | 2 +- .../git/repositories/public/GetRepository.ps1 | 91 +++++++----- .../git/repositories/public/NewRepository.ps1 | 133 +++++++++--------- .../repositories/public/RemoveRepository.ps1 | 80 +++++++---- 4 files changed, 173 insertions(+), 133 deletions(-) diff --git a/AzDevOps/git/Git.psd1 b/AzDevOps/git/Git.psd1 index b5d0760..326acfb 100644 --- a/AzDevOps/git/Git.psd1 +++ b/AzDevOps/git/Git.psd1 @@ -12,7 +12,7 @@ RootModule = 'Git.psm1' # Version number of this module. -ModuleVersion = '1.0.0' +ModuleVersion = '2.0.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/AzDevOps/git/repositories/public/GetRepository.ps1 b/AzDevOps/git/repositories/public/GetRepository.ps1 index d0c1131..472809a 100644 --- a/AzDevOps/git/repositories/public/GetRepository.ps1 +++ b/AzDevOps/git/repositories/public/GetRepository.ps1 @@ -2,65 +2,86 @@ function Get-Repository { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Get-AdoRepository.md#get-adorepository', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] [object]$Project, + [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, + [Parameter(Mandatory = $false, ParameterSetName = 'Project')] [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] [string]$Name, + [Parameter(Mandatory = $false)] - [ValidateSet('7.0')] - [string]$ApiVersion = '7.0' + [ValidateSet('7.0', '7.2-preview.1')] + [string]$ApiVersion = '7.2-preview.1' ) + begin + { + Write-Verbose "GetRepository: Begin Processing" + if ($PSCmdlet.ParameterSetName -eq 'Project') + { + Write-Verbose "Project: $($Project)" + } + else + { + Write-Verbose "ProjectId: $($ProjectId)" + } + Write-Verbose "Name: $($Name)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process { try { - Write-Verbose "GetRepository : Begin Processing"; - if ($PSCmdlet.ParameterSetName -eq 'Project') + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) + { + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." + } + + $BaseUri = if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " Project : $($Project)"; + "$($Global:azDevOpsOrg)$($Project.Id)/_apis/git/repositories" } else { - Write-Verbose " ProjectId : $($ProjectId)"; + "$($Global:azDevOpsOrg)$($ProjectId)/_apis/git/repositories" } - Write-Verbose " Name : $($Name)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + + $Uri = if ($Name) + { + "$($BaseUri)/$($Name)?api-version=$($ApiVersion)" + } + else + { + "$($BaseUri)?api-version=$($ApiVersion)" + } + + Write-Verbose "Uri: $($Uri)" + + $Response = Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference + + if ($Name) + { + return $Response + } + else { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $ThisProject = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - if ($PSCmdlet.ParameterSetName -eq 'Project') - { - $ThisProject = Get-AdoProject -Verbose:$VerbosePreference |Where-Object -Property Name -eq $Project; - } - $Uri = $Global:azDevOpsOrg + "$($ThisProject.Id)/_apis/git/repositories?api-version=$($ApiVersion)"; - if ($Name) - { - $Uri = $Global:azDevOpsOrg + "$($ThisProject.Id)/_apis/git/repositories/$($Name)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); - } - else - { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference).Value; - } + return $Response.Value } } catch { - throw $_; + throw $_ } } -} +} \ No newline at end of file diff --git a/AzDevOps/git/repositories/public/NewRepository.ps1 b/AzDevOps/git/repositories/public/NewRepository.ps1 index edf1783..7618a3f 100644 --- a/AzDevOps/git/repositories/public/NewRepository.ps1 +++ b/AzDevOps/git/repositories/public/NewRepository.ps1 @@ -5,103 +5,102 @@ function New-Repository PositionalBinding = $true)] [OutputType([Object])] param ( - [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] - [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Fork')] + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Repo')] + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Fork')] [object]$Project, - [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] - [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Fork')] - [Guid]$ProjectId, - [Parameter(Mandatory = $false, ParameterSetName = 'Project')] - [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] - [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Fork')] + + [Parameter(Mandatory = $true, ParameterSetName = 'Repo')] + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Fork')] [string]$Name, - [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Fork')] - [string]$ParentRepository, + + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Fork')] + [string]$ParentRepositoryId, + [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Fork')] [string]$ParentProjectId, + [Parameter(Mandatory = $false)] - [ValidateSet('7.0')] - [string]$ApiVersion = '7.0' + [ValidateSet('7.0', '7.2-preview.1')] + [string]$ApiVersion = '7.2-preview.1' ) + begin { try { - Write-Verbose "NewRepository : Begin Processing"; - Write-Verbose " ParametersetName : $($PSCmdlet.ParameterSetName)"; - if ($Project) - { - Write-Verbose " ProjectId : $($Project.Id)"; - } - elseif ($ProjectId) - { - Write-Verbose " ProjectId : $($ProjectId)"; - } + Write-Verbose "NewRepository: Begin Processing" + Write-Verbose "ParameterSetName: $($PSCmdlet.ParameterSetName)" + Write-Verbose "ProjectId: $($Project.Id)" if ($PSCmdlet.ParameterSetName -eq 'Fork') { - Write-Verbose " ParentRepository : $($ParentRepository)"; - Write-Verbose " ParentProjectId : $($ParentProjectId)"; + Write-Verbose "ParentRepositoryId: $($ParentRepositoryId)" + Write-Verbose "ParentProjectId: $($ParentProjectId)" } else { - Write-Verbose " Name : $($Name)"; + Write-Verbose "Name: $($Name)" + } + Write-Verbose "ApiVersion: $($ApiVersion)" + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) + { + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." } - Write-Verbose " ApiVersion : $($ApiVersion)"; - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + + $Uri = "$($Global:azDevOpsOrg)_apis/git/repositories?api-version=$($ApiVersion)" + + switch ($PSCmdlet.ParameterSetName) { - if ($ProjectId) + 'Repo' { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; + [System.Text.StringBuilder]$stringBuilder = New-Object System.Text.StringBuilder + $stringBuilder.AppendLine("{") | Out-Null + $stringBuilder.AppendLine(" `"name`": `"$($Name)`",") | Out-Null + $stringBuilder.AppendLine(" `"project`": {") | Out-Null + $stringBuilder.AppendLine(" `"id`": `"$($Project.Id)`"") | Out-Null + $stringBuilder.AppendLine(" }") | Out-Null + $stringBuilder.AppendLine("}") | Out-Null + $Body = $stringBuilder.ToString() | ConvertFrom-Json | ConvertTo-Json -Compress } - $Uri = $Global:azDevOpsOrg + "_apis/git/repositories?api-version=$($ApiVersion)"; - [System.Text.StringBuilder]$stringBuilder = New-Object System.Text.StringBuilder; - $stringBuilder.AppendLine("{") | Out-Null; - $stringBuilder.AppendLine(" `"name`": `"$($Name)`",") | Out-Null; - $stringBuilder.AppendLine(" `"project`" : {") | Out-Null; - $stringBuilder.AppendLine(" `"id`":`"$($Project.Id)`"") | Out-Null; - $stringBuilder.AppendLine(" },") | Out-Null; - $stringBuilder.AppendLine("}") | Out-Null; - $Body = $stringBuilder.ToString() | ConvertFrom-Json | ConvertTo-Json -Compress; - if ($PSCmdlet.ParameterSetName -eq 'Fork') + 'Fork' { - $Parent = Get-AdoRepository -Project $project -Name $ParentRepository; - [System.Text.StringBuilder]$stringBuilder = New-Object System.Text.StringBuilder; - $stringBuilder.AppendLine("{") | Out-Null; - $stringBuilder.AppendLine(" `"name`": `"$($Name)`",") | Out-Null; - $stringBuilder.AppendLine(" `"project`" : {") | Out-Null; - $stringBuilder.AppendLine(" `"id`":`"$($Project.Id)`"") | Out-Null; - $stringBuilder.AppendLine(" },") | Out-Null; - $stringBuilder.AppendLine(" `"parentRepository`": {") | Out-Null; - $stringBuilder.AppendLine(" `"id`": `"$($Parent.id)`",") | Out-Null; - $stringBuilder.AppendLine(" `"project`": {") | Out-Null; + $ParentUri = "$($Global:azDevOpsOrg)_apis/git/repositories/$($ParentRepositoryId)?api-version=$($ApiVersion)" + $Parent = (Invoke-AdoEndpoint -Uri ([System.Uri]::new($ParentUri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference) + [System.Text.StringBuilder]$stringBuilder = New-Object System.Text.StringBuilder + $stringBuilder.AppendLine("{") | Out-Null + $stringBuilder.AppendLine(" `"name`": `"$($Name)`",") | Out-Null + $stringBuilder.AppendLine(" `"project`": {") | Out-Null + $stringBuilder.AppendLine(" `"id`": `"$($Project.Id)`"") | Out-Null + $stringBuilder.AppendLine(" },") | Out-Null + $stringBuilder.AppendLine(" `"ParentRepositoryId`": {") | Out-Null + $stringBuilder.AppendLine(" `"id`": `"$($Parent.id)`",") | Out-Null + $stringBuilder.AppendLine(" `"project`": {") | Out-Null if ($ParentProjectId) { - $stringBuilder.AppendLine(" `"id`": `"$($ParentProjectId)`",") | Out-Null; + $stringBuilder.AppendLine(" `"id`": `"$($ParentProjectId)`",") | Out-Null } else { - $stringBuilder.AppendLine(" `"id`": `"$($Project.Id)`",") | Out-Null; + $stringBuilder.AppendLine(" `"id`": `"$($Project.Id)`",") | Out-Null } - $stringBuilder.AppendLine(" }") | Out-Null; - $stringBuilder.AppendLine(" }") | Out-Null; - $stringBuilder.AppendLine("}") | Out-Null; - $Body = $stringBuilder.ToString() | ConvertFrom-Json | ConvertTo-Json -Compress; - } - Write-Verbose " Body : $($Body |Out-String)"; - if ($PSCmdlet.ShouldProcess("New", "Create Folder $($Name) in $($Project.name) Azure Devops Projects")) - { - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method POST -Headers $Global:azDevOpsHeader -Body ($Body) -ContentType 'application/json' -Verbose:$VerbosePreference); + $stringBuilder.AppendLine(" }") | Out-Null + $stringBuilder.AppendLine(" }") | Out-Null + $stringBuilder.AppendLine("}") | Out-Null + $Body = $stringBuilder.ToString() | ConvertFrom-Json | ConvertTo-Json -Compress } } + + Write-Verbose "Body: $($Body | Out-String)" + if ($PSCmdlet.ShouldProcess("New", "Create repository $($Name) in $($Project.Name) Azure DevOps Projects")) + { + return Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method POST -Headers $Global:azDevOpsHeader -Body $Body -ContentType 'application/json' -Verbose:$VerbosePreference + } } catch { - throw $_; + throw $_ } } -} +} \ No newline at end of file diff --git a/AzDevOps/git/repositories/public/RemoveRepository.ps1 b/AzDevOps/git/repositories/public/RemoveRepository.ps1 index dc27c66..deec3b9 100644 --- a/AzDevOps/git/repositories/public/RemoveRepository.ps1 +++ b/AzDevOps/git/repositories/public/RemoveRepository.ps1 @@ -2,54 +2,74 @@ function Remove-Repository { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Remove-AdoRepository.md#remove-adorepository', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( - [Parameter(ValueFromPipeline, Mandatory = $false, ParameterSetName = 'Project')] + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Project')] [object]$Project, - [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] + + [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] [Guid]$ProjectId, - [Parameter(Mandatory = $false, ParameterSetName = 'Project')] - [Parameter(Mandatory = $false, ParameterSetName = 'ProjectId')] - [string]$Name, + + [Parameter(ValueFromPipeline, Mandatory = $true, ParameterSetName = 'Project')] + [object]$Repository, + + [Parameter(Mandatory = $true, ParameterSetName = 'ProjectId')] + [string]$RepositoryId, + [Parameter(Mandatory = $false)] - [ValidateSet('7.0')] - [string]$ApiVersion = '7.0' + [ValidateSet('7.0', '7.2-preview.1')] + [string]$ApiVersion = '7.2-preview.1' ) + begin + { + Write-Verbose "RemoveRepository: Begin Processing" + if ($PSCmdlet.ParameterSetName -eq 'Project') + { + Write-Verbose "ProjectId: $($Project.Id)" + Write-Verbose "RepositoryId: $($Repository.Id)" + } + else + { + Write-Verbose "ProjectId: $($ProjectId)" + Write-Verbose "RepositoryId: $($RepositoryId)" + } + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process { try { - Write-Verbose "RemoveRepository : Begin Processing"; - if ($PSCmdlet.ParameterSetName -eq 'Project') + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - Write-Verbose " ProjectId : $($Project.Id)"; + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." } - else + + if ($PSCmdlet.ParameterSetName -eq 'Project') { - Write-Verbose " ProjectId : $($ProjectId)"; + $ProjectIdToUse = $Project.Id + $RepositoryIdToUse = $Repository.id } - Write-Verbose " Name : $($Name)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + else { - if ($PSCmdlet.ParameterSetName -eq 'ProjectId') - { - $Project = Get-AdoProject -ProjectId $ProjectId -Verbose:$VerbosePreference; - } - $Repository = Get-AdoRepository -Project $Project -Name $Name; - $Uri = $Global:azDevOpsOrg + "$($Project.Id)/_apis/git/repositories/$($Repository.id)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method DELETE -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); + $ProjectIdToUse = $ProjectId + $RepositoryIdToUse = $RepositoryId } + + $Uri = "$($Global:azDevOpsOrg)$($ProjectIdToUse)/_apis/git/repositories/$($RepositoryIdToUse)?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + return Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method DELETE -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference } catch { - throw $_; + throw $_ } } -} +} \ No newline at end of file From 8bb4039cf17ea93208e3c24ab860b8ca32b767fe Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 22:42:33 -0500 Subject: [PATCH 19/24] Removed recursion --- AzDevOps/operations/operations.psd1 | 2 +- .../operations/public/GetOperation.ps1 | 41 +++++++++++-------- 2 files changed, 26 insertions(+), 17 deletions(-) diff --git a/AzDevOps/operations/operations.psd1 b/AzDevOps/operations/operations.psd1 index 3bfc82a..09fb656 100644 --- a/AzDevOps/operations/operations.psd1 +++ b/AzDevOps/operations/operations.psd1 @@ -12,7 +12,7 @@ RootModule = 'operations.psm1' # Version number of this module. - ModuleVersion = '2.0.0' + ModuleVersion = '3.0.0' # Supported PSEditions # CompatiblePSEditions = @() diff --git a/AzDevOps/operations/operations/public/GetOperation.ps1 b/AzDevOps/operations/operations/public/GetOperation.ps1 index 41182e2..7fa8878 100644 --- a/AzDevOps/operations/operations/public/GetOperation.ps1 +++ b/AzDevOps/operations/operations/public/GetOperation.ps1 @@ -2,36 +2,45 @@ function Get-Operation { [CmdletBinding( HelpURI = 'https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Get-AdoOperation.md#get-adooperation', - PositionalBinding = $true)] + PositionalBinding = $true + )] [OutputType([Object])] param ( [Parameter(Mandatory = $true)] [Guid]$OperationId, + [Parameter(Mandatory = $false)] - [ValidateSet('5.1', '7.1-preview.1')] - [string]$ApiVersion = '7.1-preview.1' + [ValidateSet('5.1', '7.1-preview.1', '7.2-preview.1')] + [string]$ApiVersion = '7.2-preview.1' ) + begin + { + Write-Verbose "GetOperation: Begin Processing" + Write-Verbose "OperationId: $($OperationId)" + Write-Verbose "ApiVersion: $($ApiVersion)" + } + + process { try { - Write-Verbose "GetBuild : Begin Processing"; - Write-Verbose " OperationId : $($OperationId)"; - Write-Verbose " ApiVersion : $($ApiVersion)"; - $ErrorActionPreference = 'Stop'; - $Error.Clear(); - # - # Are we connected - # - if ($Global:azDevOpsConnected) + $ErrorActionPreference = 'Stop' + $Error.Clear() + + if (-not $Global:azDevOpsConnected) { - $Uri = $Global:azDevOpsOrg + "_apis/operations/$($OperationId)?api-version=$($ApiVersion)"; - return (Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference); + throw "Not connected to Azure DevOps. Please connect using Connect-AzDevOps." } + + $Uri = "$($Global:azDevOpsOrg)_apis/operations/$($OperationId)?api-version=$($ApiVersion)" + Write-Verbose "Uri: $($Uri)" + + return Invoke-AdoEndpoint -Uri ([System.Uri]::new($Uri)) -Method Get -Headers $Global:azDevOpsHeader -Verbose:$VerbosePreference } catch { - throw $_; + throw $_ } } -} +} \ No newline at end of file From 065de7f39c0d4ad386735fd7b8353d0c16cfc99d Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 22:43:02 -0500 Subject: [PATCH 20/24] Updated version of module --- AzDevOps/AzDevOps.psd1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AzDevOps/AzDevOps.psd1 b/AzDevOps/AzDevOps.psd1 index 1c2b00b..e9a78d3 100644 --- a/AzDevOps/AzDevOps.psd1 +++ b/AzDevOps/AzDevOps.psd1 @@ -12,7 +12,7 @@ RootModule = 'AzDevOps.psm1' # Version number of this module. - ModuleVersion = '2.1.0' + ModuleVersion = '3.0.0' # Supported PSEditions # CompatiblePSEditions = @() From e0c771d5efced3402f38bb4001bf61ef9be217c6 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 22:51:16 -0500 Subject: [PATCH 21/24] No tests yet --- CHANGELOG.md | 17 +++++++++++++++++ psakefile.ps1 | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 502d774..cb70867 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,23 @@ All changes to this module should be reflected in this document. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [[3.0.0]](https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/releases/tag/v3.0.0) - 2024-07-19 + +This release addresses an bug that was discovered in issue [#56](https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/issues/56), the Get-AdoTeamMember function was failing. After digging into the problem it appears that the way in which I was generating the URI was introducing problems. To add to that, the amount of times we called back to functions just for validation was making troubleshooting confusing as well as the process seem much more heavy than it is. + +What's Change: + +- I have removed nearly all the recursive calls within each function +- A few issues were resolved with New-AdoRepository + - The function wasn't able to determine if we were using the forked params + - Renamed ParentRepository to ParentRepositoryId +- Introduced an issue with Remove-AdoRepository + - Removing the call to Get-AdoRepository means we can't pass the name of the repo + - Added RepositoryId or a Repository object +- Documentation updates + +--- + ## [[2.1.0]](https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/releases/tag/v2.1.0) - 2023-01-14 This release adds the git endpoint as well as testing for module functions. diff --git a/psakefile.ps1 b/psakefile.ps1 index f176ecf..be32b39 100644 --- a/psakefile.ps1 +++ b/psakefile.ps1 @@ -84,7 +84,7 @@ Write-Host -ForegroundColor Green "DeployBranch : $($script:DeployBranch)"; Task LocalUse -description "Use for local testing" -depends Clean, BuildNestedModules, BuildNestedManifests, BuildModule , BuildManifest -Task Build -depends LocalUse, PesterTest +Task Build -depends LocalUse# , PesterTest Task Package -depends CreateExternalHelp, CreateCabFile, UpdateReadme Task Deploy -depends CheckBranch, ReleaseNotes, PublishModule, NewTaggedRelease, Post2Discord From b910e3f2a0a4fa2e1dbfb4f625c56a1db99d19fd Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 22:58:14 -0500 Subject: [PATCH 22/24] UPdated existing documentation --- docs/Connect-AdoOrganization.md | 19 ++++++++++++++++++- docs/Get-AdoBuild.md | 8 +++++--- docs/Get-AdoBuildDefinition.md | 9 +++++---- docs/Get-AdoBuildFolder.md | 9 +++++---- docs/Get-AdoBuildLog.md | 10 +++++----- docs/Get-AdoOperation.md | 21 +++++++++++++++++++-- docs/Get-AdoProcess.md | 21 +++++++++++++++++++-- docs/Get-AdoProject.md | 21 +++++++++++++++++++-- docs/Get-AdoProjectProperty.md | 7 ++++--- docs/Get-AdoTeam.md | 10 ++++++---- docs/Get-AdoTeamMember.md | 8 +++++--- docs/Invoke-AdoEndpoint.md | 18 +++++++++++++++++- docs/New-AdoBuildFolder.md | 27 +++++++++++++++++++++------ docs/New-AdoProject.md | 24 ++++++++++++++++++++---- docs/New-AdoTeam.md | 22 +++++++++++++++++++--- docs/Remove-AdoBuild.md | 26 +++++++++++++++++++++----- docs/Remove-AdoBuildFolder.md | 27 +++++++++++++++++++++------ docs/Remove-AdoProject.md | 21 +++++++++++++++++++-- docs/Remove-AdoTeam.md | 24 +++++++++++++++++++----- docs/Start-AdoBuild.md | 28 ++++++++++++++++++++-------- docs/Update-AdoProject.md | 22 ++++++++++++++++++---- docs/Update-AdoTeam.md | 22 ++++++++++++++++++---- 22 files changed, 323 insertions(+), 81 deletions(-) diff --git a/docs/Connect-AdoOrganization.md b/docs/Connect-AdoOrganization.md index ab87498..a1253c2 100644 --- a/docs/Connect-AdoOrganization.md +++ b/docs/Connect-AdoOrganization.md @@ -14,7 +14,8 @@ This function will connect to Azure DevOps ## SYNTAX ```powershell -Connect-AdoOrganization [-Orgname] [-PAT] [[-ApiVersion] ] [] +Connect-AdoOrganization [-Orgname] [-PAT] [[-ApiVersion] ] + [-ProgressAction ] [] ``` ## DESCRIPTION @@ -85,6 +86,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### CommonParameters This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). diff --git a/docs/Get-AdoBuild.md b/docs/Get-AdoBuild.md index 5bcef86..9639ea9 100644 --- a/docs/Get-AdoBuild.md +++ b/docs/Get-AdoBuild.md @@ -16,13 +16,15 @@ Return one or more builds from a project ### Project ```powershell -Get-AdoBuild [-Project ] [-BuildId ] [-ApiVersion ] [] +Get-AdoBuild [-Project ] [-BuildId ] [-ApiVersion ] [-ProgressAction ] + [] ``` ### ProjectId ```powershell -Get-AdoBuild [-ProjectId ] [-BuildId ] [-ApiVersion ] [] +Get-AdoBuild [-ProjectId ] [-BuildId ] [-ApiVersion ] [-ProgressAction ] + [] ``` ## DESCRIPTION @@ -61,7 +63,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.7 +Accepted values: 5.1, 7.1-preview.7, 7.2-preview.7 Required: False Position: Named diff --git a/docs/Get-AdoBuildDefinition.md b/docs/Get-AdoBuildDefinition.md index 56abdd0..2d16832 100644 --- a/docs/Get-AdoBuildDefinition.md +++ b/docs/Get-AdoBuildDefinition.md @@ -16,13 +16,15 @@ Gets a definition, optionally at a specific revision. ### Project ```powershell -Get-AdoBuildDefinition [-Project ] [-DefinitionId ] [-Revision ] [-ApiVersion ] [] +Get-AdoBuildDefinition [-Project ] [-DefinitionId ] [-Revision ] [-ApiVersion ] + [-ProgressAction ] [] ``` ### ProjectId ```powershell -Get-AdoBuildDefinition [-ProjectId ] [-DefinitionId ] [-Revision ] [-ApiVersion ] [] +Get-AdoBuildDefinition [-ProjectId ] [-DefinitionId ] [-Revision ] [-ApiVersion ] + [-ProgressAction ] [] ``` ## DESCRIPTION @@ -55,7 +57,6 @@ revision : 88 createdDate : 4/15/2020 4:05:31 PM project : @{id=c31a2770-9aee-4799-a078-eee0dc12cbf4; name=AzDevOps; description=A project for working with Azure Devops using PowerShell; url=https://dev.azure.com/patton-tech/_apis/projects/c31a2770-9aee-4799-a078-eee0dc12cbf4; state=wellFormed; revision=515330752; visibility=public; lastUpdateTime=4/10/2020 4:22:12 AM} - ``` Get a list of definitions in the project @@ -148,7 +149,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.7 +Accepted values: 5.1, 7.1-preview.7, 7.2-preview.7 Required: False Position: Named diff --git a/docs/Get-AdoBuildFolder.md b/docs/Get-AdoBuildFolder.md index 63f6665..ce5af95 100644 --- a/docs/Get-AdoBuildFolder.md +++ b/docs/Get-AdoBuildFolder.md @@ -16,13 +16,15 @@ Gets a list of build definition folders ### Project ```powershell -Get-AdoBuildFolder [-Project ] [-Path ] [-ApiVersion ] [] +Get-AdoBuildFolder [-Project ] [-Path ] [-ApiVersion ] + [-ProgressAction ] [] ``` ### ProjectId ```powershell -Get-AdoBuildFolder [-ProjectId ] [-Path ] [-ApiVersion ] [] +Get-AdoBuildFolder [-ProjectId ] [-Path ] [-ApiVersion ] + [-ProgressAction ] [] ``` ## DESCRIPTION @@ -40,7 +42,6 @@ path : \ createdOn : 4/8/2020 2:46:31 PM project : @{id=c31a2770-9aee-4799-a078-eee0dc12cbf4; name=AzDevOps; description=A project for working with Azure Devops using PowerShell; url=https://dev.azure.com/patton-tech/_apis/projects/c31a2770-9aee-4799-a078-eee0dc12cbf4; state=wellFormed; revision=515330752; visibility=public; lastUpdateTime=4/10/2020 4:22:12 AM} - ``` Gets a list of build definition folders @@ -55,7 +56,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.2, 7.1-preview.2 +Accepted values: 5.1-preview.2, 7.1-preview.2, 7.2-preview.2 Required: False Position: Named diff --git a/docs/Get-AdoBuildLog.md b/docs/Get-AdoBuildLog.md index d59afe9..bd28f28 100644 --- a/docs/Get-AdoBuildLog.md +++ b/docs/Get-AdoBuildLog.md @@ -16,13 +16,15 @@ Gets the logs for a build ### Project ```powershell -Get-AdoBuildLog -Project -Build [-LogId ] [-ApiVersion ] [] +Get-AdoBuildLog -Project -Build [-LogId ] [-ApiVersion ] + [-ProgressAction ] [] ``` ### ProjectId ```powershell -Get-AdoBuildLog -ProjectId -BuildId [-LogId ] [-ApiVersion ] [] +Get-AdoBuildLog -ProjectId -BuildId [-LogId ] [-ApiVersion ] + [-ProgressAction ] [] ``` ## DESCRIPTION @@ -49,7 +51,6 @@ lastChangedOn : 8/10/2020 10:46:27 PM id : 2 type : Container url : https://dev.azure.com/patton-tech/c31a2770-9aee-4799-a078-eee0dc12cbf4/_apis/build/builds/195/logs/2 - ``` Get the logs for a build @@ -67,7 +68,6 @@ PS C:\> Get-AdoBuildLog -Project $Project -Build $Build -LogId 13 2020-08-10T22:47:05.2322457Z Agent running as: 'VssAdministrator' 2020-08-10T22:47:05.2701678Z Prepare build directory. 2020-08-10T22:47:05.5072173Z Set build variables. - ``` Get the individual log file for a build. @@ -82,7 +82,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.2 +Accepted values: 5.1, 7.1-preview.2, 7.2-preview.2 Required: False Position: Named diff --git a/docs/Get-AdoOperation.md b/docs/Get-AdoOperation.md index 6e9d055..9b64f70 100644 --- a/docs/Get-AdoOperation.md +++ b/docs/Get-AdoOperation.md @@ -14,7 +14,8 @@ Gets an operation from the the operationId using the given pluginId. ## SYNTAX ```powershell -Get-AdoOperation [-OperationId] [[-ApiVersion] ] [] +Get-AdoOperation [-OperationId] [[-ApiVersion] ] [-ProgressAction ] + [] ``` ## DESCRIPTION @@ -47,7 +48,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.1 +Accepted values: 5.1, 7.1-preview.1, 7.2-preview.1 Required: False Position: 1 @@ -72,6 +73,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### CommonParameters This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). diff --git a/docs/Get-AdoProcess.md b/docs/Get-AdoProcess.md index 350ffbe..cbac743 100644 --- a/docs/Get-AdoProcess.md +++ b/docs/Get-AdoProcess.md @@ -14,7 +14,8 @@ Get one or more available processes ## SYNTAX ```powershell -Get-AdoProcess [[-ProcessId] ] [[-ApiVersion] ] [] +Get-AdoProcess [[-ProcessId] ] [[-ApiVersion] ] [-ProgressAction ] + [] ``` ## DESCRIPTION @@ -87,7 +88,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.1 +Accepted values: 5.1, 7.1-preview.1, 7.2-preview.1 Required: False Position: 1 @@ -112,6 +113,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### CommonParameters This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). diff --git a/docs/Get-AdoProject.md b/docs/Get-AdoProject.md index c4177a5..53de1a0 100644 --- a/docs/Get-AdoProject.md +++ b/docs/Get-AdoProject.md @@ -14,7 +14,8 @@ Get one or many projects from Azure DevOps ## SYNTAX ```powershell -Get-AdoProject [[-ProjectId] ] [[-ApiVersion] ] [] +Get-AdoProject [[-ProjectId] ] [[-ApiVersion] ] [-ProgressAction ] + [] ``` ## DESCRIPTION @@ -78,7 +79,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.4 +Accepted values: 5.1, 7.1-preview.4, 7.2-preview.4 Required: False Position: 1 @@ -87,6 +88,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -ProjectId Project identifier diff --git a/docs/Get-AdoProjectProperty.md b/docs/Get-AdoProjectProperty.md index 0f99b9e..00d775c 100644 --- a/docs/Get-AdoProjectProperty.md +++ b/docs/Get-AdoProjectProperty.md @@ -14,7 +14,8 @@ Get a collection of team project Property ## SYNTAX ```powershell -Get-AdoProjectProperty [[-Project] ] [[-ApiVersion] ] [] +Get-AdoProjectProperty [[-Project] ] [[-ApiVersion] ] [-ProgressAction ] + [] ``` ## DESCRIPTION @@ -74,7 +75,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.1, 7.1-preview.1 +Accepted values: 5.1-preview.1, 7.1-preview.1, 7.2-preview.1 Required: False Position: 1 @@ -117,4 +118,4 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable [Connect-AdoOrganization](https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Connect-AdoOrganization.md#connect-adoorganization) -[Get-AdoProject](https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Get-AdoProject.md#get-adoproject) \ No newline at end of file +[Get-AdoProject](https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Get-AdoProject.md#get-adoproject) diff --git a/docs/Get-AdoTeam.md b/docs/Get-AdoTeam.md index f995e6d..ffe9e57 100644 --- a/docs/Get-AdoTeam.md +++ b/docs/Get-AdoTeam.md @@ -16,13 +16,15 @@ Get a specific team ### Project ```powershell -Get-AdoTeam [-Project ] [-TeamId ] [-ApiVersion ] [] +Get-AdoTeam [-Project ] [-TeamId ] [-ApiVersion ] [-ProgressAction ] + [] ``` ### ProjectId ```powershell -Get-AdoTeam [-ProjectId ] [-TeamId ] [-ApiVersion ] [] +Get-AdoTeam [-ProjectId ] [-TeamId ] [-ApiVersion ] [-ProgressAction ] + [] ``` ## DESCRIPTION @@ -91,7 +93,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.3, 7.1-preview.3 +Accepted values: 5.1-preview.3, 7.1-preview.3, 7.2-preview.3 Required: False Position: Named @@ -166,4 +168,4 @@ This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable [Connect-AdoOrganization](https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Connect-AdoOrganization.md#connect-adoorganization) -[Get-AdoProject](https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Get-AdoProject.md#get-adoproject) \ No newline at end of file +[Get-AdoProject](https://github.com/Azure-Devops-PowerShell-Module/core/blob/master/docs/Get-AdoProject.md#get-adoproject) diff --git a/docs/Get-AdoTeamMember.md b/docs/Get-AdoTeamMember.md index c89017f..75ab940 100644 --- a/docs/Get-AdoTeamMember.md +++ b/docs/Get-AdoTeamMember.md @@ -16,13 +16,15 @@ Get a list of members for a specific team. ### Project ```powershell -Get-AdoTeamMember [-Project ] [-TeamId ] [-ApiVersion ] [] +Get-AdoTeamMember [-Project ] [-TeamId ] [-ApiVersion ] + [-ProgressAction ] [] ``` ### ProjectId ```powershell -Get-AdoTeamMember [-ProjectId ] [-TeamId ] [-ApiVersion ] [] +Get-AdoTeamMember [-ProjectId ] [-TeamId ] [-ApiVersion ] + [-ProgressAction ] [] ``` ## DESCRIPTION @@ -75,7 +77,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.3, 7.1-preview.3 +Accepted values: 5.1-preview.3, 7.1-preview.3, 7.2-preview.2 Required: False Position: Named diff --git a/docs/Invoke-AdoEndpoint.md b/docs/Invoke-AdoEndpoint.md index a891a54..5cbe299 100644 --- a/docs/Invoke-AdoEndpoint.md +++ b/docs/Invoke-AdoEndpoint.md @@ -15,7 +15,7 @@ Query Azure Devops ```powershell Invoke-AdoEndpoint [-Uri] [-Method] [[-Headers] ] [[-ContentType] ] - [[-Body] ] [] + [[-Body] ] [-ProgressAction ] [] ``` ## DESCRIPTION @@ -99,6 +99,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Uri A proper Uri diff --git a/docs/New-AdoBuildFolder.md b/docs/New-AdoBuildFolder.md index 61eb92f..174b033 100644 --- a/docs/New-AdoBuildFolder.md +++ b/docs/New-AdoBuildFolder.md @@ -16,15 +16,15 @@ Creates a new folder ### Project ```powershell -New-AdoBuildFolder [-Project ] -Name [-Description ] [-ApiVersion ] [-WhatIf] - [-Confirm] [] +New-AdoBuildFolder [-Project ] -Name [-Description ] [-ApiVersion ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ### ProjectId ```powershell -New-AdoBuildFolder [-ProjectId ] -Name [-Description ] [-ApiVersion ] [-WhatIf] - [-Confirm] [] +New-AdoBuildFolder [-ProjectId ] -Name [-Description ] [-ApiVersion ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -46,7 +46,6 @@ createdBy : @{displayName=Jeffrey Patton; url=https://spsprodeus27.vssps.visua imageUrl=https://dev.azure.com/patton-tech/_apis/GraphProfile/MemberAvatars/aad.ZGQwYzI1YzQtNGY3MC03MThkLTgzNWYtYzJkMzlkZDRiNTA0; descriptor=aad.ZGQwYzI1YzQtNGY3MC03MThkLTgzNWYtYzJkMzlkZDRiNTA0} project : @{id=c31a2770-9aee-4799-a078-eee0dc12cbf4; name=AzDevOps; description=A project for working with Azure Devops using PowerShell; url=https://dev.azure.com/patton-tech/_apis/projects/c31a2770-9aee-4799-a078-eee0dc12cbf4; state=wellFormed; revision=515330752; visibility=public; lastUpdateTime=4/10/2020 4:22:12 AM} - ``` Creating a folder @@ -61,7 +60,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.2, 7.1-preview.2 +Accepted values: 5.1-preview.2, 7.1-preview.2, 7.2-preview.2 Required: False Position: Named @@ -102,6 +101,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project The project diff --git a/docs/New-AdoProject.md b/docs/New-AdoProject.md index 6f38b65..4882800 100644 --- a/docs/New-AdoProject.md +++ b/docs/New-AdoProject.md @@ -13,9 +13,9 @@ Queues a project to be created ## SYNTAX -``` -New-AdoProject [-Name] [[-Description] ] [[-ApiVersion] ] [-WhatIf] [-Confirm] - [] +```powershell +New-AdoProject [-Name] [[-Description] ] [[-ApiVersion] ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -47,7 +47,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.4 +Accepted values: 5.1, 7.1-preview.4, 7.2-preview.4 Required: False Position: 2 @@ -88,6 +88,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Confirm Prompts you for confirmation before running the cmdlet. diff --git a/docs/New-AdoTeam.md b/docs/New-AdoTeam.md index d9eb885..5ffdbeb 100644 --- a/docs/New-AdoTeam.md +++ b/docs/New-AdoTeam.md @@ -14,8 +14,8 @@ Create a team in a team project ## SYNTAX ```powershell -New-AdoTeam [-Name] [[-Description] ] [[-Project] ] [[-ApiVersion] ] [-WhatIf] - [-Confirm] [] +New-AdoTeam [-Name] [[-Description] ] [[-Project] ] [[-ApiVersion] ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -70,7 +70,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.3, 7.1-preview.3 +Accepted values: 5.1-preview.3, 7.1-preview.3, 7.2-preview.3 Required: False Position: 3 @@ -111,6 +111,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project A project object diff --git a/docs/Remove-AdoBuild.md b/docs/Remove-AdoBuild.md index d7b5349..f439af3 100644 --- a/docs/Remove-AdoBuild.md +++ b/docs/Remove-AdoBuild.md @@ -16,15 +16,15 @@ Deletes a build ### Project ```powershell -Remove-AdoBuild [-Project ] -BuildId [-ApiVersion ] [-WhatIf] [-Confirm] - [] +Remove-AdoBuild [-Project ] -BuildId [-ApiVersion ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ### ProjectId ```powershell -Remove-AdoBuild [-ProjectId ] -BuildId [-ApiVersion ] [-WhatIf] [-Confirm] - [] +Remove-AdoBuild [-ProjectId ] -BuildId [-ApiVersion ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -53,7 +53,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.7 +Accepted values: 5.1, 7.1-preview.7, 7.2-preview.2 Required: False Position: Named @@ -78,6 +78,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project Project diff --git a/docs/Remove-AdoBuildFolder.md b/docs/Remove-AdoBuildFolder.md index 6389ae8..5f3acb7 100644 --- a/docs/Remove-AdoBuildFolder.md +++ b/docs/Remove-AdoBuildFolder.md @@ -16,15 +16,15 @@ Deletes a definition folder ### Project ```powershell -Remove-AdoBuildFolder [-Project ] -Name [-ApiVersion ] [-WhatIf] [-Confirm] - [] +Remove-AdoBuildFolder [-Project ] -Name [-ApiVersion ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ### ProjectId ```powershell -Remove-AdoBuildFolder [-ProjectId ] -Name [-ApiVersion ] [-WhatIf] [-Confirm] - [] +Remove-AdoBuildFolder [-ProjectId ] -Name [-ApiVersion ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -48,7 +48,6 @@ Performing the operation "Remove Folder TestFolder from AzDevOps Azure Devops Pr path createdOn project ---- --------- ------- \ 4/8/2020 2:46:31 PM @{id=c31a2770-9aee-4799-a078-eee0dc12cbf4; name=AzDevOps; description=A project for working with Azure Devops using PowerShell; url=https://dev.azure.com/patton-tech/_apis/projects/c… - ``` Remove a folder @@ -63,7 +62,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.0-preview.2, 7.1-preview.2 +Accepted values: 5.0-preview.2, 7.1-preview.2, 7.2-preview.2 Required: False Position: Named @@ -88,6 +87,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project Project diff --git a/docs/Remove-AdoProject.md b/docs/Remove-AdoProject.md index 00f02f5..2dd000a 100644 --- a/docs/Remove-AdoProject.md +++ b/docs/Remove-AdoProject.md @@ -14,7 +14,8 @@ Queues a project to be deleted ## SYNTAX ```powershell -Remove-AdoProject [-Project] [[-ApiVersion] ] [-WhatIf] [-Confirm] [] +Remove-AdoProject [-Project] [[-ApiVersion] ] [-ProgressAction ] [-WhatIf] + [-Confirm] [] ``` ## DESCRIPTION @@ -61,7 +62,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.4 +Accepted values: 5.1, 7.1-preview.4, 7.2-preview.4 Required: False Position: 1 @@ -70,6 +71,22 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project This is a project as returned from Get-AdoProject diff --git a/docs/Remove-AdoTeam.md b/docs/Remove-AdoTeam.md index be3e5f9..da259de 100644 --- a/docs/Remove-AdoTeam.md +++ b/docs/Remove-AdoTeam.md @@ -13,9 +13,9 @@ Delete a team. ## SYNTAX -```powershell -Remove-AdoTeam [-ProjectId] [-TeamId] [[-ApiVersion] ] [-WhatIf] [-Confirm] - [] +``` +Remove-AdoTeam [-ProjectId] [-TeamId] [[-ApiVersion] ] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -47,7 +47,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.3, 7.1-preview.3 +Accepted values: 5.1-preview.3, 7.1-preview.3, 7.2-preview.3 Required: False Position: 2 @@ -56,6 +56,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -ProjectId A Project Id @@ -122,7 +137,6 @@ Accept wildcard characters: False ``` ### CommonParameters - This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). ## INPUTS diff --git a/docs/Start-AdoBuild.md b/docs/Start-AdoBuild.md index 688024d..94d14ec 100644 --- a/docs/Start-AdoBuild.md +++ b/docs/Start-AdoBuild.md @@ -14,17 +14,15 @@ Queues a build ## SYNTAX ### Project - -```powershell +``` Start-AdoBuild -Project -Definition [-Variables ] [-Wait] [-ApiVersion ] - [-WhatIf] [-Confirm] [] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ### ProjectId - -```powershell +``` Start-AdoBuild -ProjectId -DefinitionId [-Variables ] [-Wait] - [-ApiVersion ] [-WhatIf] [-Confirm] [] + [-ApiVersion ] [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -100,7 +98,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.7 +Accepted values: 5.1, 7.1-preview.7, 7.2-preview.2 Required: False Position: Named @@ -141,6 +139,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project Project @@ -239,7 +252,6 @@ Accept wildcard characters: False ``` ### CommonParameters - This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). ## INPUTS diff --git a/docs/Update-AdoProject.md b/docs/Update-AdoProject.md index 6554e3e..d9826eb 100644 --- a/docs/Update-AdoProject.md +++ b/docs/Update-AdoProject.md @@ -13,9 +13,9 @@ Update Name, Description or Abbreviation of a project ## SYNTAX -```powershell +``` Update-AdoProject [[-Name] ] [[-Description] ] [-Project] [[-ApiVersion] ] - [-WhatIf] [-Confirm] [] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -73,7 +73,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1, 7.1-preview.4 +Accepted values: 5.1, 7.1-preview.4, 7.2-preview.4 Required: False Position: 3 @@ -114,6 +114,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Project A project object as returned from Get-AdoProject @@ -164,7 +179,6 @@ Accept wildcard characters: False ``` ### CommonParameters - This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). ## INPUTS diff --git a/docs/Update-AdoTeam.md b/docs/Update-AdoTeam.md index bbf8130..fc7d439 100644 --- a/docs/Update-AdoTeam.md +++ b/docs/Update-AdoTeam.md @@ -13,9 +13,9 @@ Update a team's name and/or description ## SYNTAX -```powershell +``` Update-AdoTeam [[-Name] ] [[-Description] ] [[-Team] ] [[-ApiVersion] ] - [-WhatIf] [-Confirm] [] + [-ProgressAction ] [-WhatIf] [-Confirm] [] ``` ## DESCRIPTION @@ -70,7 +70,7 @@ A valid API Version for this endpoint Type: System.String Parameter Sets: (All) Aliases: -Accepted values: 5.1-preview.3, 7.1-preview.3 +Accepted values: 5.1-preview.3, 7.1-preview.3, 7.2-preview.3 Required: False Position: 3 @@ -111,6 +111,21 @@ Accept pipeline input: False Accept wildcard characters: False ``` +### -ProgressAction +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + ### -Team A Team Object @@ -161,7 +176,6 @@ Accept wildcard characters: False ``` ### CommonParameters - This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). ## INPUTS From 28f64c79f86cef38859490c5916aab5f389e8551 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 23:13:16 -0500 Subject: [PATCH 23/24] Added git documentation --- docs/Get-AdoRepository.md | 157 +++++++++++++++++++++++ docs/New-AdoRepository.md | 240 +++++++++++++++++++++++++++++++++++ docs/Remove-AdoRepository.md | 171 +++++++++++++++++++++++++ 3 files changed, 568 insertions(+) create mode 100644 docs/Get-AdoRepository.md create mode 100644 docs/New-AdoRepository.md create mode 100644 docs/Remove-AdoRepository.md diff --git a/docs/Get-AdoRepository.md b/docs/Get-AdoRepository.md new file mode 100644 index 0000000..e7260df --- /dev/null +++ b/docs/Get-AdoRepository.md @@ -0,0 +1,157 @@ +--- +external help file: AzDevOps-help.xml +Module Name: AzDevOps +online version: https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Get-AdoRepository.md#get-adorepository +schema: 2.0.0 +--- + +# Get-AdoRepository + +## SYNOPSIS + +Retrieve a git repository. + +## SYNTAX + +### Project + +```powershell +Get-AdoRepository [-Project ] [-Name ] [-ApiVersion ] + [-ProgressAction ] [] +``` + +### ProjectId + +```powershell +Get-AdoRepository [-ProjectId ] [-Name ] [-ApiVersion ] + [-ProgressAction ] [] +``` + +## DESCRIPTION + +Retrieve a git repository. + +## EXAMPLES + +### Example 1 + +```powershell +PS C:\> Get-AdoRepository -Project $Project -Name 'my repo' + +id : 7d8deb7b-863a-4ef3-bb75-83b4e6ae369a +name : my repo +url : https://dev.azure.com/myorg/44b34ea4-9831-4539-9c9f-925b9533ebf8/_apis/git/repositories/7d8deb7b-863a-4ef3-bb75-83b4e6ae369a +project : @{id=44b34ea4-9831-4539-9c9f-925b9533ebf8; name=MyProject; + url=https://dev.azure.com/myorg/_apis/projects/44b34ea4-9831-4539-9c9f-925b9533ebf8; state=wellFormed; revision=2249; visibility=private; + lastUpdateTime=7/19/2024 10:08:11 PM} +size : 0 +remoteUrl : https://myorg@dev.azure.com/myorg/MyProject/_git/my%20repo +sshUrl : git@ssh.dev.azure.com:v3/myorg/MyProject/my%20repo +webUrl : https://dev.azure.com/myorg/MyProject/_git/my%20repo +_links : @{self=; project=; web=; ssh=; commits=; refs=; pullRequests=; items=; pushes=} +isDisabled : False +isInMaintenance : False +``` + +Get a repository + +## PARAMETERS + +### -ApiVersion + +Version of the API to use. This should be set to '7.2-preview.1' to use this version of the api. + +```yaml +Type: System.String +Parameter Sets: (All) +Aliases: +Accepted values: 7.0, 7.2-preview.1 + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Name + +Name of the repository + +```yaml +Type: System.String +Parameter Sets: (All) +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Project + +The Project where the repository is located + +```yaml +Type: System.Object +Parameter Sets: Project +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -ProjectId + +The Project Id where the repository is located + +```yaml +Type: System.Guid +Parameter Sets: ProjectId +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters + +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +### System.Object + +## OUTPUTS + +### System.Object + +## NOTES + +## RELATED LINKS + +[https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Get-AdoRepository.md#get-adorepository](https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Get-AdoRepository.md#get-adorepository) diff --git a/docs/New-AdoRepository.md b/docs/New-AdoRepository.md new file mode 100644 index 0000000..0b5e7fa --- /dev/null +++ b/docs/New-AdoRepository.md @@ -0,0 +1,240 @@ +--- +external help file: AzDevOps-help.xml +Module Name: AzDevOps +online version: https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/New-AdoRepository.md#new-adorepository +schema: 2.0.0 +--- + +# New-AdoRepository + +## SYNOPSIS + +Create a git repository in a team project. + +## SYNTAX + +### Fork + +```powershell +New-AdoRepository -Project -Name -ParentRepositoryId [-ParentProjectId ] + [-ApiVersion ] [-ProgressAction ] [-WhatIf] [-Confirm] [] +``` + +### Repo + +```powershell +New-AdoRepository -Project -Name [-ApiVersion ] [-ProgressAction ] + [-WhatIf] [-Confirm] [] +``` + +## DESCRIPTION + +Create a git repository in a team project. + +## EXAMPLES + +### Example 1 + +```powershell +PS C:\> New-AdoRepository -Project $Project -Name 'my repo' -Verbose +id : 7d8deb7b-863a-4ef3-bb75-83b4e6ae369a +name : my repo +url : https://dev.azure.com/myorg/44b34ea4-9831-4539-9c9f-925b9533ebf8/_apis/git/repositories/7d8deb7b-863a-4ef3-bb75-83b4e6ae369a +project : @{id=44b34ea4-9831-4539-9c9f-925b9533ebf8; name=MyProject; + url=https://dev.azure.com/myorg/_apis/projects/44b34ea4-9831-4539-9c9f-925b9533ebf8; state=wellFormed; revision=2249; visibility=private; + lastUpdateTime=7/19/2024 10:08:11 PM} +size : 0 +remoteUrl : https://myorg@dev.azure.com/myorg/MyProject/_git/my%20repo +sshUrl : git@ssh.dev.azure.com:v3/myorg/MyProject/my%20repo +webUrl : https://dev.azure.com/myorg/MyProject/_git/my%20repo +isDisabled : False +isInMaintenance : False +``` + +Create a new repository inside your project + +### Example 2 + +```powershell +PS C:\> New-AdoRepository -Project $Project -Name 'my forked repo' -ParentRepository 'ad319ad2-9eea-4c36-abca-cdcaebf41e91' -Verbose +id : 3b0b9d6c-6ad4-41c4-a1d6-6668cd7515d5 +name : my forked repo +url : https://dev.azure.com/myorg/44b34ea4-9831-4539-9c9f-925b9533ebf8/_apis/git/repositories/3b0b9d6c-6ad4-41c4-a1d6-6668cd7515d5 +project : @{id=44b34ea4-9831-4539-9c9f-925b9533ebf8; name=MyProject; + url=https://dev.azure.com/myorg/_apis/projects/44b34ea4-9831-4539-9c9f-925b9533ebf8; state=wellFormed; revision=2249; visibility=private; + lastUpdateTime=7/19/2024 10:08:11 PM} +size : 0 +remoteUrl : https://myorg@dev.azure.com/myorg/MyProject/_git/my%20forked%20repo +sshUrl : git@ssh.dev.azure.com:v3/myorg/MyProject/my%20forked%20repo +webUrl : https://dev.azure.com/myorg/MyProject/_git/my%20forked%20repo +isFork : True +_links : @{self=; project=; web=; ssh=; commits=; refs=; pullRequests=; items=; pushes=; forkSyncOperation=} +isDisabled : False +isInMaintenance : False +``` + +Create a forked repository inside your project + +## PARAMETERS + +### -ApiVersion + +Version of the API to use. This should be set to '7.2-preview.1' to use this version of the api. + +```yaml +Type: System.String +Parameter Sets: (All) +Aliases: +Accepted values: 7.0, 7.2-preview.1 + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Name + +Name of the repository to create + +```yaml +Type: System.String +Parameter Sets: Fork +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +```yaml +Type: System.String +Parameter Sets: Repo +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -ParentProjectId + +Project where the repository to fork is located + +```yaml +Type: System.String +Parameter Sets: Fork +Aliases: + +Required: False +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -ParentRepositoryId + +Id of the repository the fork will be created from + +```yaml +Type: System.String +Parameter Sets: Fork +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Project + +The Project to create the repository in + +```yaml +Type: System.Object +Parameter Sets: (All) +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -Confirm + +Prompts you for confirmation before running the cmdlet. + +```yaml +Type: System.Management.Automation.SwitchParameter +Parameter Sets: (All) +Aliases: cf + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -WhatIf + +Shows what would happen if the cmdlet runs. +The cmdlet is not run. + +```yaml +Type: System.Management.Automation.SwitchParameter +Parameter Sets: (All) +Aliases: wi + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters + +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +### System.Object + +### System.String + +## OUTPUTS + +### System.Object + +## NOTES + +## RELATED LINKS + +[https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/New-AdoRepository.md#new-adorepository](https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/New-AdoRepository.md#new-adorepository) diff --git a/docs/Remove-AdoRepository.md b/docs/Remove-AdoRepository.md new file mode 100644 index 0000000..21296a7 --- /dev/null +++ b/docs/Remove-AdoRepository.md @@ -0,0 +1,171 @@ +--- +external help file: AzDevOps-help.xml +Module Name: AzDevOps +online version: https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Remove-AdoRepository.md#remove-adorepository +schema: 2.0.0 +--- + +# Remove-AdoRepository + +## SYNOPSIS + +Delete a git repository + +## SYNTAX + +### Project + +```powershell +Remove-AdoRepository -Project -Repository [-ApiVersion ] + [-ProgressAction ] [] +``` + +### ProjectId + +```powershell +Remove-AdoRepository -ProjectId -RepositoryId [-ApiVersion ] + [-ProgressAction ] [] +``` + +## DESCRIPTION + +Delete a git repository + +## EXAMPLES + +### Example 1 + +```powershell +PS C:\> Remove-AdoRepository -Project $Project -Repository $r -Verbose +VERBOSE: RemoveRepository: Begin Processing +VERBOSE: ProjectId: 44b34ea4-9831-4539-9c9f-925b9533ebf8 +VERBOSE: RepositoryId: 7d8deb7b-863a-4ef3-bb75-83b4e6ae369a +VERBOSE: ApiVersion: 7.2-preview.1 +VERBOSE: Uri: https://dev.azure.com/myorg/44b34ea4-9831-4539-9c9f-925b9533ebf8/_apis/git/repositories/7d8deb7b-863a-4ef3-bb75-83b4e6ae369a?api-version=7.2-preview.1 +VERBOSE: InvokeEndpoint : Begin Processing +VERBOSE: Uri : https://dev.azure.com/myorg/44b34ea4-9831-4539-9c9f-925b9533ebf8/_apis/git/repositories/7d8deb7b-863a-4ef3-bb75-83b4e6ae369a?api-version=7.2-preview.1 +VERBOSE: Method : DELETE +VERBOSE: Headers : System.Collections.Hashtable +VERBOSE: Requested HTTP/1.1 DELETE with 0-byte payload +VERBOSE: Received HTTP/1.1 response of content type of unknown size +VERBOSE: Content encoding: utf-8 +``` + +Delete repository + +## PARAMETERS + +### -ApiVersion + +Version of the API to use. This should be set to '7.2-preview.1' to use this version of the api. + +```yaml +Type: System.String +Parameter Sets: (All) +Aliases: +Accepted values: 7.0, 7.2-preview.1 + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -ProgressAction + +{{ Fill ProgressAction Description }} + +```yaml +Type: System.Management.Automation.ActionPreference +Parameter Sets: (All) +Aliases: proga + +Required: False +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Project + +Project where the repository is located + +```yaml +Type: System.Object +Parameter Sets: Project +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -ProjectId + +Project where the repository is located + +```yaml +Type: System.Guid +Parameter Sets: ProjectId +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### -Repository + +The repository to remove + +```yaml +Type: System.Object +Parameter Sets: Project +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: True (ByValue) +Accept wildcard characters: False +``` + +### -RepositoryId + +The repository to remove + +```yaml +Type: System.String +Parameter Sets: ProjectId +Aliases: + +Required: True +Position: Named +Default value: None +Accept pipeline input: False +Accept wildcard characters: False +``` + +### CommonParameters + +This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable, -InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose, -WarningAction, and -WarningVariable. For more information, see [about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216). + +## INPUTS + +### System.Object + +## OUTPUTS + +### System.Object + +## NOTES + +## RELATED LINKS + +[https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Remove-AdoRepository.md#remove-adorepository](https://github.com/Azure-Devops-PowerShell-Module/AzDevOps/blob/master/docs/Remove-AdoRepository.md#remove-adorepository) From 0dfbf0346c8fa899279f706d6e12ce5fd96830a5 Mon Sep 17 00:00:00 2001 From: Jeff Patton Date: Fri, 19 Jul 2024 23:14:44 -0500 Subject: [PATCH 24/24] Updated readme and external help --- README.md | 44 +++++++++--------- ...02-a138-6324174cda61_en-US_HelpContent.cab | Bin 21460 -> 24591 bytes ...02-a138-6324174cda61_en-US_HelpContent.zip | Bin 26006 -> 29737 bytes 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 548e42b..0a239b0 100644 --- a/README.md +++ b/README.md @@ -36,91 +36,91 @@ This module provides the ability to manage and work with an Azure Devops organiz ## AzDevOps Cmdlets -### [Connect-AdoOrganization](docs/Connect-AdoOrganization.md) +### [Connect-AdoOrganization](Docs/Connect-AdoOrganization.md) This function will connect to Azure DevOps -### [Get-AdoBuild](docs/Get-AdoBuild.md) +### [Get-AdoBuild](Docs/Get-AdoBuild.md) Return one or more builds from a project -### [Get-AdoBuildDefinition](docs/Get-AdoBuildDefinition.md) +### [Get-AdoBuildDefinition](Docs/Get-AdoBuildDefinition.md) Gets a definition, optionally at a specific revision. -### [Get-AdoBuildFolder](docs/Get-AdoBuildFolder.md) +### [Get-AdoBuildFolder](Docs/Get-AdoBuildFolder.md) Gets a list of build definition folders -### [Get-AdoBuildLog](docs/Get-AdoBuildLog.md) +### [Get-AdoBuildLog](Docs/Get-AdoBuildLog.md) Gets the logs for a build -### [Get-AdoOperation](docs/Get-AdoOperation.md) +### [Get-AdoOperation](Docs/Get-AdoOperation.md) Gets an operation from the the operationId using the given pluginId. -### [Get-AdoProcess](docs/Get-AdoProcess.md) +### [Get-AdoProcess](Docs/Get-AdoProcess.md) Get one or more available processes -### [Get-AdoProject](docs/Get-AdoProject.md) +### [Get-AdoProject](Docs/Get-AdoProject.md) Get one or many projects from Azure DevOps -### [Get-AdoProjectProperty](docs/Get-AdoProjectProperty.md) +### [Get-AdoProjectProperty](Docs/Get-AdoProjectProperty.md) Get a collection of team project Property -### [Get-AdoTeam](docs/Get-AdoTeam.md) +### [Get-AdoTeam](Docs/Get-AdoTeam.md) Get a specific team -### [Get-AdoTeamMember](docs/Get-AdoTeamMember.md) +### [Get-AdoTeamMember](Docs/Get-AdoTeamMember.md) Get a list of members for a specific team. -### [Invoke-AdoEndpoint](docs/Invoke-AdoEndpoint.md) +### [Invoke-AdoEndpoint](Docs/Invoke-AdoEndpoint.md) Query Azure Devops -### [New-AdoBuildFolder](docs/New-AdoBuildFolder.md) +### [New-AdoBuildFolder](Docs/New-AdoBuildFolder.md) Creates a new folder -### [New-AdoProject](docs/New-AdoProject.md) +### [New-AdoProject](Docs/New-AdoProject.md) Queues a project to be created -### [New-AdoTeam](docs/New-AdoTeam.md) +### [New-AdoTeam](Docs/New-AdoTeam.md) Create a team in a team project -### [Remove-AdoBuild](docs/Remove-AdoBuild.md) +### [Remove-AdoBuild](Docs/Remove-AdoBuild.md) Deletes a build -### [Remove-AdoBuildFolder](docs/Remove-AdoBuildFolder.md) +### [Remove-AdoBuildFolder](Docs/Remove-AdoBuildFolder.md) Deletes a definition folder -### [Remove-AdoProject](docs/Remove-AdoProject.md) +### [Remove-AdoProject](Docs/Remove-AdoProject.md) Queues a project to be deleted -### [Remove-AdoTeam](docs/Remove-AdoTeam.md) +### [Remove-AdoTeam](Docs/Remove-AdoTeam.md) Delete a team. -### [Start-AdoBuild](docs/Start-AdoBuild.md) +### [Start-AdoBuild](Docs/Start-AdoBuild.md) Queues a build -### [Update-AdoProject](docs/Update-AdoProject.md) +### [Update-AdoProject](Docs/Update-AdoProject.md) Update Name, Description or Abbreviation of a project -### [Update-AdoTeam](docs/Update-AdoTeam.md) +### [Update-AdoTeam](Docs/Update-AdoTeam.md) Update a team's name and/or description diff --git a/cabs/AzDevOps_e7709937-8444-4c02-a138-6324174cda61_en-US_HelpContent.cab b/cabs/AzDevOps_e7709937-8444-4c02-a138-6324174cda61_en-US_HelpContent.cab index 106189a073f6ffbf95341ac884f1b613817aaa32..dd7738430f2d76d2559b8fc5e4c35181093472aa 100644 GIT binary patch delta 18760 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≫{9~-l%$BYsWpyNrDUMU!Q=oxlUh)a*|~5RO5LB; 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 E12R=JHvj+t diff --git a/cabs/AzDevOps_e7709937-8444-4c02-a138-6324174cda61_en-US_HelpContent.zip b/cabs/AzDevOps_e7709937-8444-4c02-a138-6324174cda61_en-US_HelpContent.zip index 770b335cd6cc7afb5904cf900a45cea3c366c908..66609ffedfcfe6473231d25424304c64d918d2f6 100644 GIT binary patch delta 20362 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 delta 16648 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