package Ġcom . pas cal w el sch . git version er Ċ Ċ import Ġorg . gradle . api . Gradle Exception Ċ import Ġorg . gradle . api . Project Ċ import Ġjava . io . ByteArray OutputStream Ċ import Ġjava . io . File Ċ Ċ interface ĠGit Info Extractor Ġ{ ĊĠĠĠ Ġval Ġcurrent Sha 1 : ĠString ? ĊĠĠĠ Ġval Ġcurrent Branch : ĠString ? ĊĠĠĠ Ġval Ġlocal Changes : ĠLocal Changes ĊĠĠĠ Ġval Ġinitial Commit Date : ĠLong ĊĠĠĠ Ġval Ġcommits To Head : ĠList < String > ĊĠĠĠ Ġval Ġis Git Working : ĠBoolean ĊĠĠĠ Ġval Ġis History Sh allowed : ĠBoolean ĊĠĠĠ Ġfun Ġcommit Date ( rev : ĠString ): ĠLong ĊĠĠĠ Ġfun Ġcommits Up To ( rev : ĠString , Ġargs : ĠString Ġ= Ġ"") : ĠList < String > Ċ } Ċ Ċ /** Ċ Ġ* ĠExec utes Ġshell Ġcommands Ġto Ġget Ġinformation Ġfrom Ġgit Ċ Ġ*/ Ċ internal Ġclass ĠShell Git Info Extractor ( private Ġval Ġproject : ĠProject ) Ġ: ĠGit Info Extractor Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġcurrent Sha 1 : ĠString ? Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsha 1 Ġ= Ġ" git Ġrev - parse ĠHEAD ". execute (). throw OnError (). text . trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( sha 1 . isEmpty ()) Ġnull Ġelse Ġsha 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcurrent Branch : ĠString ? Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġresult Ġ= Ġ" git Ġsymbolic - ref Ġ-- short Ġ- q ĠHEAD ". execute ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProcess Result . Success Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbranch Ġ= Ġresult . text . trim () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( branch . isEmpty ()) Ġnull Ġelse Ġbranch ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠProcess Result . Error Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġlocal Changes : ĠLocal Changes Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġshort Stat Ġ= Ġ" git Ġdiff ĠHEAD Ġ-- short stat ". execute (). throw OnError (). text . trim () ĊĠĠĠĠĠĠĠ Ġif Ġ( short Stat . isEmpty ()) Ġreturn @ lazy ĠNO _ CHANG ES ĊĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġparse Short Stats ( short Stat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġinitial Commit Date : ĠLong Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinitial Commit : ĠString Ġ= Ġcommits To Head . last OrNull () Ġ?: Ġreturn @ lazy Ġ 0 L ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠlistOf (" git ", Ġ" log ", Ġ"- n Ġ 1 ", Ġ"-- pretty = format :' % at '", Ġinitial Commit ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. throw OnError (). text . replace ("\ '", Ġ""). trim () ĊĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġif Ġ( time . isEmpty ()) Ġ 0 L Ġelse Ġtime . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommit Date ( rev : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtime Ġ= ĠlistOf (" git ", Ġ" log ", Ġ"-- pretty = format :' % at '", Ġ"- n Ġ 1 ", Ġrev ). execute () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. throw OnError (). text . replace ("\ '", Ġ""). trim () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( time . isEmpty ()) Ġ 0 Ġelse Ġtime . to Long () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġcommits To Head : ĠList < String > Ġby Ġlazy Ġ{ Ġcommits Up To (" HEAD ") Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġis Git Working : ĠBoolean Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġ" git Ġstatus ". execute () ĊĠĠĠĠĠĠĠ Ġif Ġ( result Ġis ĠProcess Result . Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġexit Code Ġ= Ġresult . errorCode ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 6 9 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" git Ġreturned Ġwith Ġerror Ġ 6 9 \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" If Ġyou Ġare Ġa Ġmac Ġuser Ġthat Ġmessage Ġis Ġtelling Ġyou Ġis Ġthat Ġyou Ġneed Ġto Ġopen Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" application ĠX Code Ġon Ġyour ĠMac ĠOS ĠX / macOS Ġand Ġsince Ġit Ġhasn âĢĻ t Ġrun Ġsince Ġthe Ġlast Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" update , Ġyou Ġneed Ġto Ġaccept Ġthe Ġnew Ġlicense ĠE ULA Ġagreement Ġthat âĢĻ s Ġpart Ġof Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" updated ĠX Code .\ n \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" tl ; dr Ġrun \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ tx code - select Ġ-- install " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ lazy Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" ERROR : Ġcan 't Ġgenerate Ġa Ġgit Ġversion , Ġthis Ġis Ġnot Ġa Ġgit Ġproject . Ġgit Ġstatus Ġerrors Ġwith Ġerror Ġcode : Ġ$ exit Code ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Ġ-> ĠNot Ġa Ġgit Ġrepository Ġ( or Ġany Ġof Ġthe Ġparent Ġdirectories ): Ġ. git ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ lazy Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġis History Sh allowed : ĠBoolean Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġreturns Ġroot Ġdir Ġof Ġgit ĊĠĠĠĠĠĠĠ Ġval Ġroot Path Ġ= Ġ" git Ġrev - parse Ġ-- show - toplevel ". execute (). throw OnError (). text . trim () ĊĠĠĠĠĠĠĠ Ġval Ġshallow File Ġ= ĠFile ("$ rootPath /. git / sh allow ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sh allow File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" WARNING : ĠGit Ġhistory Ġis Ġincomplete \ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġgradle Ġgit Ġversion Ġplugin Ġrequires Ġthe Ġcomplete Ġgit Ġhistory Ġto Ġcalculate Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" the Ġversion . ĠThe Ġhistory Ġis Ġsh allowed , Ġtherefore Ġthe Ġversion Ġcode Ġwould Ġbe Ġincorrect .\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Please Ġfetch Ġthe Ġcomplete Ġhistory Ġwith :\ n " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"\ t git Ġfetch Ġ-- un sh allow " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ lazy Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ lazy Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcommits Up To ( rev : ĠString , Ġargs : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtext Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" git Ġrev - list Ġ$ rev Ġ$ args ". execute (). throw OnError (). text ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" git Ġrev - list Ġorigin /$ rev Ġ$ args ". execute (). throw OnError (). text ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtext . lines (). as Sequence (). map Ġ{ Ġit . trim () Ġ}. filter Ġ{ Ġit . isNotBlank () Ġ}. toList () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠString . execute (): ĠProcess Result Ġ= Ġtrim (). split (" Ġ"). execute () ĊĊĠĠĠ Ġprivate Ġfun ĠList < String >. execute (): ĠProcess Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġout Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġerr Ġ= ĠByteArrayOutputStream () ĊĠĠĠĠĠĠĠ Ġval Ġtask Ġ= Ġproject . exec Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . command Line Ġ= Ġthis @ execute ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . standard Output Ġ= Ġout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . error Output Ġ= Ġerr ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . working Dir Ġ= Ġproject . project Dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . is Ignore Exit Value Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġexit Code Ġ= Ġtask . exit Value ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( exit Code Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Result . Success ( out . toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProcess Result . Error ( err . toString (), Ġexit Code , Ġthis . join ToString (" Ġ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠProcess Result Ġ{ ĊĠĠĠĠĠĠĠ Ġclass ĠSuccess ( val Ġtext : ĠString ) Ġ: ĠProcess Result () ĊĠĠĠĠĠĠĠ Ġclass ĠError ( val Ġtext : ĠString , Ġval ĠerrorCode : ĠInt , Ġval Ġcommand : ĠString ) Ġ: ĠProcess Result () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfun ĠerrorMessage (): ĠString Ġ= Ġ" Error Ġ$ errorCode Ġexecuting Ġ`$ command `\ n \ n ${ text . take ( 1 0 0 )}" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġthrow OnError (): ĠSuccess Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSuccess Ġ-> Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠError Ġ-> Ġthrow ĠGradle Exception ( this . errorMessage ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġparses Ġ` git Ġdiff Ġ-- short stat ` Ċ Ġ* Ċ Ġ* Ġhttps :// github . com / git / git / blob / 6 9 e 6 b 9 b 4 f 4 a 9 1 ce 9 0 f 2 c 3 8 ed 2 fa 8 9 6 8 6 f 8 aff 4 4 f / diff . c # L 1 5 6 1 Ċ Ġ*/ Ċ internal Ġfun Ġparse Short Stats ( short stat : ĠString ): ĠLocal Changes Ġ{ ĊĠĠĠ Ġval Ġparts Ġ= Ġshort stat . split (",") ĊĊĠĠĠ Ġvar Ġfiles Changes Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġadditions Ġ= Ġ 0 ĊĠĠĠ Ġvar Ġde letions Ġ= Ġ 0 ĊĊĠĠĠ Ġparts . map Ġ{ Ġit . trim () Ġ}. forEach Ġ{ Ġpart Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( part . contains (" changed ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches : ĠMatch Result ? Ġ= Ġ"( \\ d + ). * ". to Regex (). find ( part ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches Ġ!= Ġnull Ġ&& Ġmatches . groups . size Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Changes Ġ= Ġmatches . group Values [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( part . contains ("( +) ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches : ĠMatch Result ? Ġ= Ġ"( \\ d + ). * ". to Regex (). find ( part ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches Ġ!= Ġnull Ġ&& Ġmatches . groups . size Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditions Ġ= Ġmatches . group Values [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( part . contains (" (- ) ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatches : ĠMatch Result ? Ġ= Ġ"( \\ d + ). * ". to Regex (). find ( part ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( matches Ġ!= Ġnull Ġ&& Ġmatches . groups . size Ġ>= Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġde letions Ġ= Ġmatches . group Values [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠLocal Changes ( files Changes , Ġadditions , Ġde letions ) Ċ } Ċ