@ file : Jvm Name (" Main ") Ċ Ċ package Ġcom . ale c strong . con way Ċ Ċ import Ġcom . github . aj alt . cli kt . core . Cli kt Command Ċ import Ġcom . github . aj alt . cli kt . parameters . options . option Ċ import Ġcom . github . aj alt . cli kt . parameters . options . split Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . InputStream Reader Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ Ċ fun Ġmain ( var arg Ġargs : ĠString ) Ġ{ ĊĠ ĠCon way Cli (). main ( args . toList ()) Ċ } Ċ Ċ internal Ġclass ĠCon way Cli Ġ: ĠCli kt Command ( name Ġ= Ġ" con way ") Ġ{ ĊĠ Ġval Ġfolder Ġby Ġoption ("-- folders ", ĊĠĠĠĠĠ Ġhelp Ġ= Ġ" Input Ġdirectories Ġ< directory 1 >,< directory 2 > "). split (",") ĊĠ Ġval Ġauthor Ġby Ġoption ("-- author ", Ġhelp Ġ= Ġ" alias Ġto Ġsearch Ġby ") ĊĠ Ġval Ġsince : ĠString ? Ġby Ġoption ("-- since ") ĊĊĠ Ġprivate Ġfun ĠInputStream . for Commits ( body : Ġ( email : ĠString , Ġchanged : ĠLine Changes , Ġfile : ĠString ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠInputStreamReader ( this ). use Lines Ġ{ Ġsequence Ġ-> ĊĠĠĠĠĠ Ġval Ġiterator Ġ= Ġsequence . iterator () ĊĊĠĠĠĠĠ Ġif Ġ(! iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġecho (" There Ġwere Ġno Ġcommits Ġfor Ġthe Ġgiven Ġarguments ", Ġerr Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġiterator . next () Ġ// ĠSkip Ġinitial Ġnewline ĊĊĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġemail Ġ= Ġiterator . next () ĊĊĠĠĠĠĠĠĠ Ġiterator . next () Ġ// ĠSkip Ġnewline ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġlines Changed Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( lines Changed . isEmpty ()) Ġbreak ĊĊĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( added , Ġremoved , Ġfile ) Ġ= Ġlines Changed . split ( spaces ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( email . substring Before ("@ "), ĠLine Changes ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditions Ġ= Ġadded . to Long OrNull () Ġ?: Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde letions Ġ= Ġremoved . to Long OrNull () Ġ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġfile ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcontributions By Folders ( folders : ĠList < String >) Ġ{ ĊĠĠĠ Ġval Ġin Folder Commits Ġ= Ġmutable Map Of < String , ĠLine Changes >() ĊĠĠĠ Ġval Ġall Commits Ġ= Ġmutable Map Of < String , ĠLine Changes >() ĊĊĠĠĠ Ġval Ġargs Ġ= Ġmutable ListOf (" git ", Ġ" log ", Ġ"-- num stat ") ĊĠĠĠ Ġif Ġ( since Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġargs . add ("-- since =\" $ since \" ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġargs . add ("-- no - mer ges ") ĊĠĠĠ Ġargs . add ("-- pretty =% n % ae ") ĊĊĠĠĠ ĠRuntime . get Runtime (). exec ( args . to Typed Array ()). inputStream . for Commits Ġ{ Ġemail , Ġchanged , Ġfile Ġ-> ĊĠĠĠĠĠ Ġif Ġ( folders . any Ġ{ Ġfile . startsWith ( it ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġin Folder Commits [ email ] Ġ= Ġin Folder Commits . get OrDefault ( email , ĠLine Changes ()) Ġ+ Ġchanged ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġall Commits [ email ] Ġ= Ġall Commits . get OrDefault ( email , ĠLine Changes ()) Ġ+ Ġchanged ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtotal In Folder Commits Ġ= Ġin Folder Commits . values . map Ġ{ Ġit . total () Ġ}. sum () ĊĊĠĠĠ Ġval Ġcontributions Ġ= Ġall Commits ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġ( author , Ġcommits ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( commits . total () Ġ< Ġ 1 0 ) Ġreturn @ map NotNull Ġnull ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġin Folder Ġ= Ġin Folder Commits . get OrDefault ( author , ĠLine Changes ()) ĊĠĠĠĠĠĠĠĠĠ Ġval Ġpercentage In Folders Ġ= Ġin Folder . total () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigDecimal . valueOf ( 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. divide ( commits . total (). to BigDecimal (), Ġ 2 , ĠRound ingMode . HALF _ UP ) ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġpercentage Of Folder Ġ= Ġin Folder . total () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigDecimal . valueOf ( 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. divide ( total In Folder Commits . to BigDecimal (), Ġ 2 , ĠRound ingMode . HALF _ UP ) ĊĊĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull ĠCont ribution ( author , Ġpercentage In Folders , Ġpercentage Of Folder , Ġcommits ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġcontributions . sorted By Descending Ġ{ Ġit . percentage In Folder Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( author , Ġpercentage , Ġ_, Ġline Changes ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( percentage Ġ< ĠBigDecimal . ONE ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠ Ġecho ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ author Ġwrites Ġ${ percentage . to Plain String ()} % Ġof Ġtheir Ġcode Ġin Ġ$ folder Ġ$ line Changes ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġecho (" --- ") ĊĊĠĠĠ Ġcontributions . sorted By Descending Ġ{ Ġit . percentage Of Folder Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( author , Ġ_, Ġpercentage , Ġline Changes ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( percentage Ġ< ĠBigDecimal . ONE ) Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠ Ġecho ("$ author Ġaccounts Ġfor Ġ${ percentage . to Plain String ()} % Ġof Ġ$ folder Ġ$ line Changes ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcontributions By Author ( author : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġfolder Commits Ġ= Ġmutable Map Of < String , ĠLine Changes >() ĊĊĠĠĠ Ġval Ġfolders Ġ= Ġfolder Ġ?: ĠlistOf ("") Ġ// default Ġto Ġroot ĊĊĠĠĠ Ġval Ġargs Ġ= Ġmutable ListOf (" git ", Ġ" log ", Ġ"-- num stat ", Ġ"-- author ", Ġauthor ) ĊĠĠĠ Ġif Ġ( since Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġargs . add ("-- since =\" $ since \" ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġargs . add ("-- no - mer ges ") ĊĠĠĠ Ġargs . add ("-- pretty =% n % ae ") ĊĊĠĠĠ Ġecho (" Finding Ġfolders Ġwith Ġ 1 % Ġor Ġgreater Ġcontributions Ġfor Ġ$ author ") ĊĊĠĠĠ ĠRuntime . get Runtime (). exec ( args . to Typed Array ()). inputStream . for Commits Ġ{ Ġ_, Ġchanged , Ġfile Ġ-> ĊĠĠĠĠĠ Ġval Ġfolder Ġ= Ġfolders . first OrNull Ġ{ Ġfile . startsWith ( it ) Ġ} Ġ?: Ġreturn @ for Commits ĊĠĠĠĠĠ Ġval Ġnext Level Directory Ġ= Ġfile . substring After ( folder ). trim ('/', Ġ'{ ', Ġ'} '). substring Before ('/') ĊĊĠĠĠĠĠ Ġfolder Commits [ next Level Directory ] Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġfolder Commits . get OrDefault ( next Level Directory , ĠLine Changes ()) Ġ+ Ġchanged ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtotal Changes Ġ= Ġfolder Commits . values . map Ġ{ Ġit . total () Ġ}. sum () ĊĊĠĠĠ Ġfolder Commits ĊĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġ( folder , Ġchanges ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġpercentage In Folder Ġ= Ġchanges . total () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to BigDecimal () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigDecimal . valueOf ( 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. divide ( total Changes . to BigDecimal (), Ġ 2 , ĠRound ingMode . HALF _ UP ) ĊĊĠĠĠĠĠĠĠĠĠ Ġreturn @ map NotNull Ġif Ġ( percentage In Folder Ġ>= ĠBigDecimal . valueOf ( 1 )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTrip le ( folder , Ġpercentage In Folder , Ġchanges ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. sorted By Descending Ġ{ Ġit . second Ġ} ĊĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( folder , Ġpercentage , Ġline Changes ) Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġecho ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ author Ġwrites Ġ${ percentage . to Plain String ()} % Ġof Ġtheir Ġcode Ġin Ġ$ folder Ġ$ line Changes ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠ Ġif Ġ( author Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcontributions By Author ( author !! ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( folder Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcontributions By Folders ( folder !! ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġdata Ġclass ĠCont ribution ( ĊĠĠĠ Ġval Ġauthor : ĠString , ĊĠĠĠ Ġval Ġpercentage In Folder : ĠBigDecimal , ĊĠĠĠ Ġval Ġpercentage Of Folder : ĠBigDecimal , ĊĠĠĠ Ġval Ġline Changes : ĠLine Changes ĊĠ Ġ) ĊĊĠ Ġprivate Ġdata Ġclass ĠLine Changes ( ĊĠĠĠ Ġval Ġadditions : ĠLong Ġ= Ġ 0 L , ĊĠĠĠ Ġval Ġde letions : ĠLong Ġ= Ġ 0 L ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġfun Ġtotal () Ġ= Ġadditions Ġ+ Ġde letions ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( other : ĠLine Changes ) Ġ= ĠLine Changes ( ĊĠĠĠĠĠĠĠ Ġadditions Ġ= Ġadditions Ġ+ Ġother . add itions , ĊĠĠĠĠĠĠĠ Ġde letions Ġ= Ġde letions Ġ+ Ġother . de letions ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġval Ġpercentage Ġ= Ġde letions . to BigDecimal () ĊĠĠĠĠĠĠĠĠĠ Ġ. multiply ( BigDecimal . valueOf ( 1 0 0 )) ĊĠĠĠĠĠĠĠĠĠ Ġ. divide (( add itions Ġ+ Ġde letions ). to BigDecimal (), Ġ 2 , ĠRound ingMode . HALF _ UP ) ĊĠĠĠĠĠ Ġreturn Ġ" (${ percentage . to Plain String ()} % Ġde letions )" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġspaces Ġ= ĠRegex ("\\ s +") ĊĠ Ġ} Ċ } ĊĊ