@@ -97,6 +97,9 @@ public class AuthorEqualityComparer : IEqualityComparer<Author>
97
97
98
98
public class MarkdownBuilder
99
99
{
100
+ private static IReadOnlyList < Milestone > AllMilestones = null ;
101
+ private static readonly Dictionary < string , string > AuthorNames = new ( ) ;
102
+
100
103
private readonly Config config ;
101
104
private readonly StringBuilder builder ;
102
105
@@ -114,11 +117,13 @@ private MarkdownBuilder(Config config)
114
117
private async Task < string > Build ( )
115
118
{
116
119
var ( repoOwner , repoName , milestone , previousMilestone , lastCommit ) = config ;
120
+ if ( string . IsNullOrEmpty ( lastCommit ) )
121
+ lastCommit = milestone ;
117
122
118
123
var client = new GitHubClient ( new ProductHeaderValue ( config . ProductHeader ) ) ;
119
124
var tokenAuth = new Credentials ( config . Token ) ;
120
125
client . Credentials = tokenAuth ;
121
-
126
+
122
127
if ( milestone == "_" )
123
128
{
124
129
var allContributors = await client . Repository . GetAllContributors ( repoOwner , repoName ) ;
@@ -136,46 +141,62 @@ private async Task<string> Build()
136
141
return builder . ToString ( ) ;
137
142
}
138
143
139
- var issueRequest = new RepositoryIssueRequest
144
+ if ( AllMilestones == null )
140
145
{
141
- State = ItemStateFilter . Closed
142
- } ;
143
- var pullRequestRequest = new PullRequestRequest
146
+ var milestoneRequest = new MilestoneRequest
147
+ {
148
+ State = ItemStateFilter . All
149
+ } ;
150
+ AllMilestones = await client . Issue . Milestone . GetAllForRepository ( repoOwner , repoName , milestoneRequest ) ;
151
+ }
152
+
153
+ IReadOnlyList < Issue > allIssues = Array . Empty < Issue > ( ) ;
154
+ var targetMilestone = AllMilestones . FirstOrDefault ( m => m . Title == milestone ) ;
155
+ if ( targetMilestone != null )
144
156
{
145
- State = ItemStateFilter . Closed
146
- } ;
157
+ var issueRequest = new RepositoryIssueRequest
158
+ {
159
+ State = ItemStateFilter . Closed ,
160
+ Milestone = targetMilestone . Number . ToString ( )
161
+ } ;
162
+
163
+ allIssues = await client . Issue . GetAllForRepository ( repoOwner , repoName , issueRequest ) ;
164
+ }
147
165
148
- var issues = ( await client . Issue . GetAllForRepository ( repoOwner , repoName , issueRequest ) )
149
- . Where ( issue => issue . Milestone != null && issue . Milestone . Title == milestone )
166
+ var issues = allIssues
150
167
. Where ( issue => issue . PullRequest == null )
151
168
. OrderBy ( issue => issue . Number )
152
169
. ToList ( ) ;
153
-
154
- var pullRequests =
155
- ( await client . PullRequest . GetAllForRepository ( repoOwner , repoName , pullRequestRequest ) )
156
- . Where ( issue => issue . Milestone != null && issue . Milestone . Title == milestone )
170
+ var pullRequests = allIssues
171
+ . Where ( issue => issue . PullRequest != null )
157
172
. OrderBy ( issue => issue . Number )
158
173
. ToList ( ) ;
159
-
174
+
160
175
var compare = await client . Repository . Commit . Compare ( repoOwner , repoName , previousMilestone , lastCommit ) ;
161
176
var commits = compare . Commits ;
162
-
163
- var authorNames = new Dictionary < string , string > ( ) ;
177
+
178
+
164
179
foreach ( var contributor in commits . Select ( commit => commit . Author ) )
165
- if ( contributor != null && ! authorNames . ContainsKey ( contributor . Login ) )
180
+ if ( contributor != null && ! AuthorNames . ContainsKey ( contributor . Login ) )
166
181
{
167
182
var user = await client . User . Get ( contributor . Login ) ;
168
183
var name = user ? . Name ;
169
- authorNames [ contributor . Login ] = string . IsNullOrWhiteSpace ( name ) ? contributor . Login : name ;
184
+ AuthorNames [ contributor . Login ] = string . IsNullOrWhiteSpace ( name ) ? contributor . Login : name ;
170
185
}
171
186
187
+ string PresentContributor ( GitHubCommit commit )
188
+ {
189
+ if ( commit . Author != null )
190
+ return $ "{ AuthorNames [ commit . Author . Login ] } ({ commit . Author . ToLink ( ) } )". Trim ( ) ;
191
+ return commit . Commit . Author . Name ;
192
+ }
193
+
172
194
var contributors = compare . Commits
173
- . Select ( commit => commit . Author )
174
- . Where ( author => author != null )
175
- . Distinct ( AuthorEqualityComparer . Default )
176
- . OrderBy ( author => authorNames [ author . Login ] )
195
+ . Select ( PresentContributor )
196
+ . OrderBy ( it => it )
197
+ . Distinct ( )
177
198
. ToImmutableList ( ) ;
178
-
199
+
179
200
var milestoneHtmlUlr = $ "https://github.com/{ repoOwner } /{ repoName } /issues?q=milestone:{ milestone } ";
180
201
181
202
builder . AppendLine ( "## Milestone details" ) ;
@@ -192,9 +213,7 @@ private async Task<string> Build()
192
213
$ "[#{ pr . Number } ]({ pr . HtmlUrl } ) { pr . Title . Trim ( ) } { pr . User . ToStr ( "by" ) } ") ;
193
214
AppendList ( "Commits" , commits , commit =>
194
215
$ "{ commit . ToLink ( ) } { commit . Commit . ToCommitMessage ( ) } { commit . ToByStr ( ) } ") ;
195
- AppendList ( "Contributors" , contributors , contributor =>
196
- $ "{ authorNames [ contributor . Login ] } ({ contributor . ToLink ( ) } )". Trim ( ) ,
197
- "Thank you very much!" ) ;
216
+ AppendList ( "Contributors" , contributors , it => it , "Thank you very much!" ) ;
198
217
199
218
return builder . ToString ( ) ;
200
219
}
0 commit comments