1
1
[CmdletBinding (SupportsShouldProcess )]
2
2
param (
3
3
# Please use the RepoOwner/RepoName format: e.g. Azure/azure-sdk-for-java
4
- $RepoId = " $RepoOwner /$RepoName " ,
5
- # Upstream repo to check and see if there are existing open PRs from before deleting branch
6
- $UpstreamRepoId ,
4
+ $RepoId ,
7
5
# CentralRepoId the original PR to generate sync PR. E.g Azure/azure-sdk-tools for eng/common
8
6
$CentralRepoId ,
9
7
# We start from the sync PRs, use the branch name to get the PR number of central repo. E.g. sync-eng/common-(<branchName>)-(<PrNumber>). Have group name on PR number.
@@ -14,126 +12,121 @@ param(
14
12
[AllowNull ()]
15
13
[DateTime ]$LastCommitOlderThan ,
16
14
[Switch ]$DeleteBranchesEvenIfThereIsOpenPR = $false ,
17
- [Parameter (Mandatory = $true )]
18
15
$AuthToken
19
16
)
20
17
Set-StrictMode - version 3
21
18
22
19
. (Join-Path $PSScriptRoot common.ps1)
23
20
24
- LogDebug " Operating on Repo [ $RepoId ]"
21
+ function Get-AllBranchesAndPullRequestInfo ($owner , $repo ) {
22
+ $query = @'
23
+ query($owner: String!, $repo: String!, $refPrefix: String!$endCursor: String) {
24
+ repository(owner: $owner, name: $repo) {
25
+ refs(first: 100, refPrefix: $refPrefix, after: $endCursor) {
26
+ nodes {
27
+ name
28
+ target {
29
+ commitUrl
30
+ ... on Commit {
31
+ committedDate
32
+ }
33
+ }
34
+ associatedPullRequests(first: 100) {
35
+ nodes {
36
+ url
37
+ closed
38
+ }
39
+ }
40
+ }
41
+ pageInfo {
42
+ hasNextPage
43
+ endCursor
44
+ }
45
+ }
46
+ }
47
+ }
48
+ '@
25
49
26
- try {
27
- # pull all branches.
28
- $responses = Get-GitHubSourceReferences - RepoId $RepoId - Ref " heads" - AuthToken $AuthToken
50
+ $all_branches = gh api graphql -- paginate -F owner= $owner -F repo= $repo -F refPrefix= ' refs/heads/' -f query= $query `
51
+ -- jq ' .data.repository.refs.nodes[] | { name, commitUrl: .target.commitUrl, committedDate: .target.committedDate, pullRequests: .associatedPullRequests.nodes }' | ConvertFrom-Json
52
+
53
+ if ($LASTEXITCODE ) {
54
+ LogError " Failed to retrieve branches for '$owner ' and '$repo ' running query '$query '"
55
+ exit $LASTEXITCODE
56
+ }
57
+
58
+ return $all_branches
29
59
}
30
- catch {
31
- LogError " Get-GitHubSourceReferences failed with exception:`n $_ "
32
- exit 1
60
+
61
+ LogDebug " Operating on Repo '$RepoId '"
62
+
63
+ # Setup GH_TOKEN for the gh cli commands
64
+ if ($AuthToken ) {
65
+ $env: GH_TOKEN = $AuthToken
33
66
}
34
67
35
- foreach ($res in $responses )
68
+ $owner , $repo = $RepoId -split " /"
69
+ $branches = Get-AllBranchesAndPullRequestInfo $owner $repo
70
+
71
+ foreach ($branch in $branches )
36
72
{
37
- if (! $res -or ! $res.ref ) {
38
- LogDebug " No branch returned from the branch prefix $BranchRegex on $Repo . Skipping..."
39
- continue
40
- }
41
- $branch = $res.ref
42
- $branchName = $branch.Replace (" refs/heads/" , " " )
43
- if (! ($branchName -match $BranchRegex )) {
73
+ $branchName = $branch.Name
74
+ if ($branchName -notmatch $BranchRegex ) {
44
75
continue
45
76
}
77
+ $openPullRequests = @ ($branch.pullRequests | Where-Object { ! $_.Closed })
46
78
47
- # If we have a central PR that created this branch still open still don't delete the branch
79
+ # If we have a central PR that created this branch still open don't delete the branch
48
80
if ($CentralRepoId )
49
81
{
50
- $pullRequestNumber = $Matches [" PrNumber" ]
51
- # If central PR number found, then skip
82
+ $pullRequestNumber = $matches [" PrNumber" ]
83
+ # If central PR number is not found, then skip
52
84
if (! $pullRequestNumber ) {
53
- LogError " No PR number found in the branch name. Please check the branch name [ $branchName ] . Skipping..."
85
+ LogError " No PR number found in the branch name. Please check the branch name ' $branchName ' . Skipping..."
54
86
continue
55
87
}
56
88
57
- try {
58
- $centralPR = Get-GitHubPullRequest - RepoId $CentralRepoId - PullRequestNumber $pullRequestNumber - AuthToken $AuthToken
59
- LogDebug " Found central PR pull request: $ ( $centralPR.html_url ) "
60
- if ($centralPR.state -ne " closed" ) {
61
- # Skipping if there open central PR number for the branch.
62
- continue
89
+ $centralPR = gh pr view -- json ' url,closed' -- repo $CentralRepoId $pullRequestNumber | ConvertFrom-Json
90
+ if ($LASTEXITCODE ) {
91
+ LogError " PR '$pullRequestNumber ' not found in repo '$CentralRepoId '. Skipping..."
92
+ continue ;
93
+ } else {
94
+ LogDebug " Found central PR $ ( $centralPR.url ) and Closed=$ ( $centralPR.closed ) "
95
+ if (! $centralPR.Closed ) {
96
+ # Skipping if there is an open central PR open for the branch.
97
+ LogDebug " Central PR is still open so skipping the deletion of branch '$branchName '. Skipping..."
98
+ continue ;
63
99
}
64
100
}
65
- catch
66
- {
67
- # If there is no central PR for the PR number, log error and skip.
68
- LogError " Get-GitHubPullRequests failed with exception:`n $_ "
69
- LogError " Not found PR number [ $pullRequestNumber ] from [ $CentralRepoId ]. Skipping..."
70
- continue
71
- }
72
101
}
73
-
74
- # If this branch has an open PR in the repo or the upstream repo then don't delete
75
- try
76
- {
77
- $head = " ${RepoId} :${branchName} "
78
- LogDebug " Operating on branch [ $branchName ]"
79
- $pullRequests = Get-GitHubPullRequests - RepoId $RepoId - State " all" - Head $head - AuthToken $AuthToken
80
-
81
- # check to see if there are any PR's open in the main central repo as well.
82
- if ($UpstreamRepoId ) {
83
- $pullRequests += Get-GitHubPullRequests - RepoId $UpstreamRepoId - State " all" - Head $head - AuthToken $AuthToken
102
+ else {
103
+ # Not CentralRepoId - not associated with a central repo PR
104
+ if ($openPullRequests.Count -gt 0 -and ! $DeleteBranchesEvenIfThereIsOpenPR ) {
105
+ LogDebug " Found open PRs associate with branch '$branchName '. Skipping..."
106
+ continue
84
107
}
85
108
}
86
- catch
87
- {
88
- LogError " Get-GitHubPullRequests failed with exception:`n $_ "
89
- exit 1
90
- }
91
- $openPullRequests = @ ($pullRequests | Where-Object { $_.State -eq " open" })
92
-
93
- if ($openPullRequests.Count -gt 0 -and ! $DeleteBranchesEvenIfThereIsOpenPR ) {
94
- LogDebug " CentralRepoId is not configured and found open PRs associate with branch [ $branchName ]. Skipping..."
95
- continue
96
- }
97
109
98
- # If there is date filter, then check if branch last commit older than the date.
110
+ # If there is date filter, then check if branch last commit is older than the date.
99
111
if ($LastCommitOlderThan )
100
112
{
101
- if (! $res.object -or ! $res.object.url ) {
102
- LogWarning " No commit url returned from response. Skipping... "
113
+ $commitDate = $branch.committedDate
114
+ if ($commitDate -gt $LastCommitOlderThan ) {
115
+ LogDebug " The branch $branch last commit date '$commitDate ' is newer than the date '$LastCommitOlderThan '. Skipping..."
103
116
continue
104
117
}
105
- try {
106
- $commitDate = Get-GithubReferenceCommitDate - commitUrl $res.object.url - AuthToken $AuthToken
107
- if (! $commitDate ) {
108
- LogDebug " No last commit date found. Skipping."
109
- continue
110
- }
111
- if ($commitDate -gt $LastCommitOlderThan ) {
112
- LogDebug " The branch $branch last commit date [ $commitDate ] is newer than the date $LastCommitOlderThan . Skipping."
113
- continue
114
- }
115
-
116
- LogDebug " Branch [ $branchName ] in repo [ $RepoId ] has a last commit date [ $commitDate ] that is older than $LastCommitOlderThan . "
117
- }
118
- catch {
119
- LogError " Get-GithubReferenceCommitDate failed with exception:`n $_ "
120
- exit 1
121
- }
122
118
}
123
119
124
120
foreach ($openPullRequest in $openPullRequests ) {
125
- Write-Host " Open pull Request [ $ ( $openPullRequest.html_url ) ] will be closed after branch deletion."
121
+ Write-Host " Note: Open pull Request ' $ ( $openPullRequest.url ) ' will be closed after branch deletion, given the central PR is closed ."
126
122
}
127
123
128
- try
129
- {
130
- if ( $PSCmdlet .ShouldProcess ( " [ $branchName ] in [ $ RepoId ] " , " Deleting branches on cleanup script " )) {
131
- Remove-GitHubSourceReferences - RepoId $RepoId - Ref $branch - AuthToken $AuthToken
132
- Write-Host " The branch [ $branchName ] with sha [ $ ( $res .object.sha ) ] in [ $RepoId ] has been deleted. "
124
+ $commitUrl = $branch .commitUrl
125
+ if ( $PSCmdlet .ShouldProcess ( " ' $branchName ' in ' $RepoId ' " , " Deleting branch on cleanup script " )) {
126
+ gh api " repos/ ${ RepoId} /git/refs/heads/ ${branchName} " - X DELETE
127
+ if ( $LASTEXITCODE ) {
128
+ LogError " Deletion of branch ' $branchName ` failed "
133
129
}
134
- }
135
- catch {
136
- LogError " Remove-GitHubSourceReferences failed with exception:`n $_ "
137
- exit 1
130
+ Write-Host " The branch '$branchName ' at commit '$commitUrl ' in '$RepoId ' has been deleted."
138
131
}
139
132
}
0 commit comments