@@ -41,6 +41,39 @@ 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 currentMilestone = ( await client . PullRequest . Get (
54
+ owner : GitHubRepositoryOwner ,
55
+ name : GitHubRepositoryName ,
56
+ number : PullRequestNumber . Value ) )
57
+ . Milestone ;
58
+
59
+ if ( currentMilestone != null && currentMilestone . Number != 0 ) {
60
+ Console . WriteLine ( $ "Pull request { PullRequestNumber } already has a milesotone: { currentMilestone . Title } ({ currentMilestone . Number } )") ;
61
+ return ;
62
+ }
63
+
64
+ var milestone = await GetOrCreateNextMilestone ( client ) ;
65
+
66
+ Console . WriteLine ( $ "Assigning PR { PullRequestNumber } to { milestone . Title } ({ milestone . Number } )") ;
67
+
68
+ await client . Issue . Update (
69
+ owner : GitHubRepositoryOwner ,
70
+ name : GitHubRepositoryName ,
71
+ number : PullRequestNumber . Value ,
72
+ new IssueUpdate { Milestone = milestone . Number } ) ;
73
+
74
+ Console . WriteLine ( $ "PR assigned") ;
75
+ } ) ;
76
+
44
77
Target SummaryOfSnapshotChanges => _ => _
45
78
. Unlisted ( )
46
79
. Requires ( ( ) => GitHubRepositoryName )
@@ -321,6 +354,56 @@ LabbelerConfiguration GetLabellerConfiguration()
321
354
}
322
355
} ) ;
323
356
357
+ private async Task < Milestone > GetOrCreateNextMilestone ( GitHubClient gitHubClient )
358
+ {
359
+ var milestoneName = CalculateNextVersion ( Version ) ;
360
+ var milestone = await GetMilestone ( gitHubClient , milestoneName ) ;
361
+ if ( milestone is not null )
362
+ {
363
+ Console . WriteLine ( $ "Found { milestoneName } milestone: { milestone . Number } ") ;
364
+ return milestone ;
365
+ }
366
+
367
+ Console . WriteLine ( $ "{ milestoneName } milestone not found, creating") ;
368
+
369
+ var milestoneRequest = new NewMilestone ( milestoneName ) ;
370
+ milestone = await gitHubClient . Issue . Milestone . Create (
371
+ owner : GitHubRepositoryOwner ,
372
+ name : GitHubRepositoryName ,
373
+ milestoneRequest ) ;
374
+ Console . WriteLine ( $ "Created { milestoneName } milestone: { milestone . Number } ") ;
375
+ return milestone ;
376
+ }
377
+
378
+ private async Task < Milestone > GetMilestone ( GitHubClient gitHubClient , string milestoneName )
379
+ {
380
+ Console . WriteLine ( "Fetching milestones..." ) ;
381
+ var allOpenMilestones = await gitHubClient . Issue . Milestone . GetAllForRepository (
382
+ owner : GitHubRepositoryOwner ,
383
+ name : GitHubRepositoryName ,
384
+ new MilestoneRequest { State = ItemStateFilter . Open } ) ;
385
+
386
+ return allOpenMilestones . FirstOrDefault ( x => x . Title == milestoneName ) ;
387
+ }
388
+
389
+ string CalculateNextVersion ( string currentVersion )
390
+ {
391
+ Console . WriteLine ( "Current version is " + currentVersion ) ;
392
+ var parsedVersion = new Version ( currentVersion ) ;
393
+ var major = parsedVersion . Major ;
394
+ int minor ;
395
+ int patch ;
396
+
397
+ // always do minor version bump on 2.x branch
398
+ minor = parsedVersion . Minor + 1 ;
399
+ patch = 0 ;
400
+
401
+ var nextVersion = $ "{ major } .{ minor } .{ patch } ";
402
+
403
+ Console . WriteLine ( "Next version calculated as " + nextVersion ) ;
404
+ return nextVersion ;
405
+ }
406
+
324
407
GitHubClient GetGitHubClient ( ) =>
325
408
new ( new ProductHeaderValue ( "nuke-ci-client" ) )
326
409
{
0 commit comments