@@ -41,6 +41,28 @@ partial class Build
41
41
42
42
const string GitHubRepositoryOwner = "DataDog" ;
43
43
44
+ Target AssignPullRequestToMilestone => _ => _
45
+ . Unlisted ( )
46
+ . Requires ( ( ) => GitHubRepositoryName )
47
+ . Requires ( ( ) => GitHubToken )
48
+ . Requires ( ( ) => PullRequestNumber )
49
+ . Executes ( async ( ) =>
50
+ {
51
+ var client = GetGitHubClient ( ) ;
52
+
53
+ var milestone = await GetOrCreateNextMilestone ( client ) ;
54
+
55
+ Console . WriteLine ( $ "Assigning PR { PullRequestNumber } to { milestone . Title } ({ milestone . Number } )") ;
56
+
57
+ await client . Issue . Update (
58
+ owner : GitHubRepositoryOwner ,
59
+ name : GitHubRepositoryName ,
60
+ number : PullRequestNumber . Value ,
61
+ new IssueUpdate { Milestone = milestone . Number } ) ;
62
+
63
+ Console . WriteLine ( $ "PR assigned") ;
64
+ } ) ;
65
+
44
66
Target SummaryOfSnapshotChanges => _ => _
45
67
. Unlisted ( )
46
68
. Requires ( ( ) => GitHubRepositoryName )
@@ -321,6 +343,56 @@ LabbelerConfiguration GetLabellerConfiguration()
321
343
}
322
344
} ) ;
323
345
346
+ private async Task < Milestone > GetOrCreateNextMilestone ( GitHubClient gitHubClient )
347
+ {
348
+ var milestoneName = CalculateNextVersion ( Version ) ;
349
+ var milestone = await GetMilestone ( gitHubClient , milestoneName ) ;
350
+ if ( milestone is not null )
351
+ {
352
+ Console . WriteLine ( $ "Found { milestoneName } milestone: { milestone . Number } ") ;
353
+ return milestone ;
354
+ }
355
+
356
+ Console . WriteLine ( $ "{ milestoneName } milestone not found, creating") ;
357
+
358
+ var milestoneRequest = new NewMilestone ( milestoneName ) ;
359
+ milestone = await gitHubClient . Issue . Milestone . Create (
360
+ owner : GitHubRepositoryOwner ,
361
+ name : GitHubRepositoryName ,
362
+ milestoneRequest ) ;
363
+ Console . WriteLine ( $ "Created { milestoneName } milestone: { milestone . Number } ") ;
364
+ return milestone ;
365
+ }
366
+
367
+ private async Task < Milestone > GetMilestone ( GitHubClient gitHubClient , string milestoneName )
368
+ {
369
+ Console . WriteLine ( "Fetching milestones..." ) ;
370
+ var allOpenMilestones = await gitHubClient . Issue . Milestone . GetAllForRepository (
371
+ owner : GitHubRepositoryOwner ,
372
+ name : GitHubRepositoryName ,
373
+ new MilestoneRequest { State = ItemStateFilter . Open } ) ;
374
+
375
+ return allOpenMilestones . FirstOrDefault ( x => x . Title == milestoneName ) ;
376
+ }
377
+
378
+ string CalculateNextVersion ( string currentVersion )
379
+ {
380
+ Console . WriteLine ( "Current version is " + currentVersion ) ;
381
+ var parsedVersion = new Version ( currentVersion ) ;
382
+ var major = parsedVersion . Major ;
383
+ int minor ;
384
+ int patch ;
385
+
386
+ // always do minor version bump on 2.x branch
387
+ minor = parsedVersion . Minor + 1 ;
388
+ patch = 0 ;
389
+
390
+ var nextVersion = $ "{ major } .{ minor } .{ patch } ";
391
+
392
+ Console . WriteLine ( "Next version calculated as " + nextVersion ) ;
393
+ return nextVersion ;
394
+ }
395
+
324
396
GitHubClient GetGitHubClient ( ) =>
325
397
new ( new ProductHeaderValue ( "nuke-ci-client" ) )
326
398
{
0 commit comments