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