Skip to content

Commit

Permalink
diff: do not show submodule with untracked files as "-dirty"
Browse files Browse the repository at this point in the history
Git diff reports a submodule directory as -dirty even when there are only untracked files in the submodule directory.
This is inconsistent with what `git describe --dirty` says when run in the submodule directory in that state.

So this patch makes `git diff HEAD` consistent with `git describe --dirty` in case of untracked files. This can be solved by including the "--ignore-submodules=untracked" feature in git diff by default. So in order to make this as default behaviour I have added the behaviour of `ignore-submodules` in `repo_diff_setup()` function. Also, to avoid `ignoreSubmodules` in user config being overwritten, I have made a  global variable `diff_ignore_submodule_config` to keep a track whether `handle_ignore_submodules_arg` is called before or not.

Signed-off-by: Sangeeta Jain <sangunb09@gmail.com>
  • Loading branch information
sangu09 committed Oct 15, 2020
1 parent d98273b commit 214e7a2
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 53 deletions.
1 change: 1 addition & 0 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -4585,6 +4585,7 @@ void repo_diff_setup(struct repository *r, struct diff_options *options)
DIFF_XDL_SET(options, INDENT_HEURISTIC);

options->orderfile = diff_order_file_cfg;
options->flags.ignore_untracked_in_submodules = 1;

if (diff_no_prefix) {
options->a_prefix = options->b_prefix = "";
Expand Down
2 changes: 2 additions & 0 deletions submodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1678,6 +1678,8 @@ unsigned is_submodule_modified(const char *path, int ignore_untracked)
strvec_pushl(&cp.args, "status", "--porcelain=2", NULL);
if (ignore_untracked)
strvec_push(&cp.args, "-uno");
else
strvec_push (&cp.args, "--ignore-submodules=none");

prepare_submodule_repo_env(&cp.env_array);
cp.git_cmd = 1;
Expand Down
2 changes: 1 addition & 1 deletion t/t3701-add-interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -761,7 +761,7 @@ test_expect_success 'setup different kinds of dirty submodules' '
echo dirty >>initial &&
: >untracked
) &&
git -C for-submodules diff-files --name-only >actual &&
git -C for-submodules diff-files --name-only --ignore-submodules=none >actual &&
cat >expected <<-\EOF &&
dirty-both-ways
dirty-head
Expand Down
6 changes: 3 additions & 3 deletions t/t4027-diff-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked)' '
) &&
git diff HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subtip $subprev-dirty &&
expect_from_to >expect.body $subtip $subprev &&
test_cmp expect.body actual.body
'

Expand Down Expand Up @@ -168,13 +168,13 @@ test_expect_success 'git diff HEAD with dirty submodule (untracked, refs match)'
git clean -qfdx &&
>cruft
) &&
git diff HEAD >actual &&
git diff --ignore-submodules=none HEAD >actual &&
sed -e "1,/^@@/d" actual >actual.body &&
expect_from_to >expect.body $subprev $subprev-dirty &&
test_cmp expect.body actual.body &&
git diff --ignore-submodules=all HEAD >actual2 &&
test_must_be_empty actual2 &&
git diff --ignore-submodules=untracked HEAD >actual3 &&
git diff HEAD >actual3 &&
test_must_be_empty actual3 &&
git diff --ignore-submodules=dirty HEAD >actual4 &&
test_must_be_empty actual4
Expand Down
16 changes: 8 additions & 8 deletions t/t4041-diff-submodule-option.sh
Original file line number Diff line number Diff line change
Expand Up @@ -262,15 +262,15 @@ test_expect_success 'submodule is up to date' '

test_expect_success 'submodule contains untracked content' '
echo new > sm1/new-file &&
git diff-index -p --submodule=log HEAD >actual &&
git diff-index -p --submodule=log HEAD --ignore-submodules=none >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
EOF
test_cmp expected actual
'

