Merge branch 'sg/ci-libsvn-perl'
[gitweb.git] / t / t3903-stash.sh
index 5f8272b6f94b513b250575c6e99e4f76d6b08e75..ea30d5f6a0f228971d29e257a89fca6ea594cecb 100755 (executable)
@@ -8,22 +8,22 @@ test_description='Test git stash'
 . ./test-lib.sh
 
 test_expect_success 'stash some dirty working directory' '
-       echo 1 > file &&
+       echo 1 >file &&
        git add file &&
        echo unrelated >other-file &&
        git add other-file &&
        test_tick &&
        git commit -m initial &&
-       echo 2 > file &&
+       echo 2 >file &&
        git add file &&
-       echo 3 > file &&
+       echo 3 >file &&
        test_tick &&
        git stash &&
        git diff-files --quiet &&
        git diff-index --cached --quiet HEAD
 '
 
-cat > expect << EOF
+cat >expect <<EOF
 diff --git a/file b/file
 index 0cfbf08..00750ed 100644
 --- a/file
@@ -35,7 +35,7 @@ EOF
 
 test_expect_success 'parents of stash' '
        test $(git rev-parse stash^) = $(git rev-parse HEAD) &&
-       git diff stash^2..stash > output &&
+       git diff stash^2..stash >output &&
        test_cmp expect output
 '
 
@@ -74,7 +74,7 @@ test_expect_success 'apply stashed changes' '
 
 test_expect_success 'apply stashed changes (including index)' '
        git reset --hard HEAD^ &&
-       echo 6 > other-file &&
+       echo 6 >other-file &&
        git add other-file &&
        test_tick &&
        git commit -m other-file &&
@@ -99,12 +99,12 @@ test_expect_success 'stash drop complains of extra options' '
 
 test_expect_success 'drop top stash' '
        git reset --hard &&
-       git stash list > stashlist1 &&
-       echo 7 > file &&
+       git stash list >expected &&
+       echo 7 >file &&
        git stash &&
        git stash drop &&
-       git stash list > stashlist2 &&
-       test_cmp stashlist1 stashlist2 &&
+       git stash list >actual &&
+       test_cmp expected actual &&
        git stash apply &&
        test 3 = $(cat file) &&
        test 1 = $(git show :file) &&
@@ -113,9 +113,9 @@ test_expect_success 'drop top stash' '
 
 test_expect_success 'drop middle stash' '
        git reset --hard &&
-       echo 8 > file &&
+       echo 8 >file &&
        git stash &&
-       echo 9 > file &&
+       echo 9 >file &&
        git stash &&
        git stash drop stash@{1} &&
        test 2 = $(git stash list | wc -l) &&
@@ -160,7 +160,7 @@ test_expect_success 'stash pop' '
        test 0 = $(git stash list | wc -l)
 '
 
-cat > expect << EOF
+cat >expect <<EOF
 diff --git a/file2 b/file2
 new file mode 100644
 index 0000000..1fe912c
@@ -170,7 +170,7 @@ index 0000000..1fe912c
 +bar2
 EOF
 
-cat > expect1 << EOF
+cat >expect1 <<EOF
 diff --git a/file b/file
 index 257cc56..5716ca5 100644
 --- a/file
@@ -180,7 +180,7 @@ index 257cc56..5716ca5 100644
 +bar
 EOF
 
-cat > expect2 << EOF
+cat >expect2 <<EOF
 diff --git a/file b/file
 index 7601807..5716ca5 100644
 --- a/file
@@ -198,79 +198,79 @@ index 0000000..1fe912c
 EOF
 
 test_expect_success 'stash branch' '
-       echo foo > file &&
+       echo foo >file &&
        git commit file -m first &&
-       echo bar > file &&
-       echo bar2 > file2 &&
+       echo bar >file &&
+       echo bar2 >file2 &&
        git add file2 &&
        git stash &&
-       echo baz > file &&
+       echo baz >file &&
        git commit file -m second &&
        git stash branch stashbranch &&
        test refs/heads/stashbranch = $(git symbolic-ref HEAD) &&
        test $(git rev-parse HEAD) = $(git rev-parse master^) &&
-       git diff --cached > output &&
+       git diff --cached >output &&
        test_cmp expect output &&
-       git diff > output &&
+       git diff >output &&
        test_cmp expect1 output &&
        git add file &&
        git commit -m alternate\ second &&
