package Ġcom . virt link . go colon ize Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . parameters . arguments . argument Ċ import Ġcom . github . aj alt . cli kt . parameters . arguments . multiple Ċ import Ġcom . github . aj alt . cli kt . parameters . arguments . unique Ċ import Ġcom . github . aj alt . cli kt . parameters . options . default Ċ import Ġcom . github . aj alt . cli kt . parameters . options . flag Ċ import Ġcom . github . aj alt . cli kt . parameters . options . option Ċ import Ġcom . github . aj alt . cli kt . parameters . options . version Option Ċ import Ġcom . github . aj alt . cli kt . parameters . types . enum Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġch . qos . log back . classic . Level Ċ import Ġch . qos . log back . classic . Logger Ċ import Ġmu . Kotlin Logging Ċ import Ġjava . lang . IllegalStateException Ċ import Ġjava . nio . file .* Ċ import Ġkotlin . streams . toList Ċ Ċ /** Ċ Ġ* ĠThe Ġmain Ġentry Ġpoint . Ċ Ġ* Ċ Ġ* Ġ@ param Ġargs Ġthe Ġcommand - line Ġarguments Ċ Ġ*/ Ċ fun Ġmain ( args : ĠArray < String >) Ġ= ĠCol on ize Command () ĊĠĠĠ Ġ. version Option ("${ ĠProperties Manager . version } Ġ(${ ĠProperties Manager . revision }) ") Ġ{ Ġversion Ġ-> Ġ""" ĊĠĠĠĠĠĠĠ Ġ------------------------------------------------------------ ĊĠĠĠĠĠĠĠ ĠGo ĠCol on ize Ġ$ version ĊĠĠĠĠĠĠĠ Ġ------------------------------------------------------------ ĊĊĠĠĠĠĠĠĠ ĠBuild Ġtime : ĠĠ Ġ${ Properties Manager . build Time } ĊĠĠĠĠĠĠĠ ĠRevision : ĠĠĠĠ Ġ${ Properties Manager . full Revision } ĊĊĠĠĠĠĠĠĠ ĠJVM : ĠĠĠĠĠĠĠĠĠ Ġ${ property (" java . version ")} Ġ(${ property (" java . vm . vendor ")} Ġ${ property (" java . vm . version ") }) ĊĠĠĠĠĠĠĠ ĠOS : ĠĠĠĠĠĠĠĠĠĠ Ġ${ property (" os . name ")} Ġ${ property (" os . version ")} Ġ(${ property (" os . arch ") }) ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ ĠUser : ĠĠĠĠĠĠĠĠ Ġ${ property (" user . name ")} ĊĠĠĠĠĠĠĠ ĠUser Ġhome : ĠĠĠ Ġ${ property (" user . home ")} ĊĠĠĠĠĠĠĠ ĠWorking Ġdir : Ġ Ġ${ property (" user . dir ")} ĊĠĠĠĠĠĠĠĠĊĠĠĠĠĠĠĠ Ġ------------------------------------------------------------ ĊĠĠĠĠĠĠĠ ĠCopyright Ġ 2 0 2 0 - 2 0 2 1 ĠDaniel ĠA . ĠA . ĠP els ma ek er ĊĠĠĠĠĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 . ĊĊĠĠĠĠĠĠĠ ĠThis Ġproject Ġincludes Ġsource Ġcode Ġfrom Ġother Ġprojects : ĊĠĠĠĠĠĠĠ Ġ- ĠG olang ĠAnt lr ĠGram mar Ġ( BSD - 3 Ġlicense ) ĊĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠ Ġ} ĊĠĠĠ Ġ. main ( args ) Ċ Ċ /** Ċ Ġ* ĠThe Ġmain Ġcommand . Ċ Ġ*/ Ċ @ Suppress (" Member Visibility Can Be Private ") Ċ class ĠCol on ize Command Ġ: ĠCli kt Command ( name =" colon ize ", Ġhelp =" Adds Ġsemi - col ons Ġto Ġa ĠGo Ġfile ") Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ// Ġ@ formatter : off ĊĠĠĠ Ġval Ġinputs ĠĠĠĠĠĠ Ġby Ġargument ( help =" Input Ġfiles Ġor Ġdirectories ; Ġor Ġnone Ġto Ġread Ġfrom ĠSTD IN "). multiple (). unique () ĊĠĠĠ Ġval Ġrecursive ĠĠĠ Ġby Ġoption ("- r ", Ġ"-- recursive ", Ġhelp =" Re cursively Ġprocess Ġthe Ġspecified Ġdirectories "). flag () ĊĠĠĠ Ġval ĠoutputFile ĠĠ Ġby Ġoption ("- O ", Ġ"-- output - file ", Ġhelp =" Output Ġfile ", Ġmetavar Ġ= Ġ" FILE ") ĊĠĠĠ Ġval Ġoutput Dir ĠĠĠ Ġby Ġoption ("- o ", Ġ"-- output - dir ", Ġhelp =" Output Ġdirectory ", Ġmetavar Ġ= Ġ" DIR ") ĊĠĠĠ Ġval Ġoutput Prefix Ġby Ġoption ("- p ", Ġ"-- output - prefix ", Ġhelp =" Output Ġfilename Ġprefix ", Ġmetavar Ġ= Ġ" PREFIX ") ĊĠĠĠ Ġval Ġoutput Suffix Ġby Ġoption ("- s ", Ġ"-- output - suffix ", Ġhelp =" Output Ġfilename Ġsuffix ", Ġmetavar Ġ= Ġ" SUFFIX ") ĊĠĠĠ Ġval Ġoutput Ext ĠĠĠ Ġby Ġoption ("- e ", Ġ"-- output - ext ", Ġhelp =" Output Ġfilename Ġextension , Ġincl Ġdot ", Ġmetavar Ġ= Ġ". EXT ") ĊĠĠĠ Ġval Ġquiet ĠĠĠĠĠĠĠ Ġby Ġoption ("- q ", Ġ"-- quiet ", Ġhelp =" Quiet Ġmode "). flag () ĊĠĠĠ Ġval Ġdry Run ĠĠĠĠĠĠ Ġby Ġoption ("- n ", Ġ"-- dry - run ", Ġhelp =" Shows Ġwhat Ġwould Ġhappen "). flag () ĊĠĠĠ Ġval ĠonError ĠĠĠĠĠ Ġby Ġoption ("- E ", Ġ"-- on - error ", Ġhelp =" How Ġparse Ġerrors Ġare Ġhandled "). enum < On ParseError >(). default ( On ParseError . Warn ) ĊĠĠĠ Ġ// Ġ@ formatter : on ĊĊĠĠĠ Ġ/** ĠA Ġset Ġof Ġdirectories Ġthat Ġhave Ġbeen Ġcreated . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcreated Dirs : ĠMutable Set < Path > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ/** ĠMat ches Ġ. go Ġfiles . Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġgo File Matcher : ĠPath Matcher Ġ= ĠFileSystem s . getDefault (). getPath Matcher (" glob :** . go ") ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġset LogLevel () ĊĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= Ġgather Files () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( files . isEmpty () Ġ&& Ġinputs . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" No Ġfiles Ġspecified .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( files . size Ġ> Ġ 1 Ġ&& ĠoutputFile Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Multiple Ġinput Ġfiles Ġspecified , Ġbut Ġone Ġoutput Ġfile .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( outputFile Ġ== Ġnull Ġ&& Ġoutput Dir Ġ== Ġnull Ġ&& Ġoutput Prefix Ġ== Ġnull Ġ&& Ġoutput Suffix Ġ== Ġnull Ġ&& Ġoutput Ext Ġ== Ġnull Ġ&& Ġfiles . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Output Ġto Ġstandard Ġout ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( file Ġin Ġfiles ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġget Output Path ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġensure Parent Exists ( output Path , Ġdry Run ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolon ize ( file , Ġoutput Path , Ġdry Run ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġif Ġ( outputFile Ġ!= Ġnull ) ĠPaths . get ( outputFile !! ) Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolon ize ( null , Ġoutput Path , Ġdry Run ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠF atal Parse ErrorException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠException Ġwas Ġthrown Ġto Ġabort Ġand Ġexit . ĠIt Ġhas Ġbeen Ġlogged Ġalready . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" Abort ed .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error ( ex . message , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . info (" Done .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġsem icol ons Ġto Ġthe Ġspecified Ġpath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġfile Ġto Ġcolon ize ; Ġor Ġ` null ` Ġto Ġinput Ġfrom ĠSTD IN ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput Path Ġthe Ġoutput Ġpath ; Ġor Ġ` null ` Ġto Ġoutput Ġto ĠST DOUT ĊĠĠĠĠ Ġ* Ġ@ param Ġdry Run Ġwhether Ġthis Ġis Ġa Ġdry - run ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcolon ize ( file : ĠPath ?, Ġoutput Path : ĠPath ?, Ġdry Run : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( dry Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ("${ file Ġ?: Ġ" STD IN "} Ġ-> Ġ${ output Path Ġ?: Ġ" STDOUT "} ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ("${ file Ġ?: Ġ" STD IN "} Ġ-> Ġ${ output Path Ġ?: Ġ" STDOUT "} ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCol on izer ( onError ). colon ize ( file , Ġoutput Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Done : Ġ${ file Ġ?: Ġ" STD IN "} Ġ-> Ġ${ output Path Ġ?: Ġ" STDOUT "} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEns ures Ġthe Ġparent Ġdirectory Ġof Ġthe Ġspecified Ġpath Ġexists . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput Path Ġthe Ġoutput Ġpath ; Ġor Ġ` null ` Ġwhen Ġoutput Ġshould Ġbe Ġwritten Ġto ĠST DOUT ĊĠĠĠĠ Ġ* Ġ@ param Ġdry Run Ġwhether Ġthis Ġis Ġa Ġdry - run ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġensure Parent Exists ( output Path : ĠPath ?, Ġdry Run : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( output Path Ġ== Ġnull ) Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġoutput Path . parent ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ! in Ġcreated Dirs Ġ&& ĠFiles . not Exists ( parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreated Dirs . add ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dry Run ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Creating Ġ$ parent ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directories ( parent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Created Ġ$ parent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Create Ġ$ parent ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ(! dry Run Ġ&& ĠFiles . not Exists ( parent )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Directory Ġwas Ġcreated Ġbut Ġno Ġlonger Ġexists : Ġ$ parent ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSets Ġthe Ġlog Ġlevel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġset LogLevel () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Logger . ROOT _ LOGGER _ NAME ) Ġas ĠLogger ĊĠĠĠĠĠĠĠ Ġif Ġ( quiet ) Ġroot . level Ġ= ĠLevel . WARN ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġnot Ġquiet , Ġwe 'll Ġuse Ġthe Ġlog Ġlevel Ġspecified Ġin Ġlog back . xml ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠG athers Ġthe Ġpaths Ġof Ġall Ġfiles Ġto Ġprocess . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġfile Ġpaths Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġgather Files (): ĠList < Path > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġinputs . map { ĠPaths . get ( it ) Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Files . isDirectory ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind ( it , Ġif Ġ( recursive ) ĠInt . MAX _ VALUE Ġelse Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}. distinct () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġall Ġfiles Ġin Ġthe Ġspecified Ġpath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpath Ġthe Ġpath Ġto Ġsearch ĊĠĠĠĠ Ġ* Ġ@ param Ġdepth Ġthe Ġmaximum Ġdepth Ġto Ġsearch ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġfile Ġpaths Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġfind ( path : ĠPath , Ġdepth : ĠInt Ġ= ĠInt . MAX _ VALUE ): ĠList < Path > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠFiles . find ( path , Ġdepth , Ġ{ Ġp , Ġa Ġ-> Ġa . is Regular File Ġ&& Ġgo File Matcher . matches ( p ) Ġ}). map Ġ{ Ġit . normalize () Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDetermines Ġthe Ġoutput Ġpath Ġfor Ġthe Ġgiven Ġinput Ġpath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput Path Ġthe Ġinput Ġpath ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġoutput Ġpath ; Ġor Ġ` null ` Ġwhen Ġoutput Ġshould Ġbe Ġwritten Ġto ĠST DOUT ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Output Path ( input Path : ĠPath ): ĠPath ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( outputFile Ġ!= Ġnull ) Ġreturn ĠPaths . get ( outputFile !! ) ĊĠĠĠĠĠĠĠ Ġif Ġ( output Dir Ġ== Ġnull Ġ&& Ġoutput Prefix Ġ== Ġnull Ġ&& Ġoutput Suffix Ġ== Ġnull Ġ&& Ġoutput Ext Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġ( name , Ġext ) Ġ= Ġsplit Extension ( input Path . fileName . toString ()) ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Path Ġ= Ġif Ġ( output Dir Ġ!= Ġnull ) ĠPaths . get ( output Dir !! ). resolve ( Paths . get (" "). rel ativ ize ( input Path )) Ġelse Ġinput Path ĊĠĠĠĠĠĠĠ Ġreturn Ġoutput Path . resolve Sibling ( Ġ"${ output Prefix Ġ?: Ġ"" }$ name ${ output Suffix Ġ?: Ġ"" }${ output Ext Ġ?: Ġext } "). normalize () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSpl its Ġa Ġfilename Ġinto Ġa Ġname Ġand Ġan Ġextension Ġ( including Ġthe Ġdot ) ĊĠĠĠĠ Ġ* ĠWhen Ġthe Ġfilename Ġstarts Ġwith Ġa Ġdot , Ġthe Ġstarting Ġdot Ġis Ġignored . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfilename Ġthe Ġfilename Ġto Ġsplit ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġpair Ġof Ġthe Ġfilename Ġand Ġthe Ġextension ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġsplit Extension ( filename : ĠString ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġext Index Ġ= Ġfilename . indexOf ('.', Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġif Ġ( ext Index Ġ< Ġ 1 ) Ġreturn ĠPair ( filename , Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( filename . substring ( 0 , Ġext Index ), Ġfilename . substring ( ext Index )) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠHelper Ġfunction Ġthat Ġkeys Ġa Ġkey Ġfrom Ġthe Ġsystem Ġproperties . Ċ Ġ* Ċ Ġ* Ġ@ param Ġkey Ġthe Ġkey Ġto Ġget Ċ Ġ* Ġ@ param Ġdefault Ġthe Ġdefault Ġvalue ; Ġor Ġ` null ` Ċ Ġ* Ġ@ return Ġthe Ġvalue Ġread Ġfrom Ġthe Ġproperties ; Ġor Ġthe Ġdefault Ġvalue Ġif Ġnot Ġfound Ċ Ġ*/ Ċ fun Ġproperty ( key : ĠString , Ġdefault : ĠString ? Ġ= Ġnull ): ĠString ? Ġ= ĠSystem . getProperty ( key , Ġdefault ) Ċ