import Ġorg . gradle . api . Project Ċ import Ġorg . gradle . kotlin . dsl . extra Ċ import Ġorg . gradle . kotlin . dsl . get ByName Ċ import Ġorg . jetbrains . dok ka . gradle . D ok ka Task Ċ import Ġstudio . for face . easy gradle . dsl . android . Version Ċ import Ġjava . io . File Ċ import Ġjava . time . LocalDate Ċ import Ġjava . time . format . DateTime Formatter Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġclass Ġwill Ġorgan ize Ġrelease . Ċ Ġ* Ċ Ġ* ĠIt Ġwill : Ċ Ġ* Ġ* ĠMove Ġa ar Ġarch ives Ġinto Ġ'/ folder Name /< lib Name >' Ċ Ġ* Ġ* ĠMove Ġapk Ġarch ives Ġinto Ġ'/ folder Name / apk ' Ċ Ġ* Ġ* ĠGenerate ĠK Doc Ġif Ġnew Ġversion Ġis Ġavailable Ċ Ġ* Ċ Ġ* Ġ@ author ĠD av ide ĠF are lla Ċ Ġ*/ Ċ class ĠRelease Manager Ġinternal Ġconstructor ( project : ĠProject ) Ġ: ĠProject Ġby Ġproject Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġtimestamp Ġ= ĠLocalDate . now (). format ( DateTime Formatter . of Pattern (" MMM Ġdd , Ġy yyy ")) ĊĊĠĠĠ Ġprivate Ġvar Ġshould Generate K doc Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġnew Version : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠMove Ġa ar Ġarch ives Ġinto Ġ'/ [ folder Name ]/ < lib Name >' Ġ*/ ĊĠĠĠ Ġfun Ġmove Arch ives ( folder Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmove ( folder Name , Ġarchive Type Ġ= ĠArchive Type . A AR ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠMove Ġapk 's Ġinto Ġ'/ [ folder Name ]/ apk ' Ġ*/ ĊĠĠĠ Ġfun Ġmove A pk ( folder Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmove ( folder Name , Ġarchive Type Ġ= ĠArchive Type . AP K ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġmove ( folder Name : ĠString , Ġarchive Type : ĠArchive Type ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( project Version . version Code Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshould Generate K doc Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġfolder ĊĠĠĠĠĠĠĠ Ġval Ġnew Dir Ġ= ĠFile ( rootDir , Ġfolder Name Ġ+ ĠFile . separator Ġ+ ĠfullName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! new Dir . exists ()) Ġnew Dir . mkdir s () ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( archive Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArchive Type . AP K Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwith ( RELEASE S _ FILE ( new Dir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Ġ= Ġread Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! RELEASE _ VERSION _ REGEX . contains Match In ( content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Text ("${ release Version ( project Version , Ġtimestamp )}\ n $ content ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA PK _ DIRECTORY . list Files Ġ{ Ġfile , Ġ_ Ġ-> Ġfile . isDirectory Ġ} ?. forEach Ġ{ Ġsub Dir Ġ-> ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsub Dir . list Files ()?. filter Ġ{ Ġit . extension Ġ== Ġ" apk " Ġ} ?. forEach Ġ{ Ġapk Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew File Ġ= ĠFile ( new Dir , Ġapk . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġfile Ġis Ġabsent , Ġcopy Ġit Ġand Ġgenerate ĠK Doc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapk . copy To ( new File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Generate K doc Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Version Ġ= Ġapk . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After Last ('_ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring Before Last ("- ${ sub Dir . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapk . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArchive Type . A AR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠA AR _ DIRECTORY . list Files Ġ{ Ġ_, Ġpath Ġ-> Ġ" release " Ġin Ġpath Ġ} ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew File Ġ= ĠFile ( new Dir , Ġit . name . replace ("- release ", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġfile Ġis Ġabsent , Ġcopy Ġit Ġand Ġgenerate ĠK Doc ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! new File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . copy To ( new File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshould Generate K doc Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Version Ġ= Ġit . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring After Last ('_ ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. substring Before Last ('- ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠGenerate ĠK Doc Ġif Ġnew Ġlibrary Ġis Ġavailable Ġ*/ ĊĠĠĠ Ġfun Ġgenerate K doc IfNeeded () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( should Generate K doc ) Ġtasks . get ByName < D ok ka Task >(" dok ka "). generate () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠUpdate Ġreadme Ġwith Ġnew Ġversion Ġ*/ ĊĠĠĠ Ġfun Ġupdate Read me () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( new Version Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠREADME _ FILE . write Text ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREADME _ FILE . read Text (). replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREADME _ VERSION _ REGEX , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreadme Version ( readable Name , Ġproject Version . version Name , Ġtimestamp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġenum Ġclass ĠArchive Type Ġ{ ĠA PK , ĠA AR Ġ} ĊĊĠĠĠ Ġ@ Suppress (" FunctionName ") ĊĠĠĠ Ġprivate Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠProject . A AR _ DIRECTORY Ġget () Ġ= ĠFile ( build Dir , Ġ" outputs " Ġ+ ĠFile . separator Ġ+ Ġ" aar ") ĊĠĠĠĠĠĠĠ Ġval ĠProject . AP K _ DIRECTORY Ġget () Ġ= ĠFile ( build Dir , Ġ" outputs " Ġ+ ĠFile . separator Ġ+ Ġ" apk ") ĊĠĠĠĠĠĠĠ Ġval ĠProject . README _ FILE Ġget () Ġ= ĠFile ( rootDir , Ġ" README . md ") ĊĠĠĠĠĠĠĠ Ġval ĠProject . README _ VERSION _ REGEX Ġget () Ġ= Ġreadme Version ( readable Name , Ġ"( .+ )", Ġ"( . +) "). to Regex () ĊĠĠĠĠĠĠĠ Ġfun ĠProject . RELEASE S _ FILE ( parent Dir : ĠFile ) Ġ= ĠFile ( parent Dir , Ġ" releases . txt "). also Ġ{ Ġif Ġ(! it . exists ()) Ġit . createNew File () Ġ} ĊĠĠĠĠĠĠĠ Ġval ĠProject . RELEASE _ VERSION _ REGEX Ġget () Ġ= Ġrelease Version ( project Version , Ġ"( . +) "). to Regex () ĊĊĠĠĠĠĠĠĠ Ġ@ Opt In ( Experimental Std lib Api :: class ) Ġ// ĠString . capitalize ( Locale ) ĊĠĠĠĠĠĠĠ Ġfun Ġreadme Version ( name : ĠString , Ġversion : ĠString , Ġtimestamp : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ${ name . capitalize ( Locale . getDefault ()) }: Ġ\ *\ *$ version \ *\ * Ġ- Ġ_ released Ġon : Ġ${ timestamp }_ """ ĊĊĠĠĠĠĠĠĠ Ġfun Ġrelease Version ( version : ĠVersion , Ġtimestamp : ĠString ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ${ version . version Name } Ġ- Ġ${ version . version Code } Ġ- Ġ$ timestamp """ ĊĠĠĠ Ġ} Ċ } Ċ Ċ val ĠProject . fullName Ġget () Ġ= Ġnames Hierarchy . join ToString ( separator Ġ= Ġ"- ") Ċ Ċ val ĠProject . readable Name Ġget () Ġ= Ġnames Hierarchy . join ToString ( separator Ġ= Ġ" Ġ") Ċ Ċ @ Opt In ( Experimental Std lib Api :: class ) Ċ private Ġval ĠProject . names Hierarchy Ġget () Ġ= Ġbuild List Ġ{ ĊĠĠĠ Ġadd ( 0 , Ġname ) ĊĊĠĠĠ Ġvar Ġp Ġ= Ġparent ĊĠĠĠ Ġwhile Ġ( p Ġ!= Ġnull Ġ&& Ġp Ġ!= Ġroot Project ) Ġ{ ĊĠĠĠĠĠĠĠ Ġadd ( 0 , Ġp . name ) ĊĠĠĠĠĠĠĠ Ġp Ġ= Ġp . parent ĊĠĠĠ Ġ} Ċ } Ċ Ċ var ĠProject . project Version : ĠVersion ĊĠĠĠ Ġget () Ġ= Ġextra . get (" project Version ") Ġas ? ĠVersion ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException ("' version ' Ġis Ġrequired Ġfor Ġ'$ fullName '") ĊĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġextra . set (" project Version ", Ġvalue ) ĊĠĠĠ Ġ} Ċ Ċ val ĠProject . Release Manager Ġget () Ġ= ĠRelease Manager ( this ) ĊĊ