// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 Ġ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 . history Ċ Ċ import Ġcom . intellij . openapi . components . Persistent State Component Ċ import Ġcom . intellij . openapi . components . State Ċ import Ġcom . intellij . openapi . components . Storage Ċ import Ġcom . intellij . openapi . components . service Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . vcs . FilePath Ċ import Ġcom . intellij . openapi . vfs . Local FileSystem Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . util . xml b . annotations . Attribute Ċ import Ġcom . intellij . util . xml b . annotations . Tag Ċ import Ġcom . intellij . util . xml b . annotations . X Collection Ċ import Ġcom . intellij . vcs . log . Commit Id Ċ import Ġcom . intellij . vcs . log . impl . Hash Impl Ċ import Ġcom . intellij . vcs . log . util . V cs Log Util Ċ import Ġcom . intellij . vcs Util . V cs File Util Ċ import Ġcom . intellij . vcs Util . V cs Util Ċ import Ġjava . util . concurrent . atomic . Atomic Reference Ċ Ċ @ State ( name Ġ= Ġ" V cs Directory Rename s ", Ġstorage s Ġ= Ġ[ Storage ( value Ġ= Ġ" vcs . xml ") ]) Ċ internal Ġclass ĠV cs Directory Rename s Provider Ġ: ĠPersistent State Component < Array < Rename Record >> Ġ{ ĊĠ Ġprivate Ġval Ġre names : ĠAtomic Reference < Map < Edge Data < Commit Id >, ĠEdge Data < FilePath >>> Ġ= ĠAtomic Reference ( empty Map ()) ĊĊĠ Ġval Ġre names Map : ĠMap < Edge Data < Commit Id >, ĠEdge Data < FilePath >> ĊĠĠĠ Ġget () Ġ= Ġre names . get () ĊĊĠ Ġoverride Ġfun ĠgetState (): ĠArray < Rename Record >? Ġ{ ĊĠĠĠ Ġreturn Ġre names . get (). entries . groupBy ({ Ġit . value Ġ}) Ġ{ Ġit . key Ġ}. map Ġ{ Ġentry Ġ-> ĊĠĠĠĠĠ Ġval Ġpaths Ġ= Ġentry . key ĊĠĠĠĠĠ Ġval Ġcommits Ġ= Ġentry . value ĊĠĠĠĠĠ Ġval Ġroot Ġ= Ġcommits . first (). parent . root ĊĠĠĠĠĠ ĠRename Record ( root . path , ĠV cs File Util . relative Path ( root , Ġpaths . parent ), ĠV cs File Util . relative Path ( root , Ġpaths . child ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcommits . map Ġ{ ĠHas hes ( it ) Ġ}. to Typed Array ()) ĊĠĠĠ Ġ}. to Typed Array () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġload State ( state : ĠArray < Rename Record >) Ġ{ ĊĠĠĠ Ġre names . set ( state . flatMap Ġ{ Ġrecord Ġ-> Ġrecord . get Commits And Paths () Ġ}. toMap ( linked Map Of ())) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetInstance ( project : ĠProject ): ĠV cs Directory Rename s Provider Ġ= Ġproject . service () ĊĠ Ġ} Ċ } Ċ Ċ @ Tag (" hashes ") Ċ internal Ġdata Ġclass ĠHas hes (@ Attribute (" parent Hash ") Ġval Ġparent Hash : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Attribute (" child Hash ") Ġval Ġchild Hash : ĠString ) Ġ{ ĊĠ Ġinternal Ġconstructor () Ġ: Ġthis ("", Ġ"") ĊĊĠ Ġinternal Ġconstructor ( edge Data : ĠEdge Data < Commit Id >) Ġ: Ġthis ( edge Data . parent . hash . asString (), Ġedge Data . child . hash . asString ()) ĊĊĠ Ġfun Ġget Commit Ids ( root File : ĠVirtual File ): ĠEdge Data < Commit Id >? Ġ{ ĊĠĠĠ Ġif Ġ(! V cs Log Util . HASH _ REGEX . matcher ( parent Hash ). matches () Ġ|| Ġ! V cs Log Util . HASH _ REGEX . matcher ( child Hash ). matches ()) Ġreturn Ġnull ĊĠĠĠ Ġreturn ĠEdge Data ( Commit Id ( Hash Impl . build ( parent Hash ), Ġroot File ), ĠCommit Id ( Hash Impl . build ( child Hash ), Ġroot File )) ĊĠ Ġ} Ċ } Ċ Ċ @ Tag (" rename ") Ċ internal Ġclass ĠRename Record (@ Attribute (" root ") Ġval Ġroot : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Attribute (" parent Path ") Ġval Ġparent Path : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Attribute (" child Path ") Ġval Ġchild Path : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ X Collection ( property ElementName Ġ= Ġ" hashes List ") Ġval Ġhashes : ĠArray < Hashes >) Ġ{ ĊĠ Ġinternal Ġconstructor () Ġ: Ġthis ("", Ġ"", Ġ"", Ġempty Array ()) ĊĊĠ Ġprivate Ġval Ġroot File Ġby Ġlazy Ġ{ ĠLocal FileSystem . getInstance (). find File By Path ( root ) Ġ} ĊĊĠ Ġprivate Ġfun Ġget Paths ( root : ĠVirtual File ) Ġ= ĊĠĠĠ ĠEdge Data ( V cs Util . get FilePath ( root , Ġparent Path , Ġtrue ), ĠV cs Util . get FilePath ( root , Ġchild Path , Ġtrue )) ĊĊĠ Ġprivate Ġfun Ġget Commits ( root : ĠVirtual File ) Ġ= Ġhashes . map NotNull Ġ{ Ġit . get Commit Ids ( root ) Ġ} ĊĊĠ Ġfun Ġget Commits And Paths (): ĠList < Pair < Edge Data < Commit Id >, ĠEdge Data < FilePath >>> Ġ{ ĊĠĠĠ Ġreturn Ġroot File ?. let Ġ{ Ġroot Ġ-> ĊĠĠĠĠĠ Ġval Ġpaths Ġ= Ġget Paths ( root ) ĊĠĠĠĠĠ Ġget Commits ( root ). map Ġ{ ĠPair ( it , Ġpaths ) Ġ} ĊĠĠĠ Ġ} Ġ?: Ġempty List () ĊĠ Ġ} Ċ }