test_expect_success 'submodule contains untracked content (untracked ignored)' '
git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
git diff-index -p --submodule=log HEAD >actual &&
test_must_be_empty actual
'

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

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

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

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

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

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

test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
echo modification >> sm1/foo6 &&
git diff-index -p --ignore-submodules=untracked --submodule=log HEAD >actual &&
git diff-index -p --submodule=log HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
Submodule sm1 $head6..$head8:
Expand Down
16 changes: 8 additions & 8 deletions t/t4060-diff-submodule-option-diff-format.sh
Original file line number Diff line number Diff line change
Expand Up @@ -409,15 +409,15 @@ test_expect_success 'submodule is up to date' '

test_expect_success 'submodule contains untracked content' '
echo new > sm1/new-file &&
git diff-index -p --submodule=diff HEAD >actual &&
git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
EOF
diff_cmp expected actual
'

test_expect_success 'submodule contains untracked content (untracked ignored)' '
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
git diff-index -p --submodule=diff HEAD >actual &&
test_must_be_empty actual
'

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

test_expect_success 'submodule contains untracked and modified content' '
echo new > sm1/foo6 &&
git diff-index -p --submodule=diff HEAD >actual &&
git diff-index -p --ignore-submodules=none --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains untracked content
Submodule sm1 contains modified content
Expand All @@ -451,7 +451,7 @@ test_expect_success 'submodule contains untracked and modified content' '
# NOT OK
test_expect_success 'submodule contains untracked and modified content (untracked ignored)' '
echo new > sm1/foo6 &&
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
diff --git a/sm1/foo6 b/sm1/foo6
Expand Down Expand Up @@ -512,7 +512,7 @@ test_expect_success 'submodule is modified' '

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

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

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

test_expect_success 'modified submodule contains untracked and modified content (untracked ignored)' '
echo modification >> sm1/foo6 &&
git diff-index -p --ignore-submodules=untracked --submodule=diff HEAD >actual &&
git diff-index -p --submodule=diff HEAD >actual &&
cat >expected <<-EOF &&
Submodule sm1 contains modified content
Submodule sm1 $head7..$head8:
Expand Down
8 changes: 4 additions & 4 deletions t/t7064-wtstatus-pv2.sh
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,7 @@ test_expect_success 'create and add submodule, submodule appears clean (A. S...)
)
'

