Skip to content

Commit 8ab0a6b

Browse files
authored
Merge pull request #1824 from cruessler/replace-find-commit-by-find
Replace `odb.find_commit` by `gix_traverse::commit::find`
2 parents aa05ef0 + e09ec3e commit 8ab0a6b

File tree

2 files changed

+43
-16
lines changed

2 files changed

+43
-16
lines changed

gix-blame/src/file/function.rs

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,16 @@ pub fn file(
7373

7474
let mut stats = Statistics::default();
7575
let (mut buf, mut buf2, mut buf3) = (Vec::new(), Vec::new(), Vec::new());
76-
let blamed_file_entry_id = find_path_entry_in_commit(&odb, &suspect, file_path, &mut buf, &mut buf2, &mut stats)?
77-
.ok_or_else(|| Error::FileMissing {
76+
let blamed_file_entry_id = find_path_entry_in_commit(
77+
&odb,
78+
&suspect,
79+
file_path,
80+
cache.as_ref(),
81+
&mut buf,
82+
&mut buf2,
83+
&mut stats,
84+
)?
85+
.ok_or_else(|| Error::FileMissing {
7886
file_path: file_path.to_owned(),
7987
commit_id: suspect,
8088
})?;
@@ -135,7 +143,15 @@ pub fn file(
135143
.filter(|(id, _)| *id == suspect)
136144
.map(|(_, entry)| entry);
137145
if entry.is_none() {
138-
entry = find_path_entry_in_commit(&odb, &suspect, file_path, &mut buf, &mut buf2, &mut stats)?;
146+
entry = find_path_entry_in_commit(
147+
&odb,
148+
&suspect,
149+
file_path,
150+
cache.as_ref(),
151+
&mut buf,
152+
&mut buf2,
153+
&mut stats,
154+
)?;
139155
}
140156

141157
let Some(entry_id) = entry else {
@@ -177,9 +193,15 @@ pub fn file(
177193
}
178194

179195
for (pid, (parent_id, parent_commit_time)) in parent_ids.iter().enumerate() {
180-
if let Some(parent_entry_id) =
181-
find_path_entry_in_commit(&odb, parent_id, file_path, &mut buf, &mut buf2, &mut stats)?
182-
{
196+
if let Some(parent_entry_id) = find_path_entry_in_commit(
197+
&odb,
198+
parent_id,
199+
file_path,
200+
cache.as_ref(),
201+
&mut buf,
202+
&mut buf2,
203+
&mut stats,
204+
)? {
183205
let no_change_in_entry = entry_id == parent_entry_id;
184206
if pid == 0 {
185207
previous_entry = Some((*parent_id, parent_entry_id));
@@ -200,6 +222,7 @@ pub fn file(
200222
file_path,
201223
suspect,
202224
parent_id,
225+
cache.as_ref(),
203226
&mut stats,
204227
&mut diff_state,
205228
&mut buf,
@@ -401,20 +424,19 @@ fn tree_diff_at_file_path(
401424
file_path: &BStr,
402425
id: ObjectId,
403426
parent_id: ObjectId,
427+
cache: Option<&gix_commitgraph::Graph>,
404428
stats: &mut Statistics,
405429
state: &mut gix_diff::tree::State,
406430
commit_buf: &mut Vec<u8>,
407431
lhs_tree_buf: &mut Vec<u8>,
408432
rhs_tree_buf: &mut Vec<u8>,
409433
) -> Result<Option<gix_diff::tree::recorder::Change>, Error> {
410-
let parent_tree = odb.find_commit(&parent_id, commit_buf)?.tree();
411-
stats.commits_to_tree += 1;
434+
let parent_tree_id = tree_id(find_commit(cache, &odb, &parent_id, commit_buf)?)?;
412435

413-
let parent_tree_iter = odb.find_tree_iter(&parent_tree, lhs_tree_buf)?;
436+
let parent_tree_iter = odb.find_tree_iter(&parent_tree_id, lhs_tree_buf)?;
414437
stats.trees_decoded += 1;
415438

416-
let tree_id = odb.find_commit(&id, commit_buf)?.tree();
417-
stats.commits_to_tree += 1;
439+
let tree_id = tree_id(find_commit(cache, &odb, &id, commit_buf)?)?;
418440

419441
let tree_iter = odb.find_tree_iter(&tree_id, rhs_tree_buf)?;
420442
stats.trees_decoded += 1;
@@ -605,13 +627,13 @@ fn find_path_entry_in_commit(
605627
odb: &impl gix_object::Find,
606628
commit: &gix_hash::oid,
607629
file_path: &BStr,
630+
cache: Option<&gix_commitgraph::Graph>,
608631
buf: &mut Vec<u8>,
609632
buf2: &mut Vec<u8>,
610633
stats: &mut Statistics,
611634
) -> Result<Option<ObjectId>, Error> {
612-
let commit_id = odb.find_commit(commit, buf)?.tree();
613-
stats.commits_to_tree += 1;
614-
let tree_iter = odb.find_tree_iter(&commit_id, buf)?;
635+
let tree_id = tree_id(find_commit(cache, odb, commit, buf)?)?;
636+
let tree_iter = odb.find_tree_iter(&tree_id, buf)?;
615637
stats.trees_decoded += 1;
616638

617639
let res = tree_iter.lookup_entry(
@@ -666,6 +688,13 @@ fn collect_parents(
666688
Ok(parent_ids)
667689
}
668690

691+
fn tree_id(commit: gix_traverse::commit::Either<'_, '_>) -> Result<ObjectId, Error> {
692+
match commit {
693+
gix_traverse::commit::Either::CommitRefIter(mut commit_ref_iter) => Ok(commit_ref_iter.tree_id()?),
694+
gix_traverse::commit::Either::CachedCommit(commit) => Ok(commit.root_tree_id().into()),
695+
}
696+
}
697+
669698
/// Return an iterator over tokens for use in diffing. These are usually lines, but it's important
670699
/// to unify them so the later access shows the right thing.
671700
pub(crate) fn tokens_for_diffing(data: &[u8]) -> impl TokenSource<Token = &[u8]> {

gix-blame/src/types.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ pub struct Outcome {
2424
pub struct Statistics {
2525
/// The amount of commits it traversed until the blame was complete.
2626
pub commits_traversed: usize,
27-
/// The amount of commits whose trees were extracted.
28-
pub commits_to_tree: usize,
2927
/// The amount of trees that were decoded to find the entry of the file to blame.
3028
pub trees_decoded: usize,
3129
/// The amount of tree-diffs to see if the filepath was added, deleted or modified. These diffs

0 commit comments

Comments
 (0)