diff --git a/gix/src/status/index_worktree.rs b/gix/src/status/index_worktree.rs index 0a5ba17f2d4..2a98ed53631 100644 --- a/gix/src/status/index_worktree.rs +++ b/gix/src/status/index_worktree.rs @@ -213,13 +213,21 @@ mod submodule_status { mode: Submodule, ) -> Result { let local_repo = repo.to_thread_local(); - let submodule_paths = match local_repo.submodules()? { - Some(sm) => { + let submodule_paths = match local_repo.submodules() { + Ok(Some(sm)) => { let mut v: Vec<_> = sm.filter_map(|sm| sm.path().ok().map(Cow::into_owned)).collect(); v.sort(); v } - None => Vec::new(), + Ok(None) => Vec::new(), + Err(crate::submodule::modules::Error::FindHeadCommit( + crate::reference::head_commit::Error::PeelToCommit( + crate::head::peel::to_commit::Error::PeelToObject( + crate::head::peel::to_object::Error::Unborn { .. }, + ), + ), + )) => Vec::new(), + Err(err) => return Err(err), }; Ok(Self { mode, diff --git a/gix/src/status/iter/mod.rs b/gix/src/status/iter/mod.rs index 5aef90a4db4..f4d58b2a7af 100644 --- a/gix/src/status/iter/mod.rs +++ b/gix/src/status/iter/mod.rs @@ -45,7 +45,17 @@ where let obtain_tree_id = || -> Result, crate::status::into_iter::Error> { Ok(match self.head_tree { - Some(None) => Some(self.repo.head_tree_id()?.into()), + Some(None) => match self.repo.head_tree_id() { + Ok(id) => Some(id.into()), + Err(crate::reference::head_tree_id::Error::HeadCommit( + crate::reference::head_commit::Error::PeelToCommit( + crate::head::peel::to_commit::Error::PeelToObject( + crate::head::peel::to_object::Error::Unborn { .. }, + ), + ), + )) => None, + Err(err) => return Err(err.into()), + }, Some(Some(tree_id)) => Some(tree_id), None => None, }) diff --git a/gix/tests/fixtures/generated-archives/make_status_repos.tar b/gix/tests/fixtures/generated-archives/make_status_repos.tar index 0fbbc9a60e7..e8789ea33c0 100644 Binary files a/gix/tests/fixtures/generated-archives/make_status_repos.tar and b/gix/tests/fixtures/generated-archives/make_status_repos.tar differ diff --git a/gix/tests/fixtures/make_status_repos.sh b/gix/tests/fixtures/make_status_repos.sh index cf8514bd496..e5828cde625 100755 --- a/gix/tests/fixtures/make_status_repos.sh +++ b/gix/tests/fixtures/make_status_repos.sh @@ -29,4 +29,9 @@ git init racy-git echo ho >file && git add file echo ha >file +) + +git init untracked-unborn +(cd untracked-unborn + touch untracked ) \ No newline at end of file diff --git a/gix/tests/gix/status.rs b/gix/tests/gix/status.rs index c0bb4f8e079..be32c667382 100644 --- a/gix/tests/gix/status.rs +++ b/gix/tests/gix/status.rs @@ -83,6 +83,36 @@ mod into_iter { Ok(()) } + #[test] + fn untracked_unborn() -> crate::Result { + let repo = repo("untracked-unborn")?; + let mut status = repo.status(gix::progress::Discard)?.into_iter(None)?; + let mut items: Vec<_> = status.by_ref().filter_map(Result::ok).collect(); + items.sort_by(|a, b| a.location().cmp(b.location())); + insta::assert_debug_snapshot!(items, @r#" + [ + IndexWorktree( + DirectoryContents { + entry: Entry { + rela_path: "untracked", + status: Untracked, + property: None, + disk_kind: Some( + File, + ), + index_kind: None, + pathspec_match: Some( + Always, + ), + }, + collapsed_directory_status: None, + }, + ), + ] + "#); + Ok(()) + } + #[test] fn error_during_tree_traversal_causes_failure() -> crate::Result { let repo = repo("untracked-only")?;