From d95c9d1eb5193e05aeefea98d03650467b8d6373 Mon Sep 17 00:00:00 2001 From: tison Date: Thu, 30 Apr 2026 23:05:26 +0800 Subject: [PATCH 1/2] fix: files can be forced added even if gitignored Signed-off-by: tison --- fmt/src/git.rs | 25 ++++++++++++++++++++----- fmt/src/selection.rs | 23 ++++++++++++++++++----- 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/fmt/src/git.rs b/fmt/src/git.rs index c4cfdda..012a63c 100644 --- a/fmt/src/git.rs +++ b/fmt/src/git.rs @@ -203,6 +203,7 @@ pub fn resolve_file_attrs( process_changes(changes, time, &author); // process dirty working tree + let index = repo.index_or_empty().or_raise(make_error)?; let status_platform = repo.status(gix::progress::Discard).or_raise(make_error)?; let status_iter = status_platform.into_iter(None).or_raise(make_error)?; let now = gix::date::Time::now_local_or_utc(); @@ -241,14 +242,28 @@ pub fn resolve_file_attrs( if file_type.is_dir() { if platform.is_excluded() { - log::debug!(path:?, rela_path:?; "skip git ignored directory"); - it.skip_current_dir(); - continue; + let rela = + gix::path::try_into_bstr(rela_path).or_raise(|| { + Error::new("cannot convert path to git path") + })?; + + if !index.path_is_directory(rela.as_ref()) { + log::debug!(path:?, rela_path:?; "skip git ignored directory"); + it.skip_current_dir(); + continue; + } } } else if file_type.is_file() { if platform.is_excluded() { - log::debug!(path:?, rela_path:?; "skip git ignored file"); - continue; + let rela = + gix::path::try_into_bstr(rela_path).or_raise(|| { + Error::new("cannot convert path to git path") + })?; + + if index.entry_by_path(rela.as_ref()).is_none() { + log::debug!(path:?, rela_path:?; "skip git ignored file"); + continue; + } } update_attrs(rela_path, now, current_username.as_str()); } diff --git a/fmt/src/selection.rs b/fmt/src/selection.rs index 613f922..c2d5ed0 100644 --- a/fmt/src/selection.rs +++ b/fmt/src/selection.rs @@ -208,6 +208,9 @@ fn select_files_with_git( let mut excludes = worktree .excludes(None) .or_raise(|| Error::new("cannot create gix exclude stack"))?; + let index = repo + .index_or_empty() + .or_raise(|| Error::new("cannot open gix index"))?; while let Some(entry) = it.next() { let entry = entry.or_raise(|| Error::new("cannot traverse directory"))?; @@ -232,9 +235,14 @@ fn select_files_with_git( if file_type.is_dir() { if platform.is_excluded() { - log::debug!(path:?, rela_path:?; "skip git ignored directory"); - it.skip_current_dir(); - continue; + let rela = gix::path::try_into_bstr(rela_path) + .or_raise(|| Error::new("cannot convert path to git path"))?; + + if !index.path_is_directory(rela.as_ref()) { + log::debug!(path:?, rela_path:?; "skip git ignored directory"); + it.skip_current_dir(); + continue; + } } if matcher.matched(rela_path, file_type.is_dir()).is_ignore() { log::debug!(path:?, rela_path:?; "skip glob ignored directory"); @@ -243,8 +251,13 @@ fn select_files_with_git( } } else if file_type.is_file() { if platform.is_excluded() { - log::debug!(path:?, rela_path:?; "skip git ignored file"); - continue; + let rela = gix::path::try_into_bstr(rela_path) + .or_raise(|| Error::new("cannot convert path to git path"))?; + + if index.entry_by_path(rela.as_ref()).is_none() { + log::debug!(path:?, rela_path:?; "skip git ignored file"); + continue; + } } if !matcher .matched(rela_path, file_type.is_dir()) From 87bf335c7593df1c06aefe1f8da46de23f2b1ceb Mon Sep 17 00:00:00 2001 From: tison Date: Fri, 8 May 2026 08:44:07 +0800 Subject: [PATCH 2/2] lint Signed-off-by: tison --- fmt/src/document/model.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fmt/src/document/model.rs b/fmt/src/document/model.rs index 2e9090f..732a312 100644 --- a/fmt/src/document/model.rs +++ b/fmt/src/document/model.rs @@ -34,8 +34,8 @@ pub fn default_mapping() -> Vec { toml::from_str(defaults).expect("default mapping must be valid"); mapping - .into_iter() - .flat_map(|(_, doctype)| { + .into_values() + .flat_map(|doctype| { let mut ms = vec![]; if doctype.extension { ms.push(Mapping::Extension {