package Ġme . ms ou cy . gb at Ċ Ċ import Ġcom . xen om ach ina . arg parser . Arg Parser Ċ import Ġcom . xen om ach ina . arg parser . InvalidArgumentException Ċ import Ġcom . xen om ach ina . arg parser . default Ċ import Ġcom . xen om ach ina . arg parser . main Body Ċ import Ġjava . io . File Ċ import Ġjava . util . concurrent . Executors Ċ import Ġkotlin . math . pow Ċ import Ġkotlin . system . exit Process Ċ import Ġkotlin . text . Regex Ċ import Ġkotlin . text . Regex Option Ċ import Ġkotlin . text . startsWith Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow .* Ċ import Ġme . ms ou cy . gb at . models . Risk Model Ċ import Ġme . ms ou cy . gb at . models . Summary Model Ċ import Ġorg . jetbrains . ex posed . sql .* Ċ Ċ val ĠRE ALLY _ LONG _ TIME Ġ= Ġ 8 6 4 0 0 0 Ċ val ĠDEFAULT _ INTER EST ING _ RES Ġ= Ġmutable ListOf ( ĊĠĠĠ Ġ"\\ . java $", ĊĠĠĠ Ġ"\\ . cs $", ĊĠĠĠ Ġ"\\ . py $", ĊĠĠĠ Ġ"\\ . c $", ĊĠĠĠ Ġ"\\ . cpp $", ĊĠĠĠ Ġ"\\ . h $", ĊĠĠĠ Ġ"\\ . hpp $", ĊĠĠĠ Ġ"\\ . pl $", ĊĠĠĠ Ġ"\\ . perl $", ĊĠĠĠ Ġ"\\ . rb $", ĊĠĠĠ Ġ"\\ . sh $", ĊĠĠĠ Ġ"\\ . js $", ĊĠĠĠ Ġ"\\ . kt $" Ċ ) Ċ Ċ fun Ġvalidate Git ( exe : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġos Ġ= ĠSystem . getProperty (" os . name ") ĊĠĠĠ Ġvar Ġful lex e Ġ= Ġif Ġ( os . startsWith (" Windows ") Ġ&& Ġ! exe . endsWith (". exe ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġexe Ġ+ Ġ". exe " ĊĠĠĠ Ġ} Ġelse Ġexe ĊĠĠĠ Ġvar Ġfile Ġ= ĠFile ( ful lex e ) ĊĠĠĠ Ġif Ġ( file . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . absolute Path ĊĠĠĠ Ġ} ĊĠĠĠ Ġfor Ġ( path Ġin ĠSystem . getenv (" PATH "). split ("; ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( path , Ġful lex e ) ĊĠĠĠĠĠĠĠ Ġif Ġ( file . can Read ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile . absolute Path ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠInvalidArgumentException (" Provided Ġgit Ġexecutable Ġdoes Ġnot Ġexist ") Ċ } Ċ Ċ class ĠG bat Args ( parser : ĠArg Parser ) Ġ{ ĊĠĠĠ Ġ// ĠInput Ġoptions ĊĠĠĠ Ġval Ġinteresting Ġby Ġparser . adding ("-- interest ing ", Ġ"- I ", Ġhelp Ġ= Ġ" Regular Ġexpression Ġto Ġdetermine Ġwhich Ġfiles Ġshould Ġbe Ġincluded Ġin Ġcalculations .") ĊĠĠĠ Ġval Ġnot _ interest ing Ġby Ġparser . adding ("-- not - interest ing ", Ġ"- N ", Ġhelp Ġ= Ġ" Regular Ġexpression Ġto Ġdetermine Ġwhich Ġfiles Ġshould Ġnot Ġbe Ġincluded Ġin Ġcalculations .") ĊĠĠĠ Ġval Ġcase _ sensitive Ġby Ġparser . flag ging (" Use Ġcase Ġsensitive Ġregex ps Ġwhen Ġdetermining Ġinteresting Ġfiles Ġ( default Ġis Ġcase - ins ensitive )") ĊĠĠĠ Ġval Ġdepart ed Ġby Ġparser . st oring ("-- depart ed - file ", Ġ"- D ", Ġhelp Ġ= Ġ" File Ġlisting Ġdepart ed Ġde vs , Ġone Ġper Ġline ", Ġtransform Ġ= Ġ:: File ). default < File ? >( null ) ĊĠĠĠ Ġval Ġrisk _ file Ġby Ġparser . st oring ("-- bus - risk - file ", Ġhelp Ġ= Ġ" File Ġof Ġdev = float Ġlines Ġ( e . g . Ġej org ens en = 0 . 4 ) Ġwith Ġcustom Ġbus Ġris ks Ġfor Ġde vs ", Ġtransform Ġ= Ġ:: File ). default < File ? >( null ) ĊĠĠĠ Ġval Ġdefault _ bus _ risk Ġby Ġparser . st oring ("-- default - bus - risk ", Ġhelp Ġ= Ġ" Default Ġrisk Ġthat Ġa Ġdev Ġwill Ġbe Ġhit Ġby Ġa Ġbus Ġin Ġyour Ġanalysis Ġtime frame Ġ( defaults Ġto Ġ 0 . 1 ). ") Ġ{ Ġto Double () Ġ}. default ( 0 . 1 ) ĊĊĠĠĠ Ġ// ĠMulti processing Ġoptions ĊĠĠĠ Ġval Ġnum _ analyzer _ procs Ġby Ġparser . st oring ("-- num - analyzer - procs ", Ġhelp Ġ= Ġ" The Ġnumber Ġof Ġanalyzer Ġprocesses Ġto Ġrun Ġ( defaults Ġto Ġ 3 )") Ġ{ Ġto Int () Ġ}. default ( 3 ) ĊĊĠĠĠ Ġ// ĠT uning Ġoptions ĊĠĠĠ Ġval Ġrisk _ threshold Ġby Ġparser . st oring ("-- risk - threshold ", Ġhelp Ġ= Ġ" Threshold Ġpast Ġwhich Ġto Ġsummarize Ġrisk Ġ( defaults Ġto Ġdefault Ġbus Ġrisk Ġcub ed )") Ġ{ Ġto Double () Ġ}. default < Double ? >( null ) ĊĠĠĠ Ġval Ġcreation _ constant Ġby Ġparser . st oring ("-- knowledge - creation - constant ", Ġhelp Ġ= Ġ" How Ġmuch Ġknowledge Ġa Ġchanged Ġline Ġshould Ġcreate Ġif Ġa Ġnew Ġline Ġcreates Ġ 1 Ġ( defaults Ġto Ġ 0 . 1 )") Ġ{ Ġto Double () Ġ}. default ( 0 . 1 ) ĊĊĠĠĠ Ġ// ĠMisc Ġoptions ĊĠĠĠ Ġval Ġgit _ exe Ġby Ġparser . st oring ("-- git - exe ", Ġhelp Ġ= Ġ" Path Ġto Ġthe Ġgit Ġexecutable ", Ġtransform Ġ= Ġ:: validate Git ). default (" git "). add Validator Ġ{ Ġvalidate Git ( value ) Ġ} ĊĠĠĠ Ġval Ġverbose Ġby Ġparser . flag ging ("-- verbose ", Ġ"- v ", Ġhelp Ġ= Ġ" Print Ġcomfort ing Ġoutput ") ĊĠĠĠ Ġval Ġoutput Ġby Ġparser . st oring (" Output Ġdirectory Ġfor Ġdata Ġfiles Ġand Ġhtml Ġsummary Ġ( defaults Ġto Ġ\" output \" ), Ġerror Ġif Ġalready Ġexists "). default (" output ") ĊĊĠĠĠ Ġ// ĠDirectory ĊĠĠĠ Ġval Ġproject _ root Ġby Ġparser . positional (" The Ġroot Ġdirectory Ġto Ġinspect ") Ċ } Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ= Ġmain Body Ġ{ ĊĠĠĠ ĠArg Parser ( args ). parse Into (:: G bat Args ). run Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Dir Ġ= ĠFile ( output ) ĊĊĠĠĠĠĠĠĠ Ġout Dir . delete () ĊĠĠĠĠĠĠĠ Ġout Dir . mkdir s () ĊĠĠĠĠĠĠĠ ĠFile ( out Dir , Ġ". gitignore "). write Text ("* ") ĊĊĠĠĠĠĠĠĠ Ġfun Ġparse _ interest ing ( the List : ĠList < String >) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthe List . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( case _ sensitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRegex ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRegex ( it , ĠRegex Option . IGNORE _ CASE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrisk Th resh Ġ= Ġrisk _ threshold Ġ?: Ġdefault _ bus _ risk . pow ( 3 ) ĊĠĠĠĠĠĠĠ Ġval Ġinteresting _ res Ġ= Ġparse _ interest ing ( if Ġ( interest ing . isEmpty ()) ĠDEFAULT _ INTER EST ING _ RES Ġelse Ġinteresting ) ĊĠĠĠĠĠĠĠ Ġval Ġnot _ interest ing _ res Ġ= Ġif Ġ( not _ interest ing . isEmpty ()) ĠlistOf () Ġelse Ġparse _ interest ing ( not _ interest ing ) ĊĊĠĠĠĠĠĠĠ Ġval Ġproject Root File Ġ= ĠFile ( project _ root ). also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalidArgumentException (" Provided Ġproject Ġroot Ġdoes Ġnot Ġexist ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrepo Ġ= ĠGit Repo ( project Root File , Ġvalidate Git ( git _ exe )) ĊĊĠĠĠĠĠĠĠ Ġfun ĠString . is Inter esting (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhas Interest Ġ= Ġinteresting _ res . any Ġ{ Ġit . contains Match In ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( has Interest ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Interest Ġ= Ġ! not _ interest ing _ res . any Ġ{ Ġit . contains Match In ( this ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġhas Interest ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġf names Ġ= Ġrepo . ls (). split ("\ n "). filter Ġ{ Ġit . is Inter esting () Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( f names . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" No Ġinteresting Ġfiles Ġfound , Ġexiting .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexit Process ( 1 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( verbose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . err . println (" Found Ġ${ f names . size } Ġinteresting Ġfiles ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrisk Model Ġ= ĠR isk Model ( risk Th resh , Ġdefault _ bus _ risk , Ġrisk _ file , Ġdepart ed ) ĊĊĠĠĠĠĠĠĠ Ġval Ġdb F name Ġ= ĠFile ( out Dir , Ġ" summary . db ") ĊĠĠĠĠĠĠĠ Ġdb F name . delete () ĊĠĠĠĠĠĠĠ Ġval Ġsummary Db Ġ= ĠDatabase . connect (" jdbc : sqlite :${ db F name . absolute Path }", Ġdriver Ġ= Ġ" org . sqlite . JDBC ") ĊĠĠĠĠĠĠĠ Ġval Ġsummary Model Ġ= ĠSummary Model ( summary Db ) ĊĠĠĠĠĠĠĠ Ġval Ġanalysis Executor Ġ= ĠExec utors . new Fixed ThreadPool ( num _ analyzer _ procs ). as Coroutine Dispatcher () ĊĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġf names . map Ġ{ Ġfname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġasync ( analysis Executor ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( verbose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Analy zing Ġ$ fname ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhistory Ġ= Ġparse History ( repo , Ġproject Root File , ĠFile ( project Root File , Ġfname )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze ( risk Model , Ġcreation _ constant , Ġhistory , Ġverbose ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. await All (). forEach Ġ{ Ġanalysis Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( verbose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Sum mar izing Ġ${ analysis . fileName }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsummary Model . sum mar ize ( analysis ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( verbose ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Rendering Ġoutput ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrender Summary ( project Root File , Ġsummary Model , Ġout Dir ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠRender Ġsummary ĊĠĠĠĠĠĠĠ ĠSystem . err . println (" Done , Ġsummary Ġis Ġin Ġ$ out Dir / index . html ") ĊĠĠĠ Ġ} Ċ } Ċ