From 693375e94dc0321f47ff0a860a86a8b5ff61a937 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:32:14 +0000 Subject: [PATCH 1/2] Initial plan From e556a5e1afa5cbdc5219f56d6b655b8fbda95e66 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 16 Feb 2026 03:37:23 +0000 Subject: [PATCH 2/2] fix: ignore assume-unchanged submodule path replaced by symlink in status Co-authored-by: Byron <63622+Byron@users.noreply.github.com> --- gix-dir/src/walk/classify.rs | 12 ++++++++++-- gix/tests/fixtures/make_status_repos.sh | 16 ++++++++++++++++ gix/tests/gix/status.rs | 9 +++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) 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")?;