/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* Ġ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 . gradle . tasks Ċ Ċ import Ġorg . gradle . api . file .* Ċ import Ġorg . gradle . api . logging . Logger Ċ import Ġorg . gradle . api . provider . Provider Ċ import Ġjava . io . File Ċ import Ġjava . net . URI Ċ import Ġjava . nio . file . FileSystem s Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Standard Copy Option Ċ import Ġjava . util . zip .* Ċ Ċ internal Ġclass ĠTask Outputs Backup ( ĊĠĠĠ Ġval Ġfile System Operations : ĠFileSystem Operations , ĊĠĠĠ Ġval Ġbuild Directory : ĠDirectory Property , ĊĠĠĠ Ġval Ġsnapshots Dir : ĠProvider < Directory >, ĊĠĠĠ Ġval Ġoutputs : ĠFile Collection , ĊĠĠĠ Ġval Ġlogger : ĠLogger Ċ ) Ġ{ ĊĠĠĠ Ġfun Ġcreate Snapshot () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠKotlin ĠJS Ġcompilation Ġtask Ġdecl ares Ġone Ġfile Ġfrom Ġ' destination Directory ' Ġoutput Ġas Ġtask Ġ`@ OutputFile ' ĊĠĠĠĠĠĠĠ Ġ// Ġproperty . ĠTo Ġavoid Ġsnapshot Ġsync Ġcollisions , Ġeach Ġsnapshot Ġoutput Ġdirectory Ġhas Ġalso Ġ' index ' Ġas Ġprefix . ĊĠĠĠĠĠĠĠ Ġoutputs . files . to Sorted Set (). forEach Indexed Ġ{ Ġindex , Ġoutput Path Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath In Snapshot Ġ= Ġ"$ index ${ File . separator }${ output Path . path Relative To Build Directory }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Path . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsnapshots Dir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . file ( path In Snapshot ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompress Directory To Zip ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( this , ĠDIRECTORY _ SNAPSHOT _ ARCH IVE _ FILE ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile System Operations . copy Ġ{ Ġspec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . from ( output Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . into ( snapshots Dir . map Ġ{ Ġit . file ( path In Snapshot ). as File . parent File Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġrestore Outputs () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile System Operations . delete Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete ( outputs ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoutputs . files . to Sorted Set (). forEach Indexed Ġ{ Ġindex , Ġoutput Path Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath In Snapshot Ġ= Ġ"$ index ${ File . separator }${ output Path . path Relative To Build Directory }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile In Snapshot Ġ= Ġsnapshots Dir . get (). file ( path In Snapshot ). as File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file In Snapshot . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsnapshot Archive Ġ= ĠFile ( file In Snapshot , ĠDIRECTORY _ SNAPSHOT _ ARCH IVE _ FILE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! snapshot Archive . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| Failed Ġto Ġrestore Ġtask Ġoutputs Ġas Ġsnapshot Ġfile Ġ${ snapshot Archive . absolute Path } Ġdoes Ġnot Ġexist ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ| On Ġre compilation Ġfull Ġrebuild Ġwill Ġbe Ġperformed . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Margin () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun compress Zip Into Directory ( snapshot Archive , Ġoutput Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile System Operations . copy Ġ{ Ġspec Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . from ( snapshots Dir . map Ġ{ Ġit . file ( path In Snapshot ). as File . parent File Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . into ( output Path . parent File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete Snapshot () Ġ{ ĊĠĠĠĠĠĠĠ Ġfile System Operations . delete Ġ{ Ġit . delete ( snapshots Dir ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠKotlin 's Ġcompilation Ġin Ġa Ġ" fat " Ġproject Ġmay Ġcontain Ġa Ġlot Ġof Ġsmall Ġfiles Ġthat Ġis Ġslow Ġto Ġcopy ĊĠĠĠĠ Ġ* ĠSo Ġwe Ġspeed ing Ġit Ġup Ġby Ġarch iving Ġthem Ġinto Ġsingle Ġzip Ġfile Ġwithout Ġcompression . ĠSuch Ġapproach Ġreduces Ġsnapshot ting ĊĠĠĠĠ Ġ* Ġtime Ġup Ġto Ġhalf Ġot Ġthe Ġtime Ġneeded Ġto Ġcopy Ġsimilar Ġfiles . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcompress Directory To Zip ( ĊĠĠĠĠĠĠĠ Ġsnapshot File : ĠFile , ĊĠĠĠĠĠĠĠ Ġoutput Path : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsnapshot File . parent File . mkdir s () ĊĠĠĠĠĠĠĠ Ġsnapshot File . createNew File () ĊĊĠĠĠĠĠĠĠ ĠZip OutputStream ( snapshot File . output Stream (). buffered ()). use Ġ{ Ġzip Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip . setLevel ( De flater . NO _ COMPRESS ION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. walk Top Down () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! it . isDirectory Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġentry Ġ= ĠZip Entry ( file . relative To ( output Path ). in variant Separ ators Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip . put Next Entry ( entry ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . inputStream (). buffered (). use Ġ{ Ġit . copy To ( zip ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġzip . close Entry () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġun compress Zip Into Directory ( ĊĠĠĠĠĠĠĠ Ġsnapshot File : ĠFile , ĊĠĠĠĠĠĠĠ Ġoutput Directory : ĠFile ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġoutput Directory . to Path () ĊĠĠĠĠĠĠĠ Ġval Ġsnapshot Uri Ġ= ĠURI . create (" jar :${ snapshot File . to URI () }") ĊĠĠĠĠĠĠĠ ĠFileSystem s . new FileSystem ( snapshot Uri , Ġempty Map < String , ĠAny > ()). use Ġ{ Ġzip Fs Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġzip Fs . root Directories . forEach Ġ{ Ġroot Dir Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . walk ( rootDir ). use Ġ{ Ġpaths Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Files . isDirectory ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directories ( output Path . resolve ( it . normalized ToBe Relative )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Files . is Regular File ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . copy ( it , Ġoutput Path . resolve ( it . normalized ToBe Relative ), ĠStandard Copy Option . REPLACE _ EXIST ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠPath . normalized ToBe Relative : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġif Ġ( toString () Ġ== Ġ"/") Ġ"." Ġelse ĠtoString (). remove Prefix ("/") ĊĊĠĠĠ Ġprivate Ġval ĠFile . path Relative To Build Directory : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Dir Ġ= Ġbuild Directory . get (). as File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrelative To ( build Dir ). path ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠDIRECTORY _ SNAPSHOT _ ARCH IVE _ FILE Ġ= Ġ" snapshot . zip " ĊĠĠĠ Ġ} Ċ } Ċ