Skip to content

Commit a657591

Browse files
committed
Downstream merge: reuse existing PR for branch instead of failing.
1 parent 3f855ef commit a657591

File tree

1 file changed

+50
-21
lines changed

1 file changed

+50
-21
lines changed

src/PostSharp.Engineering.BuildTools/ContinuousIntegration/GitHubHelper.cs

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using PostSharp.Engineering.BuildTools.Utilities;
99
using System.Collections.Generic;
1010
using System.Diagnostics.CodeAnalysis;
11+
using System.Linq;
1112
using System.Text;
1213
using System.Threading.Tasks;
1314
using Connection = Octokit.GraphQL.Connection;
@@ -27,12 +28,23 @@ internal static bool TryGetToken(
2728
ConsoleHelper console,
2829
[NotNullWhen( true )] out string? token,
2930
string tokenEnvironmentVariableName = EnvironmentVariableNames.GitHubToken )
31+
=> TryGetToken( console, true, out token );
32+
33+
internal static bool TryGetToken(
34+
ConsoleHelper console,
35+
bool writeError,
36+
[NotNullWhen( true )] out string? token,
37+
string tokenEnvironmentVariableName = EnvironmentVariableNames.GitHubToken )
3038
{
3139
token = Environment.GetEnvironmentVariable( tokenEnvironmentVariableName );
3240

3341
if ( string.IsNullOrEmpty( token ) )
3442
{
35-
console.WriteError( $"The '{tokenEnvironmentVariableName}' environment variable is not defined." );
43+
if ( writeError )
44+
{
45+
console.WriteError( $"The '{tokenEnvironmentVariableName}' environment variable is not defined." );
46+
}
47+
3648
token = null;
3749

3850
return false;
@@ -97,23 +109,27 @@ public static bool TryDownloadText( ConsoleHelper console, GitHubRepository repo
97109
string targetBranch,
98110
string title )
99111
{
100-
bool TryConnectRestApis( [NotNullWhen( true )] out GitHubClient? c, [NotNullWhen( true )] out GitHubClient? r )
112+
bool TryConnectRestApis( [NotNullWhen( true )] out GitHubClient? creatorClient, out GitHubClient? reviewerClient )
101113
{
102-
c = null;
103-
r = null;
114+
creatorClient = null;
115+
reviewerClient = null;
104116

105117
if ( !TryGetToken( console, out var creatorToken ) )
106118
{
107119
return false;
108120
}
121+
122+
creatorClient = ConnectRestApi( creatorToken );
109123

110-
if ( !TryGetToken( console, out var reviewerToken, EnvironmentVariableNames.GitHubReviewerToken ) )
124+
if ( !TryGetToken( console, false, out var reviewerToken, EnvironmentVariableNames.GitHubReviewerToken ) )
111125
{
112-
return false;
126+
console.WriteWarning( $"The {EnvironmentVariableNames.GitHubReviewerToken} environment variable is not defined. The PR won't be auto-approved." );
113127
}
114-
115-
c = ConnectRestApi( creatorToken );
116-
r = creatorToken == reviewerToken ? c : ConnectRestApi( reviewerToken );
128+
else
129+
{
130+
reviewerClient = creatorToken == reviewerToken ? creatorClient : ConnectRestApi( reviewerToken );
131+
}
132+
117133

118134
return true;
119135
}
@@ -128,21 +144,34 @@ bool TryConnectRestApis( [NotNullWhen( true )] out GitHubClient? c, [NotNullWhen
128144
return null;
129145
}
130146

131-
console.WriteMessage( "Creating pull request." );
132-
var newPullRequest = new NewPullRequest( title, sourceBranch, targetBranch );
133-
var pullRequest = await creatorGitHub.PullRequest.Create( repository.Owner, repository.Name, newPullRequest );
134-
console.WriteMessage( $"Pull request created: {pullRequest.Url}" );
147+
var allExistingPullRequests = await creatorGitHub.PullRequest.GetAllForRepository( repository.Owner, repository.Name );
148+
var pullRequest = allExistingPullRequests.FirstOrDefault( pr => pr.Head.Ref == sourceBranch );
149+
150+
if ( pullRequest != null )
151+
{
152+
console.WriteMessage( $"Existing PR found: {pullRequest.Url}." );
153+
}
154+
else
155+
{
156+
console.WriteMessage( "Creating pull request." );
157+
var newPullRequest = new NewPullRequest( title, sourceBranch, targetBranch );
158+
pullRequest = await creatorGitHub.PullRequest.Create( repository.Owner, repository.Name, newPullRequest );
159+
console.WriteMessage( $"Pull request created: {pullRequest.Url}" );
160+
}
135161

136162
// A pull request cannot be self-reviewed on GitHub.
137163
// https://github.com/orgs/community/discussions/6292
138-
var reviewerLogin = reviewerGitHub.User.Current().Result.Login;
139-
console.WriteMessage( $"Requesting a review of the pull request from '{reviewerLogin}' user." );
140-
var reviewRequest = new PullRequestReviewRequest( new List<string> { reviewerLogin }, new List<string>() );
141-
pullRequest = await reviewerGitHub.PullRequest.ReviewRequest.Create( repository.Owner, repository.Name, pullRequest.Number, reviewRequest );
142-
143-
console.WriteMessage( "Approving the pull request." );
144-
var pullRequestApproval = new PullRequestReviewCreate { Event = PullRequestReviewEvent.Approve };
145-
_ = await reviewerGitHub.PullRequest.Review.Create( repository.Owner, repository.Name, pullRequest.Number, pullRequestApproval );
164+
if ( reviewerGitHub != null )
165+
{
166+
var reviewerLogin = reviewerGitHub.User.Current().Result.Login;
167+
console.WriteMessage( $"Requesting a review of the pull request from '{reviewerLogin}' user." );
168+
var reviewRequest = new PullRequestReviewRequest( new List<string> { reviewerLogin }, new List<string>() );
169+
pullRequest = await reviewerGitHub.PullRequest.ReviewRequest.Create( repository.Owner, repository.Name, pullRequest.Number, reviewRequest );
170+
171+
console.WriteMessage( "Approving the pull request." );
172+
var pullRequestApproval = new PullRequestReviewCreate { Event = PullRequestReviewEvent.Approve };
173+
_ = await reviewerGitHub.PullRequest.Review.Create( repository.Owner, repository.Name, pullRequest.Number, pullRequestApproval );
174+
}
146175

147176
console.WriteMessage( "Enabling pull request auto-merge." );
148177

0 commit comments

Comments
 (0)