@ file : SuppressWarnings (" New Api ") Ċ Ċ package Ġedu . ill inois . cs . cs 1 2 5 . gradle grader . plugin Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . data format . yaml . YAML Factory Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġcom . google . gson . Gson Ċ import Ġio . gitlab . art urb os ch . de te kt . Det ek t Ċ import Ġio . gitlab . art urb os ch . de te kt . extensions . Det ek t Extension Ċ import Ġorg . eclipse . j git . api . Git Ċ import Ġorg . eclipse . j git . lib . Constants Ċ import Ġorg . eclipse . j git . storage . file . File Repository Builder Ċ import Ġorg . gradle . api . Plugin Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . plugins . quality . Check style Extension Ċ import Ġorg . gradle . api . tasks . Delete Ċ import Ġorg . gradle . api . tasks . compile . Java Compile Ċ import Ġorg . gradle . api . tasks . testing . Test Ċ import Ġorg . jetbrains . kotlin . gradle . dsl . Kotlin Compile Ċ import Ġjava . nio . file . Files Ċ Ċ /** Ċ Ġ* ĠThe Ġgradle grader ĠGradle Ġplugin . Ċ Ġ*/ Ċ @ Suppress (" unused ") Ċ class ĠGradle Gr ader Plugin Ġ: ĠPlugin < Project > Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠApplies Ġthe Ġplugin Ġto Ġthe Ġproject . ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe ĠGradle Ġproject Ġto Ġapply Ġto ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġapply ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= Ġproject . extensions . create (" gradle grader ", ĠGr ade Policy Extension :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġexit Manager Ġ= ĠExit Manager ( config ) ĊĊĠĠĠĠĠĠĠ Ġfun Ġfind Sub projects (): ĠList < Project > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġconfig . sub projects Ġ?: ĠlistOf ( project ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġjava Compile Tasks Ġ= Ġmutable Set Of < Java Compile >() ĊĠĠĠĠĠĠĠ Ġval Ġkotlin Compile Tasks Ġ= Ġmutable Set Of < Task >() ĊĊĠĠĠĠĠĠĠ Ġval Ġtest Tasks Ġ= Ġmutable Map Of < Project , ĠTest >() ĊĠĠĠĠĠĠĠ Ġvar Ġcurrent Checkpoint : ĠString ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcheck style Task Ġ= Ġproject . tasks . register (" rel ent less Check style ", ĠRel ent less Check style :: class . java ). get () ĊĠĠĠĠĠĠĠ Ġval Ġde te kt Task Ġ= Ġproject . tasks . register (" our Det ek t ", ĠDet ek t :: class . java ). get () ĊĊĠĠĠĠĠĠĠ Ġval Ġtarget Task Ġ= Ġproject . tasks . register (" grade "). get () ĊĠĠĠĠĠĠĠ Ġval Ġgrade Task : ĠGr ade Task Ġ= Ġproject . tasks . register (" score ", ĠGr ade Task :: class . java ). get () ĊĠĠĠĠĠĠĠ Ġgrade Task . must Run After ( target Task ) ĊĊĠĠĠĠĠĠĠ Ġval Ġre conf Task Ġ= Ġproject . task (" prepare For Grad ing "). do Last Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġprojects ' Ġtest Ġtasks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Sub projects (). forEach Ġ{ Ġsub project Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! test Tasks . containsKey ( sub project )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Manager . fail (" Couldn 't Ġfind Ġa Ġtest Ġtask Ġfor Ġproject Ġ${ sub project . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġcontributors Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . identification . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtxt File Ġ= Ġconfig . identification . txt File !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! txt File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Manager . fail (" Missing Ġcontributor Ġidentification Ġfile : Ġ${ txt File . absolute Path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart ners Ġ= ĠFiles . read All Lines ( txt File . to Path ()). filter Ġ{ Ġit . isNotBlank () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! config . identification . count Limit . is Satisf ied By ( partners . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Manager . fail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . identification . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ" Invalid Ġnumber Ġof Ġcontributors Ġ(${ partners . size }) Ġin Ġidentification Ġfile : Ġ${ txt File . absolute Path }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpart ners . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! config . identification . validate . is Satisf ied By ( it )) Ġexit Manager . fail ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . identification . message ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ" Invalid Ġcontributor Ġformat : Ġ$ it " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . contributors Ġ= Ġpart ners ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck ĠV CS ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . vcs . git ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgit Repo Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġce iling Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . root Project . project Dir . parent File Ġ// ĠGo Ġan Ġextra Ġlevel Ġup Ġto Ġwork Ġaround Ġa ĠJ Git Ġbug ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Repository Builder (). set Must Exist ( true ). add Ce iling Directory ( ce iling ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find Git Dir ( project . project Dir ). build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Manager . fail (" Gr ader ĠGit Ġintegration Ġis Ġenabled Ġbut Ġthe Ġproject Ġisn 't Ġa ĠGit Ġrepository .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . git Config Ġ= Ġgit Repo . config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Commit Ġ= Ġgit Repo . resolve ( Constants . HEAD ). name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . last Commit Id Ġ= Ġlast Commit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . vcs . require Commit ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġscore Info Ġ= ĠV cs Score Info ( listOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġloaded Info Ġ= ĠGson (). fromJson ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . root Project . file (". score . json "). read Text (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV cs Score Info :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" S ENSE LESS _ COMP AR IS ON ") Ġ// ĠPossible Ġfor Ġcheck points Ġto Ġbe Ġnull Ġif Ġloaded Ġby ĠGson ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( loaded Info . check points Ġ!= Ġnull ) Ġscore Info Ġ= Ġloaded Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheckpoint Score Info Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscore Info . get Checkpoint Info ( current Checkpoint ) Ġ?: ĠV cs Checkpoint Score Info ( current Checkpoint ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus Ġ= ĠGit . open ( git Repo . work Tree ). status (). call () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclean Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( status . added . size Ġ+ Ġstatus . changed . size Ġ+ Ġstatus . removed . size Ġ+ Ġstatus . modified . size Ġ+ Ġstatus . missing . size ) Ġ== Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( checkpoint Score Info . increase d Ġ&& Ġcheckpoint Score Info . last Seen Commit Ġ== Ġlast Commit Ġ&& Ġ! clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit Manager . fail (" The Ġauto grader Ġwill Ġnot Ġrun Ġuntil Ġyou Ġcommit Ġthe Ġchanges Ġthat Ġincreased Ġyour Ġscore .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . score Info Ġ= Ġscore Info ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . repo Is Clean Ġ= Ġclean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġcheck style ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . check style . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheck style Config Ġ= Ġproject . extensions . getBy Type ( Check style Extension :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Config . tool Version Ġ= Ġconfig . check style . version ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Config . reports Dir Ġ= Ġproject . file (" build / reports / check style ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . ignore Failures Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . source ( find Sub projects (). map Ġ{ Ġ"${ it . project Dir }/ src / main " Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . set Includes ( config . check style . include ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . set Exclude s ( config . check style . exclude ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . configFile Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . check style . configFile Ġ?: Ġexit Manager . fail (" check style . configFile Ġnot Ġspecified ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . classpath Ġ= Ġproject . files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . listen To ( check style Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . de te kt . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġde te kt Config Ġ= Ġproject . extensions . getBy Type ( Det ek t Extension :: class . java ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . ignore Failures Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . source ( de te kt Config . source ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . build Up on Default Config Ġ= Ġde te kt Config . build Up on Default Config ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . config . set From ( de te kt Config . config ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġthe Ġtest Ġtasks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest Tasks . values . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . listen To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! project . has Property (" grade . ignore properties ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . system Properties . forEach Ġ{ Ġ( prop , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . system Property ( prop , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( project . has Property (" grade . test filter ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . set Test Name Include Patterns ( mutable ListOf ( project . property (" grade . test filter ") Ġas ĠString )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . filter . is Fail On No Matching Tests Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( current Checkpoint Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfig . checkpoint ing . test Configure Action . accept ( current Checkpoint !! , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . setProperty (" ignore Failures ", Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . gather Test Info ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġcompilation Ġtasks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Compile Tasks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . listen To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . options . is Fail OnError Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Compile Tasks . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . listen To ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . outputs . up ToDate When Ġ{ Ġfalse Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLogic Ġthat Ġdepends Ġon Ġall Ġprojects Ġhaving Ġbeen Ġevaluated ĊĠĠĠĠĠĠĠ Ġval Ġon All Projects Ready Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclean Tasks Ġ= Ġfind Sub projects (). map Ġ{ Ġit . tasks . get ByName (" clean ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . force Clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequire Ġa Ġclean Ġfirst ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Task . depends On ( clean Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDepend Ġon Ġcheck style ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . check style . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . must Run After ( re conf Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck style Task . must Run After ( clean Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Task . depends On ( check style Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . gather Check style Info ( check style Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . de te kt . enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . must Run After ( re conf Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde te kt Task . must Run After ( clean Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Task . depends On ( de te kt Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . gather Det ek t Info ( de te kt Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGet Ġsub project Ġtasks ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Sub projects (). forEach Ġ{ Ġsub project Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClean Ġbefore Ġcompile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub project . tasks . with Type ( Java Compile :: class . java ) Ġ{ Ġcompile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile . must Run After ( clean Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile . must Run After ( re conf Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjava Compile Tasks . add ( compile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub project . tasks . with Type ( Kotlin Compile :: class . java ) Ġ{ Ġcompile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile . must Run After ( clean Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompile . must Run After ( re conf Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin Compile Tasks . add ( compile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDepend Ġon Ġtests ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub project . tasks . with Type ( Test :: class . java ) Ġ{ Ġtest Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( test . name Ġin Ġset Of (" test ", Ġ" test Debug UnitTest ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Tasks [ sub project ] Ġ= Ġtest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest . must Run After ( clean Tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest . must Run After ( re conf Task ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Task . depends On ( test ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠFinish Ġsetup Ġonce Ġall Ġprojects Ġhave Ġbeen Ġevaluated Ġand Ġtasks Ġhave Ġbeen Ġcreated ĊĠĠĠĠĠĠĠ Ġproject . after Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . force Clean ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġre conf Task . depends On ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . tasks . register (" clear Build Dir ", ĠDelete :: class . java ) Ġ{ Ġdel Task Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdel Task . delete Ġ= Ġset Of ( project . build Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . depends On ( re conf Task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( config . checkpoint ing . yaml File Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfig Loader Ġ= ĠObjectMapper ( YAML Factory ()). also Ġ{ Ġit . register Kotlin Module () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcheckpoint Config Ġ= Ġconfig Loader . readValue < Checkpoint Config >( config . checkpoint ing . yaml File !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent Checkpoint Ġ= Ġcheckpoint Config . checkpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrade Task . current Checkpoint Ġ= Ġcurrent Checkpoint ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġeval Pending Ġ= Ġfind Sub projects (). to Mutable List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġeval Pending . remove ( project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( eval Pending . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon All Projects Ready () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeval Pending . toList (). forEach Ġ{ Ġsub project Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub project . after Evaluate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġeval Pending . remove ( sub project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( eval Pending . size Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon All Projects Ready () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