-       git diff master..stashbranch > output &&
+       git diff master..stashbranch >output &&
        test_cmp output expect2 &&
        test 0 = $(git stash list | wc -l)
 '
 
 test_expect_success 'apply -q is quiet' '
-       echo foo > file &&
+       echo foo >file &&
        git stash &&
-       git stash apply -q > output.out 2>&1 &&
+       git stash apply -q >output.out 2>&1 &&
        test_must_be_empty output.out
 '
 
 test_expect_success 'save -q is quiet' '
-       git stash save --quiet > output.out 2>&1 &&
+       git stash save --quiet >output.out 2>&1 &&
        test_must_be_empty output.out
 '
 
 test_expect_success 'pop -q is quiet' '
-       git stash pop -q > output.out 2>&1 &&
+       git stash pop -q >output.out 2>&1 &&
        test_must_be_empty output.out
 '
 
 test_expect_success 'pop -q --index works and is quiet' '
-       echo foo > file &&
+       echo foo >file &&
        git add file &&
        git stash save --quiet &&
-       git stash pop -q --index > output.out 2>&1 &&
+       git stash pop -q --index >output.out 2>&1 &&
        test foo = "$(git show :file)" &&
        test_must_be_empty output.out
 '
 
 test_expect_success 'drop -q is quiet' '
        git stash &&
-       git stash drop -q > output.out 2>&1 &&
+       git stash drop -q >output.out 2>&1 &&
        test_must_be_empty output.out
 '
 
 test_expect_success 'stash -k' '
-       echo bar3 > file &&
-       echo bar4 > file2 &&
+       echo bar3 >file &&
+       echo bar4 >file2 &&
        git add file2 &&
        git stash -k &&
        test bar,bar4 = $(cat file),$(cat file2)
 '
 
 test_expect_success 'stash --no-keep-index' '
-       echo bar33 > file &&
-       echo bar44 > file2 &&
+       echo bar33 >file &&
+       echo bar44 >file2 &&
        git add file2 &&
        git stash --no-keep-index &&
        test bar,bar2 = $(cat file),$(cat file2)
 '
 
 test_expect_success 'stash --invalid-option' '
-       echo bar5 > file &&
-       echo bar6 > file2 &&
+       echo bar5 >file &&
+       echo bar6 >file2 &&
        git add file2 &&
        test_must_fail git stash --invalid-option &&
        test_must_fail git stash save --invalid-option &&
@@ -287,6 +287,14 @@ test_expect_success 'stash an added file' '
        test new = "$(cat file3)"
 '
 
+test_expect_success 'stash --intent-to-add file' '
+       git reset --hard &&
+       echo new >file4 &&
+       git add --intent-to-add file4 &&
+       test_when_finished "git rm -f file4" &&
+       test_must_fail git stash
+'
+
 test_expect_success 'stash rm then recreate' '
        git reset --hard &&
        git rm file &&
@@ -444,6 +452,36 @@ test_expect_failure 'stash file to directory' '
        test foo = "$(cat file/file)"
 '
 
+test_expect_success 'giving too many ref arguments does not modify files' '
+       git stash clear &&
+       test_when_finished "git reset --hard HEAD" &&
+       echo foo >file2 &&
+       git stash &&
+       echo bar >file2 &&
+       git stash &&
+       test-tool chmtime =123456789 file2 &&
+       for type in apply pop "branch stash-branch"
+       do
+               test_must_fail git stash $type stash@{0} stash@{1} 2>err &&
+               test_i18ngrep "Too many revisions" err &&
+               test 123456789 = $(test-tool chmtime -g file2) || return 1
+       done
+'
+
+test_expect_success 'drop: too many arguments errors out (does nothing)' '
+       git stash list >expect &&
+       test_must_fail git stash drop stash@{0} stash@{1} 2>err &&
+       test_i18ngrep "Too many revisions" err &&
+       git stash list >actual &&
+       test_cmp expect actual
+'
+
+test_expect_success 'show: too many arguments errors out (does nothing)' '
+       test_must_fail git stash show stash@{0} stash@{1} 2>err 1>out &&
+       test_i18ngrep "Too many revisions" err &&
+       test_must_be_empty out
+'
+
 test_expect_success 'stash create - no changes' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
@@ -456,11 +494,12 @@ test_expect_success 'stash branch - no stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        git stash branch stash-branch ${STASH_ID} &&
-       test_when_finished "git reset --hard HEAD && git checkout master && git branch -D stash-branch" &&
+       test_when_finished "git reset --hard HEAD && git checkout master &&
+       git branch -D stash-branch" &&
        test $(git ls-files --modified | wc -l) -eq 1
 '
 
