diff --git a/gix-dir/src/walk/classify.rs b/gix-dir/src/walk/classify.rs index 361dffde192..9593a2bb579 100644 --- a/gix-dir/src/walk/classify.rs +++ b/gix-dir/src/walk/classify.rs @@ -372,7 +372,11 @@ fn resolve_file_type_with_index( None }; ( - kind.filter(|_| entry.flags.contains(gix_index::entry::Flags::UPTODATE)), + kind.filter(|_| { + entry + .flags + .intersects(gix_index::entry::Flags::UPTODATE | gix_index::entry::Flags::ASSUME_VALID) + }), kind, ) } @@ -380,7 +384,11 @@ fn resolve_file_type_with_index( fn icase_directory_to_kinds(dir: Option<&gix_index::Entry>) -> (Option, Option) { let index_kind = dir.map(|_| entry::Kind::Directory); let uptodate_kind = dir - .filter(|entry| entry.flags.contains(gix_index::entry::Flags::UPTODATE)) + .filter(|entry| { + entry + .flags + .intersects(gix_index::entry::Flags::UPTODATE | gix_index::entry::Flags::ASSUME_VALID) + }) .map(|_| entry::Kind::Directory); (uptodate_kind, index_kind) } diff --git a/gix/tests/fixtures/make_status_repos.sh b/gix/tests/fixtures/make_status_repos.sh index d006b453de4..594dfa07c13 100755 --- a/gix/tests/fixtures/make_status_repos.sh +++ b/gix/tests/fixtures/make_status_repos.sh @@ -41,3 +41,19 @@ git init untracked-added echo content >added git add added ) + +git init -q module +(cd module + touch this + git add this + git commit -q -m c1 +) + +git init -q submodule-assume-unchanged-symlink +(cd submodule-assume-unchanged-symlink + git submodule add ../module sub + git commit -q -m "add submodule" + git update-index --assume-unchanged sub + rm -Rf sub + ln -s ../module sub +) diff --git a/gix/tests/gix/status.rs b/gix/tests/gix/status.rs index eb7f69355ee..8374fc30a55 100644 --- a/gix/tests/gix/status.rs +++ b/gix/tests/gix/status.rs @@ -265,6 +265,15 @@ mod into_iter { Ok(()) } + #[test] + fn submodule_assume_unchanged_replaced_with_symlink_is_ignored() -> crate::Result { + let repo = repo("submodule-assume-unchanged-symlink")?; + let mut status = repo.status(gix::progress::Discard)?.into_iter(None)?; + let items: Vec<_> = status.by_ref().filter_map(Result::ok).collect(); + assert!(items.is_empty(), "assume-unchanged submodule should not show up in status"); + Ok(()) + } + #[test] fn error_during_tree_traversal_causes_failure() -> crate::Result { let repo = repo("untracked-only")?;