@@ -130,6 +130,7 @@ class MockRepositoryProvider implements RepositoryProvider {
130130        } 
131131        throw  new  Error ( `ref ${ ref }   not found` ) ; 
132132    } 
133+ 
133134    async  getCommitInfo ( user : User ,  owner : string ,  repo : string ,  ref : string ) : Promise < CommitInfo  |  undefined >  { 
134135        return  headu ( this . branches . get ( ref ) ?. commits ) ; 
135136    } 
@@ -541,6 +542,92 @@ describe("ContextService", async () => {
541542        expect ( ( ctx . context  as  any  as  PrebuiltWorkspaceContext ) . prebuiltWorkspace . commit ) . to . equal ( revision1 ) ; 
542543    } ) ; 
543544
545+     it ( "should handle triggering prebuilds out of order with respect to commits" ,  async  ( )  =>  { 
546+         const  commit1  =  { 
547+             sha : "69420" , 
548+             author : "some-dude" , 
549+             commitMessage : `commit 69420` , 
550+         } ; 
551+         const  commit2  =  { 
552+             sha : "69421" , 
553+             author : "some-other-dude" , 
554+             commitMessage : "commit 69421" , 
555+         } ; 
556+         const  branchName  =  "branch-2" ; 
557+         mockRepositoryProvider . addBranch ( 
558+             {  name : branchName ,  htmlUrl : `https://github.com/gitpod-io/empty/tree/${ branchName }  `  } , 
559+             [ commit1 ] , 
560+         ) ; 
561+         mockRepositoryProvider . pushCommit ( branchName ,  commit2 ) ; 
562+ 
563+         // request context for both commits separately 
564+         const  svc  =  container . get ( ContextService ) ; 
565+         let  ctx1  =  await  svc . parseContext ( owner ,  `https://github.com/gitpod-io/empty/commit/${ commit1 . sha }  ` ,  { 
566+             projectId : project . id , 
567+             organizationId : org . id , 
568+             forceDefaultConfig : false , 
569+         } ) ; 
570+         let  ctx2  =  await  svc . parseContext ( owner ,  `https://github.com/gitpod-io/empty/commit/${ commit2 . sha }  ` ,  { 
571+             projectId : project . id , 
572+             organizationId : org . id , 
573+             forceDefaultConfig : false , 
574+         } ) ; 
575+ 
576+         // trigger and "await" prebuilds for both commits in push order 
577+         const  prebuildManager  =  container . get ( PrebuildManager ) ; 
578+         const  workspaceDb : WorkspaceDB  =  container . get ( WorkspaceDB ) ; 
579+         const  prebuildForCommit2  =  await  prebuildManager . startPrebuild ( 
580+             { } , 
581+             {  user : owner ,  project,  commitInfo : commit2 ,  context : ctx2 . context  as  CommitContext  } , 
582+         ) ; 
583+         const  prebuild1  =  await  workspaceDb . findPrebuildByID ( prebuildForCommit2 . prebuildId ) ; 
584+         await  workspaceDb . storePrebuiltWorkspace ( { 
585+             ...prebuild1 ! , 
586+             state : "available" , 
587+         } ) ; 
588+         const  wsAndI1  =  await  workspaceDb . findWorkspaceAndInstance ( prebuild1 ! . buildWorkspaceId ) ; 
589+         await  workspaceDb . updateInstancePartial ( wsAndI1 ! . instanceId ,  {  status : {  phase : "stopped"  }  } ) ; 
590+ 
591+         const  prebuildForCommit1  =  await  prebuildManager . startPrebuild ( 
592+             { } , 
593+             {  user : owner ,  project,  commitInfo : commit1 ,  context : ctx1 . context  as  CommitContext ,  forcePrebuild : true  } , 
594+         ) ; 
595+         const  prebuild2  =  await  workspaceDb . findPrebuildByID ( prebuildForCommit1 . prebuildId ) ; 
596+         await  workspaceDb . storePrebuiltWorkspace ( { 
597+             ...prebuild2 ! , 
598+             state : "available" , 
599+         } ) ; 
600+         const  wsAndI2  =  await  workspaceDb . findWorkspaceAndInstance ( prebuild2 ! . buildWorkspaceId ) ; 
601+         await  workspaceDb . updateInstancePartial ( wsAndI2 ! . instanceId ,  {  status : {  phase : "stopped"  }  } ) ; 
602+ 
603+         // after everything has settled, request context for both commits again 
604+ 
605+         ctx1  =  await  svc . parseContext ( owner ,  `https://github.com/gitpod-io/empty/commit/${ commit1 . sha }  ` ,  { 
606+             projectId : project . id , 
607+             organizationId : org . id , 
608+             forceDefaultConfig : false , 
609+         } ) ; 
610+         ctx2  =  await  svc . parseContext ( owner ,  `https://github.com/gitpod-io/empty/commit/${ commit2 . sha }  ` ,  { 
611+             projectId : project . id , 
612+             organizationId : org . id , 
613+             forceDefaultConfig : false , 
614+         } ) ; 
615+ 
616+         expect ( ctx1 . project ?. id ) . to . equal ( project . id ) ; 
617+         expect ( PrebuiltWorkspaceContext . is ( ctx1 . context ) ) . to . equal ( true ) ; 
618+         expect ( ( ctx1 . context  as  any  as  PrebuiltWorkspaceContext ) . prebuiltWorkspace . id ) . to . equal ( 
619+             prebuildForCommit1 . prebuildId , 
620+         ) ; 
621+         expect ( ( ctx1 . context  as  any  as  PrebuiltWorkspaceContext ) . prebuiltWorkspace . commit ) . to . equal ( commit1 . sha ) ; 
622+ 
623+         expect ( ctx2 . project ?. id ) . to . equal ( project . id ) ; 
624+         expect ( PrebuiltWorkspaceContext . is ( ctx2 . context ) ) . to . equal ( true ) ; 
625+         expect ( ( ctx2 . context  as  any  as  PrebuiltWorkspaceContext ) . prebuiltWorkspace . id ) . to . equal ( 
626+             prebuildForCommit2 . prebuildId , 
627+         ) ; 
628+         expect ( ( ctx2 . context  as  any  as  PrebuiltWorkspaceContext ) . prebuiltWorkspace . commit ) . to . equal ( commit2 . sha ) ; 
629+     } ) ; 
630+ 
544631    it ( "should parse snapshot context" ,  async  ( )  =>  { 
545632        const  svc  =  container . get ( ContextService ) ; 
546633        const  ctx  =  await  svc . parseContext ( owner ,  `snapshot/${ snapshot . id }  ` ,  { 
0 commit comments