@@ -468,25 +507,31 @@ test_expect_success 'stash branch - stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        git stash &&
        test_when_finished "git stash drop" &&
-       echo bar >> file &&
+       echo bar >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        git stash branch stash-branch ${STASH_ID} &&
-       test_when_finished "git reset --hard HEAD && git checkout master && git branch -D stash-branch" &&
+       test_when_finished "git reset --hard HEAD && git checkout master &&
+       git branch -D stash-branch" &&
        test $(git ls-files --modified | wc -l) -eq 1
 '
 
+test_expect_success 'stash branch complains with no arguments' '
+       test_must_fail git stash branch 2>err &&
+       test_i18ngrep "No branch name specified" err
+'
+
 test_expect_success 'stash show format defaults to --stat' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        git stash &&
        test_when_finished "git stash drop" &&
-       echo bar >> file &&
+       echo bar >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        cat >expected <<-EOF &&
@@ -501,10 +546,10 @@ test_expect_success 'stash show - stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        git stash &&
        test_when_finished "git stash drop" &&
-       echo bar >> file &&
+       echo bar >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        echo "1 0       file" >expected &&
@@ -516,10 +561,10 @@ test_expect_success 'stash show -p - stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        git stash &&
        test_when_finished "git stash drop" &&
-       echo bar >> file &&
+       echo bar >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        cat >expected <<-EOF &&
@@ -539,7 +584,7 @@ test_expect_success 'stash show - no stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        echo "1 0       file" >expected &&
@@ -551,7 +596,7 @@ test_expect_success 'stash show -p - no stashes on stack, stash-like argument' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD" &&
        git reset --hard &&
-       echo foo >> file &&
+       echo foo >>file &&
        STASH_ID=$(git stash create) &&
        git reset --hard &&
        cat >expected <<-EOF &&
@@ -567,13 +612,31 @@ test_expect_success 'stash show -p - no stashes on stack, stash-like argument' '
        test_cmp expected actual
 '
 
-test_expect_success 'stash drop - fail early if specified stash is not a stash reference' '
+test_expect_success 'stash show --patience shows diff' '
+       git reset --hard &&
+       echo foo >>file &&
+       STASH_ID=$(git stash create) &&
+       git reset --hard &&
+       cat >expected <<-EOF &&
+       diff --git a/file b/file
+       index 7601807..71b52c4 100644
+       --- a/file
+       +++ b/file
+       @@ -1 +1,2 @@
+        baz
+       +foo
+       EOF
+       git stash show --patience ${STASH_ID} >actual &&
+       test_cmp expected actual
+'
+
+test_expect_success 'drop: fail early if specified stash is not a stash ref' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD && git stash clear" &&
        git reset --hard &&
-       echo foo > file &&
+       echo foo >file &&
        git stash &&
-       echo bar > file &&
+       echo bar >file &&
        git stash &&
        test_must_fail git stash drop $(git rev-parse stash@{0}) &&
        git stash pop &&
@@ -581,13 +644,13 @@ test_expect_success 'stash drop - fail early if specified stash is not a stash r
        git reset --hard HEAD
 '
 
-test_expect_success 'stash pop - fail early if specified stash is not a stash reference' '
+test_expect_success 'pop: fail early if specified stash is not a stash ref' '
        git stash clear &&
        test_when_finished "git reset --hard HEAD && git stash clear" &&
        git reset --hard &&
-       echo foo > file &&
+       echo foo >file &&
        git stash &&
-       echo bar > file &&
+       echo bar >file &&
        git stash &&
        test_must_fail git stash pop $(git rev-parse stash@{0}) &&
        git stash pop &&
@@ -597,8 +660,8 @@ test_expect_success 'stash pop - fail early if specified stash is not a stash re
 
 test_expect_success 'ref with non-existent reflog' '
        git stash clear &&
-       echo bar5 > file &&
-       echo bar6 > file2 &&
+       echo bar5 >file &&
+       echo bar6 >file2 &&
        git add file2 &&
        git stash &&
        test_must_fail git rev-parse --quiet --verify does-not-exist &&
@@ -618,8 +681,8 @@ test_expect_success 'ref with non-existent reflog' '
 test_expect_success 'invalid ref of the form stash@{n}, n >= N' '
        git stash clear &&
        test_must_fail git stash drop stash@{0} &&
