Skip to content

Commit 0806279

Browse files
committed
Merge branch 'sj/untracked-files-in-submodule-directory-is-not-dirty'
"git diff" showed a submodule working tree with untracked cruft as "Submodule commit <objectname>-dirty", but a natural expectation is that the "-dirty" indicator would align with "git describe --dirty", which does not consider having untracked files in the working tree as source of dirtiness. The inconsistency has been fixed. * sj/untracked-files-in-submodule-directory-is-not-dirty: diff: do not show submodule with untracked files as "-dirty"
2 parents dfcd905 + 8ef9312 commit 0806279

File tree

9 files changed

+42
-19
lines changed

9 files changed

+42
-19
lines changed

Documentation/config/diff.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ diff.ignoreSubmodules::
8585
and 'git status' when `status.submoduleSummary` is set unless it is
8686
overridden by using the --ignore-submodules command-line option.
8787
The 'git submodule' commands are not affected by this setting.
88+
By default this is set to untracked so that any untracked
89+
submodules are ignored.
8890

8991
diff.mnemonicPrefix::
9092
If set, 'git diff' uses a prefix pair that is different from the

diff.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4593,6 +4593,9 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
45934593

45944594
options->orderfile = diff_order_file_cfg;
45954595

4596+
if (!options->flags.ignore_submodule_set)
4597+
options->flags.ignore_untracked_in_submodules = 1;
4598+
45964599
if (diff_no_prefix) {
45974600
options->a_prefix = options->b_prefix = "";
45984601
} else if (!diff_mnemonic_prefix) {

diff.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ struct diff_flags {
178178
unsigned diff_from_contents;
179179
unsigned dirty_submodules;
180180
unsigned ignore_untracked_in_submodules;
181+
unsigned ignore_submodule_set;
181182
unsigned ignore_dirty_submodules;
182183
unsigned override_submodule_config;
183184
unsigned dirstat_by_line;

submodule.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ const char *submodule_strategy_to_string(const struct submodule_update_strategy
420420
void handle_ignore_submodules_arg(struct diff_options *diffopt,
421421
const char *arg)
422422
{
423+
diffopt->flags.ignore_submodule_set = 1;
423424
diffopt->flags.ignore_submodules = 0;
424425
diffopt->flags.ignore_untracked_in_submodules = 0;
425426
diffopt->flags.ignore_dirty_submodules = 0;

t/t3701-add-interactive.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,12 @@ test_expect_success 'setup different kinds of dirty submodules' '
849849
cat >expected <<-\EOF &&
850850
dirty-both-ways
851851
dirty-head
852+
EOF
853+
test_cmp expected actual &&
854+
git -C for-submodules diff-files --name-only --ignore-submodules=none >actual &&
855+
cat >expected <<-\EOF &&
856+
dirty-both-ways
857+
dirty-head
852858
dirty-otherwise
853859
EOF
854860
test_cmp expected actual &&

t/t4027-diff-submodule.sh

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
9393
) &&
9494
git diff HEAD >actual &&
9595
sed -e "1,/^@@/d" actual >actual.body &&
96+
expect_from_to >expect.body $subtip $subprev &&
97+
test_cmp expect.body actual.body
98+
'
99+
100+
test_expect_success 'git diff HEAD with dirty submodule (untracked) (none ignored)' '
101+
test_config diff.ignoreSubmodules none &&
102+
git diff HEAD >actual &&
103+
sed -e "1,/^@@/d" actual >actual.body &&
96104
expect_from_to >expect.body $subtip $subprev-dirty &&
97105
test_cmp expect.body actual.body
98106
'
@@ -168,13 +176,13 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)'
168176
git clean -qfdx &&
169177
>cruft
170178
) &&
171-
git diff HEAD >actual &&
179+
git diff --ignore-submodules=none HEAD >actual &&
172180
sed -e "1,/^@@/d" actual >actual.body &&
173181
expect_from_to >expect.body $subprev $subprev-dirty &&
174182
test_cmp expect.body actual.body &&
175183
git diff --ignore-submodules=all HEAD >actual2 &&
176184
test_must_be_empty actual2 &&
177-
git diff --ignore-submodules=untracked HEAD >actual3 &&
185+
git diff HEAD >actual3 &&
178186
test_must_be_empty actual3 &&
179187
git diff --ignore-submodules=dirty HEAD >actual4 &&
180188
test_must_be_empty actual4

t/t4041-diff-submodule-option.sh

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -262,15 +262,15 @@ test_expect_success 'submodule is up to date' '
262262

263263
test_expect_success 'submodule contains untracked content' '
264264
echo new > sm1/new-file &&
265-
git diff-index -p --submodule=log HEAD >actual &&
265+
git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
266266
cat >expected <<-EOF &&
267267
Submodule sm1 contains untracked content
268268
EOF
269269
test_cmp expected actual
270270
'
271271

272272
test_expect_success 'submodule contains untracked content (untracked ignored)' '
273-
git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
273+
git diff-index -p --submodule=log HEAD >actual &&
274274
test_must_be_empty actual
275275
'
276276

@@ -286,7 +286,7 @@ test_expect_success 'submodule contains untracked content (all ignored)' '
286286

287287
test_expect_success 'submodule contains untracked and modified content' '
288288
echo new > sm1/foo6 &&
289-
git diff-index -p --submodule=log HEAD >actual &&
289+
git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
290290
cat >expected <<-EOF &&
291291
Submodule sm1 contains untracked content
292292
Submodule sm1 contains modified content
@@ -296,7 +296,7 @@ test_expect_success 'submodule contains untracked and modified content' '
296296

297297
test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
298298
echo new > sm1/foo6 &&
299-
git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
299+
git diff-index -p --submodule=log HEAD >actual &&
300300
cat >expected <<-EOF &&
301301
Submodule sm1 contains modified content
302302
EOF
@@ -337,7 +337,7 @@ test_expect_success 'submodule is modified' '
337337

338338
test_expect_success 'modified submodule contains untracked content' '
339339
echo new > sm1/new-file &&
340-
git diff-index -p --submodule=log HEAD >actual &&
340+
git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
341341
cat >expected <<-EOF &&
342342
Submodule sm1 contains untracked content
343343
Submodule sm1 $head6..$head8:
@@ -347,7 +347,7 @@ test_expect_success 'modified submodule contains untracked content' '
347347
'
348348

349349
test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
350-
git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
350+
git diff-index -p --submodule=log HEAD >actual &&
351351
cat >expected <<-EOF &&
352352
Submodule sm1 $head6..$head8:
353353
> change
@@ -371,7 +371,7 @@ test_expect_success 'modified submodule contains untracked content (all ignored)
371371

372372
test_expect_success 'modified submodule contains untracked and modified content' '
373373
echo modification >> sm1/foo6 &&
374-
git diff-index -p --submodule=log HEAD >actual &&
374+
git diff-index -p --ignore-submodules=none --submodule=log HEAD >actual &&
375375
cat >expected <<-EOF &&
376376
Submodule sm1 contains untracked content
377377
Submodule sm1 contains modified content
@@ -383,7 +383,7 @@ test_expect_success 'modified submodule contains untracked and modified content'
383383

384384
test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
385385
echo modification >> sm1/foo6 &&
386-
git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
386+
git diff-index -p --submodule=log HEAD >actual &&
387387
cat >expected <<-EOF &&
388388
Submodule sm1 contains modified content
389389
Submodule sm1 $head6..$head8:

t/t4060-diff-submodule-option-diff-format.sh

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,15 @@ test_expect_success 'submodule is up to date' '
409409

410410
test_expect_success 'submodule contains untracked content' '
411411
echo new > sm1/new-file &&
412-
git diff-index -p --submodule=diff HEAD >actual &&
412+
git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
413413
cat >expected <<-EOF &&
414414
Submodule sm1 contains untracked content
415415
EOF
416416
diff_cmp expected actual
417417
'
418418

419419
test_expect_success 'submodule contains untracked content (untracked ignored)' '
420-
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
420+
git diff-index -p --submodule=diff HEAD >actual &&
421421
test_must_be_empty actual
422422
'
423423

@@ -433,7 +433,7 @@ test_expect_success 'submodule contains untracked content (all ignored)' '
433433

434434
test_expect_success 'submodule contains untracked and modified content' '
435435
echo new > sm1/foo6 &&
436-
git diff-index -p --submodule=diff HEAD >actual &&
436+
git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
437437
cat >expected <<-EOF &&
438438
Submodule sm1 contains untracked content
439439
Submodule sm1 contains modified content
@@ -451,7 +451,7 @@ test_expect_success 'submodule contains untracked and modified content' '
451451
# NOT OK
452452
test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
453453
echo new > sm1/foo6 &&
454-
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
454+
git diff-index -p --submodule=diff HEAD >actual &&
455455
cat >expected <<-EOF &&
456456
Submodule sm1 contains modified content
457457
diff --git a/sm1/foo6 b/sm1/foo6
@@ -512,7 +512,7 @@ test_expect_success 'submodule is modified' '
512512

513513
test_expect_success 'modified submodule contains untracked content' '
514514
echo new > sm1/new-file &&
515-
git diff-index -p --submodule=diff HEAD >actual &&
515+
git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
516516
cat >expected <<-EOF &&
517517
Submodule sm1 contains untracked content
518518
Submodule sm1 $head7..$head8:
@@ -528,7 +528,7 @@ test_expect_success 'modified submodule contains untracked content' '
528528
'
529529

530530
test_expect_success 'modified submodule contains untracked content (untracked ignored)' '
531-
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
531+
git diff-index -p --submodule=diff HEAD >actual &&
532532
cat >expected <<-EOF &&
533533
Submodule sm1 $head7..$head8:
534534
diff --git a/sm1/foo6 b/sm1/foo6
@@ -564,7 +564,7 @@ test_expect_success 'modified submodule contains untracked content (all ignored)
564564

565565
test_expect_success 'modified submodule contains untracked and modified content' '
566566
echo modification >> sm1/foo6 &&
567-
git diff-index -p --submodule=diff HEAD >actual &&
567+
git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
568568
cat >expected <<-EOF &&
569569
Submodule sm1 contains untracked content
570570
Submodule sm1 contains modified content
@@ -583,7 +583,7 @@ test_expect_success 'modified submodule contains untracked and modified content'
583583

584584
test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
585585
echo modification >> sm1/foo6 &&
586-
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
586+
git diff-index -p --submodule=diff HEAD >actual &&
587587
cat >expected <<-EOF &&
588588
Submodule sm1 contains modified content
589589
Submodule sm1 $head7..$head8:

wt-status.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,9 @@ static void wt_status_collect_changes_worktree(struct wt_status *s)
606606
if (s->ignore_submodule_arg) {
607607
rev.diffopt.flags.override_submodule_config = 1;
608608
handle_ignore_submodules_arg(&rev.diffopt, s->ignore_submodule_arg);
609-
}
609+
} else if (!rev.diffopt.flags.ignore_submodule_set &&
610+
s->show_untracked_files != SHOW_NO_UNTRACKED_FILES)
611+
handle_ignore_submodules_arg(&rev.diffopt, "none");
610612
rev.diffopt.format_callback = wt_status_collect_changed_cb;
611613
rev.diffopt.format_callback_data = s;
612614
rev.diffopt.detect_rename = s->detect_rename >= 0 ? s->detect_rename : rev.diffopt.detect_rename;

0 commit comments

Comments
 (0)