/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 - present ĠFacebook , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . facebook . buck . mult it enant . service Ċ Ċ import Ġcom . facebook . buck . mult it enant . fs . Fs A gn ost ic Path Ċ Ċ /** Ċ Ġ* ĠA Ġcollection Ġof Ġpackages Ġ( package Ġis Ġrepresented Ġby Ġthe Ġrelative Ġpath Ġto Ġits Ġroot ) Ġthat Ġmay Ġhave Ċ Ġ* Ġchanged Ġbecause Ġof Ġsome Ġinput Ġchange Ġand Ġthus Ġneed Ġto Ġbe Ġre parsed Ċ Ġ*/ Ċ data Ġclass ĠPot entially Affected Build Packages ( ĊĠĠĠ Ġval Ġcommit : ĠCommit , ĊĠĠĠ Ġval Ġadded : ĠList < Fs A gn ost ic Path > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġmodified : ĠList < Fs A gn ost ic Path > Ġ= Ġempty List (), ĊĠĠĠ Ġval Ġremoved : ĠList < Fs A gn ost ic Path > Ġ= Ġempty List ()) Ċ Ċ /** Ċ Ġ* ĠBased Ġon Ġchanged Ġinput Ġfiles , Ġdetermines Ġpackages Ġthat Ġmight Ġhave Ġchanged . ĠWe Ġuse Ġdef ensive Ċ Ġ* Ġapproach Ġto Ġdetect Ġif Ġpackage Ġis Ġchanged Ġbecause Ġwe Ġover schedule Ġre parsing Ġrather Ġthan Ċ Ġ* Ġs ac rif ice Ġcorrect ness . Ċ Ġ* Ċ Ġ* Ġ@ param Ġfs Changes ĠChanges Ġin Ġfiles Ġto Ġsome Ġknown Ġcommit Ġbase Ċ Ġ* Ġ@ param Ġbuild FileName ĠName Ġof Ġthe Ġbuild Ġfile Ġ( like Ġ' BU CK '), Ġexpressed Ġas Ġ[ Fs A gn ost ic Path ] Ċ Ġ* Ġ@ param Ġall Known Packages ĠAll Ġpackages Ġknown Ġto Ġcurrent Ġuniverse Ġ( usually , Ġall Ġpackages Ġin Ċ Ġ* Ġa Ġcorpus ), Ġexpressed Ġby Ġ[ Fs A gn ost ic Path ] Ġto Ġpackage Ġroot , Ġrelative Ġto Ġuniverse Ġroot Ċ Ġ* Ġ@ param Ġdep To Package Index ĠAn Ġindex Ġfrom Ġall Ġfiles Ġwhich Ġare Ġparse - time Ġdependencies , Ġincluding Ċ Ġ* Ġtrans itive Ġones , Ġto Ġpackages Ġ( exp ressed Ġas Ġ[ Fs A gn ost ic Path ] s ) Ġwhich Ġload Ġor Ġotherwise Ġuse Ċ Ġ* Ġthose Ġdependencies Ġduring Ġparsing Ġfor Ġthat Ġspecific Ġuniverse . ĠParse - time Ġdependencies Ġare Ġusually Ċ Ġ* Ġextension Ġ(. bz l ) Ġfiles . ĠThis Ġshould Ġnot Ġinclude Ġconfiguration Ġfiles . Ċ Ġ*/ Ċ fun Ġget Pot entially Affected Build Packages ( ĊĠĠĠ Ġfs Changes : ĠFs Changes , ĊĠĠĠ Ġbuild FileName : ĠFs A gn ost ic Path , ĊĠĠĠ Ġall Known Packages : ĠSet < Fs A gn ost ic Path >, ĊĠĠĠ Ġdep To Package Index : ĠMap < Fs A gn ost ic Path , ĠSet < Fs A gn ost ic Path >> Ċ ): ĠPot entially Affected Build Packages Ġ{ ĊĠĠĠ Ġval Ġnew Packages Ġ= Ġmutable Set Of < Fs A gn ost ic Path >() ĊĠĠĠ Ġval Ġchanged Packages Ġ= Ġmutable Set Of < Fs A gn ost ic Path >() ĊĠĠĠ Ġval Ġremoved Packages Ġ= Ġmutable Set Of < Fs A gn ost ic Path >() ĊĊĠĠĠ Ġfs Changes . added . forEach Ġ{ Ġadded Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġadded . path ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġpath . name () ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdding Ġa Ġnew Ġpackage : Ġneed Ġto Ġparse Ġit Ġand Ġalso Ġits Ġparent , Ġbecause Ġa Ġparent Ġmay Ġlose ĊĠĠĠĠĠĠĠ Ġ// Ġtargets ĊĠĠĠĠĠĠĠ Ġif Ġ( filename Ġ== Ġbuild FileName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Package Path Ġ= Ġpath . dirname () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Packages . add ( new Package Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Containing Package ( new Package Path . dirname (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Known Packages )?. let Ġ{ Ġchanged Packages . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdding Ġa Ġnew Ġfile Ġcannot Ġbe Ġa Ġparse - time Ġdependency , Ġas Ġthey Ġhave Ġto Ġbe Ġexplicitly ĊĠĠĠĠĠĠĠ Ġ// Ġdeclared , Ġso Ġnothing Ġto Ġdo Ġhere ĊĊĠĠĠĠĠĠĠ Ġ// ĠAdding Ġa Ġnew Ġsource Ġfile : Ġre parse Ġpackage Ġthat Ġpotentially Ġowns Ġthe Ġfile Ġbecause ĊĠĠĠĠĠĠĠ Ġ// Ġsome Ġtarget Ġcontents Ġmay Ġchange ĊĠĠĠĠĠĠĠ Ġget Containing Package ( path . dirname (), Ġall Known Packages )?. let Ġ{ Ġchanged Packages . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfs Changes . modified . forEach Ġ{ Ġmodified Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġmodified . path ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġpath . name () ĊĊĠĠĠĠĠĠĠ Ġ// ĠModify ing Ġexisting Ġpackage : Ġneed Ġto Ġre parse Ġit ĊĠĠĠĠĠĠĠ Ġif Ġ( filename Ġ== Ġbuild FileName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Path Ġ= Ġpath . dirname () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Packages . add ( package Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠModify ing Ġa Ġparse - time Ġdependency : Ġdetect Ġand Ġre parse Ġaffected Ġpackages Ġonly ĊĠĠĠĠĠĠĠ Ġdep To Package Index . get ( path )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Packages . addAll ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠModify ing Ġa Ġsource Ġfile : Ġit Ġdoes Ġnot Ġyield Ġto Ġchanges Ġin Ġpackages , Ġso Ġnothing Ġmore Ġto Ġdo ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfs Changes . removed . forEach Ġ{ Ġremoved Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġremoved . path ĊĠĠĠĠĠĠĠ Ġval Ġfilename Ġ= Ġpath . name () ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemoving Ġa Ġpackage : Ġneed Ġto Ġremove Ġthe Ġpackage Ġitself Ġand Ġre parse Ġthe Ġparent Ġas Ġits ĊĠĠĠĠĠĠĠ Ġ// Ġtargets Ġcan Ġchange Ġbecause Ġparent Ġpackage Ġmay Ġstart Ġto Ġown Ġmore Ġfiles ĊĠĠĠĠĠĠĠ Ġif Ġ( filename Ġ== Ġbuild FileName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpackage Path Ġ= Ġpath . dirname () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremoved Packages . add ( package Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Containing Package ( package Path . dirname (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġall Known Packages )?. let Ġ{ Ġchanged Packages . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemoving Ġa Ġparse - time Ġdependency : Ġdetect Ġand Ġre parse Ġaffected Ġpackages Ġonly ĊĠĠĠĠĠĠĠ Ġdep To Package Index . get ( path )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchanged Packages . addAll ( it ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠRemoving Ġa Ġsource Ġfile : Ġre parse Ġpackage Ġthat Ġpotentially Ġowns Ġthe Ġfile Ġbecause ĊĠĠĠĠĠĠĠ Ġ// Ġsome Ġtarget Ġcontents Ġmay Ġchange ĊĠĠĠĠĠĠĠ Ġget Containing Package ( path . dirname (), Ġall Known Packages )?. let Ġ{ Ġchanged Packages . add ( it ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠPot entially Affected Build Packages ( commit Ġ= Ġfs Changes . commit , Ġadded Ġ= Ġnew Packages . toList (), ĊĠĠĠĠĠĠĠ Ġremoved Ġ= Ġremoved Packages . toList (), ĊĠĠĠĠĠĠĠ Ġmodified Ġ= Ġ( changed Packages Ġ- Ġnew Packages Ġ- Ġremoved Packages ). toList ()) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturn Ġa Ġpackage Ġ( by Ġpath ) Ġthat Ġpotentially Ġowns Ġthe Ġspecified Ġpath . ĠThere Ġshould Ġbe Ġonly Ġone Ċ Ġ* Ġpackage , Ġor Ġnone , Ġin Ġwhich Ġcase Ġnull Ġis Ġreturned . Ċ Ġ* Ċ Ġ* Ġ@ param Ġdir ĠPath Ġto Ġa Ġfolder Ġthat Ġmight Ġbelong Ġto Ġsome Ġpackage ; Ġthis Ġfolder Ċ Ġ* Ġwill Ġbe Ġeither Ġdirectly Ġa Ġpackage Ġroot Ġfolder Ġ( folder Ġthat Ġhas Ġbuild Ġfile ) Ġor Ġsome Ġfolder Ġbelow Ċ Ġ* Ġpackage Ġroot Ġit Ġin Ġa Ġdirectory Ġtree Ċ Ġ* Ġ@ param Ġall Known Packages ĠAll Ġpackages Ġin Ġthe Ġuniverse Ġfor Ġthe Ġsame Ġbase Ġcommit Ċ Ġ*/ Ċ private Ġfun Ġget Containing Package ( ĊĠĠĠ Ġdir : ĠFs A gn ost ic Path , ĊĠĠĠ Ġall Known Packages : ĠSet < Fs A gn ost ic Path > Ċ ): ĠFs A gn ost ic Path ? Ġ{ ĊĠĠĠ Ġvar Ġcurrent Ġ= Ġdir ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( all Known Packages . contains ( current )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( current . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġtraverse Ġup Ġthe Ġdirectory Ġtree ĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . dirname () ĊĠĠĠ Ġ} Ċ } Ċ