diff --git a/eng/common/scripts/Delete-RemoteBranches.ps1 b/eng/common/scripts/Delete-RemoteBranches.ps1 index 66913163bf4..0dd20150589 100644 --- a/eng/common/scripts/Delete-RemoteBranches.ps1 +++ b/eng/common/scripts/Delete-RemoteBranches.ps1 @@ -2,25 +2,27 @@ param( $RepoOwner, $RepoName, $BranchPrefix, - $WorkingDirectory, $AuthToken ) . "${PSScriptRoot}\common.ps1" -pushd $WorkingDirectory -git clone https://github.com/$RepoOwner/$RepoName.git -pushd $RepoName -$syncBranches = git branch -r --list origin/$BranchPrefix* | % { $_ -replace "origin/", "" } - LogDebug "Operating on Repo [ $RepoName ]" -foreach ($branch in $syncBranches) +try{ + $branches = (List-References -RepoOwner $RepoOwner -RepoName $RepoName -Ref "heads/$BranchPrefix").ref +} +catch { + LogError "List-References failed with exception:`n$_" + exit 1 +} + +foreach ($branch in $branches) { try { - $branchName = $branch.Trim() + $branchName = $branch.Replace("refs/heads/","") $head = "${RepoOwner}/${RepoName}:${branchName}" LogDebug "Operating on branch [ $branchName ]" - $response = List-PullRequests -RepoOwner $RepoOwner -RepoName $RepoName -head $head -AuthToken $AuthToken + $pullRequests = List-PullRequests -RepoOwner $RepoOwner -RepoName $RepoName -head $head } catch { @@ -28,16 +30,19 @@ foreach ($branch in $syncBranches) exit 1 } - if ($response.Count -eq 0) + "bvranch $branch" + "PR COunt $($pullRequests.Count)" + + + if ($pullRequests.Count -eq 0) { LogDebug "Branch [ $branchName ] in repo [ $RepoName ] has no associated Pull Request. Deleting Branch" - git push origin --delete $branchName - if ($lastExitCode -ne 0) { - Write-Host "Failed to delete branch [ $branchName ] in repo [ $RepoName ]" + try{ + Delete-References -RepoOwner $RepoOwner -RepoName $RepoName -Ref ($branch.Remove(0,5)) + } + catch { + LogError "Delete-References failed with exception:`n$_" exit 1 } } -} - -popd -popd +} \ No newline at end of file diff --git a/eng/common/scripts/Invoke-GitHubAPI.ps1 b/eng/common/scripts/Invoke-GitHubAPI.ps1 index e2836856dc9..22f370f3202 100644 --- a/eng/common/scripts/Invoke-GitHubAPI.ps1 +++ b/eng/common/scripts/Invoke-GitHubAPI.ps1 @@ -47,6 +47,24 @@ function Invoke-GitHubAPIPatch { return $resp } +function Invoke-GitHubAPIDelete { + param ( + [Parameter(Mandatory = $true)] + $apiURI, + [Parameter(Mandatory = $true)] + $token + ) + + $resp = Invoke-RestMethod ` + -Method DELETE ` + -Uri $apiURI ` + -Headers (Get-GitHubHeaders -token $token) ` + -MaximumRetryCount 3 + + return $resp +} + + function Invoke-GitHubAPIGet { param ( [Parameter(Mandatory = $true)] @@ -105,6 +123,27 @@ function List-PullRequests { return Invoke-GitHubAPIGet -apiURI $uri } +# +<# +.PARAMETER Ref +Ref to search for +Pass 'heads/ ,tags/, or nothing +#> +function List-References { + param ( + [Parameter(Mandatory = $true)] + $RepoOwner, + [Parameter(Mandatory = $true)] + $RepoName, + $Ref + ) + + $uri = "$GithubAPIBaseURI/$RepoOwner/$RepoName/git/matching-refs/" + if ($Ref) { $uri += "$Ref" } + + return Invoke-GitHubAPIGet -apiURI $uri +} + function Add-IssueComment { param ( [Parameter(Mandatory = $true)] @@ -229,4 +268,27 @@ function Update-Issue { } return Invoke-GitHubAPIPatch -apiURI $uri -body $parameters -token $AuthToken +} + +function Delete-References { + param ( + [Parameter(Mandatory = $true)] + $RepoOwner, + [Parameter(Mandatory = $true)] + $RepoName, + [ValidateNotNullOrEmpty()] + [Parameter(Mandatory = $true)] + $Ref, + [Parameter(Mandatory = $true)] + $AuthToken + ) + + if ($Ref.Trim().Length -eq 0) + { + throw "You must supply a valid 'Ref' Parameter to 'Delete-Reference'." + } + + $uri = "$GithubAPIBaseURI/$RepoOwner/$RepoName/git/refs/$Ref" + + return Invoke-GitHubAPIDelete -apiURI $uri -token $AuthToken } \ No newline at end of file