/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . Ġ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 . build Utils . idea Ċ Ċ import ĠIntelliJ Instrument Code Task Ċ import Ġcom . github . jen gel man . gradle . plugins . shadow . tasks . Shadow Jar Ċ import Ġidea . Dist Copy Details Mock Ċ import Ġidea . Dist Model BuildContext Ċ import Ġorg . codehaus . groovy . runtime . G String Impl Ċ import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . api . Task Ċ import Ġorg . gradle . api . artifacts . Configuration Ċ import Ġorg . gradle . api . file . File Collection Ċ import Ġorg . gradle . api . file . File Visit Details Ċ import Ġorg . gradle . api . file . File Visitor Ċ import Ġorg . gradle . api . file . Source Directory Set Ċ import Ġorg . gradle . api . internal . file .* Ċ import Ġorg . gradle . api . internal . file . archive . Zip File Tree Ċ import Ġorg . gradle . api . internal . file . collections .* Ċ import Ġorg . gradle . api . internal . file . copy . Copy Spec Internal Ċ import Ġorg . gradle . api . internal . file . copy . Default Copy Spec Ċ import Ġorg . gradle . api . internal . file . copy . Destination Root Copy Spec Ċ import Ġorg . gradle . api . internal . file . copy . Single Parent Copy Spec Ċ import Ġorg . gradle . api . tasks . Abstract Copy Task Ċ import Ġorg . gradle . api . tasks . Copy Ċ import Ġorg . gradle . api . tasks . Source Set Output Ċ import Ġorg . gradle . api . tasks . Sync Ċ import Ġorg . gradle . api . tasks . bund ling . Abstract Archive Task Ċ import Ġorg . gradle . api . tasks . compile . Abstract Compile Ċ import Ġorg . gradle . internal . file . Path ToFile Resolver Ċ import Ġorg . gradle . jvm . tasks . Jar Ċ import Ġjava . io . File Ċ import Ġjava . io . PrintWriter Ċ import Ġjava . util . concurrent . Callable Ċ Ċ open Ġclass ĠDist Model Builder ( val Ġroot Project : ĠProject , Ġpw : ĠPrintWriter ) Ġ{ ĊĠĠĠ Ġval Ġroot Ctx Ġ= ĠDist Model BuildContext ( null , Ġ" ROOT ", Ġ" dist ", Ġpw ) ĊĠĠĠ Ġval Ġvisited Ġ= Ġmutable Map Of < Task , ĠDist Model BuildContext >() ĊĠĠĠ Ġval Ġv fs Root Ġ= ĠDist V File ( null , Ġ"< root >", ĠFile ("")) ĊĠĠĠ Ġval Ġrefs Ġ= Ġmutable Set Of < Dist V File >() ĊĊĠĠĠ Ġfun Ġvisit Instrument Task ( it : ĠIntelliJ Instrument Code Task ): ĠDist Model BuildContext Ġ= Ġvisited . get Or Put ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= Ġroot Ctx . child (" INSTR UMENT ", Ġit . path ) ĊĠĠĠĠĠĠĠ Ġctx . set Dest ( it . output !!. path ) ĊĠĠĠĠĠĠĠ Ġprocess Source Path ( it . original Classes Dirs , Ġctx ) ĊĠĠĠĠĠĠĠ Ġval Ġdest Ġ= Ġctx . destination ĊĠĠĠĠĠĠĠ Ġif Ġ( dest Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDist Module Output ( dest , Ġit . project . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġctx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit Compile Task ( it : ĠAbstract Compile ): ĠDist Model BuildContext Ġ= Ġvisited . get Or Put ( it ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġctx Ġ= Ġroot Ctx . child (" COMPILE ", Ġit . path ) ĊĠĠĠĠĠĠĠ Ġctx . set Dest ( it . destination Dir . path ) ĊĠĠĠĠĠĠĠ Ġval Ġdest Ġ= Ġctx . destination ĊĠĠĠĠĠĠĠ Ġif Ġ( dest Ġ!= Ġnull ) ĠDist Module Output ( dest , Ġit . project . path ) ĊĠĠĠĠĠĠĠ Ġelse Ġctx . log Unsupported (" Cannot Ġadd Ġcontents : Ġdestination Ġis Ġunknown ", Ġit ) ĊĊĠĠĠĠĠĠĠ Ġctx ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġvisit Copy Task ( ĊĠĠĠĠĠĠĠ Ġcopy : ĠAbstract Copy Task , ĊĠĠĠĠĠĠĠ Ġsh ade : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ): ĠDist Model BuildContext Ġ= Ġvisited . get Or Put ( copy ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġroot Ctx . child (" COPY ", Ġcopy . path , Ġsh ade ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġroot Spec Ġ= Ġcopy . root Spec ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCopy Ġ-> Ġcontext . set Dest ( copy . destination Dir . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSync Ġ-> Ġcontext . set Dest ( copy . destination Dir . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠAbstract Archive Task Ġ-> Ġcontext . set Dest ( copy . archive Path . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( copy ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠShadow Jar Ġ-> Ġcopy . configurations . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( it , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprocess Copy Spec ( root Spec , Ġcontext ) ĊĊĊĠĠĠĠĠĠĠ Ġcontext ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Copy Spec ( spec : ĠCopy Spec Internal , Ġctx : ĠDist Model BuildContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġspec . children . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDestination Root Copy Spec Ġ-> Ġctx . child (" DEST INATION ĠROOT ĠCOPY ĠSPEC ") Ġ{ Ġnew Ctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ctx . set Dest ( get RelativePath ( it . destination Dir . path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Copy Spec ( it , Ġnew Ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠDefault Copy Spec Ġ-> Ġctx . child (" DEFAULT ĠCOPY ĠSPEC ") Ġ{ Ġnew Ctx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Root Resolver Ġ= Ġit . build Root Resolver () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . add Copy Actions ( build Root Resolver . all Copy Actions ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ctx . set Dest ( build Root Resolver . dest Path . getFile ( ctx . destination !!. file ). path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Copy Spec ( it , Ġnew Ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . includes ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Ctx . child (" SING E ĠP ARENT ĠCOPY ĠSPEC ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . source Paths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( it , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSingle Parent Copy Spec Ġ-> Ġctx . child (" OTHER ĠS INGE ĠP ARENT ĠCOPY ĠSPEC ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . source Paths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( it , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠCopy Spec Internal Ġ-> Ġprocess Copy Spec ( it , Ġctx ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġctx . log Unsupported (" Copy Spec ", Ġspec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġprocess Source Path ( source Path : ĠAny ?, Ġctx : ĠDist Model BuildContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġ== Ġnull Ġ-> ĠUnit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠJar Ġ-> Ġctx . child (" JAR ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( source Path . archive Path . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠSource Set Output Ġ-> Ġctx . child (" COMPILE ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . classes Dirs . files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( it . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠConfiguration Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . child (" CONFIGURATION ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . resolve (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( it . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠSource Directory Set Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx . child (" SOURCES ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . src Dirs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( it . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠMin imal File Set Ġ-> Ġctx . child (" MIN IMAL ĠFILE ĠSET Ġ(${ source Path . java Class . simple Name }) ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( it , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠMin imal File Tree Ġ-> Ġctx . child (" MIN IMAL ĠFILE ĠT REE Ġ(${ source Path . java Class . simple Name }) ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . visit ( object Ġ: ĠFile Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dir ( dir Details : ĠFile Visit Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( dir Details . file , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file Details : ĠFile Visit Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( file Details . file , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠFile Tree Adapter Ġ&& Ġsource Path . tree Ġis ĠMap File Tree Ġ-> Ġctx . child (" FILE ĠT REE ĠAD AP TER ĠOF ĠMAP ĠFILE ĠT REE Ġ(${ source Path . java Class . simple Name }) ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . visit Contents ( object Ġ: ĠFile Collection Resolve Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġadd ( element : ĠAny ): ĠFile Collection Resolve Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( element , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnew Context (): ĠRes olvable File Collection Resolve Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" not Ġsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpush ( file Resolver : ĠPath ToFile Resolver ): ĠFile Collection Resolve Context Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠComposite File Collection Ġ-> Ġctx . child (" COMP OS ITE ĠFILE ĠCOL LECTION ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . visit Root Elements ( object Ġ: ĠFile Collection Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Directory Tree ( directory Tree : ĠDirectory File Tree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . child (" DIR ĠT REE ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . add Copy Of ( directory Tree . dir . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Tree ( file Tree : ĠFile Tree Internal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . child (" TREE ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( file Tree , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Collection ( file Collection : ĠFile Collection Internal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( file Collection , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠFile Tree Adapter Ġ&& Ġsource Path . tree Ġis ĠZip File Tree Ġ-> Ġctx . child (" ZIP ĠFILE ĠT REE ĠAD AP TER ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Ġ= Ġsource Path . tree ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġtree . java Class . declared Fields . find Ġ{ Ġit . name Ġ== Ġ" zip File " Ġ} !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip File Ġ= Ġfield . get ( tree ) Ġas ĠFile ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( zip File . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠFile Tree Internal Ġ-> Ġctx . child (" FILE ĠT REE ĠINTERNAL ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtodo : Ġpreserve Ġor Ġwarn Ġabout Ġfiltering ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . visit Tree Or Backing File ( object Ġ: ĠFile Visitor Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file Details : ĠFile Visit Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( file Details . file . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Dir ( dir Details : ĠFile Visit Details ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( dir Details . file . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠFile Collection Ġ-> Ġctx . child (" OTHER ĠFILE ĠCOL LECTION Ġ(${ source Path . java Class }) ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( it . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . log Unsupported (" FILE ĠCOL LECTION Ġ(${ t . message })", Ġsource Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠString Ġ|| Ġsource Path Ġis ĠG String Impl Ġ-> Ġctx . child (" STRING ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( source Path . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠCallable < *> Ġ-> Ġctx . child (" CALL ABLE ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( source Path . call (), Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠCollection < *> Ġ-> Ġctx . child (" COLLECTION ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Source Path ( it , Ġchild ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠCopy Ġ-> Ġctx . child (" COPY ĠOUTPUT ") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= Ġvisit Copy Task ( source Path ). destination ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src Ġ!= Ġnull ) Ġchild . add Copy Of ( src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġelse Ġit Ġis Ġadded Ġto Ġ` it `, Ġbecause Ġdestination Ġis Ġin her et ed Ġby Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Path Ġis ĠFile Ġ-> Ġctx . child (" FILE Ġ${ source Path . path }") Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchild . add Copy Of ( source Path . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġctx . log Unsupported (" SOURCE ĠPATH ", Ġsource Path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun ĠDist Model BuildContext . add Copy Of ( ĊĠĠĠĠĠĠĠ Ġsrc : ĠString , ĊĠĠĠĠĠĠĠ Ġbody : Ġ( src : ĠDist V File , Ġtarget : ĠDist V File ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĠUnit Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Copy Of ( require Path ( src ), Ġbody ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDist Model BuildContext . transform Name ( src Name : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdetails Mock Ġ= ĠDist Copy Details Mock ( this , Ġsrc Name ) ĊĠĠĠĠĠĠĠ Ġall Copy Actions . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetails Mock . last Action Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . execute ( details Mock ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠDist Copy Details Mock . E ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġname 1 Ġ= Ġdetails Mock . relative Path . lastName ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( name 1 . endsWith (". jar ")) Ġtransform Jar Name ( name 1 ) Ġelse Ġname 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Ġtodo : Ġinvestigate Ġwhy Ġall Copy Actions Ġnot Ġworking ĊĠĠĠ Ġopen Ġfun Ġtransform Jar Name ( name : ĠString ): ĠString Ġ= Ġname ĊĊĠĠĠ Ġinline Ġfun ĠDist Model BuildContext . add Copy Of ( ĊĠĠĠĠĠĠĠ Ġsrc : ĠDist V File , ĊĠĠĠĠĠĠĠ Ġbody : Ġ( src : ĠDist V File , Ġtarget : ĠDist V File ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_ Ġ-> ĠUnit Ġ} ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= Ġdestination ĊĠĠĠĠĠĠĠ Ġif Ġ( destination Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( src , Ġdestination ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcustom Target Name Ġ= Ġtransform Name ( src . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDist Copy ( destination , Ġsrc , Ġcustom Target Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog ("+ Dist Copy ", Ġ"${ get RelativePath ( src . file . path )} Ġ-> Ġ${ get RelativePath ( destination . file . path ) }/ $ custom Target Name ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġlog Unsupported (" Cannot Ġadd Ġcopy Ġof Ġ`$ src `: Ġdestination Ġis Ġunknown ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠDist Model BuildContext . set Dest ( path : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdestination Ġ= Ġv fs Root . relative Path ( path ) ĊĠĠĠĠĠĠĠ Ġlog (" IN TO ", Ġget RelativePath ( path )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcheck Refs () Ġ{ ĊĠĠĠĠĠĠĠ Ġrefs . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . has Contents Ġ&& Ġit . contents . isEmpty () Ġ&& Ġit . file . path . contains ("${ File . path Separator } build ${ File . path Separator } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" UN RESOL VED Ġ${ it . file }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . contents . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("+ Ġ${ it }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget RelativePath ( path : ĠString ) Ġ= Ġpath . replace ( root Project . project Dir . path , Ġ"$ ") ĊĊĠĠĠ Ġfun Ġrequire Path ( target Path : ĠString ): ĠDist V File Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġv fs Root . relative Path ( target Path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! File ( target Path ). exists ()) Ġrefs . add ( target ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠ Ġ} Ċ }