Add tests for submodule sync --recursive
[gitweb.git] / t / t7506-status-submodule.sh
index 3d4f85d74f6f378d76bde77e581273af010ba452..d31b34da83d5ad336f2355acc0d2536b9d30e3ce 100755 (executable)
@@ -4,17 +4,21 @@ test_description='git status for submodule'
 
 . ./test-lib.sh
 
-test_expect_success 'setup' '
-       test_create_repo sub &&
+test_create_repo_with_commit () {
+       test_create_repo "$1" &&
        (
-               cd sub &&
+               cd "$1" &&
                : >bar &&
                git add bar &&
                git commit -m " Add bar" &&
                : >foo &&
                git add foo &&
                git commit -m " Add foo"
-       ) &&
+       )
+}
+
+test_expect_success 'setup' '
+       test_create_repo_with_commit sub &&
        echo output > .gitignore &&
        git add sub .gitignore &&
        git commit -m "Add submodule sub"
@@ -22,19 +26,19 @@ test_expect_success 'setup' '
 
 test_expect_success 'status clean' '
        git status >output &&
-       grep "nothing to commit" output
+       test_i18ngrep "nothing to commit" output
 '
 
 test_expect_success 'commit --dry-run -a clean' '
        test_must_fail git commit --dry-run -a >output &&
-       grep "nothing to commit" output
+       test_i18ngrep "nothing to commit" output
 '
 
 test_expect_success 'status with modified file in submodule' '
        (cd sub && git reset --hard) &&
        echo "changed" >sub/foo &&
        git status >output &&
-       grep "modified:   sub (modified content)" output
+       test_i18ngrep "modified:   sub (modified content)" output
 '
 
 test_expect_success 'status with modified file in submodule (porcelain)' '
@@ -49,7 +53,7 @@ test_expect_success 'status with modified file in submodule (porcelain)' '
 test_expect_success 'status with added file in submodule' '
        (cd sub && git reset --hard && echo >foo && git add foo) &&
        git status >output &&
-       grep "modified:   sub (modified content)" output
+       test_i18ngrep "modified:   sub (modified content)" output
 '
 
 test_expect_success 'status with added file in submodule (porcelain)' '
@@ -64,12 +68,12 @@ test_expect_success 'status with untracked file in submodule' '
        (cd sub && git reset --hard) &&
        echo "content" >sub/new-file &&
        git status >output &&
-       grep "modified:   sub (untracked content)" output
+       test_i18ngrep "modified:   sub (untracked content)" output
 '
 
 test_expect_success 'status -uno with untracked file in submodule' '
        git status -uno >output &&
-       grep "^nothing to commit" output
+       test_i18ngrep "^nothing to commit" output
 '
 
 test_expect_success 'status with untracked file in submodule (porcelain)' '
@@ -83,7 +87,7 @@ 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 &&
-       grep "modified:   sub (modified content, untracked content)" output
+       test_i18ngrep "modified:   sub (modified content, untracked content)" output
 '
 
 test_expect_success 'status with added and untracked file in submodule (porcelain)' '
@@ -101,7 +105,7 @@ test_expect_success 'status with modified file in modified submodule' '
        (cd sub && echo "next change" >foo && git commit -m "next change" foo) &&
        echo "changed" >sub/foo &&
        git status >output &&
-       grep "modified:   sub (new commits, modified content)" output
+       test_i18ngrep "modified:   sub (new commits, modified content)" output
 '
 
 test_expect_success 'status with modified file in modified submodule (porcelain)' '
@@ -116,7 +120,7 @@ test_expect_success 'status with modified file in modified submodule (porcelain)
 test_expect_success 'status with added file in modified submodule' '
        (cd sub && git reset --hard && echo >foo && git add foo) &&
        git status >output &&
-       grep "modified:   sub (new commits, modified content)" output
+       test_i18ngrep "modified:   sub (new commits, modified content)" output
 '
 
 test_expect_success 'status with added file in modified submodule (porcelain)' '
@@ -131,7 +135,7 @@ test_expect_success 'status with untracked file in modified submodule' '
        (cd sub && git reset --hard) &&
        echo "content" >sub/new-file &&
        git status >output &&
