@@ -43,8 +43,14 @@ static async Task AsyncMain(IConfigurationRoot config)
4343 var gitHubConfig = config . GetSection ( "github" ) ;
4444 var query = new Query ( gitHubConfig [ "token" ] ) ;
4545
46+ Console . WriteLine ( $ "GitHub organisation: { gitHubConfig [ "organization" ] } ") ;
47+ Console . WriteLine ( $ "GitHub team: { gitHubConfig [ "team" ] } ") ;
48+ Console . WriteLine ( $ "GitHub repository: { gitHubConfig [ "repository" ] } ") ;
49+ Console . WriteLine ( $ "GitHub base branch: { gitHubConfig [ "baseBranch" ] } ") ;
50+ Console . WriteLine ( $ "GitHub merge branch: { gitHubConfig [ "mergeBranch" ] } ") ;
51+
4652 var members = await query . GetTeamMembers ( gitHubConfig [ "organization" ] , gitHubConfig [ "team" ] ) ;
47- Console . WriteLine ( $ "Org ' { gitHubConfig [ "organization" ] } ' team ' { gitHubConfig [ "team" ] } ' members ({ members . Count } )") ;
53+ Console . WriteLine ( $ "Team members ({ members . Count } ): ") ;
4854 foreach ( var member in members )
4955 {
5056 Console . WriteLine ( $ " { member . Login } ") ;
@@ -53,7 +59,7 @@ static async Task AsyncMain(IConfigurationRoot config)
5359
5460 var pullRequests = await query . GetOpenPullRequests ( gitHubConfig [ "organization" ] , gitHubConfig [ "repository" ] ) ;
5561 var autoMergePullRequests = new List < GraphPullRequest > ( ) ;
56- Console . WriteLine ( $ "Org ' { gitHubConfig [ "organization" ] } ' repo ' { gitHubConfig [ "repository" ] } ' open pull requests ({ pullRequests . Count } )") ;
62+ Console . WriteLine ( $ "Open pull requests ({ pullRequests . Count } ): ") ;
5763 foreach ( var pullRequest in pullRequests )
5864 {
5965 var autoMerge = memberLogins . Contains ( pullRequest . Author . Login )
@@ -69,11 +75,90 @@ static async Task AsyncMain(IConfigurationRoot config)
6975 }
7076 }
7177
72- Console . WriteLine ( $ "Org ' { gitHubConfig [ "organization" ] } ' repo ' { gitHubConfig [ "repository" ] } ' auto-merge pull requests ({ autoMergePullRequests . Count } )") ;
78+ Console . WriteLine ( $ "Pull requests suitable for auto-merging ({ autoMergePullRequests . Count } ): ") ;
7379 foreach ( var pullRequest in autoMergePullRequests )
7480 {
7581 Console . WriteLine ( $ " #{ pullRequest . Number } { pullRequest . Title } ") ;
7682 }
83+
84+ var git = new Git . Project ( GetGitPath ( ) , false ) ;
85+ git . Init ( $ "https://github.com/{ gitHubConfig [ "organization" ] } /{ gitHubConfig [ "repository" ] } .git") ;
86+ git . Fetch ( ) ;
87+ git . ResetHard ( ) ;
88+ var baseBranchCommit = git . ParseRef ( gitHubConfig [ "baseBranch" ] ) ;
89+ var mergeBranchCommit = git . ParseRef ( gitHubConfig [ "mergeBranch" ] ) ;
90+ var mergeBranchTree = git . ParseRef ( $ "{ mergeBranchCommit } ^{{tree}}") ;
91+ git . CheckoutDetached ( baseBranchCommit ) ;
92+ var baseBranchVersion = String . Format ( gitHubConfig [ "versionFormat" ] ?? "{0}" , git . Describe ( gitHubConfig [ "versionDescribeOptions" ] ?? "" ) ) ;
93+ var mergeBranchParents = new List < string > ( ) ;
94+ mergeBranchParents . Add ( mergeBranchCommit ) ;
95+ mergeBranchParents . Add ( baseBranchCommit ) ;
96+ var autoMergePullRequestsSuccess = new List < GraphPullRequest > ( ) ;
97+ var autoMergePullRequestsFailure = new List < GraphPullRequest > ( ) ;
98+ foreach ( var pullRequest in autoMergePullRequests )
99+ {
100+ var mergeCommit = git . ParseRef ( $ "pull/{ pullRequest . Number } /head") ;
101+ try
102+ {
103+ git . Merge ( mergeCommit ) ;
104+ mergeBranchParents . Add ( mergeCommit ) ;
105+ autoMergePullRequestsSuccess . Add ( pullRequest ) ;
106+ }
107+ catch ( ApplicationException )
108+ {
109+ autoMergePullRequestsFailure . Add ( pullRequest ) ;
110+ git . ResetHard ( ) ;
111+ }
112+ }
113+ var autoMergeCommit = git . ParseRef ( "HEAD" ) ;
114+ var autoMergeTree = git . ParseRef ( $ "{ autoMergeCommit } ^{{tree}}") ;
115+
116+ Console . WriteLine ( $ "Pull requests successfully auto-merged ({ autoMergePullRequestsSuccess . Count } ):") ;
117+ foreach ( var pullRequest in autoMergePullRequestsSuccess )
118+ {
119+ Console . WriteLine ( $ " #{ pullRequest . Number } { pullRequest . Title } ") ;
120+ }
121+
122+ Console . WriteLine ( $ "Pull requests not auto-merged ({ autoMergePullRequestsFailure . Count } ):") ;
123+ foreach ( var pullRequest in autoMergePullRequestsFailure )
124+ {
125+ Console . WriteLine ( $ " #{ pullRequest . Number } { pullRequest . Title } ") ;
126+ }
127+
128+ if ( mergeBranchTree == autoMergeTree )
129+ {
130+ Console . WriteLine ( "No changes to push into merge branch" ) ;
131+ }
132+ else
133+ {
134+ var newMergeBranchMessage = String . Format ( gitHubConfig [ "mergeMessageFormat" ] ,
135+ baseBranchVersion ,
136+ autoMergePullRequestsSuccess . Count ,
137+ String . Join ( "" , autoMergePullRequestsSuccess . Select ( pr => String . Format (
138+ gitHubConfig [ "mergeMessagePRFormat" ] ,
139+ pr . Number ,
140+ pr . Title ,
141+ git . GetAbbreviatedCommit ( $ "pull/{ pr . Number } /head")
142+ ) ) )
143+ ) ;
144+ var newMergeBranchCommit = git . CommitTree ( $ "{ autoMergeCommit } ^{{tree}}", mergeBranchParents , newMergeBranchMessage ) ;
145+ git . SetBranchRef ( gitHubConfig [ "mergeBranch" ] , newMergeBranchCommit ) ;
146+ git . Checkout ( gitHubConfig [ "mergeBranch" ] ) ;
147+ var newMergeBranchVersion = String . Format (
148+ gitHubConfig [ "mergeVersionFormat" ] ?? gitHubConfig [ "versionFormat" ] ?? "{0}" ,
149+ git . Describe ( gitHubConfig [ "mergeVersionDescribeOptions" ] ?? gitHubConfig [ "versionDescribeOptions" ] ?? "" ) ,
150+ git . GetCommitDate ( newMergeBranchCommit )
151+ ) ;
152+ Console . WriteLine ( "Pushed changes into merge branch:" ) ;
153+ Console . WriteLine ( $ " Version: { newMergeBranchVersion } ") ;
154+ Console . WriteLine ( $ " Message: { newMergeBranchMessage . Split ( "\n " ) [ 0 ] } ") ;
155+ }
156+ }
157+
158+ static string GetGitPath ( )
159+ {
160+ var appFilePath = System . Reflection . Assembly . GetEntryAssembly ( ) . Location ;
161+ return Path . Combine ( Path . GetDirectoryName ( appFilePath ) , "git" ) ;
77162 }
78163 }
79164}
0 commit comments