88using PostSharp . Engineering . BuildTools . Utilities ;
99using System . Collections . Generic ;
1010using System . Diagnostics . CodeAnalysis ;
11+ using System . Linq ;
1112using System . Text ;
1213using System . Threading . Tasks ;
1314using 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