package Ġus . ih mc . build Ċ Ċ import Ġorg . apache . commons . lang 3 . StringUtils Ċ import Ġorg . apache . commons . lang 3 . mutable . Mutable Int Ċ import Ġorg . gradle . api .* Ċ import Ġorg . gradle . api . plugins . Extra Properties Extension Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ Ċ late init Ġvar ĠLog Tools : ĠI H MC Build Log Tools Ċ Ċ object ĠI H MC Build Tools Ċ { ĊĠĠ Ġfun Ġis Project Group Compatibility ( raw String : ĠString ): ĠBoolean ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġraw String . trim (). toLowerCase (). contains (" true "); ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġke bab Case d Name Compatibility ( projectName : ĠString , Ġextra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" title ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġtitle To K eb ab Case ( property AsString (" title ", Ġextra )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( contains Valid String Property (" ke bab Case d Name ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġke bab Case d Name Ġ= Ġextra . get (" ke bab Case d Name ") Ġas ĠString ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" Loaded Ġke bab Case d Name Ġ= Ġ$ ke bab Case d Name ") ĊĠĠĠĠĠĠĠĠ Ġreturn Ġke bab Case d Name ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġto K eb ab Case d ( projectName ) ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" No Ġvalue Ġfound Ġfor Ġke bab Case d Name . ĠUsing Ġdefault Ġvalue : Ġ$ defaultValue ") ĊĠĠĠĠĠĠĠĠ Ġextra . set (" ke bab Case d Name ", ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠ Ġreturn ĠdefaultValue ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġtitle Case d Name Compatibility ( projectName : ĠString , Ġextra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" title ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġproperty AsString (" title ", Ġextra ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( contains Valid String Property (" pas cal Case d Name ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġproperty AsString (" pas cal Case d Name ", Ġextra ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn ĠprojectName ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġsnapshot Mode Compatibility ( extra : ĠExtra Properties Extension ): ĠBoolean ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" snapshot Mode ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġsnapshot Mode Ġ= Ġ( extra . get (" snapshot Mode ") Ġas ĠString ). trim (). toLowerCase (). contains (" true ") ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" Loaded Ġsnapshot Mode Ġ= Ġ$ snapshot Mode ") ĊĠĠĠĠĠĠĠĠ Ġreturn Ġsnapshot Mode ; ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( extra . has (" publish Mode ") Ġ// ĠBack wards Ġcompatibility ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ!( extra . get (" publish Mode ") Ġas ĠString ). startsWith ("$ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( extra . get (" publish Mode ") Ġas ĠString ). trim (). toLowerCase (). contains (" snapshot ")) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ ĠLog Tools . warn (" Using Ġpublish Mode Ġ= Ġ${ ( extra . get (" publish Mode ") Ġas ĠString )} Ġto Ġset Ġsnapshot Mode Ġ= Ġtrue .") ĊĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġpublish Url Compatibility ( extra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( extra . has (" publish Mode ")) Ġ// ĠBack wards Ġcompatibility ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ ĠLog Tools . warn (" publish Mode Ġhas Ġbeen Ġreplaced Ġby Ġpublish Url . ĠSee ĠREADME Ġfor Ġdetails .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" publish Url ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ( extra . get (" publish Url ") Ġas ĠString ). trim () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( contains Valid String Property (" publish Mode ", Ġextra )) Ġ// ĠBack wards Ġcompatibility ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġpublish Mode String Ġ= Ġ( extra . get (" publish Mode ") Ġas ĠString ). trim (). toLowerCase () ĊĊĠĠĠĠĠĠĠĠ Ġif Ġ( publish Mode String . contains (" local ")) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Tools . warn (" Using Ġpublish Mode Ġ= Ġ${ ( extra . get (" publish Mode ") Ġas ĠString )} Ġto Ġset Ġpublish Url Ġ= Ġlocal .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" local " ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġelse Ġif Ġ( publish Mode String . contains (" snapshot ")) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Tools . warn (" Using Ġpublish Mode Ġ= Ġ${ ( extra . get (" publish Mode ") Ġas ĠString )} Ġto Ġset Ġpublish Url Ġ= Ġih mc Snapshots .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" ih mc Snapshots " ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog Tools . warn (" Using Ġpublish Mode Ġ= Ġ${ ( extra . get (" publish Mode ") Ġas ĠString )} Ġto Ġset Ġpublish Url Ġ= Ġih mc Release .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" ih mc Release " ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ" local " Ġ// Ġdefault ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġpublish Url Is Keyword ( publish Url : ĠString , Ġkeyword : ĠString ): ĠBoolean ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġval Ġsanitized Ġ= Ġpublish Url . toLowerCase (). replace ("- ", Ġ"") ĊĠĠĠĠĠ Ġreturn Ġsanitized Ġ== Ġkeyword ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġcomposite Search Height Compatibility ( extra : ĠExtra Properties Extension ): ĠInt ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" composite Search Height ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ( extra . get (" composite Search Height ") Ġas ĠString ). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġif Ġ( contains Valid String Property (" depth From Workspace Directory ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ( extra . get (" depth From Workspace Directory ") Ġas ĠString ). toInt () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" No Ġvalue Ġfound Ġfor Ġcomposite Search Height . ĠUsing Ġdefault Ġvalue : Ġ$ defaultValue ") ĊĠĠĠĠĠĠĠĠ Ġextra . set (" composite Search Height ", ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠ Ġreturn ĠdefaultValue ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġci Database Url Compatibility ( extra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" ci Database Url ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ( extra . get (" ci Database Url ") Ġas ĠString ). trim () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" No Ġvalue Ġfound Ġfor Ġci Database Url . ĠUsing Ġdefault Ġvalue : Ġ$ defaultValue ") ĊĠĠĠĠĠĠĠĠ Ġextra . set (" ci Database Url ", ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠ Ġreturn ĠdefaultValue ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġart ifactory Url Compatibility ( extra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" art ifactory Url ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ( extra . get (" art ifactory Url ") Ġas ĠString ). trim () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġ" https :// art ifactory . ih mc . us " ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" No Ġvalue Ġfound Ġfor Ġart ifactory Url . ĠUsing Ġdefault Ġvalue : Ġ$ defaultValue ") ĊĠĠĠĠĠĠĠĠ Ġextra . set (" art ifactory Url ", ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠ Ġreturn ĠdefaultValue ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġcompatibility Version Compatibility ( extra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( contains Valid String Property (" compatibility Version ", Ġextra )) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġreturn Ġ( extra . get (" compatibility Version ") Ġas ĠString ). trim () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġ" CURRENT " ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info (" No Ġvalue Ġfound Ġfor Ġcompatibility Version . ĠUsing Ġdefault Ġvalue : Ġ$ defaultValue ") ĊĠĠĠĠĠĠĠĠ Ġextra . set (" compatibility Version ", ĠdefaultValue ) ĊĠĠĠĠĠĠĠĠ Ġreturn ĠdefaultValue ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġcontains Valid String Property ( propertyName : ĠString , Ġextra : ĠExtra Properties Extension ): ĠBoolean ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġextra . has ( propertyName ) Ġ&& Ġ!( extra . get ( propertyName ) Ġas ĠString ). startsWith ("$ ") ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġproperty AsString ( propertyName : ĠString , Ġextra : ĠExtra Properties Extension ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ( extra . get ( propertyName ) Ġas ĠString ). trim () ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġtitle To K eb ab Case ( title Case d : ĠString ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtitle Case d . trim (). toLowerCase (). replace ( Regex ("\\ s + "), Ġ"- ") ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġtitle To Pas cal Case ( title Case d : ĠString ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtitle Case d . trim (). replace ( Regex ("\\ s + "), Ġ"") ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġto Source SetName ( sub project : ĠProject ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġto K eb ab Case d ( sub project . name . substring After ( sub project . parent !!. name Ġ+ Ġ"- ")) ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġke bab To Pas cal Case ( ke bab Case d : ĠString ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġval Ġsplit Ġ= Ġke bab Case d . split ("- ") ĊĠĠĠĠĠ Ġvar Ġpas cal Case d Ġ= Ġ"" ĊĠĠĠĠĠ Ġfor Ġ( section Ġin Ġsplit ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġpas cal Case d Ġ+= Ġsection . capitalize () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġpas cal Case d ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġke bab To Camel Case ( ke bab Case d : ĠString ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġval Ġsplit Ġ= Ġke bab Case d . split ("- ") ĊĠĠĠĠĠ Ġvar Ġcamel Case d Ġ= Ġ"" ĊĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 0 ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġcamel Case d Ġ+= Ġsplit [ 0 ]. de capitalize () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 Ġuntil Ġsplit . size ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġcamel Case d Ġ+= Ġsplit [ i ]. capitalize () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn Ġcamel Case d ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġto K eb ab Case d ( any Case d : ĠString ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġvar Ġke bab Case d Ġ= Ġto Pre K abab With Book end Handles ( any Case d ); ĊĊĠĠĠĠĠ Ġke bab Case d Ġ= Ġke bab Case d . substring ( 1 , Ġke bab Case d . length Ġ- Ġ 1 ); ĊĊĠĠĠĠĠ Ġreturn Ġke bab Case d ; ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġto Pre K abab With Book end Handles ( any Case d : ĠString ): ĠString ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġval Ġparts Ġ= ĠArrayList < String >(); ĊĠĠĠĠĠ Ġvar Ġpart Ġ= Ġ""; ĊĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġany Case d . length ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġvar Ġcharacter Ġ= Ġany Case d [ i ]. toString (); ĊĠĠĠĠĠĠĠĠ Ġif Ġ( StringUtils . is All UpperCase ( character ) Ġ|| ĠStringUtils . is Numeric ( character )) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! part . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts . add ( part . toLowerCase ()); ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Ġ= Ġcharacter ; ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpart Ġ+= Ġcharacter ; ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ(! part . isEmpty ()) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġparts . add ( part . toLowerCase ()); ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġvar Ġke bab Ġ= Ġ""; ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġparts . size ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġke bab Ġ+= Ġ'- '; ĊĠĠĠĠĠĠĠĠ Ġke bab Ġ+= Ġparts . get ( i ); ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġke bab Ġ+= Ġ'- '; ĊĊĠĠĠĠĠ Ġreturn Ġke bab ; ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġparse Dependencies From Gradle K ts File ( build File : ĠPath ): ĠSorted Set < String > ĊĠĠ Ġ{ ĊĠĠĠĠĠ ĠLog Tools . debug (" Parsing Ġbuild Ġfile : Ġ${ build File . to AbsolutePath (). normalize ()} Ġ") ĊĠĠĠĠĠ Ġval Ġdependency Set Ġ= ĠTree Set < String >() ĊĊĠĠĠĠĠ Ġval Ġfile AsString Ġ= ĠString ( Files . read All Bytes ( build File )) ĊĊĠĠĠĠĠ Ġval Ġpattern Ġ= ĠRegex (" ep end encies [ Ġ\\ t \\ x 0 B \\ S ]* \\ { "). to Pattern () ĊĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġpattern . matcher ( file AsString ); ĊĊĠĠĠĠĠ Ġwhile Ġ( matcher . find ()) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġend Ġ= Ġmatcher . end () ĊĊĠĠĠĠĠĠĠĠ Ġval Ġindex After End Bracket Ġ= Ġmatching Bracket ( file AsString . substring ( end ), ĠMutable Int ( 0 )) ĊĊĠĠĠĠĠĠĠĠ Ġval Ġdependency Block String Ġ= Ġ" ĠĠ Ġ" Ġ+ Ġfile AsString . substring ( end , Ġend Ġ+ Ġindex After End Bracket Ġ- Ġ 1 ). trim () ĊĊĠĠĠĠĠĠĠĠ ĠLog Tools . debug (" Matched : Ġ$ dependency Block String ") ĊĠĠĠĠĠĠĠĠ Ġdependency Set . addAll ( extract Dependency Artifact Names ( dependency Block String )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġdependency Set ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġextract Dependency Artifact Names ( dependency Block String : ĠString ): ĠSorted Set < String > ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġval Ġartifact Names Ġ= ĠTree Set < String >() ĊĊĠĠĠĠĠ Ġval Ġpattern Ġ= ĠRegex ("( compile | implementation | api | runtime )[ Ġ\\ t \\ x 0 B ]* \\ ([ Ġ\\ t \\ x 0 B ]* \\\" [ \\ s \\ - \\ w \\. ]+ :[ \\ $ \\ s \\ :\\ - \\ w \\. ]+ \\ \"" ). to Pattern () ĊĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġpattern . matcher ( dependency Block String ); ĊĠĠĠĠĠ Ġwhile Ġ( matcher . find ()) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġmatcher . toMatch Result (). group () ĊĠĠĠĠĠĠĠĠ Ġval Ġartifact Name Ġ= Ġmatch . split (": ")[ 1 ] ĊĊĠĠĠĠĠĠĠĠ Ġartifact Names . add ( artifact Name ) ĊĠĠĠĠĠĠĠĠ ĠLog Tools . debug (" Added Ġartifact Ġname : Ġ$ artifact Name ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġartifact Names ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġmatching Bracket ( string : ĠString , Ġi : ĠMutable Int ): ĠInt ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġwhile Ġ( i . value Ġ< Ġstring . length ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġif Ġ( string [ i . value ] Ġ== Ġ'{ ') ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . increment () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi . setValue ( matching Bracket ( string , Ġi )) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġif Ġ( string [ i . value ] Ġ== Ġ' }') ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi . value Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġi . increment () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġthrow ĠGradle Exception (" No Ġend Ġbracket Ġfor Ġdependencies Ġblock ") ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġdefine Dynamic Composite Task ( project : ĠProject ) ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġif Ġ( project . has Property (" task Name ") Ġ|| Ġproject . has Property (" task Names ")) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġval Ġtask Names Ġ= Ġarray ListOf < String >() ĊĊĠĠĠĠĠĠĠĠ Ġif Ġ( project . has Property (" task Name ")) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Names . addAll (( project . property (" task Name ") Ġas ĠString ). split ("," )) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġif Ġ( project . has Property (" task Names ")) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtask Names . addAll (( project . property (" task Names ") Ġas ĠString ). split ("," )) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġif Ġ( task Names . size Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefine Deep Composite Task (" composite Task ", Ġtask Names , Ġproject ) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġdefine Deep Composite Task ( composite Task Name : ĠString , Ġtarget Task Name : ĠString , Ġproject : ĠProject ): ĠTask ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdefine Deep Composite Task ( composite Task Name , Ġarray ListOf ( target Task Name ), Ġproject ) ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠCreate Ġa Ġtask Ġthat Ġruns Ġthe Ġtarget Ġtasks Ġin Ġboth Ġthis Ġproject Ġand Ġthe Ġincluded ĊĠĠĠ Ġ* Ġprojects Ġas Ġwell . ĠSince Ġwe Ġcan 't Ġreference Ġsub projects Ġof Ġcomposite Ġincluded Ġbuilds , ĊĠĠĠ Ġ* Ġwe Ġmust Ġuse Ġa Ġtwo Ġlayer Ġhierarchy . ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun Ġdefine Deep Composite Task ( composite Task Name : ĠString , Ġtarget Task Names : ĠArrayList < String >, Ġproject : ĠProject ): ĠTask ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġproject . tasks . create ( composite Task Name ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġevery Ġproject Ġto Ġhave Ġa Ġ" handle " Ġtask Ġthat Ġdepends Ġon Ġall Ġthe Ġtask Ġnames ĊĠĠĠĠĠĠĠĠ Ġproject . all projects . forEach Ġ{ Ġall project Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Task Names . forEach Ġ{ Ġtarget Task Name Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠConfigure Ġevery Ġproject Ġto Ġhave Ġat Ġleast Ġan Ġempty Ġtask Ġwith Ġthe Ġnames ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all project . tasks . findBy Path ( target Task Name ) Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfigure Empty Sub project Task ( all project , Ġtarget Task Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( all project . tasks . get ByName ( target Task Name )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠ Ġ// ĠFor Ġthe Ġbuild Ġroot , Ġmake Ġthe Ġglobal Ġtask Ġdepend Ġon Ġall Ġthe Ġincluded Ġbuild Ġglobal Ġtasks ĊĠĠĠĠĠĠĠĠ Ġif Ġ( is Build Root ( project )) ĊĠĠĠĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject . gradle . included Build s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( it . task (" :$ composite Task Name ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġ/** ĊĠĠĠ Ġ* ĠDeclare Ġempty Ġtask Ġif Ġit Ġdoesn 't Ġexist Ġso Ġit Ġcan Ġbe Ġcalled Ġwithout Ġerrors ĊĠĠĠ Ġ*/ ĊĠĠ Ġfun Ġconfigure Empty Sub project Task ( sub project : ĠProject , Ġtarget Task Name : ĠString ) ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġtry ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ ĠLog Tools . info ("${ sub project . name }: ĠDecl aring Ġempty Ġtask : Ġ$ target Task Name ") ĊĠĠĠĠĠĠĠĠ Ġsub project . tasks . create ( target Task Name ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( e : ĠInvalid UserData Exception ) ĊĠĠĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠĠ Ġ// Ġif Ġthe Ġtask Ġexists Ġor Ġsomething Ġelse Ġgoes Ġwrong ĊĠĠĠĠĠĠĠĠ ĠLog Tools . error ("${ sub project . name }: ĠInvalid UserData Exception : Ġ${ e . message }: Ġ$ target Task Name ") ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġenforce Multi project Task Dependency ( task Name : ĠString , Ġproject : ĠProject ) ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġproject . tasks . get ByName ( task Name ) Ġ{ ĊĠĠĠĠĠĠĠĠ Ġproject . sub projects . forEach Ġ{ Ġsub project Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdepends On ( sub project . tasks . getBy Path ( task Name )) ĊĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠ Ġ} ĊĊĠĠ Ġfun Ġis Build Root ( project : ĠProject ): ĠBoolean ĊĠĠ Ġ{ ĊĠĠĠĠĠ Ġreturn Ġproject . gradle . parent Ġ== Ġnull ĊĠĠ Ġ} Ċ } Ċ