-       echo bar5 > file &&
-       echo bar6 > file2 &&
+       echo bar5 >file &&
+       echo bar6 >file2 &&
        git add file2 &&
        git stash &&
        test_must_fail git stash drop stash@{1} &&
@@ -645,7 +708,7 @@ test_expect_success 'invalid ref of the form "n", n >= N' '
        git stash drop
 '
 
-test_expect_success 'stash branch should not drop the stash if the branch exists' '
+test_expect_success 'branch: do not drop the stash if the branch exists' '
        git stash clear &&
        echo foo >file &&
        git add file &&
@@ -656,7 +719,7 @@ test_expect_success 'stash branch should not drop the stash if the branch exists
        git rev-parse stash@{0} --
 '
 
-test_expect_success 'stash branch should not drop the stash if the apply fails' '
+test_expect_success 'branch: should not drop the stash if the apply fails' '
        git stash clear &&
        git reset HEAD~1 --hard &&
        echo foo >file &&
@@ -670,7 +733,7 @@ test_expect_success 'stash branch should not drop the stash if the apply fails'
        git rev-parse stash@{0} --
 '
 
-test_expect_success 'stash apply shows status same as git status (relative to current directory)' '
+test_expect_success 'apply: show same status as git status (relative to ./)' '
        git stash clear &&
        echo 1 >subdir/subfile1 &&
        echo 2 >subdir/subfile2 &&
@@ -689,7 +752,7 @@ test_expect_success 'stash apply shows status same as git status (relative to cu
        test_i18ncmp expect actual
 '
 
-cat > expect << EOF
+cat >expect <<EOF
 diff --git a/HEAD b/HEAD
 new file mode 100644
 index 0000000..fe0cbee
@@ -702,14 +765,14 @@ EOF
 test_expect_success 'stash where working directory contains "HEAD" file' '
        git stash clear &&
        git reset --hard &&
-       echo file-not-a-ref > HEAD &&
+       echo file-not-a-ref >HEAD &&
        git add HEAD &&
        test_tick &&
        git stash &&
        git diff-files --quiet &&
        git diff-index --cached --quiet HEAD &&
        test "$(git rev-parse stash^)" = "$(git rev-parse HEAD)" &&
-       git diff stash^..stash > output &&
+       git diff stash^..stash >output &&
        test_cmp expect output
 '
 
@@ -1011,7 +1074,7 @@ test_expect_success 'stash push -p with pathspec shows no changes only once' '
        test_i18ncmp expect actual
 '
 
-test_expect_success 'stash push with pathspec shows no changes when there are none' '
+test_expect_success 'push <pathspec>: show no changes when there are none' '
        >foo &&
        git add foo &&
        git commit -m "tmp" &&
@@ -1021,12 +1084,35 @@ test_expect_success 'stash push with pathspec shows no changes when there are no
        test_i18ncmp expect actual
 '
 
-test_expect_success 'stash push with pathspec not in the repository errors out' '
+test_expect_success 'push: <pathspec> not in the repository errors out' '
        >untracked &&
        test_must_fail git stash push untracked &&
        test_path_is_file untracked
 '
 
+test_expect_success 'push: -q is quiet with changes' '
+       >foo &&
+       git add foo &&
+       git stash push -q >output 2>&1 &&
+       test_must_be_empty output
+'
+
+test_expect_success 'push: -q is quiet with no changes' '
+       git stash push -q >output 2>&1 &&
+       test_must_be_empty output
+'
+
+test_expect_success 'push: -q is quiet even if there is no initial commit' '
+       git init foo_dir &&
+       test_when_finished rm -rf foo_dir &&
+       (
+               cd foo_dir &&
+               >bar &&
+               test_must_fail git stash push -q >output 2>&1 &&
+               test_must_be_empty output
+       )
+'
+
 test_expect_success 'untracked files are left in place when -u is not given' '
        >file &&
        git add file &&
@@ -1096,6 +1182,12 @@ test_expect_success 'stash -- <subdir> works with binary files' '
        test_path_is_file subdir/untracked
 '
 
+test_expect_success 'stash with user.name and user.email set works' '
+       test_config user.name "A U Thor" &&
+       test_config user.email "a.u@thor" &&
+       git stash
+'
+
 test_expect_success 'stash works when user.name and user.email are not set' '
        git reset &&
        >1 &&