// ĠCopyright Ġ 2 0 0 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . intellij . vcs . log . visible . filters Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . openapi . vcs . FilePath Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . util . containers . Open TH ash Set Ċ import Ġcom . intellij . vcs . log .* Ċ import Ġcom . intellij . vcs . log . V cs Log Filter Collection . Filter Key Ċ import Ġcom . intellij . vcs . log . V cs Log Filter Collection . HASH _ FILTER Ċ import Ġcom . intellij . vcs . log . V cs Log Range Filter . Ref Range Ċ import Ġcom . intellij . vcs . log . data . V cs Log Data Ċ import Ġcom . intellij . vcs . log . data . V cs Log Structure Filter Impl Ċ import Ġcom . intellij . vcs . log . ui . filter . V cs Log Text Filter Impl Ċ import Ġcom . intellij . vcs . log . util . V cs Log Util Ċ import Ġcom . intellij . vcs . log . util . V cs User Util Ċ import Ġcom . intellij . vcs Util . V cs Util Ċ import Ġg nu . tro ve . T Object Hash ing Strategy Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ import Ġjava . util . regex . Pattern Syntax Exception Ċ Ċ private Ġval ĠLOG Ġ= ĠLogger . getInstance ("# com . intellij . vcs . log . visible . filters . V cs Log Filters ") Ċ Ċ object ĠV cs Log Filter Object Ġ{ ĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Pattern ( text : ĠString , Ġis Regexp Allowed : ĠBoolean Ġ= Ġfalse , Ġis Match Case : ĠBoolean Ġ= Ġfalse ): ĠV cs Log Text Filter Ġ{ ĊĠĠĠ Ġif Ġ( is Regexp Allowed Ġ&& ĠV cs Log Util . maybe Regexp ( text )) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠV cs Log Regex Text Filter ( Pattern . compile ( text , Ġif Ġ( is Match Case ) Ġ 0 Ġelse ĠPattern . CASE _ INS ENS ITIVE )) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġcatch Ġ( ignored : ĠPattern Syntax Exception ) Ġ{ ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠV cs Log Text Filter Impl ( text , Ġis Match Case ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Patterns List ( patterns : ĠList < String >, Ġis Match Case : ĠBoolean Ġ= Ġfalse ): ĠV cs Log Text Filter Ġ{ ĊĠĠĠ Ġif Ġ( patterns . isEmpty ()) Ġreturn Ġfrom Pattern ("", Ġfalse , Ġis Match Case ) ĊĠĠĠ Ġif Ġ( patterns . size Ġ== Ġ 1 ) Ġreturn Ġfrom Pattern ( patterns . single (), Ġfalse , Ġis Match Case ) ĊĠĠĠ Ġreturn ĠV cs Log Multiple Patterns Text Filter ( patterns , Ġis Match Case ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Branch ( branch Name : ĠString ): ĠV cs Log Branch Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Branch Filter Impl ( listOf ( branch Name ), Ġempty List (), Ġempty List (), Ġempty List ()) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Range ( exclusive Ref : ĠString , Ġinclusive Ref : ĠString ): ĠV cs Log Range Filter Ġ{ ĊĠĠĠ Ġreturn Ġfrom Range ( listOf ( Ref Range ( exclusive Ref , Ġinclusive Ref ))) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Range ( ranges : ĠList < Ref Range >): ĠV cs Log Range Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Range Filter Impl ( ranges ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Branch Patterns ( strings : ĠCollection < String >, Ġexisting Branches : ĠSet < String >): ĠV cs Log Branch Filter Ġ{ ĊĠĠĠ Ġval Ġbranch Names Ġ= ĠArrayList < String >() ĊĠĠĠ Ġval Ġexcluded Branches Ġ= ĠArrayList < String >() ĊĠĠĠ Ġval Ġpatterns Ġ= ĠArrayList < Pattern >() ĊĠĠĠ Ġval Ġexcluded Patterns Ġ= ĠArrayList < Pattern >() ĊĊĠĠĠ Ġfor Ġ( s Ġin Ġstrings ) Ġ{ ĊĠĠĠĠĠ Ġval Ġis Excluded Ġ= Ġs . startsWith ("- ") ĊĠĠĠĠĠ Ġval Ġstring Ġ= Ġif Ġ( is Excluded ) Ġs . substring ( 1 ) Ġelse Ġs ĊĠĠĠĠĠ Ġval Ġis Regexp Ġ= Ġ( existing Branches . isNotEmpty () Ġ&& Ġ! existing Branches . contains ( string )) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( existing Branches . isEmpty () Ġ&& ĠV cs Log Util . maybe Regexp ( string )) ĊĊĠĠĠĠĠ Ġif Ġ( is Regexp ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= ĠPattern . compile ( string ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Excluded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexcluded Patterns . add ( pattern ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpatterns . add ( pattern ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcatch Ġ( e : ĠPattern Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLOG . warn (" Pattern Ġ$ string Ġis Ġnot Ġa Ġproper Ġregular Ġexpression Ġand Ġno Ġbranch Ġcan Ġbe Ġfound Ġwith Ġthat Ġname .", Ġe ) ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Excluded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexcluded Branches . add ( string ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbranch Names . add ( string ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Excluded ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġexcluded Branches . add ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbranch Names . add ( string ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn ĠV cs Log Branch Filter Impl ( branch Names , Ġpatterns , Ġexcluded Branches , Ġexcluded Patterns ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Commit ( commit : ĠCommit Id ): ĠV cs Log Revision Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Revision Filter Impl ( listOf ( commit )) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Commits ( commits : ĠList < Commit Id >): ĠV cs Log Revision Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Revision Filter Impl ( commits ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Hash ( text : ĠString ): ĠV cs Log Hash Filter ? Ġ{ ĊĠĠĠ Ġval Ġhashes Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġfor Ġ( word Ġin ĠString Util . split ( text , Ġ" Ġ")) Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! V cs Log Util . HASH _ REGEX . matcher ( word ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġhashes . add ( word ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( hashes . isEmpty ()) Ġreturn Ġnull ĊĊĠĠĠ Ġreturn Ġfrom Hashes ( hashes ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Hashes ( hashes : ĠCollection < String >): ĠV cs Log Hash Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Hash Filter Impl ( hashes ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Dates ( after : ĠDate ?, Ġbefore : ĠDate ?): ĠV cs Log Date Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Date Filter Impl ( after , Ġbefore ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Dates ( after : ĠLong , Ġbefore : ĠLong ): ĠV cs Log Date Filter Ġ{ ĊĠĠĠ Ġreturn Ġfrom Dates ( if Ġ( after Ġ> Ġ 0 ) ĠDate ( after ) Ġelse Ġnull , Ġif Ġ( before Ġ> Ġ 0 ) ĠDate ( before ) Ġelse Ġnull ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom User Names ( user Names : ĠCollection < String >, Ġv cs Log Data : ĠV cs Log Data ): ĠV cs Log User Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log User Filter Impl ( user Names , Ġv cs Log Data . currentUser , Ġv cs Log Data . all Users ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom User ( user : ĠV cs User , Ġall Users : ĠSet < V cs User > Ġ= Ġset Of ( user )): ĠV cs Log User Filter Ġ{ ĊĠĠĠ Ġreturn Ġfrom User Names ( listOf ( V cs User Util . get Short Presentation ( user )), Ġempty Map (), Ġall Users ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom User Names ( user Names : ĠCollection < String >, Ġme Data : ĠMap < Virtual File , ĠV cs User >, Ġall Users : ĠSet < V cs User >): ĠV cs Log User Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log User Filter Impl ( user Names , Ġme Data , Ġall Users ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Paths ( files : ĠCollection < FilePath >): ĠV cs Log Structure Filter Ġ{ ĊĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠ Ġreturn ĠV cs Log Structure Filter Impl ( files ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Virtual Files ( files : ĠCollection < Virtual File >): ĠV cs Log Structure Filter Ġ{ ĊĠĠĠ Ġreturn Ġfrom Paths ( files . map Ġ{ Ġfile Ġ-> ĠV cs Util . get FilePath ( file ) Ġ}) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Root ( root : ĠVirtual File ): ĠV cs Log Root Filter Ġ{ ĊĠĠĠ Ġreturn Ġfrom Roots ( listOf ( root )) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġfrom Roots ( roots : ĠCollection < Virtual File >): ĠV cs Log Root Filter Ġ{ ĊĠĠĠ Ġreturn ĠV cs Log Root Filter Impl ( roots ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Static ĊĠ Ġfun Ġcollection ( var arg Ġfilters : ĠV cs Log Filter ?): ĠV cs Log Filter Collection Ġ{ ĊĠĠĠ Ġval Ġfilter Set Ġ= Ġcreate Filter Set () ĊĠĠĠ Ġfor Ġ( f Ġin Ġfilters ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( f Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( filter Set . replace ( f )) ĠLOG . warn (" Two Ġfilters Ġwith Ġthe Ġsame Ġkey Ġ${ f . key } Ġin Ġfilter Ġcollection . ĠKeep ing Ġonly Ġ${ f }. ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠV cs Log Filter Collection Impl ( filter Set ) ĊĠ Ġ} ĊĊĠ Ġ@ Jvm Field ĊĠ Ġval ĠEMPTY _ COLLECTION Ġ= Ġcollection () Ċ } Ċ Ċ fun ĠV cs Log Filter Collection . with ( filter : ĠV cs Log Filter ?): ĠV cs Log Filter Collection Ġ{ ĊĠ Ġif Ġ( filter Ġ== Ġnull ) Ġreturn Ġthis ĊĊĠ Ġval Ġfilter Set Ġ= Ġcreate Filter Set () ĊĠ Ġfilter Set . addAll ( this . filters ) ĊĠ Ġfilter Set . replace ( filter ) ĊĠ Ġreturn ĠV cs Log Filter Collection Impl ( filter Set ) Ċ } Ċ Ċ fun ĠV cs Log Filter Collection . without ( filter Key : ĠFilter Key < *> ): ĠV cs Log Filter Collection Ġ{ ĊĠ Ġval Ġfilter Set Ġ= Ġcreate Filter Set () ĊĠ Ġthis . filters . forEach Ġ{ Ġif Ġ( it . key Ġ!= Ġfilter Key ) Ġfilter Set . add ( it ) Ġ} ĊĠ Ġreturn ĠV cs Log Filter Collection Impl ( filter Set ) Ċ } Ċ Ċ fun ĠV cs Log Filter Collection . matches ( var arg Ġfilter Key : ĠFilter Key < *> ): ĠBoolean Ġ{ ĊĠ Ġreturn Ġthis . filters . map To ( mutable Set Of ()) Ġ{ Ġit . key Ġ} Ġ== Ġfilter Key . toSet () Ċ } Ċ Ċ fun ĠV cs Log Filter Collection . get Presentation (): ĠString Ġ{ ĊĠ Ġif Ġ( get ( HASH _ FILTER ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġreturn Ġget ( HASH _ FILTER ) !!. presentation ĊĠ Ġ} ĊĠ Ġreturn Ġfilters . join ToString (" Ġ") Ġ{ Ġfilter Ġ-> ĊĠĠĠ Ġval Ġprefix Ġ= Ġif Ġ( filters . size Ġ!= Ġ 1 ) Ġfilter . get Prefix () Ġelse Ġ"" ĊĠĠĠ Ġprefix Ġ+ Ġfilter . presentation ĊĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠV cs Log Filter . get Prefix (): ĠString Ġ{ ĊĠ Ġwhen Ġ{ ĊĠĠĠ Ġthis Ġis ĠV cs Log Text Filter Ġ-> Ġreturn Ġ" containing Ġ" ĊĠĠĠ Ġthis Ġis ĠV cs Log User Filter Ġ-> Ġreturn Ġ" by Ġ" ĊĠĠĠ Ġthis Ġis ĠV cs Log Date Filter Ġ-> Ġreturn Ġ" made Ġ" ĊĠĠĠ Ġthis Ġis ĠV cs Log Branch Filter Ġ-> Ġreturn Ġ" on Ġ" ĊĠĠĠ Ġthis Ġis ĠV cs Log Root Filter Ġ-> Ġreturn Ġ" in Ġ" ĊĠĠĠ Ġthis Ġis ĠV cs Log Structure Filter Ġ-> Ġreturn Ġ" for Ġ" ĊĠ Ġ} ĊĠ Ġreturn Ġ"" Ċ } Ċ Ċ private Ġfun Ġcreate Filter Set () Ġ= ĠOpen TH ash Set < V cs Log Filter >( Filter ByKey Hash ing Strategy ()) Ċ Ċ private Ġfun Ġ< T > ĠOpen TH ash Set < T >. replace ( element : ĠT ): ĠBoolean Ġ{ ĊĠ Ġval Ġis Modified Ġ= Ġremove ( element ) ĊĠ Ġadd ( element ) ĊĠ Ġreturn Ġis Modified Ċ } Ċ Ċ internal Ġclass ĠFilter ByKey Hash ing Strategy Ġ: ĠTObject Hash ing Strategy < V cs Log Filter > Ġ{ ĊĠ Ġoverride Ġfun Ġcompute HashCode (` object `: ĠV cs Log Filter ): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġ` object `. key . hashCode () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġequals ( o 1 : ĠV cs Log Filter , Ġo 2 : ĠV cs Log Filter ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġo 1 . key Ġ== Ġo 2 . key ĊĠ Ġ} Ċ } Ċ