@@ -204,6 +204,7 @@ pub struct BuiltinSubmoduleStatus {
204
204
205
205
///
206
206
mod submodule_status {
207
+ use crate :: bstr:: BString ;
207
208
use std:: borrow:: Cow ;
208
209
209
210
use crate :: {
@@ -247,6 +248,8 @@ mod submodule_status {
247
248
SubmoduleStatus ( #[ from] crate :: submodule:: status:: Error ) ,
248
249
#[ error( transparent) ]
249
250
IgnoreConfig ( #[ from] crate :: submodule:: config:: Error ) ,
251
+ #[ error( "The value of 'diff.submoduleIgnore' was invalid: '{actual}'" ) ]
252
+ DiffSubmoduleIgnoreConfig { actual : BString } ,
250
253
}
251
254
252
255
impl gix_status:: index_as_worktree:: traits:: SubmoduleStatus for BuiltinSubmoduleStatus {
@@ -275,7 +278,20 @@ mod submodule_status {
275
278
return Ok ( None ) ;
276
279
} ;
277
280
let ( ignore, check_dirty) = match self . mode {
278
- Submodule :: AsConfigured { check_dirty } => ( sm. ignore ( ) ?. unwrap_or_default ( ) , check_dirty) ,
281
+ Submodule :: AsConfigured { check_dirty } => {
282
+ // diff.ignoreSubmodules is the global setting, and if it exists, it overrides the submodule's own ignore setting.
283
+ let global_ignore = repo. config_snapshot ( ) . string ( "diff.ignoreSubmodules" ) ;
284
+ if let Some ( ignore_str) = global_ignore {
285
+ let ignore = ignore_str. as_ref ( ) . try_into ( ) . map_err ( |_| Error :: DiffSubmoduleIgnoreConfig {
286
+ actual : ignore_str. into_owned ( ) ,
287
+ } ) ?;
288
+ ( ignore, check_dirty)
289
+ } else {
290
+ // If no global ignore is set, use the submodule's ignore setting.
291
+ let ignore = sm. ignore ( ) ?. unwrap_or_default ( ) ;
292
+ ( ignore, check_dirty)
293
+ }
294
+ }
279
295
Submodule :: Given { ignore, check_dirty } => ( ignore, check_dirty) ,
280
296
} ;
281
297
let status = sm. status ( ignore, check_dirty) ?;
0 commit comments