/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠV lad im ir ĠS it nik ov Ġ< sit nik ov . vl ad im ir @ gmail . com > Ċ Ġ* Ċ Ġ* Ġ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 . github . aut ost yle Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Serializable Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util .* Ċ Ċ /** ĠComputes Ġa Ġsignature Ġfor Ġany Ġneeded Ġfiles . Ġ Ġ*/ Ċ class ĠFile Signature Ġprivate Ġconstructor ( ĊĠĠĠ Ġkey Paths : ĠMap < File , ĠString >, ĊĠĠĠ Ġ/* ĊĠĠĠĠ Ġ* ĠTrans ient Ġbecause Ġnot Ġneeded Ġto Ġuniquely Ġidentify Ġa ĠFile Signature Ġinstance , Ġand Ġalso Ġbecause ĊĠĠĠĠ Ġ* ĠGradle Ġonly Ġneeds Ġthis Ġclass Ġto Ġbe ĠSerializable Ġso Ġit Ġcan Ġcompare ĠFile Signature Ġinstances Ġfor ĊĠĠĠĠ Ġ* Ġincremental Ġbuilds . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ field : Transient ĊĠĠĠ Ġprivate Ġval Ġfiles : ĠList < File >, ĊĠĠĠ Ġordered : ĠBoolean Ċ ) Ġ: ĠSerializable Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdigest : ĠByteArray ĊĊĠĠĠ Ġ/** ĠReturns Ġall Ġof Ġthe Ġfiles Ġin Ġthis Ġsignature Ġ*/ ĊĠĠĠ Ġfun Ġfiles (): ĠCollection < File > Ġ= ĠCollections . unmodifiable List ( files ) ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġonly Ġfile Ġin Ġthis Ġsignature , Ġthrowing Ġan Ġexception Ġif Ġthere Ġare Ġmore Ġor Ġless Ġthan Ġ 1 Ġfile . Ġ Ġ*/ ĊĠĠĠ Ġval Ġonly File : ĠFile Ġget () Ġ= Ġfiles . single () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" SHA - 1 ") ĊĠĠĠĠĠĠĠ Ġval Ġentries Ġ= Ġkey Paths . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . key . canonical Path Ġto Ġit . value Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġit . first . length Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠĠĠĠĠ Ġval Ġcontents Ġ= Ġfiles . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġit . canonical Path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= Ġentries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ Ġroot Ġ-> Ġpath . startsWith ( root . first ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġroot Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . second Ġ+ Ġ":" Ġ+ Ġpath . substring ( root . first . length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Path Ġto Ġit ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ordered ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsorted By Ġ{ Ġit . first Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ(( relative Path , Ġfile ) Ġin Ġcontents ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update ( relative Path . toByteArray ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 0 - byte Ġis Ġunlikely Ġto Ġappear Ġin Ġa Ġfile Ġpath , Ġso Ġit Ġshould Ġbe Ġsafe Ġfor Ġuse Ġas Ġa Ġdelimiter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . forEach Block Ġ{ Ġbuffer , Ġbytes Read Ġ-> Ġmd . update ( buffer , Ġ 0 , Ġbytes Read ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġdigest Ġ= Ġmd . digest () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠserialVersionUID Ġ= Ġ 1 L ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDEFAULT _ KEYS Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( File ( System . getProperty (" user . home ")) Ġto Ġ"\ $ HOME ") ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġval ĠEMPTY Ġ= Ġsign As List ( DEFAULT _ KEYS , ĠlistOf ()) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġfile Ġsignature Ġwhereas Ġorder Ġof Ġthe Ġfiles Ġremains Ġunchanged . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Deprecated (" use Ġkey Paths Ġfor ĠPath Sensitive . Relative ") ĊĠĠĠĠĠĠĠ Ġfun Ġsign As List ( var arg Ġfiles : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign As List ( DEFAULT _ KEYS , ĠlistOf (* files )) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġfile Ġsignature Ġwhereas Ġorder Ġof Ġthe Ġfiles Ġremains Ġunchanged . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Deprecated (" use Ġkey Paths Ġfor ĠPath Sensitive . Relative ") ĊĠĠĠĠĠĠĠ Ġfun Ġsign As List ( files : ĠIterable < File >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign As List ( DEFAULT _ KEYS , Ġfiles . toList ()) ĊĊĠĠĠĠĠĠĠ Ġ/** ĠCreates Ġfile Ġsignature Ġwhereas Ġorder Ġof Ġthe Ġfiles Ġremains Ġunchanged . Ġ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Deprecated (" use Ġkey Paths Ġfor ĠPath Sensitive . Relative ") ĊĠĠĠĠĠĠĠ Ġfun Ġsign As Set ( var arg Ġfiles : ĠFile ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign As Set ( DEFAULT _ KEYS , ĠlistOf (* files )) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġfile Ġsignature Ġins ensitive Ġto Ġthe Ġorder Ġof Ġthe Ġfiles . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġ@ Deprecated (" use Ġkey Paths Ġfor ĠPath Sensitive . Relative ") ĊĠĠĠĠĠĠĠ Ġfun Ġsign As Set ( files : ĠIterable < File >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsign As Set ( DEFAULT _ KEYS , Ġfiles . toList ()) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġfile Ġsignature Ġwhereas Ġorder Ġof Ġthe Ġfiles Ġremains Ġunchanged . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġsign As List ( key Paths : ĠMap < File , ĠString >, Ġfiles : ĠIterable < File >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Signature ( key Paths , Ġfiles . toList (), Ġtrue ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCreates Ġfile Ġsignature Ġins ensitive Ġto Ġthe Ġorder Ġof Ġthe Ġfiles . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠ Ġfun Ġsign As Set ( key Paths : ĠMap < File , ĠString >, Ġfiles : ĠIterable < File >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Signature ( key Paths , Ġfiles . to Sorted Set (). toList (), Ġfalse ) ĊĠĠĠ Ġ} Ċ } Ċ