-       grep "modified:   sub (new commits, untracked content)" output
+       test_i18ngrep "modified:   sub (new commits, untracked content)" output
 '
 
 test_expect_success 'status with untracked file in modified submodule (porcelain)' '
@@ -145,7 +149,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 &&
-       grep "modified:   sub (new commits, modified content, untracked content)" output
+       test_i18ngrep "modified:   sub (new commits, modified content, untracked content)" output
 '
 
 test_expect_success 'status with added and untracked file in modified submodule (porcelain)' '
@@ -170,7 +174,7 @@ test_expect_success 'setup .git file for sub' '
 test_expect_success 'status with added file in modified submodule with .git file' '
        (cd sub && git reset --hard && echo >foo && git add foo) &&
        git status >output &&
-       grep "modified:   sub (new commits, modified content)" output
+       test_i18ngrep "modified:   sub (new commits, modified content)" output
 '
 
 test_expect_success 'rm submodule contents' '
@@ -179,12 +183,92 @@ test_expect_success 'rm submodule contents' '
 
 test_expect_success 'status clean (empty submodule dir)' '
        git status >output &&
-       grep "nothing to commit" output
+       test_i18ngrep "nothing to commit" output
 '
 
 test_expect_success 'status -a clean (empty submodule dir)' '
        test_must_fail git commit --dry-run -a >output &&
-       grep "nothing to commit" output
+       test_i18ngrep "nothing to commit" output
+'
+
+cat >status_expect <<\EOF
+AA .gitmodules
+A  sub1
+EOF
+
+test_expect_success 'status with merge conflict in .gitmodules' '
+       git clone . super &&
+       test_create_repo_with_commit sub1 &&
+       test_tick &&
+       test_create_repo_with_commit sub2 &&
+       (
+               cd super &&
+               prev=$(git rev-parse HEAD) &&
+               git checkout -b add_sub1 &&
+               git submodule add ../sub1 &&
+               git commit -m "add sub1" &&
+               git checkout -b add_sub2 $prev &&
+               git submodule add ../sub2 &&
+               git commit -m "add sub2" &&
+               git checkout -b merge_conflict_gitmodules &&
+               test_must_fail git merge add_sub1 &&
+               git status -s >../status_actual 2>&1
+       ) &&
+       test_cmp status_actual status_expect
+'
+
+sha1_merge_sub1=$(cd sub1 && git rev-parse HEAD)
+sha1_merge_sub2=$(cd sub2 && git rev-parse HEAD)
+short_sha1_merge_sub1=$(cd sub1 && git rev-parse --short HEAD)
+short_sha1_merge_sub2=$(cd sub2 && git rev-parse --short HEAD)
+cat >diff_expect <<\EOF
+diff --cc .gitmodules
+index badaa4c,44f999a..0000000
+--- a/.gitmodules
++++ b/.gitmodules
+@@@ -1,3 -1,3 +1,9 @@@
+++<<<<<<< HEAD
+ +[submodule "sub2"]
+ +     path = sub2
+ +     url = ../sub2
+++=======
++ [submodule "sub1"]
++      path = sub1
++      url = ../sub1
+++>>>>>>> add_sub1
+EOF
+
+cat >diff_submodule_expect <<\EOF
+diff --cc .gitmodules
+index badaa4c,44f999a..0000000
+--- a/.gitmodules
++++ b/.gitmodules
+@@@ -1,3 -1,3 +1,9 @@@
+++<<<<<<< HEAD
+ +[submodule "sub2"]
+ +     path = sub2
+ +     url = ../sub2
+++=======
++ [submodule "sub1"]
++      path = sub1
++      url = ../sub1
+++>>>>>>> add_sub1
+EOF
+
+test_expect_success 'diff with merge conflict in .gitmodules' '
+       (
+               cd super &&
+               git diff >../diff_actual 2>&1
+       ) &&
+       test_cmp diff_actual diff_expect
+'
+
+test_expect_success 'diff --submodule with merge conflict in .gitmodules' '
+       (
+               cd super &&
+               git diff --submodule >../diff_submodule_actual 2>&1
+       ) &&
+       test_cmp diff_submodule_actual diff_submodule_expect
 '
 
 test_done