@@ -41,6 +41,28 @@ partial class Build
4141
4242 const string GitHubRepositoryOwner = "DataDog" ;
4343
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+
4466 Target SummaryOfSnapshotChanges => _ => _
4567 . Unlisted ( )
4668 . Requires ( ( ) => GitHubRepositoryName )
@@ -321,6 +343,56 @@ LabbelerConfiguration GetLabellerConfiguration()
321343 }
322344 } ) ;
323345
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+
324396 GitHubClient GetGitHubClient ( ) =>
325397 new ( new ProductHeaderValue ( "nuke-ci-client" ) )
326398 {
0 commit comments