Imported Upstream version 2.15.0
[platform/upstream/git.git] / t / t7102-reset.sh
index b096dc8..95653a0 100755 (executable)
@@ -9,6 +9,22 @@ Documented tests for git reset'
 
 . ./test-lib.sh
 
+commit_msg () {
+       # String "modify 2nd file (changed)" partly in German
+       # (translated with Google Translate),
+       # encoded in UTF-8, used as a commit log message below.
+       msg="modify 2nd file (ge\303\244ndert)\n"
+       if test -n "$1"
+       then
+               printf "$msg" | iconv -f utf-8 -t "$1"
+       else
+               printf "$msg"
+       fi
+}
+
+# Tested non-UTF-8 encoding
+test_encoding="ISO8859-1"
+
 test_expect_success 'creating initial files and commits' '
        test_tick &&
        echo "1st file" >first &&
@@ -28,7 +44,10 @@ test_expect_success 'creating initial files and commits' '
 
        echo "1st line 2nd file" >secondfile &&
        echo "2nd line 2nd file" >>secondfile &&
-       git commit -a -m "modify 2nd file"
+       # "git commit -m" would break MinGW, as Windows refuse to pass
+       # $test_encoding encoded parameter to git.
+       commit_msg $test_encoding | git -c "i18n.commitEncoding=$test_encoding" commit -a -F - &&
+       head5=$(git rev-parse --verify HEAD)
 '
 # git log --pretty=oneline # to see those SHA1 involved
 
@@ -43,6 +62,20 @@ check_changes () {
        done | test_cmp .cat_expect -
 }
 
+test_expect_success 'reset --hard message' '
+       hex=$(git log -1 --format="%h") &&
+       git reset --hard > .actual &&
+       echo HEAD is now at $hex $(commit_msg) > .expected &&
+       test_i18ncmp .expected .actual
+'
+
+test_expect_success 'reset --hard message (ISO8859-1 logoutputencoding)' '
+       hex=$(git log -1 --format="%h") &&
+       git -c "i18n.logOutputEncoding=$test_encoding" reset --hard > .actual &&
+       echo HEAD is now at $hex $(commit_msg $test_encoding) > .expected &&
+       test_i18ncmp .expected .actual
+'
+
 >.diff_expect
 >.cached_expect
 cat >.cat_expect <<EOF
@@ -56,7 +89,7 @@ test_expect_success 'giving a non existing revision should fail' '
        test_must_fail git reset --mixed aaaaaa &&
        test_must_fail git reset --soft aaaaaa &&
        test_must_fail git reset --hard aaaaaa &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       check_changes $head5
 '
 
 test_expect_success 'reset --soft with unmerged index should fail' '
@@ -74,7 +107,7 @@ test_expect_success \
        test_must_fail git reset --hard -- first &&
        test_must_fail git reset --soft HEAD^ -- first &&
        test_must_fail git reset --hard HEAD^ -- first &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       check_changes $head5
 '
 
 test_expect_success 'giving unrecognized options should fail' '
@@ -86,7 +119,7 @@ test_expect_success 'giving unrecognized options should fail' '
        test_must_fail git reset --soft -o &&
        test_must_fail git reset --hard --other &&
        test_must_fail git reset --hard -o &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       check_changes $head5
 '
 
 test_expect_success \
@@ -110,7 +143,7 @@ test_expect_success \
 
        git checkout master &&
        git branch -D branch1 branch2 &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       check_changes $head5
 '
 
 test_expect_success \
@@ -133,27 +166,27 @@ test_expect_success \
 
        git checkout master &&
        git branch -D branch3 branch4 &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       check_changes $head5
 '
 
 test_expect_success \
        'resetting to HEAD with no changes should succeed and do nothing' '
        git reset --hard &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset --hard HEAD &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset --soft &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset --soft HEAD &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset --mixed &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset --mixed HEAD &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+               check_changes $head5 &&
        git reset HEAD &&
-               check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+               check_changes $head5
 '
 
 >.diff_expect
@@ -176,7 +209,7 @@ test_expect_success '--soft reset only should show changes in diff --cached' '
        git reset --soft HEAD^ &&
        check_changes d1a4bc3abce4829628ae2dcb0d60ef3d1a78b1c4 &&
        test "$(git rev-parse ORIG_HEAD)" = \
-                       3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+                       $head5
 '
 
 >.diff_expect
@@ -191,9 +224,10 @@ test_expect_success \
        'changing files and redo the last commit should succeed' '
        echo "3rd line 2nd file" >>secondfile &&
        git commit -a -C ORIG_HEAD &&
-       check_changes 3d3b7be011a58ca0c179ae45d94e6c83c0b0cd0d &&
+       head4=$(git rev-parse --verify HEAD) &&
+       check_changes $head4 &&
        test "$(git rev-parse ORIG_HEAD)" = \
-                       3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+                       $head5
 '
 
 >.diff_expect
@@ -210,7 +244,7 @@ test_expect_success \
        git reset --hard HEAD~2 &&
        check_changes ddaefe00f1da16864591c61fdc7adb5d7cd6b74e &&
        test "$(git rev-parse ORIG_HEAD)" = \
-                       3d3b7be011a58ca0c179ae45d94e6c83c0b0cd0d
+                       $head4
 '
 
 >.diff_expect
