/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 Ġthe Ġoriginal Ġauthor Ġor Ġauthors . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . gradle . kotlin . dsl . cache Ċ Ċ import Ġorg . gradle . kotlin . dsl . support . normal ised Path Relative To Ċ import Ġorg . gradle . kotlin . dsl . support . use To Run Ċ import Ġjava . io . Data InputStream Ċ import Ġjava . io . Data OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . util . zip . GZIP InputStream Ċ import Ġjava . util . zip . GZIP OutputStream ĊĊ Ċ internal Ċ data Ġclass ĠPack Metadata ( ĊĠĠĠ Ġval Ġbuild Invocation Id : ĠString , ĊĠĠĠ Ġval Ġexecution Time Millis : ĠLong Ċ ) ĊĊ Ċ internal Ċ fun Ġpack ( input Dir : ĠFile , Ġmetadata : ĠPack Metadata , ĠoutputStream : ĠOutputStream ): ĠLong Ġ= ĊĊĠĠĠ ĠData OutputStream ( GZIP OutputStream ( output Stream )). use To Run Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwrite Int ( pack Format Version ) ĊĠĠĠĠĠĠĠ Ġpack Metadata ( metadata ) ĊĠĠĠĠĠĠĠ Ġpack Files From ( input Dir ) ĊĠĠĠ Ġ} ĊĊ Ċ private Ċ const Ġval Ġpack Format Version Ġ= Ġ 1 ĊĊ Ċ internal Ċ fun Ġunpack ( inputStream : ĠInputStream , Ġoutput Dir : ĠFile ): ĠPair < Pack Metadata , ĠLong > Ġ= ĊĊĠĠĠ ĠData InputStream ( GZIP InputStream ( inputStream )). use To Run Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpacked Version Ġ= Ġread Int () ĊĠĠĠĠĠĠĠ Ġrequire ( packed Version Ġ== Ġpack Format Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Unsupported Ġcache Ġformat Ġversion , Ġexpected Ġversion Ġ$ pack Format Version , Ġgot Ġversion Ġ$ packed Version ." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġunpack Metadata () Ġto Ġunpack Files To ( output Dir ) ĊĠĠĠ Ġ} ĊĊ Ċ private Ċ fun ĠData OutputStream . pack Metadata ( metadata : ĠPack Metadata ) Ġ{ ĊĠĠĠ Ġwrite UTF ( metadata . build Invocation Id ) ĊĠĠĠ Ġwrite Long ( metadata . execution Time Millis ) Ċ } ĊĊ Ċ private Ċ fun ĠData InputStream . unpack Metadata (): ĠPack Metadata Ġ{ ĊĠĠĠ Ġval Ġbuild Invocation Id Ġ= Ġread UTF () ĊĠĠĠ Ġval Ġexecution Time Millis Ġ= Ġread Long () ĊĠĠĠ Ġreturn ĠPack Metadata ( build Invocation Id , Ġexecution Time Millis ) Ċ } ĊĊ Ċ private Ċ fun ĠData OutputStream . pack Files From ( input Dir : ĠFile ): ĠLong Ġ{ ĊĊĠĠĠ Ġvar Ġentry Count Ġ= Ġ 0 L ĊĊĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( DEFAULT _ BUFFER _ SIZE ) ĊĊĠĠĠ Ġinput Dir . walk Top Down (). drop ( 1 ). forEach Ġ{ Ġfile Ġ-> ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġfile . normal ised Path Relative To ( input Dir ) ĊĠĠĠĠĠĠĠ Ġval Ġis File Ġ= Ġfile . isFile ĊĊĠĠĠĠĠĠĠ Ġwrite UTF ( path ) ĊĠĠĠĠĠĠĠ Ġwrite Boolean ( isFile ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Long ( file . length ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . copy To ( this , Ġbuffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġentry Count Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwrite UTF ("") ĊĊĠĠĠ Ġreturn Ġentry Count Ċ } ĊĊ Ċ private Ċ fun ĠData InputStream . unpack Files To ( output Dir : ĠFile ): ĠLong Ġ{ ĊĊĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( DEFAULT _ BUFFER _ SIZE ) ĊĊĠĠĠ Ġvar Ġentry Count Ġ= Ġ 0 L ĊĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġread UTF () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. take If ( String :: isNotEmpty ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġbreak ĊĊĠĠĠĠĠĠĠ Ġval Ġis File Ġ= Ġread Boolean () ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( output Dir , Ġpath ) ĊĠĠĠĠĠĠĠ Ġif Ġ( isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġread Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopy To ( file , Ġlength , Ġbuffer ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġentry Count Ġ+= Ġ 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġentry Count Ċ } ĊĊ Ċ private Ċ fun ĠFile . copy To ( out : ĠOutputStream , Ġbuffer : ĠByteArray ) Ġ{ ĊĠĠĠ ĠinputStream (). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġread Ġ= Ġinput . read ( buffer ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( read Ġ>= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġout . write ( buffer , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Ġ= Ġinput . read ( buffer ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ private Ċ fun ĠInputStream . copy To ( file : ĠFile , Ġlength : ĠLong , Ġbuffer : ĠByteArray ) Ġ{ ĊĠĠĠ Ġfile . output Stream (). use Ġ{ Ġoutput Ġ-> ĊĠĠĠĠĠĠĠ Ġvar Ġremaining Ġ= Ġlength ĊĠĠĠĠĠĠĠ Ġval ĠbufferSize Ġ= Ġbuffer . size . to Long () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( remaining Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Ġ= Ġread ( buffer , Ġ 0 , Ġremaining . coerce At Most ( buffer Size ). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . write ( buffer , Ġ 0 , Ġread ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremaining Ġ-= Ġread ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