Merge branch 'jc/denoise-rm-to-resolve' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 29 Jul 2019 19:38:17 +0000 (12:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 29 Jul 2019 19:38:17 +0000 (12:38 -0700)
"git rm" to resolve a conflicted path leaked an internal message
"needs merge" before actually removing the path, which was
confusing. This has been corrected.

* jc/denoise-rm-to-resolve:
rm: resolving by removal is not a warning-worthy event

1  2 
builtin/rm.c
t/t3600-rm.sh
diff --combined builtin/rm.c
index 90cbe896c99188130a36a18aa18a57cd080be591,3ddce9cf061336223346caca8c1795da9be733ac..bf4a443e1369c2ef6131e5ac34be30c5a5d5b19f
@@@ -3,7 -3,6 +3,7 @@@
   *
   * Copyright (C) Linus Torvalds 2006
   */
 +#define USE_THE_INDEX_COMPATIBILITY_MACROS
  #include "builtin.h"
  #include "config.h"
  #include "lockfile.h"
@@@ -110,7 -109,7 +110,7 @@@ static int check_local_mod(struct objec
                const struct cache_entry *ce;
                const char *name = list.entry[i].name;
                struct object_id oid;
 -              unsigned mode;
 +              unsigned short mode;
                int local_changes = 0;
                int staged_changes = 0;
  
@@@ -273,7 -272,7 +273,7 @@@ int cmd_rm(int argc, const char **argv
        parse_pathspec(&pathspec, 0,
                       PATHSPEC_PREFER_CWD,
                       prefix, argv);
-       refresh_index(&the_index, REFRESH_QUIET, &pathspec, NULL, NULL);
+       refresh_index(&the_index, REFRESH_QUIET|REFRESH_UNMERGED, &pathspec, NULL, NULL);
  
        seen = xcalloc(pathspec.nr, 1);
  
diff --combined t/t3600-rm.sh
index 85ae7dc1e4618275413a8b498f43d43f3e0ead92,a4d25c8b083640373efc96c48fcbe5beeffb1835..66282a720ee853e7442334c889e199978aac9260
@@@ -8,92 -8,91 +8,92 @@@ test_description='Test of the various o
  . ./test-lib.sh
  
  # Setup some files to be removed, some with funny characters
 -test_expect_success \
 -    'Initialize test directory' \
 -    "touch -- foo bar baz 'space embedded' -q &&
 -     git add -- foo bar baz 'space embedded' -q &&
 -     git commit -m 'add normal files'"
 +test_expect_success 'Initialize test directory' '
 +      touch -- foo bar baz "space embedded" -q &&
 +      git add -- foo bar baz "space embedded" -q &&
 +      git commit -m "add normal files"
 +'
  
 -if test_have_prereq !FUNNYNAMES; then
 +if test_have_prereq !FUNNYNAMES
 +then
        say 'Your filesystem does not allow tabs in filenames.'
  fi
  
 -test_expect_success FUNNYNAMES 'add files with funny names' "
 -     touch -- 'tab    embedded' 'newline
 -embedded' &&
 -     git add -- 'tab  embedded' 'newline
 -embedded' &&
 -     git commit -m 'add files with tabs and newlines'
 -"
 -
 -test_expect_success \
 -    'Pre-check that foo exists and is in index before git rm foo' \
 -    '[ -f foo ] && git ls-files --error-unmatch foo'
 -
 -test_expect_success \
 -    'Test that git rm foo succeeds' \
 -    'git rm --cached foo'
 -
 -test_expect_success \
 -    'Test that git rm --cached foo succeeds if the index matches the file' \
 -    'echo content >foo &&
 -     git add foo &&
 -     git rm --cached foo'
 -
 -test_expect_success \
 -    'Test that git rm --cached foo succeeds if the index matches the file' \
 -    'echo content >foo &&
 -     git add foo &&
 -     git commit -m foo &&
 -     echo "other content" >foo &&
 -     git rm --cached foo'
 -
 -test_expect_success \
 -    'Test that git rm --cached foo fails if the index matches neither the file nor HEAD' '
 -     echo content >foo &&
 -     git add foo &&
 -     git commit -m foo --allow-empty &&
 -     echo "other content" >foo &&
 -     git add foo &&
 -     echo "yet another content" >foo &&
 -     test_must_fail git rm --cached foo
 -'
 -
 -test_expect_success \
 -    'Test that git rm --cached -f foo works in case where --cached only did not' \
 -    'echo content >foo &&
 -     git add foo &&
 -     git commit -m foo --allow-empty &&
 -     echo "other content" >foo &&
 -     git add foo &&
 -     echo "yet another content" >foo &&
 -     git rm --cached -f foo'
 -
 -test_expect_success \
 -    'Post-check that foo exists but is not in index after git rm foo' \
 -    '[ -f foo ] && test_must_fail git ls-files --error-unmatch foo'
 -
 -test_expect_success \
 -    'Pre-check that bar exists and is in index before "git rm bar"' \
 -    '[ -f bar ] && git ls-files --error-unmatch bar'
 -
 -test_expect_success \
 -    'Test that "git rm bar" succeeds' \
 -    'git rm bar'
 -
 -test_expect_success \
 -    'Post-check that bar does not exist and is not in index after "git rm -f bar"' \
 -    '! [ -f bar ] && test_must_fail git ls-files --error-unmatch bar'
 -
 -test_expect_success \
 -    'Test that "git rm -- -q" succeeds (remove a file that looks like an option)' \
 -    'git rm -- -q'
 -
 -test_expect_success FUNNYNAMES \
 -    "Test that \"git rm -f\" succeeds with embedded space, tab, or newline characters." \
 -    "git rm -f 'space embedded' 'tab  embedded' 'newline
 -embedded'"
 +test_expect_success FUNNYNAMES 'add files with funny names' '
 +      touch -- "tab   embedded" "newline${LF}embedded" &&
 +      git add -- "tab embedded" "newline${LF}embedded" &&
 +      git commit -m "add files with tabs and newlines"
 +'
 +
 +test_expect_success 'Pre-check that foo exists and is in index before git rm foo' '
 +      test_path_is_file foo &&
 +      git ls-files --error-unmatch foo
 +'
 +
 +test_expect_success 'Test that git rm foo succeeds' '
 +      git rm --cached foo
 +'
 +
 +test_expect_success 'Test that git rm --cached foo succeeds if the index matches the file' '
 +      echo content >foo &&
 +      git add foo &&
 +      git rm --cached foo
 +'
 +
 +test_expect_success 'Test that git rm --cached foo succeeds if the index matches the file' '
 +      echo content >foo &&
 +      git add foo &&
 +      git commit -m foo &&
 +      echo "other content" >foo &&
 +      git rm --cached foo
 +'
 +
 +test_expect_success 'Test that git rm --cached foo fails if the index matches neither the file nor HEAD' '
 +      echo content >foo &&
 +      git add foo &&
 +      git commit -m foo --allow-empty &&
 +      echo "other content" >foo &&
 +      git add foo &&
 +      echo "yet another content" >foo &&
 +      test_must_fail git rm --cached foo
 +'
 +
 +test_expect_success 'Test that git rm --cached -f foo works in case where --cached only did not' '
 +      echo content >foo &&
 +      git add foo &&
 +      git commit -m foo --allow-empty &&
 +      echo "other content" >foo &&
 +      git add foo &&
 +      echo "yet another content" >foo &&
 +      git rm --cached -f foo
 +'
 +
 +test_expect_success 'Post-check that foo exists but is not in index after git rm foo' '
 +      test_path_is_file foo &&
 +      test_must_fail git ls-files --error-unmatch foo
 +'
 +
 +test_expect_success 'Pre-check that bar exists and is in index before "git rm bar"' '
 +      test_path_is_file bar &&
 +      git ls-files --error-unmatch bar
 +'
 +
 +test_expect_success 'Test that "git rm bar" succeeds' '
 +      git rm bar
 +'
 +
 +test_expect_success 'Post-check that bar does not exist and is not in index after "git rm -f bar"' '
 +      test_path_is_missing bar &&
 +      test_must_fail git ls-files --error-unmatch bar
 +'
 +
 +test_expect_success 'Test that "git rm -- -q" succeeds (remove a file that looks like an option)' '
 +      git rm -- -q
 +'
 +
 +test_expect_success FUNNYNAMES 'Test that "git rm -f" succeeds with embedded space, tab, or newline characters.' '
 +      git rm -f "space embedded" "tab embedded" "newline${LF}embedded"
 +'
  
  test_expect_success SANITY 'Test that "git rm -f" fails if its rm fails' '
        test_when_finished "chmod 775 ." &&
        test_must_fail git rm -f baz
  '
  
 -test_expect_success \
 -    'When the rm in "git rm -f" fails, it should not remove the file from the index' \
 -    'git ls-files --error-unmatch baz'
 +test_expect_success 'When the rm in "git rm -f" fails, it should not remove the file from the index' '
 +      git ls-files --error-unmatch baz
 +'
  
  test_expect_success 'Remove nonexistent file with --ignore-unmatch' '
        git rm --ignore-unmatch nonexistent
@@@ -138,15 -137,15 +138,15 @@@ test_expect_success 'Re-add foo and baz
  test_expect_success 'Modify foo -- rm should refuse' '
        echo >>foo &&
        test_must_fail git rm foo baz &&
 -      test -f foo &&
 -      test -f baz &&
 +      test_path_is_file foo &&
 +      test_path_is_file baz &&
        git ls-files --error-unmatch foo baz
  '
  
  test_expect_success 'Modified foo -- rm -f should work' '
        git rm -f foo baz &&
 -      test ! -f foo &&
 -      test ! -f baz &&
 +      test_path_is_missing foo &&
 +      test_path_is_missing baz &&
        test_must_fail git ls-files --error-unmatch foo &&
        test_must_fail git ls-files --error-unmatch bar
  '
@@@ -160,15 -159,15 +160,15 @@@ test_expect_success 'Re-add foo and ba
  
  test_expect_success 'foo is different in index from HEAD -- rm should refuse' '
        test_must_fail git rm foo baz &&
 -      test -f foo &&
 -      test -f baz &&
 +      test_path_is_file foo &&
 +      test_path_is_file baz &&
        git ls-files --error-unmatch foo baz
  '
  
  test_expect_success 'but with -f it should work.' '
        git rm -f foo baz &&
 -      test ! -f foo &&
 -      test ! -f baz &&
 +      test_path_is_missing foo &&
 +      test_path_is_missing baz &&
        test_must_fail git ls-files --error-unmatch foo &&
        test_must_fail git ls-files --error-unmatch baz
  '
@@@ -195,21 -194,21 +195,21 @@@ test_expect_success 'Recursive test set
  
  test_expect_success 'Recursive without -r fails' '
        test_must_fail git rm frotz &&
 -      test -d frotz &&
 -      test -f frotz/nitfol
 +      test_path_is_dir frotz &&
 +      test_path_is_file frotz/nitfol
  '
  
  test_expect_success 'Recursive with -r but dirty' '
        echo qfwfq >>frotz/nitfol &&
        test_must_fail git rm -r frotz &&
 -      test -d frotz &&
 -      test -f frotz/nitfol
 +      test_path_is_dir frotz &&
 +      test_path_is_file frotz/nitfol
  '
  
  test_expect_success 'Recursive with -r -f' '
        git rm -f -r frotz &&
 -      ! test -f frotz/nitfol &&
 -      ! test -d frotz
 +      test_path_is_missing frotz/nitfol &&
 +      test_path_is_missing frotz
  '
  
  test_expect_success 'Remove nonexistent file returns nonzero exit status' '
  
  test_expect_success 'Call "rm" from outside the work tree' '
        mkdir repo &&
 -      (cd repo &&
 -       git init &&
 -       echo something >somefile &&
 -       git add somefile &&
 -       git commit -m "add a file" &&
 -       (cd .. &&
 -        git --git-dir=repo/.git --work-tree=repo rm somefile) &&
 -      test_must_fail git ls-files --error-unmatch somefile)
 +      (
 +              cd repo &&
 +              git init &&
 +              echo something >somefile &&
 +              git add somefile &&
 +              git commit -m "add a file" &&
 +              (
 +                      cd .. &&
 +                      git --git-dir=repo/.git --work-tree=repo rm somefile
 +              ) &&
 +              test_must_fail git ls-files --error-unmatch somefile
 +      )
  '
  
  test_expect_success 'refresh index before checking if it is up-to-date' '
 -
        git reset --hard &&
        test-tool chmtime -86400 frotz/nitfol &&
        git rm frotz/nitfol &&
 -      test ! -f frotz/nitfol
 -
 +      test_path_is_missing frotz/nitfol
  '
  
  test_expect_success 'choking "git rm" should not let it die with cruft' '
        i=0 &&
        while test $i -lt 12000
        do
 -          echo "100644 1234567890123456789012345678901234567890 0     some-file-$i"
 -          i=$(( $i + 1 ))
 +              echo "100644 1234567890123456789012345678901234567890 0 some-file-$i"
 +              i=$(( $i + 1 ))
        done | git update-index --index-info &&
        git rm -n "some-file-*" | : &&
        test_path_is_missing .git/index.lock
  '
  
+ test_expect_success 'Resolving by removal is not a warning-worthy event' '
+       git reset -q --hard &&
+       test_when_finished "rm -f .git/index.lock msg && git reset -q --hard" &&
+       blob=$(echo blob | git hash-object -w --stdin) &&
+       for stage in 1 2 3
+       do
+               echo "100644 $blob $stage       blob"
+       done | git update-index --index-info &&
+       git rm blob >msg 2>&1 &&
+       test_i18ngrep ! "needs merge" msg &&
+       test_must_fail git ls-files -s --error-unmatch blob
+ '
  test_expect_success 'rm removes subdirectories recursively' '
        mkdir -p dir/subdir/subsubdir &&
        echo content >dir/subdir/subsubdir/file &&
        git add dir/subdir/subsubdir/file &&
        git rm -f dir/subdir/subsubdir/file &&
 -      ! test -d dir
 +      test_path_is_missing dir
  '
  
  cat >expect <<EOF
@@@ -295,7 -305,7 +308,7 @@@ test_expect_success 'rm removes empty s
        git add .gitmodules &&
        git commit -m "add submodule" &&
        git rm submod &&
 -      test ! -e submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
@@@ -317,7 -327,7 +330,7 @@@ test_expect_success 'rm removes work tr
        git reset --hard &&
        git submodule update &&
        git rm submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
@@@ -328,7 -338,7 +341,7 @@@ test_expect_success 'rm removes a submo
        git reset --hard &&
        git submodule update &&
        git rm submod/ &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -346,12 -356,12 +359,12 @@@ test_expect_success 'rm of a populated 
        git submodule update &&
        git -C submod checkout HEAD^ &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
@@@ -362,8 -372,8 +375,8 @@@ test_expect_success 'rm --cached leave
        git reset --hard &&
        git submodule update &&
        git rm --cached submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno >actual &&
        test_cmp expect.cached actual &&
        git config -f .gitmodules submodule.sub.url &&
@@@ -374,7 -384,7 +387,7 @@@ test_expect_success 'rm --dry-run does 
        git reset --hard &&
        git submodule update &&
        git rm -n submod &&
 -      test -f submod/.git &&
 +      test_path_is_file submod/.git &&
        git diff-index --exit-code HEAD
  '
  
@@@ -384,8 -394,8 +397,8 @@@ test_expect_success 'rm does not compla
        git rm .gitmodules &&
        git rm submod >actual 2>actual.err &&
        test_must_be_empty actual.err &&
 -      ! test -d submod &&
 -      ! test -f submod/.git &&
 +      test_path_is_missing submod &&
 +      test_path_is_missing submod/.git &&
        git status -s -uno >actual &&
        test_cmp expect.both_deleted actual
  '
@@@ -395,15 -405,15 +408,15 @@@ test_expect_success 'rm will error out 
        git submodule update &&
        git config -f .gitmodules foo.bar true &&
        test_must_fail git rm submod >actual 2>actual.err &&
 -      test -s actual.err &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_file_not_empty actual.err &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git diff-files --quiet -- submod &&
        git add .gitmodules &&
        git rm submod >actual 2>actual.err &&
        test_must_be_empty actual.err &&
 -      ! test -d submod &&
 -      ! test -f submod/.git &&
 +      test_path_is_missing submod &&
 +      test_path_is_missing submod/.git &&
        git status -s -uno >actual &&
        test_cmp expect actual
  '
@@@ -416,8 -426,8 +429,8 @@@ test_expect_success 'rm issues a warnin
        echo "warning: Could not find section in .gitmodules where path=submod" >expect.err &&
        git rm submod >actual 2>actual.err &&
        test_i18ncmp expect.err actual.err &&
 -      ! test -d submod &&
 -      ! test -f submod/.git &&
 +      test_path_is_missing submod &&
 +      test_path_is_missing submod/.git &&
        git status -s -uno >actual &&
        test_cmp expect actual
  '
@@@ -427,12 -437,12 +440,12 @@@ test_expect_success 'rm of a populated 
        git submodule update &&
        echo X >submod/empty &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified_inside actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -442,12 -452,12 +455,12 @@@ test_expect_success 'rm of a populated 
        git submodule update &&
        echo X >submod/untracked &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified_untracked actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -484,7 -494,7 +497,7 @@@ test_expect_success 'rm removes work tr
        git submodule update &&
        test_must_fail git merge conflict2 &&
        git rm submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -496,12 -506,12 +509,12 @@@ test_expect_success 'rm of a conflicte
        git -C submod checkout HEAD^ &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
@@@ -515,12 -525,12 +528,12 @@@ test_expect_success 'rm of a conflicte
        echo X >submod/empty &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual &&
        test_must_fail git config -f .gitmodules submodule.sub.url &&
@@@ -534,12 -544,12 +547,12 @@@ test_expect_success 'rm of a conflicte
        echo X >submod/untracked &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -548,21 -558,20 +561,21 @@@ test_expect_success 'rm of a conflicte
        git checkout conflict1 &&
        git reset --hard &&
        git submodule update &&
 -      (cd submod &&
 +      (
 +              cd submod &&
                rm .git &&
                cp -R ../.git/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree
        ) &&
        test_must_fail git merge conflict2 &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -d submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_dir submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        test_must_fail git rm -f submod &&
 -      test -d submod &&
 -      test -d submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_dir submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.conflict actual &&
        git merge --abort &&
@@@ -574,7 -583,7 +587,7 @@@ test_expect_success 'rm of a conflicte
        git reset --hard &&
        test_must_fail git merge conflict2 &&
        git rm submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -583,18 -592,17 +596,18 @@@ test_expect_success 'rm of a populated 
        git checkout -f master &&
        git reset --hard &&
        git submodule update &&
 -      (cd submod &&
 +      (
 +              cd submod &&
                rm .git &&
                cp -R ../.git/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree &&
                rm -r ../.git/modules/sub
        ) &&
        git rm submod 2>output.err &&
 -      ! test -d submod &&
 -      ! test -d submod/.git &&
 +      test_path_is_missing submod &&
 +      test_path_is_missing submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
 -      test -s actual &&
 +      test_file_not_empty actual &&
        test_i18ngrep Migrating output.err
  '
  
@@@ -605,8 -613,7 +618,8 @@@ EO
  test_expect_success 'setup subsubmodule' '
        git reset --hard &&
        git submodule update &&
 -      (cd submod &&
 +      (
 +              cd submod &&
                git update-index --add --cacheinfo 160000 $(git rev-parse HEAD) subsubmod &&
                git config -f .gitmodules submodule.sub.url ../. &&
                git config -f .gitmodules submodule.sub.path subsubmod &&
  
  test_expect_success 'rm recursively removes work tree of unmodified submodules' '
        git rm submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -630,12 -637,12 +643,12 @@@ test_expect_success 'rm of a populated 
        git submodule update --recursive &&
        git -C submod/subsubmod checkout HEAD^ &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified_inside actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -645,12 -652,12 +658,12 @@@ test_expect_success 'rm of a populated 
        git submodule update --recursive &&
        echo X >submod/subsubmod/empty &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified_inside actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
@@@ -660,12 -667,12 +673,12 @@@ test_expect_success 'rm of a populated 
        git submodule update --recursive &&
        echo X >submod/subsubmod/untracked &&
        test_must_fail git rm submod &&
 -      test -d submod &&
 -      test -f submod/.git &&
 +      test_path_is_dir submod &&
 +      test_path_is_file submod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect.modified_untracked actual &&
        git rm -f submod &&
 -      test ! -d submod &&
 +      test_path_is_missing submod &&
        git status -s -uno --ignore-submodules=none >actual &&
        test_cmp expect actual
  '
  test_expect_success "rm absorbs submodule's nested .git directory" '
        git reset --hard &&
        git submodule update --recursive &&
 -      (cd submod/subsubmod &&
 +      (
 +              cd submod/subsubmod &&
                rm .git &&
                mv ../../.git/modules/sub/modules/sub .git &&
                GIT_WORK_TREE=. git config --unset core.worktree
        ) &&
        git rm submod 2>output.err &&
 -      ! test -d submod &&
 -      ! test -d submod/subsubmod/.git &&
 +      test_path_is_missing submod &&
 +      test_path_is_missing submod/subsubmod/.git &&
        git status -s -uno --ignore-submodules=none >actual &&
 -      test -s actual &&
 +      test_file_not_empty actual &&
        test_i18ngrep Migrating output.err
  '