@@ -302,8 +336,10 @@ test_expect_success 'redoing the last two commits should succeed' '
 
        echo "1st line 2nd file" >secondfile &&
        echo "2nd line 2nd file" >>secondfile &&
-       git commit -a -m "modify 2nd file" &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       # "git commit -m" would break MinGW, as Windows refuse to pass
+       # $test_encoding encoded parameter to git.
+       commit_msg $test_encoding | git -c "i18n.commitEncoding=$test_encoding" commit -a -F - &&
+       check_changes $head5
 '
 
 >.diff_expect
@@ -325,10 +361,11 @@ test_expect_success '--hard reset to HEAD should clear a failed merge' '
        git checkout branch2 &&
        echo "3rd line in branch2" >>secondfile &&
        git commit -a -m "change in branch2" &&
+       head3=$(git rev-parse --verify HEAD) &&
 
        test_must_fail git pull . branch1 &&
        git reset --hard &&
-       check_changes 77abb337073fb4369a7ad69ff6f5ec0e4d6b54bb
+       check_changes $head3
 '
 
 >.diff_expect
@@ -341,15 +378,15 @@ EOF
 test_expect_success \
        '--hard reset to ORIG_HEAD should clear a fast-forward merge' '
        git reset --hard HEAD^ &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+       check_changes $head5 &&
 
        git pull . branch1 &&
        git reset --hard ORIG_HEAD &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc &&
+       check_changes $head5 &&
 
        git checkout master &&
        git branch -D branch1 branch2 &&
-       check_changes 3ec39651e7f44ea531a5de18a9fa791c0fd370fc
+       check_changes $head5
 '
 
 cat > expect << EOF
@@ -388,11 +425,12 @@ test_expect_success 'test --mixed <paths>' '
        echo 4 > file4 &&
        echo 5 > file1 &&
        git add file1 file3 file4 &&
-       test_must_fail git reset HEAD -- file1 file2 file3 &&
+       git reset HEAD -- file1 file2 file3 &&
+       test_must_fail git diff --quiet &&
        git diff > output &&
-       test_cmp output expect &&
+       test_cmp expect output &&
        git diff --cached > output &&
-       test_cmp output cached_expect
+       test_cmp cached_expect output
 '
 
 test_expect_success 'test resetting the index at give paths' '
@@ -402,7 +440,8 @@ test_expect_success 'test resetting the index at give paths' '
        >sub/file2 &&
        git update-index --add sub/file1 sub/file2 &&
        T=$(git write-tree) &&
-       test_must_fail git reset HEAD sub/file2 &&
+       git reset HEAD sub/file2 &&
+       test_must_fail git diff --quiet &&
        U=$(git write-tree) &&
        echo "$T" &&
        echo "$U" &&
@@ -440,7 +479,8 @@ test_expect_success 'resetting specific path that is unmerged' '
                echo "100644 $F3 3      file2"
        } | git update-index --index-info &&
        git ls-files -u &&
-       test_must_fail git reset HEAD file2 &&
+       git reset HEAD file2 &&
+       test_must_fail git diff --quiet &&
        git diff-index --exit-code --cached HEAD
 '
 
@@ -449,10 +489,11 @@ test_expect_success 'disambiguation (1)' '
        git reset --hard &&
        >secondfile &&
        git add secondfile &&
-       test_must_fail git reset secondfile &&
+       git reset secondfile &&
+       test_must_fail git diff --quiet -- secondfile &&
        test -z "$(git diff --cached --name-only)" &&
        test -f secondfile &&
-       test ! -s secondfile
+       test_must_be_empty secondfile
 
 '
 
@@ -474,7 +515,8 @@ test_expect_success 'disambiguation (3)' '
        >secondfile &&
        git add secondfile &&
        rm -f secondfile &&
-       test_must_fail git reset HEAD secondfile &&
+       git reset HEAD secondfile &&
+       test_must_fail git diff --quiet &&
        test -z "$(git diff --cached --name-only)" &&
        test ! -f secondfile
 
@@ -486,9 +528,44 @@ test_expect_success 'disambiguation (4)' '
        >secondfile &&
        git add secondfile &&
        rm -f secondfile &&
-       test_must_fail git reset -- secondfile &&
+       git reset -- secondfile &&
+       test_must_fail git diff --quiet &&
        test -z "$(git diff --cached --name-only)" &&
        test ! -f secondfile
 '
 
+test_expect_success 'reset with paths accepts tree' '
+       # for simpler tests, drop last commit containing added files
+       git reset --hard HEAD^ &&
+       git reset HEAD^^{tree} -- . &&
+       git diff --cached HEAD^ --exit-code &&
+       git diff HEAD --exit-code
+'
+
+test_expect_success 'reset -N keeps removed files as intent-to-add' '
+       echo new-file >new-file &&
+       git add new-file &&
+       git reset -N HEAD &&
+
+       tree=$(git write-tree) &&
+       git ls-tree $tree new-file >actual &&
+       >expect &&
+       test_cmp expect actual &&
+
+       git diff --name-only >actual &&
+       echo new-file >expect &&
+       test_cmp expect actual
+'
+
+test_expect_success 'reset --mixed sets up work tree' '
+       git init mixed_worktree &&
+       (
+               cd mixed_worktree &&
+               test_commit dummy
+       ) &&
+       : >expect &&
+       git --git-dir=mixed_worktree/.git --work-tree=mixed_worktree reset >actual &&
+       test_cmp expect actual
+'
+
 test_done