Skip to content

Commit 02878c9

Browse files
committed
feat: add Repository::head_tree_id_or_empty() for convenience.
1 parent 776f9be commit 02878c9

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

gix/src/repository/reference.rs

+16
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,22 @@ impl crate::Repository {
227227
Ok(self.head_commit()?.tree_id()?)
228228
}
229229

230+
/// Like [`Self::head_tree_id()`], but will return an empty tree hash if the repository HEAD is unborn.
231+
pub fn head_tree_id_or_empty(&self) -> Result<crate::Id<'_>, reference::head_tree_id::Error> {
232+
self.head_tree_id().or_else(|err| {
233+
if let reference::head_tree_id::Error::HeadCommit(reference::head_commit::Error::PeelToCommit(
234+
crate::head::peel::to_commit::Error::PeelToObject(crate::head::peel::to_object::Error::Unborn {
235+
..
236+
}),
237+
)) = err
238+
{
239+
Ok(self.empty_tree().id())
240+
} else {
241+
Err(err)
242+
}
243+
})
244+
}
245+
230246
/// Return the tree object the `HEAD^{tree}` reference currently points to after peeling it fully,
231247
/// following symbolic references and tags until a tree is found.
232248
///

gix/src/status/iter/mod.rs

+1-11
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,7 @@ where
4545

4646
let obtain_tree_id = || -> Result<Option<gix_hash::ObjectId>, crate::status::into_iter::Error> {
4747
Ok(match self.head_tree {
48-
Some(None) => match self.repo.head_tree_id() {
49-
Ok(id) => Some(id.into()),
50-
Err(crate::reference::head_tree_id::Error::HeadCommit(
51-
crate::reference::head_commit::Error::PeelToCommit(
52-
crate::head::peel::to_commit::Error::PeelToObject(
53-
crate::head::peel::to_object::Error::Unborn { .. },
54-
),
55-
),
56-
)) => Some(gix_hash::ObjectId::empty_tree(self.repo.object_hash())),
57-
Err(err) => return Err(err.into()),
58-
},
48+
Some(None) => Some(self.repo.head_tree_id_or_empty()?.into()),
5949
Some(Some(tree_id)) => Some(tree_id),
6050
None => None,
6151
})

gix/tests/gix/clone.rs

+1
Original file line numberDiff line numberDiff line change
@@ -667,6 +667,7 @@ mod blocking_io {
667667
assert!(!repo.index_path().is_file(), "newly initialized repos have no index");
668668
let head = repo.head()?;
669669
assert!(head.is_unborn());
670+
assert_eq!(repo.head_tree_id_or_empty()?, repo.empty_tree().id());
670671

671672
assert!(
672673
head.log_iter().all()?.is_none(),

gix/tests/gix/head.rs

+1
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ mod peel {
1212
let commit = repo.head_commit()?;
1313
assert_eq!(commit.id, expected_commit);
1414
assert_eq!(repo.head_tree_id()?, commit.tree_id()?);
15+
assert_eq!(repo.head_tree_id_or_empty()?, commit.tree_id()?);
1516
assert_eq!(repo.head()?.try_into_peeled_id()?.expect("born"), expected_commit);
1617
assert_eq!(repo.head()?.peel_to_object_in_place()?.id, expected_commit);
1718
assert_eq!(repo.head()?.try_peel_to_id_in_place()?.expect("born"), expected_commit);

0 commit comments

Comments
 (0)