test_expect_success 'untracked changes in added submodule (AM S..U)' '
test_expect_success 'untracked changes in added submodule (A. S...))' '
( cd super_repo &&
## create untracked file in the submodule.
( cd sub1 &&
Expand All @@ -500,7 +500,7 @@ test_expect_success 'untracked changes in added submodule (AM S..U)' '
# branch.upstream origin/master
# branch.ab +0 -0
1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules
1 AM S..U 000000 160000 160000 $ZERO_OID $HSUB sub1
1 A. S... 000000 160000 160000 $ZERO_OID $HSUB sub1
EOF
git status --porcelain=v2 --branch --untracked-files=all >actual &&
Expand Down Expand Up @@ -560,7 +560,7 @@ test_expect_success 'staged and unstaged changes in added (AM S.M.)' '
)
'

test_expect_success 'staged and untracked changes in added submodule (AM S.MU)' '
test_expect_success 'staged and untracked changes in added submodule (AM S.M.)' '
( cd super_repo &&
( cd sub1 &&
## stage new changes in tracked file.
Expand All @@ -579,7 +579,7 @@ test_expect_success 'staged and untracked changes in added submodule (AM S.MU)'
# branch.upstream origin/master
# branch.ab +0 -0
1 A. N... 000000 100644 100644 $ZERO_OID $HMOD .gitmodules
1 AM S.MU 000000 160000 160000 $ZERO_OID $HSUB sub1
1 AM S.M. 000000 160000 160000 $ZERO_OID $HSUB sub1
EOF
git status --porcelain=v2 --branch --untracked-files=all >actual &&
Expand Down
38 changes: 9 additions & 29 deletions t/t7506-status-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ test_expect_success 'status with untracked file in submodule' '
(cd sub && git reset --hard) &&
echo "content" >sub/new-file &&
git status >output &&
test_i18ngrep "modified: sub (untracked content)" output
test_i18ngrep "^nothing to commit" output
'

test_expect_success 'status -uno with untracked file in submodule' '
Expand All @@ -105,23 +105,19 @@ test_expect_success 'status -uno with untracked file in submodule' '

test_expect_success 'status with untracked file in submodule (porcelain)' '
git status --porcelain >output &&
diff output - <<-\EOF
M sub
EOF
test_must_be_empty output
'

test_expect_success 'status with untracked file in submodule (short)' '
git status --short >output &&
diff output - <<-\EOF
? sub
EOF
test_must_be_empty output
'

test_expect_success 'status with added and untracked file in submodule' '
(cd sub && git reset --hard && echo >foo && git add foo) &&
echo "content" >sub/new-file &&
git status >output &&
test_i18ngrep "modified: sub (modified content, untracked content)" output
test_i18ngrep "modified: sub (modified content)" output
'

test_expect_success 'status with added and untracked file in submodule (porcelain)' '
Expand Down Expand Up @@ -169,7 +165,7 @@ test_expect_success 'status with untracked file in modified submodule' '
(cd sub && git reset --hard) &&
echo "content" >sub/new-file &&
git status >output &&
test_i18ngrep "modified: sub (new commits, untracked content)" output
test_i18ngrep "modified: sub (new commits)" output
'

test_expect_success 'status with untracked file in modified submodule (porcelain)' '
Expand All @@ -183,7 +179,7 @@ test_expect_success 'status with added and untracked file in modified submodule'
(cd sub && git reset --hard && echo >foo && git add foo) &&
echo "content" >sub/new-file &&
git status >output &&
test_i18ngrep "modified: sub (new commits, modified content, untracked content)" output
test_i18ngrep "modified: sub (new commits, modified content)" output
'

test_expect_success 'status with added and untracked file in modified submodule (porcelain)' '
Expand Down Expand Up @@ -350,30 +346,17 @@ test_expect_success 'setup superproject with untracked file in nested submodule'

test_expect_success 'status with untracked file in nested submodule (porcelain)' '
git -C super status --porcelain >output &&
diff output - <<-\EOF
M sub1
M sub2
M sub3
EOF
test_must_be_empty output
'

test_expect_success 'status with untracked file in nested submodule (porcelain=2)' '
git -C super status --porcelain=2 >output &&
sanitize_output output &&
diff output - <<-\EOF
1 .M S..U 160000 160000 160000 HASH HASH sub1
1 .M S..U 160000 160000 160000 HASH HASH sub2
1 .M S..U 160000 160000 160000 HASH HASH sub3
EOF
test_must_be_empty output
'

test_expect_success 'status with untracked file in nested submodule (short)' '
git -C super status --short >output &&
diff output - <<-\EOF
? sub1
? sub2
? sub3
EOF
test_must_be_empty output
'

test_expect_success 'setup superproject with modified file in nested submodule' '
Expand All @@ -386,7 +369,6 @@ test_expect_success 'status with added file in nested submodule (porcelain)' '
diff output - <<-\EOF
M sub1
M sub2
M sub3
EOF
'

Expand All @@ -396,7 +378,6 @@ test_expect_success 'status with added file in nested submodule (porcelain=2)' '
diff output - <<-\EOF
1 .M S.M. 160000 160000 160000 HASH HASH sub1
1 .M S.M. 160000 160000 160000 HASH HASH sub2
1 .M S..U 160000 160000 160000 HASH HASH sub3
EOF
'

Expand All @@ -405,7 +386,6 @@ test_expect_success 'status with added file in nested submodule (short)' '
diff output - <<-\EOF
m sub1
m sub2
? sub3
EOF
'

Expand Down

0 comments on commit 214e7a2

Please sign in to comment.