/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġandroidx . build . dependency Tracker Ċ Ċ import Ġandroidx . build . dependency Tracker . Affected Module Detector . Companion . ENABLE _ ARG Ċ import Ġandroidx . build . get Distribution Directory Ċ import Ġandroidx . build . git client . Git Client Impl Ċ import Ġandroidx . build . gradle . is Root Ċ import Ġjava . io . File Ċ import Ġorg . gradle . api . Action Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . invocation . Gradle Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġorg . gradle . api . services . Build Service Ċ import Ġorg . gradle . api . services . Build Service Parameters Ċ import Ġorg . gradle . api . services . Build Service Spec Ċ Ċ /** Ċ Ġ* ĠThe Ġsub sets Ġwe Ġallow Ġthe Ġprojects Ġto Ġbe Ġpartition ed Ġinto . Ċ Ġ* ĠThis Ġis Ġto Ġallow Ġmore Ġgran ular Ġtesting . ĠSpecific ally , Ġto Ġenable Ġrunning Ġlarge Ġtests Ġon Ċ Ġ* ĠCH ANG ED _ PROJECT S , Ġwhile Ġstill Ġonly Ġrunning Ġsmall Ġand Ġmedium Ġtests Ġon ĠDE PEND ENT _ PROJECT S . Ċ Ġ* Ċ Ġ* ĠThe ĠProject Subset Ġspecifies Ġwhich Ġprojects Ġwe Ġare Ġinterested Ġin Ġtesting . Ċ Ġ* ĠThe ĠAff ected Module Detector Ġdetermines Ġthe Ġminimum Ġset Ġof Ġprojects Ġthat Ġmust Ġbe Ġbuilt Ġin Ċ Ġ* Ġorder Ġto Ġrun Ġall Ġthe Ġtests Ġalong Ġwith Ġtheir Ġruntime Ġdependencies . Ċ Ġ* Ċ Ġ* ĠThe Ġsub sets Ġare : Ċ Ġ* Ġ ĠCH ANG ED _ PROJECT S Ġ-- ĠThe Ġcontaining Ġprojects Ġfor Ġany Ġfiles Ġthat Ġwere Ġchanged Ġin Ġthis ĠCL . Ċ Ġ* Ċ Ġ* Ġ ĠDE PEND ENT _ PROJECT S Ġ-- ĠAny Ġprojects Ġthat Ġhave Ġa Ġdependency Ġon Ġany Ġof Ġthe Ġprojects Ċ Ġ* ĠĠĠĠĠ Ġin Ġthe ĠCH ANG ED _ PROJECT S Ġset . Ċ Ġ* Ċ Ġ* Ġ ĠNONE Ġ-- ĠA Ġstatus Ġto Ġreturn Ġfor Ġa Ġproject Ġwhen Ġit Ġis Ġnot Ġsupposed Ġto Ġbe Ġbuilt . Ċ Ġ*/ Ċ enum Ġclass ĠProject Subset Ġ{ ĠDE PEND ENT _ PROJECT S , ĠCH ANG ED _ PROJECT S , ĠNONE Ġ} Ċ Ċ /** Ċ Ġ* ĠProvides Ġthe Ġlist Ġof Ġfile Ġpaths Ġ( relative Ġto Ġthe Ġgit Ġroot ) Ġthat Ġhave Ġchanged Ġ( can Ġinclude Ċ Ġ* Ġremoved Ġfiles ). Ċ Ġ* Ċ Ġ* ĠReturns Ġ` null ` Ġif Ġchanged Ġfiles Ġcannot Ġbe Ġdetected . Ċ Ġ*/ Ċ type alias ĠChanged Files Provider Ġ= Ġ() Ġ-> ĠList < String >? Ċ Ċ /** Ċ Ġ* ĠA Ġutility Ġclass Ġthat Ġcan Ġdiscover Ġwhich Ġfiles Ġare Ġchanged Ġbased Ġon Ġgit Ġhistory . Ċ Ġ* Ċ Ġ* ĠTo Ġenable Ġthis , Ġyou Ġneed Ġto Ġpass Ġ[ ENABLE _ ARG ] Ġinto Ġthe Ġbuild Ġas Ġa Ġcommand Ġline Ġparameter Ċ Ġ* Ġ(- P < name >) Ċ Ġ* Ċ Ġ* ĠCurrently , Ġit Ġchecks Ġgit Ġlogs Ġto Ġfind Ġlast Ġmerge ĠCL Ġto Ġdiscover Ġwhere Ġthe Ġanchor ĠCL Ġis . Ċ Ġ* Ċ Ġ* ĠEvent ually , Ġwe 'll Ġmove Ġto Ġthe Ġprops Ġpassed Ġdown Ġby Ġthe Ġbuild Ġsystem Ġwhen Ġit Ġis Ġavailable . Ċ Ġ* Ċ Ġ* ĠSince Ġthis Ġneeds Ġto Ġcheck Ġproject Ġdependency Ġgraph Ġto Ġwork , Ġit Ġcannot Ġbe Ġaccessed Ġbefore Ċ Ġ* Ġall Ġprojects Ġare Ġloaded . ĠDo ing Ġso Ġwill Ġthrow Ġan Ġexception . Ċ Ġ*/ Ċ abstract Ġclass ĠAff ected Module Detector ( ĊĠĠĠ Ġprotected Ġval Ġlogger : ĠLogger ? Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthis Ġproject Ġwas Ġaffected Ġby Ġcurrent Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġshould Include ( project : ĠString ): ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġthis Ġtask Ġwas Ġaffected Ġby Ġcurrent Ġchanges . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġshould Include ( task : ĠTask ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinclude Ġ= Ġshould Include ( task . project . path ) ĊĠĠĠĠĠĠĠ Ġval Ġinclusion Verb Ġ= Ġif Ġ( include ) Ġ" In cluding " Ġelse Ġ" Ex cluding " ĊĠĠĠĠĠĠĠ Ġlogger ?. info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ in clusion Verb Ġtask Ġ${ task . path }" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġinclude ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġset Ġthat Ġthe Ġproject Ġbelongs Ġto . ĠThe Ġset Ġis Ġone Ġof Ġthe ĠProject Subset Ġabove . ĊĠĠĠĠ Ġ* ĠThis Ġis Ġused Ġby Ġthe Ġtest Ġconfig Ġgenerator . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Subset ( project Path : ĠString ): ĠProject Subset ĊĊĠĠĠ Ġfun Ġget Subset ( task : ĠTask ): ĠProject Subset Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtask Path Ġ= Ġtask . path ĊĠĠĠĠĠĠĠ Ġval Ġlast Colon Index Ġ= Ġtask Path . lastIndexOf (": ") ĊĠĠĠĠĠĠĠ Ġval Ġproject Path Ġ= Ġtask Path . substring ( 0 , Ġlast Colon Index ) ĊĠĠĠĠĠĠĠ Ġreturn Ġget Subset ( project Path ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠROOT _ PROP _ NAME Ġ= Ġ" affected Module Detector " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSERVICE _ NAME Ġ= ĠROOT _ PROP _ NAME Ġ+ Ġ" Build Service " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOG _ FILE _ NAME Ġ= Ġ" affected _ module _ detector _ log . txt " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠENABLE _ ARG Ġ= Ġ" android x . enable Affected Module Detection " ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠBASE _ COMMIT _ ARG Ġ= Ġ" android x . affected Module Detector . base Commit " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġconfigure ( gradle : ĠGradle , Ġroot Project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMake Ġan ĠAff ected Module Detector Wrapper Ġthat Ġcall ers Ġcan Ġsave Ġbefore Ġthe Ġreal ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAff ected Module Detector Ġis Ġready . ĠCall ers Ġwon 't Ġbe Ġable Ġto Ġuse Ġit Ġuntil Ġthe Ġwrapped ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdetector Ġhas Ġbeen Ġassigned , Ġbut Ġconfigure Task Guard Ġcan Ġstill Ġreference Ġit Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclo s ures Ġthat Ġwill Ġexecute Ġduring Ġtask Ġexecution . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinstance Ġ= ĠAff ected Module Detector Wrapper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Project . extensions . add ( ROOT _ PROP _ NAME , Ġinstance ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenabled Ġ= Ġroot Project . has Property ( ENABLE _ ARG ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Project . find Property ( ENABLE _ ARG ) Ġ!= Ġ" false " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdist Dir Ġ= Ġroot Project . get Distribution Directory () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputFile Ġ= Ġdist Dir . resolve ( LOG _ FILE _ NAME ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠFile Logger ( outputFile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" setup : Ġenabled : Ġ$ enabled ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġsetup With Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġspec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġspec . parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . accept All Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . log Ġ= ĠoutputFile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" using ĠAccept All ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . wrapped Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Commit Override : ĠString ? Ġ= Ġroot Project . find Property ( BASE _ COMMIT _ ARG ) Ġas ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( base Commit Override Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" using Ġbase Ġcommit Ġoverride Ġ$ base Commit Override ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgradle . task Graph . when Ready Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . lifecycle (" projects Ġevaluated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Graph Ġ= ĠProject Graph ( root Project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdependency Tracker Ġ= ĠDependency Tracker ( root Project , Ġlogger ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovider Ġ= Ġsetup With Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot Project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġspec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparams Ġ= Ġspec . parameters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . rootDir Ġ= Ġroot Project . project Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . project Graph Ġ= Ġproject Graph ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . dependency Tracker Ġ= Ġdependency Tracker ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . log Ġ= ĠoutputFile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparams . base Commit Override Ġ= Ġbase Commit Override ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" using Ġreal Ġdetector ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . wrapped Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġsetup With Params ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Project : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Action : ĠAction < Build Service Spec < Affected Module Detector Loader . Parameters >> ĊĠĠĠĠĠĠĠ Ġ): ĠProvider < Affected Module Detector Loader > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! root Project . is Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" this Ġshould 've Ġbeen Ġthe Ġroot Ġproject ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġservice Provider Ġ= Ġroot Project . get Gradle (). get Shared Services () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. register If Absent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSERVICE _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAff ected Module Detector Loader :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Action ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġservice Provider ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ): ĠAff ected Module Detector Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextensions Ġ= Ġproject . root Project . extensions ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetector Ġ= Ġextensions . find ByName ( ROOT _ PROP _ NAME ) Ġas ? ĠAff ected Module Detector ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdetector !! ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCall Ġthis Ġmethod Ġto Ġconfigure Ġthe Ġgiven Ġtask Ġto Ġexecute Ġonly Ġif Ġthe Ġowner Ġproject ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Ġaffected Ġby Ġcurrent Ġchanges ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Throws ( Gradle Exception :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġconfigure Task Guard ( task : ĠTask ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdetector Ġ= ĠgetInstance ( task . project ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask . only If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdetector . should Include ( task ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠWrapper Ġfor ĠAff ected Module Detector Ċ Ġ* ĠCall ers Ġcan Ġaccess Ġthis Ġwrapper Ġduring Ġproject Ġconfiguration Ġand Ġsave Ġit Ġuntil Ġtask Ġexecution Ċ Ġ* Ġtime Ġwhen Ġthe Ġwrapped Ġdetector Ġis Ġready Ġfor Ġuse Ġ( after Ġthe Ġproject Ġgraph Ġis Ġready ) Ċ Ġ*/ Ċ class ĠAff ected Module Detector Wrapper Ġ: ĠAff ected Module Detector ( logger Ġ= Ġnull ) Ġ{ ĊĠĠĠ Ġ// ĠWe Ġsave Ġa Ġprovider Ġto Ġa Ġbuild Ġservice Ġthat Ġknows Ġhow Ġto Ġmake Ġan ĊĠĠĠ Ġ// ĠAff ected Module Detector Impl Ġbecause : ĊĠĠĠ Ġ// ĠAn ĠAff ected Module Detector Impl Ġsaves Ġthe Ġlist Ġof Ġmodified Ġfiles Ġand Ġaffected ĊĠĠĠ Ġ// Ġmodules Ġto Ġavoid Ġhaving Ġto Ġre compute Ġit Ġfor Ġeach Ġtask . ĠHowever , Ġthat Ġlist Ġcan ĊĠĠĠ Ġ// Ġchange Ġacross Ġbuilds Ġand Ġwe Ġwant Ġto Ġre compute Ġit Ġin Ġeach Ġbuild . ĠThis Ġrequires ĊĠĠĠ Ġ// Ġcreating Ġa Ġnew ĠAff ected Module Detector Impl Ġin Ġeach Ġbuild . ĊĠĠĠ Ġ// ĠTo Ġget ĠGradle Ġto Ġcreate Ġa Ġnew ĠAff ected Module Detector Impl Ġin Ġeach Ġbuild , Ġwe Ġneed ĊĠĠĠ Ġ// Ġto Ġpass Ġaround Ġa Ġprovider Ġto Ġa Ġbuild Ġservice Ġand Ġquery Ġit Ġfrom Ġeach Ġtask . ĊĠĠĠ Ġ// ĠThe Ġbuild Ġservice Ġgets Ġre created Ġwhen Ġabsent Ġand Ġreused Ġwhen Ġpresent . ĠThen Ġthe ĊĠĠĠ Ġ// Ġbuild Ġservice Ġwill Ġreturn Ġthe Ġsame ĠAff ected Module Detector Impl Ġfor Ġeach Ġtask Ġin ĊĠĠĠ Ġ// Ġa Ġbuild ĊĠĠĠ Ġvar Ġwrapped : ĠProvider < Affected Module Detector Loader >? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġget OrThrow (): ĠAff ected Module Detector Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwrapped ?. get ()?. detector Ġ?: Ġthrow ĠGradle Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠT ried Ġto Ġget Ġthe Ġaffected Ġmodule Ġdetector Ġimplementation Ġtoo Ġearly . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠYou Ġcannot Ġaccess Ġit Ġuntil Ġall Ġprojects Ġare Ġevaluated . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġget Subset ( project Path : ĠString ): ĠProject Subset Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget OrThrow (). get Subset ( project Path ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġshould Include ( project : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget OrThrow (). should Include ( project ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġoverride Ġfun Ġshould Include ( task : ĠTask ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget OrThrow (). should Include ( task ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠStores Ġthe Ġparameters Ġof Ġan ĠAff ected Module Detector Ġand Ġcreates Ġone Ġwhen Ġneeded . Ċ Ġ* ĠThe Ġparameters Ġhere Ġmay Ġbe Ġdeserialized Ġand Ġloaded Ġfrom ĠGradle 's Ġconfiguration Ġcache Ġwhen Ġthe Ċ Ġ* Ġconfiguration Ġcache Ġis Ġenabled . Ċ Ġ*/ Ċ abstract Ġclass ĠAff ected Module Detector Loader Ġ: ĊĠĠĠ ĠBuild Service < Affected Module Detector Loader . Parameters > Ġ{ ĊĠĠĠ Ġinterface ĠParameters Ġ: ĠBuild Service Parameters Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġaccept All : ĠBoolean ĊĊĠĠĠĠĠĠĠ Ġvar Ġroot Dir : ĠFile ĊĠĠĠĠĠĠĠ Ġvar Ġproject Graph : ĠProject Graph ĊĠĠĠĠĠĠĠ Ġvar Ġdependency Tracker : ĠDependency Tracker ĊĠĠĠĠĠĠĠ Ġvar Ġlog : ĠFile ĊĠĠĠĠĠĠĠ Ġvar Ġco built Test Paths : ĠSet < Set < String >> ? ĊĠĠĠĠĠĠĠ Ġvar Ġalways Build IfExists : ĠSet < String >? ĊĠĠĠĠĠĠĠ Ġvar Ġignored Paths : ĠSet < String >? ĊĠĠĠĠĠĠĠ Ġvar Ġbase Commit Override : ĠString ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdetector : ĠAff ected Module Detector Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlogger Ġ= ĠFile Logger ( parameters . log ) ĊĠĠĠĠĠĠĠ Ġif Ġ( parameters . accept All ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAccept All ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Commit Override Ġ= Ġparameters . base Commit Override ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( base Commit Override Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" using Ġbase Ġcommit Ġoverride Ġ$ base Commit Override ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgit Client Ġ= ĠGit Client Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġworking Dir Ġ= Ġparameters . rootDir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= Ġlogger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchanged Files Provider : ĠChanged Files Provider Ġ= Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase Sha Ġ= Ġbase Commit Override Ġ?: Ġgit Client . find Previous Submitted Change () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Sha ?. let ( git Client :: find Changed Files Since ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠAff ected Module Detector Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Graph Ġ= Ġparameters . project Graph , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Tracker Ġ= Ġparameters . dependency Tracker , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger Ġ= Ġlogger , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco built Test Paths Ġ= Ġparameters . co built Test Paths ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠAff ected Module Detector Impl . CO BUIL T _ TEST _ PATHS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalways Build IfExists Ġ= Ġparameters . always Build IfExists ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠAff ected Module Detector Impl . ALWAYS _ BUILD _ IF _ EXISTS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored Paths Ġ= Ġparameters . ignored Paths Ġ?: ĠAff ected Module Detector Impl . IG NO RED _ PATHS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Files Provider Ġ= Ġchanged Files Provider ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠImplementation Ġthat Ġaccepts Ġeverything Ġwithout Ġchecking . Ċ Ġ*/ Ċ private Ġclass ĠAccept All ( ĊĠĠĠ Ġlogger : ĠLogger ? Ġ= Ġnull Ċ ) Ġ: ĠAff ected Module Detector ( logger ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġshould Include ( project : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger ?. info ("[ Accept All ] Ġaccept All . should Include Ġreturning Ġtrue ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Subset ( project Path : ĠString ): ĠProject Subset Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger ?. info ("[ Accept All ] ĠAccept All . get Subset Ġreturning ĠCH ANG ED _ PROJECT S ") ĊĠĠĠĠĠĠĠ Ġreturn ĠProject Subset . CHANGED _ PROJECT S ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReal Ġimplementation Ġthat Ġchecks Ġgit Ġlogs Ġto Ġdecide Ġwhat Ġis Ġaffected . Ċ Ġ* Ċ Ġ* ĠIf Ġany Ġfile Ġoutside Ġa Ġmodule Ġis Ġchanged , Ġwe Ġassume Ġeverything Ġhas Ġchanged . Ċ Ġ* Ċ Ġ* ĠWhen Ġa Ġfile Ġin Ġa Ġmodule Ġis Ġchanged , Ġall Ġmodules Ġthat Ġdepend Ġon Ġit Ġare Ġconsidered Ġas Ġchanged . Ċ Ġ*/ Ċ class ĠAff ected Module Detector Impl Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġproject Graph : ĠProject Graph , ĊĠĠĠ Ġprivate Ġval Ġdependency Tracker : ĠDependency Tracker , ĊĠĠĠ Ġlogger : ĠLogger ?, ĊĠĠĠ Ġ// Ġused Ġfor Ġdebugging Ġpurposes Ġwhen Ġwe Ġwant Ġto Ġignore Ġnon Ġmodule Ġfiles ĊĠĠĠ Ġ@ Suppress (" unused ") ĊĠĠĠ Ġprivate Ġval Ġignore Unknown Projects : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġco built Test Paths : ĠSet < Set < String >> Ġ= ĠCO BUIL T _ TEST _ PATHS , ĊĠĠĠ Ġprivate Ġval Ġalways Build IfExists : ĠSet < String > Ġ= ĠAL WAYS _ BUILD _ IF _ EXISTS , ĊĠĠĠ Ġprivate Ġval Ġignored Paths : ĠSet < String > Ġ= ĠIG NO RED _ PATHS , ĊĠĠĠ Ġprivate Ġval Ġchanged Files Provider : ĠChanged Files Provider Ċ ) Ġ: ĠAff ected Module Detector ( logger ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġall Projects Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġproject Graph . all Projects ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġaffected Projects Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġchanged Projects Ġ+ Ġdependent Projects ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġchanged Projects Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Changed Projects () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdependent Projects Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġfind Dependent Projects () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġalways Build Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġalways Build IfExists . filter ({ Ġpath Ġ-> Ġall Projects . contains ( path ) Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġunknown Files : ĠMutable Set < String > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ// ĠFiles Ġtracked Ġby Ġgit Ġthat Ġare Ġnot Ġexpected Ġto Ġeffect Ġthe Ġbuild , Ġthus Ġrequire Ġno Ġconsideration ĊĠĠĠ Ġprivate Ġvar Ġignored Files : ĠMutable Set < String > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġval Ġbuild All Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġshould Build All () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġco built Test Projects Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġlookup Project Sets From Paths ( co built Test Paths ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbuild Contains Non Project File Changes Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġunknown Files . isNotEmpty () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġshould Include ( project : ĠString ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( project Ġ== Ġ":" Ġ|| Ġbuild All ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaffected Projects . contains ( project ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Subset ( project Path : ĠString ): ĠProject Subset Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Projects . contains ( project Path ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject Subset . CHANGED _ PROJECT S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependent Projects . contains ( project Path ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject Subset . DEPEND ENT _ PROJECT S ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprojects Ġthat Ġare Ġonly Ġincluded Ġbecause Ġof Ġbuild All ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠProject Subset . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġonly Ġthe Ġset Ġof Ġprojects Ġthat Ġwere Ġdirectly Ġchanged Ġin Ġthe Ġcommit . ĠThis Ġincludes ĊĠĠĠĠ Ġ* Ġplaceholder - tests Ġand Ġany Ġmodules Ġthat Ġneed Ġto Ġbe Ġco - built . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAlso Ġpop ulates Ġthe Ġunknown Files Ġvar Ġwhich Ġis Ġused Ġin Ġfind Affected Projects ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠReturns Ġall Projects Ġif Ġthere Ġare Ġno Ġprevious Ġmerge ĠCL s , Ġwhich Ġshouldn 't Ġhappen . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Changed Projects (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchanged Files Ġ= Ġchanged Files Provider () Ġ?: Ġreturn Ġall Projects ĊĊĠĠĠĠĠĠĠ Ġval Ġchanged Projects : ĠMutable Set < String > Ġ= Ġalways Build . to Mutable Set () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( filePath Ġin Ġchanged Files ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ignored Paths . any Ġ{ ĠfilePath . startsWith ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignored Files . add ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ign oring Ġfile : Ġ$ filePath " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontaining Project Ġ= Ġfind Containing Project ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( containing Project Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Files . add ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Couldn 't Ġfind Ġcontaining Ġproject Ġfor Ġfile : Ġ$ filePath . ĠAdding Ġto Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" unknown Files ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Projects . add ( containing Project ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" For Ġfile Ġ$ filePath Ġcontaining Ġproject Ġis Ġ$ containing Project . Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Adding Ġto Ġchanged Projects ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchanged Projects Ġ+ Ġget Affected Co built Projects ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Projects , Ġco built Test Projects ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġall Ġdependent Ġprojects Ġfrom Ġthe Ġset Ġof Ġchanged Projects . ĠThis Ġdoesn 't Ġinclude Ġthe ĊĠĠĠĠ Ġ* Ġoriginal Ġchanged Projects . ĠAlways Ġbuild Ġis Ġstill Ġhere Ġto Ġensure Ġat Ġleast Ġ 1 Ġthing Ġis Ġbuilt ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind Dependent Projects (): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdependent Projects Ġ= Ġchanged Projects . flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdependency Tracker . findAll Depend ents ( it ) ĊĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠĠĠĠĠ Ġreturn Ġdependent Projects Ġ+ Ġalways Build Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Affected Co built Projects ( dependent Projects , Ġco built Test Projects ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġwhether Ġwe Ġare Ġin Ġa Ġstate Ġwhere Ġwe Ġwant Ġto Ġbuild Ġall Ġprojects , Ġinstead Ġof ĊĠĠĠĠ Ġ* Ġonly Ġaffected Ġones . ĠThis Ġoccurs Ġfor Ġbuild Src Ġchanges , Ġas Ġwell Ġas Ġin Ġsituations Ġwhere ĊĠĠĠĠ Ġ* Ġwe Ġdetermine Ġthere Ġare Ġno Ġchanges Ġwithin Ġour Ġrepository Ġ( e . g . Ġpre bu il ts Ġchange Ġonly ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshould Build All (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġshould Build All Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ// ĠShould Ġonly Ġtrigger Ġif Ġthere Ġare Ġno Ġchanged Files Ġand Ġno Ġignored Ġfiles ĊĠĠĠĠĠĠĠ Ġif Ġ( changed Projects . size Ġ== Ġalways Build . size Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġunknown Files . isEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġignored Files . isEmpty () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Build All Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( unknown Files . isNotEmpty () Ġ&& Ġ! is Github Inf ra Change ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Build All Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġlogger ?. info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" unknown Files : Ġ$ unknown Files , Ġchanged Projects : Ġ$ changed Projects , Ġbuild All : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ should Build All " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( should Build All ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info (" Building Ġall Ġprojects ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( unknown Files . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info (" because Ġno Ġchanged Ġfiles Ġwere Ġdetected ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info (" because Ġone Ġof Ġthe Ġunknown Ġfiles Ġmay Ġaffect Ġeverything Ġin Ġthe Ġbuild ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThe Ġmodules Ġdetected Ġas Ġaffected Ġby Ġchanged Ġfiles Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ${ changed Projects Ġ+ Ġdependent Projects } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġshould Build All ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġall Ġunknown Ġchanged Ġfiles Ġare Ġcontained Ġin Ġgithub Ġsetup Ġrelated Ġfiles . ĊĠĠĠĠ Ġ* Ġ(. github , Ġplay ground - common ). ĠThese Ġfiles Ġwill Ġnot Ġaffect Ġao sp Ġhence Ġshould Ġnot Ġinvalidate ĊĠĠĠĠ Ġ* Ġchanged Ġfile Ġtracking Ġ( e . g . Ġnot Ġcause Ġrunning Ġall Ġtests ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Github Inf ra Change (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġunknown Files . all Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . contains (". github ") Ġ|| Ġit . contains (" playground - common ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlookup Project Sets From Paths ( all Sets : ĠSet < Set < String >> ): ĠSet < Set < String >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġall Sets . map Ġ{ Ġset Paths Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġset Exists Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Set Ġ= ĠHashSet < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġset Paths ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! all Projects . contains ( path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( set Exists ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" One Ġof Ġthe Ġprojects Ġin Ġthe Ġgroup Ġof Ġprojects Ġthat Ġare Ġrequired Ġto Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" be Ġbuilt Ġtogether Ġis Ġmissing . ĠLook ed Ġfor Ġ" Ġ+ Ġset Paths ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Exists Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Set . add ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġproject Set ĊĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Affected Co built Projects ( ĊĠĠĠĠĠĠĠ Ġaffected Projects : ĠSet < String >, ĊĠĠĠĠĠĠĠ Ġall Co built Sets : ĠSet < Set < String >> ĊĠĠĠ Ġ): ĠSet < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġco bu il ts Ġ= Ġmutable Set Of < String >() ĊĠĠĠĠĠĠĠ Ġaffected Projects . forEach Ġ{ Ġproject Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġall Co built Sets . forEach Ġ{ Ġco built Set Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( co built Set . any Ġ{ Ġproject Ġ== Ġit Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġco bu il ts . addAll ( co built Set ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġco bu il ts ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Containing Project ( filePath : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproject Graph . find Containing Project ( filePath , Ġlogger ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ?. info (" search Ġresult Ġfor Ġ$ filePath Ġresulted Ġin Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠProject Ġpaths Ġthat Ġwe Ġalways Ġbuild Ġif Ġthey Ġexist ĊĠĠĠĠĠĠĠ Ġval ĠAL WAYS _ BUILD _ IF _ EXISTS Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġplaceholder Ġtest Ġproject Ġto Ġensure Ġno Ġfailure Ġdue Ġto Ġno Ġinstrument ation . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġcan Ġeventually Ġremove Ġif Ġwe Ġresolve Ġb / 1 2 7 8 1 9 3 6 9 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ": placeholder - tests ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ": build Src - tests : project - sub sets " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSome Ġtests Ġare Ġcode pend ent Ġeven Ġif Ġtheir Ġmodules Ġare Ġnot . ĠEnable Ġmanual Ġbund ling Ġof Ġtests ĊĠĠĠĠĠĠĠ Ġval ĠCO BUIL T _ TEST _ PATHS Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠInstall Ġmedia Ġtests Ġtogether Ġper Ġb / 1 2 8 5 7 7 7 3 5 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMaking Ġa Ġchange Ġin Ġ: media : version - compat - tests Ġmakes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmedia Generate Test Configuration Ġrun Ġ( an Ġun fortun ate Ġbut Ġlow Ġpriority Ġbug ). ĠTo ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprevent Ġfailures Ġfrom Ġmissing Ġap ks , Ġwe Ġmake Ġsure Ġto Ġbuild Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġversion - compat - tests Ġprojects Ġin Ġthat Ġcase . ĠSame Ġwith Ġmedia 2 - session Ġbelow . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media : version - compat - tests ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media : version - compat - tests : client ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media : version - compat - tests : service ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media : version - compat - tests : client - previous ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media : version - compat - tests : service - previous " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media 2 : media 2 - session ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media 2 : media 2 - session : version - compat - tests ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media 2 : media 2 - session : version - compat - tests : client ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media 2 : media 2 - session : version - compat - tests : service ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media 2 : media 2 - session : version - compat - tests : client - previous ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": media 2 : media 2 - session : version - compat - tests : service - previous " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ// ĠLink Ġgraphics Ġand Ġmaterial Ġto Ġalways Ġrun Ġ@ Large Ġin Ġpres ub mit Ġper Ġb / 1 6 0 6 2 4 0 2 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": compose : ui : ui - graphics ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": compose : material : material " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ// ĠLink Ġmaterial Ġand Ġmaterial - ripple ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": compose : material : material - ripple ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": compose : material : material " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": benchmark : benchmark - macro ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": benchmark : integration - tests : macro benchmark - target " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ// Ġlink Ġbenchmark - macro 's Ġcorrect ness Ġtest Ġand Ġits Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": benchmark : integration - tests : macro benchmark ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": benchmark : integration - tests : macro benchmark - target " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġ// Ġlink Ġbenchmark 's Ġmacro benchmark Ġand Ġits Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": compose : integration - tests : macro benchmark ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": compose : integration - tests : macro benchmark - target " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": emoji 2 : integration - tests : init - disabled - macro benchmark ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": emoji 2 : integration - tests : init - disabled - macro benchmark - target ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": emoji 2 : integration - tests : init - enabled - macro benchmark ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": emoji 2 : integration - tests : init - enabled - macro benchmark - target ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": we ar : benchmark : integration - tests : macro benchmark ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": we ar : benchmark : integration - tests : macro benchmark - target " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": we ar : compose : integration - tests : macro benchmark ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ": we ar : compose : integration - tests : macro benchmark - target " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġval ĠIG NO RED _ PATHS Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" docs /", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" development /" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