/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . gradle . plugin . statistics Ċ Ċ import Ġorg . gradle . api . logging . Logging Ċ import Ġorg . gradle . tool ing . events . Finish Event Ċ import Ġorg . gradle . tool ing . events . Operation Completion Listener Ċ import Ġorg . gradle . tool ing . events . task . Task Failure Result Ċ import Ġorg . gradle . tool ing . events . task . Task Finish Event Ċ import Ġorg . gradle . tool ing . events . task . Task Skipped Result Ċ import Ġorg . gradle . tool ing . events . task . Task Success Result Ċ import Ġorg . jetbrains . kotlin . cli . common . Compiler System Properties Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . internal . state . Task Execution Results Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . stat . Compile Stat Data Ċ import Ġorg . jetbrains . kotlin . gradle . plugin . stat . Report Statistics Ċ import Ġorg . jetbrains . kotlin . incremental . Changed Files Ċ import Ġorg . jetbrains . kotlin . utils . addTo Std lib . measure Time Millis With Result Ċ import Ġjava . net . Inet Address Ċ import Ġjava . util .* Ċ import Ġkotlin . system . measure Time Millis Ċ Ċ enum Ġclass ĠTask Execution State Ġ{ ĊĠĠĠ ĠSKIP PED , ĊĠĠĠ ĠFAILED , ĊĠĠĠ ĠUNKNOWN , ĊĠĠĠ ĠSUCCESS , ĊĠĠĠ ĠFROM _ CACHE , ĊĠĠĠ ĠUP _ TO _ DATE ĊĠĠĠ Ġ; Ċ } Ċ Ċ class ĠKotlin Build Stat Listener ( val ĠprojectName : ĠString , Ġval Ġreport Statistics : ĠList < Report Statistics >) Ġ: ĊĠĠĠ ĠOperation Completion Listener , ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/* ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAll Ġlisteners Ġprocess Ġevents Ġin Ġsingle Ġthread Ġpool . ĠAfter Ġbuild Ġfinished Ġit Ġhas Ġonly Ġ 6 0 Ġseconds Ġto Ġfinish Ġprocessing . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠOur Ġlisteners Ġshould Ġnot Ġspend Ġsignificant Ġamount Ġof Ġtime Ġduring Ġevent Ġprocessing . ĊĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠLIMIT _ DURATION _ MS Ġ= Ġ 5 Ġ* Ġ 1 0 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLogging . getLogger ( this . java Class ) ĊĠĠĠ Ġval Ġbuild Uuid : ĠString Ġ= ĠUUID . randomUUID (). toString () ĊĊĠĠĠ Ġval Ġlabel Ġby Ġlazy Ġ{ ĠCompiler System Properties . K OT LIN _ STAT _ LAB El _ PROPERTY . value Ġ} ĊĠĠĠ Ġval Ġhost Name : ĠString ? Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠInet Address . getLocal Host (). host Name ĊĠĠĠ Ġ} Ġcatch Ġ(_ : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// do Ġnothing ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Finish ( event : ĠFinish Event ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmeasured Time Ms Ġ= Ġmeasure Time Millis Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġis ĠTask Finish Event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġevent . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Path Ġ= Ġevent . descriptor . task Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġduration Ġ= Ġresult . endTime Ġ- Ġresult . startTime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Result Ġ= Ġwhen Ġ( result ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Success Result Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is From Cache Ġ-> ĠTask Execution State . FROM _ CACHE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Up ToDate Ġ-> ĠTask Execution State . UP _ TO _ DATE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTask Execution State . SUCCESS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Skipped Result Ġ-> ĠTask Execution State . SKIP PED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠTask Failure Result Ġ-> ĠTask Execution State . FAILED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTask Execution State . UNKNOWN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreport Data ( task Path , Ġduration , Ġtask Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( meas ured Time Ms Ġ> ĠLIMIT _ DURATION _ MS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Ex ceed Ġtime Ġlimit Ġfor Ġ$ event . ĠTakes Ġ${ meas ured Time Ms } ms Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreport Data ( task Path : ĠString , Ġduration : ĠLong , Ġtask Result : ĠTask Execution State ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( report Data Duration , Ġcompile Stat Data ) Ġ= Ġmeasure Time Millis With Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! available For Stat ( task Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtask Execution Result Ġ= ĠTask Execution Results [ task Path ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtime Data Ġ= Ġtask Execution Result ?. build Metrics ?. build Times ?. as Map ()?. filter Values Ġ{ Ġvalue Ġ-> Ġvalue Ġ!= Ġ 0 L Ġ} Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġperf Data Ġ= Ġtask Execution Result ?. build Metrics ?. build Performance Metrics ?. as Map ()?. filter Values Ġ{ Ġvalue Ġ-> Ġvalue Ġ!= Ġ 0 L Ġ} Ġ?: Ġempty Map () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanges Ġ= Ġwhen Ġ( val Ġchanged Files Ġ= Ġtask Execution Result ?. task Info ?. changed Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChanged Files . Known Ġ-> Ġchanged Files . modified . map Ġ{ Ġit . absolute Path Ġ} Ġ+ Ġchanged Files . removed . map Ġ{ Ġit . absolute Path Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠChanged Files . Dependencies Ġ-> Ġchanged Files . modified . map Ġ{ Ġit . absolute Path Ġ} Ġ+ Ġchanged Files . removed . map Ġ{ Ġit . absolute Path Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List < String >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcompile Stat Data Ġ= ĠCompile Stat Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġduration Ġ= Ġduration , Ġtask Result Ġ= Ġtask Result . name , Ġlabel Ġ= Ġlabel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtime Data Ġ= Ġtime Data , Ġperf Data Ġ= Ġperf Data , ĠprojectName Ġ= ĠprojectName , Ġtask Name Ġ= Ġtask Path , Ġchanges Ġ= Ġchanges , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtags Ġ= Ġtask Execution Result ?. task Info ?. properties ?. map Ġ{ Ġit . name Ġ} Ġ?: Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnon Incremental Attributes Ġ= Ġtask Execution Result ?. build Metrics ?. build Attributes ?. as Map () Ġ?: Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Name Ġ= Ġhost Name , Ġkotlin Version Ġ= Ġ" 1 . 6 ", Ġbuild Uuid Ġ= Ġbuild Uuid , Ġtime In Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport Statistics . forEach Ġ{ Ġit . report ( compile Stat Data ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcompile Stat Data ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlog . debug (" Report Ġdata Ġtakes Ġ$ report Data Duration : Ġ$ compile Stat Data ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġavailable For Stat ( task Path : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtask Path . contains (" Kotlin ") Ġ&& Ġ( Task Execution Results [ task Path ] Ġ!= Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