From d29703c0883a1f2e29e65bb8c470e80e634775c3 Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 12 Oct 2020 10:17:07 -0700 Subject: [PATCH 1/4] Add pipeline configuration for cleaning up upstream branches --- eng/common/scripts/Delete-Remote-Branches.ps1 | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 eng/common/scripts/Delete-Remote-Branches.ps1 diff --git a/eng/common/scripts/Delete-Remote-Branches.ps1 b/eng/common/scripts/Delete-Remote-Branches.ps1 new file mode 100644 index 000000000000..71dcf3982eca --- /dev/null +++ b/eng/common/scripts/Delete-Remote-Branches.ps1 @@ -0,0 +1,43 @@ +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 { + $branchName = $branch.Trim() + $head = "${RepoOwner}/${RepoName}:${branchName}" + LogDebug "Operating on branch [ $branchName ]" + $response = ListPullRequests -RepoOwner $RepoOwner -RepoName $RepoName -head $head + } + catch + { + LogError "ListPullRequests failed with exception:`n$_" + exit 1 + } + + if ($response.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 ]" + exit 1 + } + } +} + +popd +popd From c5eb524a9c8179a70544043fa93c581f49e478cd Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 12 Oct 2020 11:32:31 -0700 Subject: [PATCH 2/4] Fix powershell naming --- .../{Delete-Remote-Branches.ps1 => Delete-RemoteBranches.ps1} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename eng/common/scripts/{Delete-Remote-Branches.ps1 => Delete-RemoteBranches.ps1} (84%) diff --git a/eng/common/scripts/Delete-Remote-Branches.ps1 b/eng/common/scripts/Delete-RemoteBranches.ps1 similarity index 84% rename from eng/common/scripts/Delete-Remote-Branches.ps1 rename to eng/common/scripts/Delete-RemoteBranches.ps1 index 71dcf3982eca..66913163bf4b 100644 --- a/eng/common/scripts/Delete-Remote-Branches.ps1 +++ b/eng/common/scripts/Delete-RemoteBranches.ps1 @@ -20,11 +20,11 @@ foreach ($branch in $syncBranches) $branchName = $branch.Trim() $head = "${RepoOwner}/${RepoName}:${branchName}" LogDebug "Operating on branch [ $branchName ]" - $response = ListPullRequests -RepoOwner $RepoOwner -RepoName $RepoName -head $head + $response = List-PullRequests -RepoOwner $RepoOwner -RepoName $RepoName -head $head -AuthToken $AuthToken } catch { - LogError "ListPullRequests failed with exception:`n$_" + LogError "List-PullRequests failed with exception:`n$_" exit 1 } From 2a9db398896ae91264a5f5bc032dc3b234532a14 Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 12 Oct 2020 18:35:52 -0700 Subject: [PATCH 3/4] Switch to use github API --- eng/common/scripts/Delete-RemoteBranches.ps1 | 39 ++++++------ eng/common/scripts/Invoke-GitHubAPI.ps1 | 62 ++++++++++++++++++++ 2 files changed, 84 insertions(+), 17 deletions(-) diff --git a/eng/common/scripts/Delete-RemoteBranches.ps1 b/eng/common/scripts/Delete-RemoteBranches.ps1 index 66913163bf4b..0dd201505891 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 e2836856dc9f..22f370f3202f 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 From 71659d87381ddcdcc269951ec2ee5a7bc4e5067b Mon Sep 17 00:00:00 2001 From: Chidozie Ononiwu Date: Mon, 12 Oct 2020 18:40:24 -0700 Subject: [PATCH 4/4] Use github API to delete branches --- eng/common/scripts/Delete-RemoteBranches.ps1 | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/eng/common/scripts/Delete-RemoteBranches.ps1 b/eng/common/scripts/Delete-RemoteBranches.ps1 index 0dd201505891..da55471ef25f 100644 --- a/eng/common/scripts/Delete-RemoteBranches.ps1 +++ b/eng/common/scripts/Delete-RemoteBranches.ps1 @@ -30,15 +30,11 @@ foreach ($branch in $branches) exit 1 } - "bvranch $branch" - "PR COunt $($pullRequests.Count)" - - if ($pullRequests.Count -eq 0) { LogDebug "Branch [ $branchName ] in repo [ $RepoName ] has no associated Pull Request. Deleting Branch" try{ - Delete-References -RepoOwner $RepoOwner -RepoName $RepoName -Ref ($branch.Remove(0,5)) + Delete-References -RepoOwner $RepoOwner -RepoName $RepoName -Ref ($branch.Remove(0,5)) -AuthToken $AuthToken } catch { LogError "Delete-References failed with exception:`n$_"