1+ use super :: { process_changes, Change , Offset , UnblamedHunk } ;
2+ use crate :: { BlameEntry , Outcome } ;
13use gix_diff:: blob:: intern:: TokenSource ;
24use gix_hash:: ObjectId ;
35use gix_object:: { bstr:: BStr , FindExt } ;
4- use std:: { ops:: Range , path:: PathBuf } ;
5-
6- use super :: { process_changes, Change , Offset , UnblamedHunk } ;
7- use crate :: { BlameEntry , Outcome } ;
6+ use std:: ops:: Range ;
87
98// TODO: do not instantiate anything, get everything passed as argument.
109/// Produce a list of consecutive [`BlameEntry`] instances to indicate in which commits the ranges of the file
@@ -57,22 +56,19 @@ pub fn file<E>(
5756 odb : impl gix_object:: Find + gix_object:: FindHeader ,
5857 traverse : impl IntoIterator < Item = Result < gix_traverse:: commit:: Info , E > > ,
5958 resource_cache : & mut gix_diff:: blob:: Platform ,
60- // TODO: remove
61- worktree_root : PathBuf ,
6259 file_path : & BStr ,
6360) -> Result < Outcome , E > {
64- // TODO: `worktree_root` should be removed - read everything from Commit.
65- // Worktree changes should be placed into a temporary commit.
6661 // TODO: remove this and deduplicate the respective code.
6762 use gix_object:: bstr:: ByteSlice ;
68- let absolute_path = worktree_root. join ( gix_path:: from_bstr ( file_path) ) ;
6963
7064 let mut traverse = traverse. into_iter ( ) . peekable ( ) ;
7165 let Some ( Ok ( suspect) ) = traverse. peek ( ) . map ( |res| res. as_ref ( ) . map ( |item| item. id ) ) else {
7266 todo ! ( "return actual error" ) ;
7367 } ;
7468
75- let original_file_blob = std:: fs:: read ( absolute_path) . unwrap ( ) ;
69+ let ( mut buf, mut buf2) = ( Vec :: new ( ) , Vec :: new ( ) ) ;
70+ let original_file_entry = find_blob_in_commit ( & odb, & suspect, file_path, & mut buf, & mut buf2) . unwrap ( ) ;
71+ let original_file_blob = odb. find_blob ( & original_file_entry. oid , & mut buf) . unwrap ( ) . data . to_vec ( ) ;
7672 let num_lines_in_original = {
7773 let mut interner = gix_diff:: blob:: intern:: Interner :: new ( original_file_blob. len ( ) / 100 ) ;
7874 tokens_for_diffing ( & original_file_blob)
@@ -88,7 +84,6 @@ pub fn file<E>(
8884 ) ] ;
8985
9086 let mut out = Vec :: new ( ) ;
91- let mut buf = Vec :: with_capacity ( 512 ) ;
9287 ' outer: for item in traverse {
9388 let item = item?;
9489 let suspect = item. id ;
@@ -124,9 +119,8 @@ pub fn file<E>(
124119 if parent_ids. len ( ) == 1 {
125120 let parent_id: ObjectId = * parent_ids. last ( ) . unwrap ( ) ;
126121
127- let mut buffer = Vec :: new ( ) ;
128- let parent_commit_id = odb. find_commit ( & parent_id, & mut buffer) . unwrap ( ) . tree ( ) ;
129- let parent_tree_iter = odb. find_tree_iter ( & parent_commit_id, & mut buffer) . unwrap ( ) ;
122+ let parent_commit_id = odb. find_commit ( & parent_id, & mut buf) . unwrap ( ) . tree ( ) ;
123+ let parent_tree_iter = odb. find_tree_iter ( & parent_commit_id, & mut buf) . unwrap ( ) ;
130124
131125 let mut entry_buffer = Vec :: new ( ) ;
132126 if let Some ( parent_entry) = parent_tree_iter
@@ -175,9 +169,8 @@ pub fn file<E>(
175169 }
176170 }
177171 } else {
178- let mut buffer = Vec :: new ( ) ;
179- let commit_id = odb. find_commit ( & suspect, & mut buffer) . unwrap ( ) . tree ( ) ;
180- let tree_iter = odb. find_tree_iter ( & commit_id, & mut buffer) . unwrap ( ) ;
172+ let commit_id = odb. find_commit ( & suspect, & mut buf) . unwrap ( ) . tree ( ) ;
173+ let tree_iter = odb. find_tree_iter ( & commit_id, & mut buf) . unwrap ( ) ;
181174
182175 let mut entry_buffer = Vec :: new ( ) ;
183176 let entry = tree_iter
@@ -435,6 +428,21 @@ fn blob_changes(
435428 gix_diff:: blob:: diff ( gix_diff:: blob:: Algorithm :: Histogram , & input, change_recorder)
436429}
437430
431+ fn find_blob_in_commit (
432+ odb : & impl gix_object:: Find ,
433+ commit : & gix_hash:: oid ,
434+ file_path : & BStr ,
435+ buf : & mut Vec < u8 > ,
436+ buf2 : & mut Vec < u8 > ,
437+ ) -> Option < gix_object:: tree:: Entry > {
438+ let commit_id = odb. find_commit ( commit, buf) . unwrap ( ) . tree ( ) ;
439+ let tree_iter = odb. find_tree_iter ( & commit_id, buf) . unwrap ( ) ;
440+
441+ tree_iter
442+ . lookup_entry ( odb, buf2, file_path. split ( |b| * b == b'/' ) )
443+ . unwrap ( )
444+ }
445+
438446/// Return an iterator over tokens for use in diffing. These usually lines, but iit's important to unify them
439447/// so the later access shows the right thing.
440448pub ( crate ) fn tokens_for_diffing ( data : & [ u8 ] ) -> impl TokenSource < Token = & [ u8 ] > {
0 commit comments