// ĠSPDX - License - Identifier : ĠBSD - 3 - Clause Ċ package Ġorg . isl ando ft ex . ar ara . core . session Ċ Ċ import Ġkotlin . time . Time Source Ċ import Ġorg . isl ando ft ex . ar ara . api . Ar ara Exception Ċ import Ġorg . isl ando ft ex . ar ara . api . configuration . Execution Options Ċ import Ġorg . isl ando ft ex . ar ara . api . files . Project Ċ import Ġorg . isl ando ft ex . ar ara . api . files . Project File Ċ import Ġorg . isl ando ft ex . ar ara . api . session . Execution Report Ċ import Ġorg . isl ando ft ex . ar ara . api . session . Executor Ċ import Ġorg . isl ando ft ex . ar ara . core . dependencies . Project Graph Ċ import Ġorg . isl ando ft ex . ar ara . core . files . by Priority Ċ Ċ object ĠLinear Executor Ġ: ĠExecutor Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpecify Ġcustom Ġuser Ġhooks Ġto Ġrun . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġhooks Ġ= ĠExecutor Hooks () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġproject Ġthis Ġexecutor Ġcurrently Ġexecutes , Ġif Ġany . ĠThis Ġwill Ġalways ĊĠĠĠĠ Ġ* Ġbe Ġset Ġbefore Ġthe Ġ[ Executor Hooks . execute Before Project ] Ġhook Ġis Ġexecuted ĊĠĠĠĠ Ġ* Ġand Ġunset Ġafter Ġthe Ġ[ Executor Hooks . execute After Project ] Ġhook . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent Project : ĠProject ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġfile Ġthis Ġexecutor Ġcurrently Ġworks Ġon , Ġif Ġany . ĠThis Ġwill Ġalways ĊĠĠĠĠ Ġ* Ġbe Ġset Ġafter Ġthe Ġ[ Executor Hooks . execute Before File ] Ġhook Ġis Ġexecuted ĊĠĠĠĠ Ġ* Ġand Ġunset Ġbefore Ġthe Ġ[ Executor Hooks . execute After File ] Ġhook . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcurrent File : ĠProject File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsetup Ġfor Ġall Ġexecution s Ġrun Ġby Ġthis Ġexecutor . ĠThe Ġexecution Ġoptions ĊĠĠĠĠ Ġ* Ġshould Ġnot Ġchange Ġwhile Ġexecuting Ġone Ġproject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġvar Ġexecution Options : ĠExecution Options Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġorg . isl ando ft ex . ar ara . core . configuration . Execution Options () ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current File Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAr ara Exception (" Cannot Ġchange Ġexecution Ġoptions Ġwhile Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" exec uting Ġthe Ġfile Ġ${ current File ?. path }. ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . parallel Execution ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠAr ara Exception (" This Ġexecutor Ġdoes Ġnot Ġsupport Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" parallel Ġexecution .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExecute Ġrules Ġbased Ġon Ġthe Ġprojects . ĠShould Ġroughly Ġimplement Ġthe ĊĠĠĠĠ Ġ* Ġfollowing Ġsteps : ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ 1 . ĠResolve Ġproject Ġdependencies Ġand Ġcreate Ġan Ġappropriate Ġexecution ĊĠĠĠĠ Ġ* ĠĠĠ Ġorder . ĠPay Ġattention Ġto Ġblocking Ġwhen Ġdoing Ġparallel Ġexecution . ĊĠĠĠĠ Ġ* Ġ 2 . ĠRun Ġar ara 's Ġmain Ġroutines Ġon Ġeach Ġproject . ĠWith in Ġa Ġproject , ĊĠĠĠĠ Ġ* ĠĠĠ Ġfollow Ġthe Ġfile Ġprior ities . ĊĠĠĠĠ Ġ* Ġ 3 . ĠWait Ġfor Ġall Ġtasks Ġto Ġfinish . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġprojects ĠThe Ġprojects Ġto Ġact Ġon . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( projects : ĠList < Project >): ĠExecution Report Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprojects In Order Ġ= ĠProject Graph (). apply Ġ{ Ġadd All ( projects ) Ġ}. k ah n () ĊĠĠĠĠĠĠĠ Ġhooks . execute Before Execution () ĊĠĠĠĠĠĠĠ Ġval Ġexecution Started Ġ= ĠTime Source . Mon otonic . mark Now () ĊĠĠĠĠĠĠĠ Ġvar Ġexit Code Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( project Ġin Ġprojects In Order ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Code Ġ= Ġexecute Project ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( execution Options . halt On Errors Ġ&& Ġexit Code Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexecution Ended Ġ= ĠTime Source . Mon otonic . mark Now () ĊĠĠĠĠĠĠĠ Ġval Ġexecution Report Ġ= ĠExecution Report ( execution Started , Ġexecution Ended , Ġexit Code ) ĊĠĠĠĠĠĠĠ Ġhooks . execute After Execution ( execution Report ) ĊĠĠĠĠĠĠĠ Ġreturn Ġexecution Report ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġfun Ġexecute Project ( project : ĠProject ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġexit Code Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġcurrent Project Ġ= Ġproject ĊĠĠĠĠĠĠĠ Ġhooks . execute Before Project ( project ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġproject . files . by Priority ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhooks . execute Before File ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexecution Report Ġ= Ġexecute ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Code Ġ= Ġexecution Report . exit Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( execution Options . halt On Errors Ġ&& Ġexit Code Ġ!= Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexit Code ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhooks . execute After File ( execution Report ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġhooks . execute After Project ( project ) ĊĠĠĠĠĠĠĠ Ġcurrent Project Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġexit Code ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerforms Ġar ara 's Ġmain Ġroutine Ġto Ġrun Ġa Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile ĠThe Ġfile Ġto Ġrun . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġexecute ( file : ĠProject File ): ĠExecution Report Ġ{ ĊĠĠĠĠĠĠĠ Ġcurrent File Ġ= Ġfile ĊĠĠĠĠĠĠĠ Ġval Ġexecution Started Ġ= ĠTime Source . Mon otonic . mark Now () ĊĠĠĠĠĠĠĠ Ġval Ġdirectives Ġ= Ġhooks . process Directives ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . fetch Directives ( execution Options . parse Only Header ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġvar Ġexit Code Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( directive Ġin Ġdirectives ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Code Ġ= Ġdirective . execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( execution Options . halt On Errors Ġ&& Ġexit Code Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcurrent File Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠExecution Report ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexecution Started , ĠTime Source . Mon otonic . mark Now (), Ġexit Code ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