Skip to content

Commit 9c5507a

Browse files
committed
remove duplication and unnecessary parameter
1 parent 766336f commit 9c5507a

File tree

3 files changed

+27
-38
lines changed

3 files changed

+27
-38
lines changed

gitoxide-core/src/repository/blame.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
use std::{ffi::OsStr, path::PathBuf};
2-
3-
use anyhow::anyhow;
41
use gix::bstr::BStr;
2+
use std::ffi::OsStr;
53

64
pub fn blame_file(mut repo: gix::Repository, file: &OsStr, out: impl std::io::Write) -> anyhow::Result<()> {
75
repo.object_cache_size_if_unset(repo.compute_object_cache_size_for_tree_diffs(&**repo.index_or_empty()?));
@@ -11,20 +9,9 @@ pub fn blame_file(mut repo: gix::Repository, file: &OsStr, out: impl std::io::Wr
119
gix::traverse::commit::topo::Builder::from_iters(&repo.objects, [suspect.id], None::<Vec<gix::ObjectId>>)
1210
.build()?;
1311
let mut resource_cache = repo.diff_resource_cache_for_tree_diff()?;
14-
15-
let work_dir: PathBuf = repo
16-
.work_dir()
17-
.ok_or_else(|| anyhow!("blame needs a workdir, but there is none"))?
18-
.into();
1912
let file_path: &BStr = gix::path::os_str_into_bstr(file)?;
2013

21-
let outcome = gix::blame::file(
22-
&repo.objects,
23-
traverse,
24-
&mut resource_cache,
25-
work_dir.clone(),
26-
file_path,
27-
)?;
14+
let outcome = gix::blame::file(&repo.objects, traverse, &mut resource_cache, file_path)?;
2815
write_blame_entries(out, outcome)?;
2916

3017
Ok(())

gix-blame/src/file/function.rs

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1+
use super::{process_changes, Change, Offset, UnblamedHunk};
2+
use crate::{BlameEntry, Outcome};
13
use gix_diff::blob::intern::TokenSource;
24
use gix_hash::ObjectId;
35
use 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.
440448
pub(crate) fn tokens_for_diffing(data: &[u8]) -> impl TokenSource<Token = &[u8]> {

gix-blame/tests/blame.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ mod baseline {
108108
}
109109

110110
struct Fixture {
111-
worktree_path: PathBuf,
112111
odb: gix_odb::Handle,
113112
resource_cache: gix_diff::blob::Platform,
114113
commits: Vec<Result<gix_traverse::commit::Info, gix_traverse::commit::topo::Error>>,
@@ -174,7 +173,6 @@ impl Fixture {
174173
);
175174
Ok(Fixture {
176175
odb,
177-
worktree_path,
178176
resource_cache,
179177
commits,
180178
})
@@ -186,7 +184,6 @@ macro_rules! mktest {
186184
#[test]
187185
fn $name() {
188186
let Fixture {
189-
worktree_path,
190187
odb,
191188
mut resource_cache,
192189
commits,
@@ -196,7 +193,6 @@ macro_rules! mktest {
196193
&odb,
197194
commits,
198195
&mut resource_cache,
199-
worktree_path,
200196
format!("{}.txt", $case).as_str().into(),
201197
)
202198
.unwrap()
@@ -247,7 +243,6 @@ mktest!(file_only_changed_in_branch, "file-only-changed-in-branch", 2);
247243
fn diff_disparity() {
248244
for case in ["empty-lines-myers", "empty-lines-histogram"] {
249245
let Fixture {
250-
worktree_path,
251246
odb,
252247
mut resource_cache,
253248
commits,
@@ -257,7 +252,6 @@ fn diff_disparity() {
257252
&odb,
258253
commits,
259254
&mut resource_cache,
260-
worktree_path,
261255
format!("{case}.txt").as_str().into(),
262256
)
263257
.unwrap()

0 commit comments

Comments
 (0)