|  | #!/bin/sh | 
|  | # | 
|  | # Copyright (c) 2007 Johannes E Schindelin | 
|  | # | 
|  |  | 
|  | test_description='Test git-stash' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success 'stash some dirty working directory' ' | 
|  | echo 1 > file && | 
|  | git add file && | 
|  | test_tick && | 
|  | git commit -m initial && | 
|  | echo 2 > file && | 
|  | git add file && | 
|  | echo 3 > file && | 
|  | test_tick && | 
|  | git stash && | 
|  | git diff-files --quiet && | 
|  | git diff-index --cached --quiet HEAD | 
|  | ' | 
|  |  | 
|  | cat > expect << EOF | 
|  | diff --git a/file b/file | 
|  | index 0cfbf08..00750ed 100644 | 
|  | --- a/file | 
|  | +++ b/file | 
|  | @@ -1 +1 @@ | 
|  | -2 | 
|  | +3 | 
|  | EOF | 
|  |  | 
|  | test_expect_success 'parents of stash' ' | 
|  | test $(git rev-parse stash^) = $(git rev-parse HEAD) && | 
|  | git diff stash^2..stash > output && | 
|  | test_cmp output expect | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply needs clean working directory' ' | 
|  | echo 4 > other-file && | 
|  | git add other-file && | 
|  | echo 5 > other-file && | 
|  | test_must_fail git stash apply | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply stashed changes' ' | 
|  | git add other-file && | 
|  | test_tick && | 
|  | git commit -m other-file && | 
|  | git stash apply && | 
|  | test 3 = $(cat file) && | 
|  | test 1 = $(git show :file) && | 
|  | test 1 = $(git show HEAD:file) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'apply stashed changes (including index)' ' | 
|  | git reset --hard HEAD^ && | 
|  | echo 6 > other-file && | 
|  | git add other-file && | 
|  | test_tick && | 
|  | git commit -m other-file && | 
|  | git stash apply --index && | 
|  | test 3 = $(cat file) && | 
|  | test 2 = $(git show :file) && | 
|  | test 1 = $(git show HEAD:file) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'unstashing in a subdirectory' ' | 
|  | git reset --hard HEAD && | 
|  | mkdir subdir && | 
|  | cd subdir && | 
|  | git stash apply && | 
|  | cd .. | 
|  | ' | 
|  |  | 
|  | test_expect_success 'drop top stash' ' | 
|  | git reset --hard && | 
|  | git stash list > stashlist1 && | 
|  | echo 7 > file && | 
|  | git stash && | 
|  | git stash drop && | 
|  | git stash list > stashlist2 && | 
|  | diff stashlist1 stashlist2 && | 
|  | git stash apply && | 
|  | test 3 = $(cat file) && | 
|  | test 1 = $(git show :file) && | 
|  | test 1 = $(git show HEAD:file) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'drop middle stash' ' | 
|  | git reset --hard && | 
|  | echo 8 > file && | 
|  | git stash && | 
|  | echo 9 > file && | 
|  | git stash && | 
|  | git stash drop stash@{1} && | 
|  | test 2 = $(git stash list | wc -l) && | 
|  | git stash apply && | 
|  | test 9 = $(cat file) && | 
|  | test 1 = $(git show :file) && | 
|  | test 1 = $(git show HEAD:file) && | 
|  | git reset --hard && | 
|  | git stash drop && | 
|  | git stash apply && | 
|  | test 3 = $(cat file) && | 
|  | test 1 = $(git show :file) && | 
|  | test 1 = $(git show HEAD:file) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'stash pop' ' | 
|  | git reset --hard && | 
|  | git stash pop && | 
|  | test 3 = $(cat file) && | 
|  | test 1 = $(git show :file) && | 
|  | test 1 = $(git show HEAD:file) && | 
|  | test 0 = $(git stash list | wc -l) | 
|  | ' | 
|  |  | 
|  | cat > expect << EOF | 
|  | diff --git a/file2 b/file2 | 
|  | new file mode 100644 | 
|  | index 0000000..1fe912c | 
|  | --- /dev/null | 
|  | +++ b/file2 | 
|  | @@ -0,0 +1 @@ | 
|  | +bar2 | 
|  | EOF | 
|  |  | 
|  | cat > expect1 << EOF | 
|  | diff --git a/file b/file | 
|  | index 257cc56..5716ca5 100644 | 
|  | --- a/file | 
|  | +++ b/file | 
|  | @@ -1 +1 @@ | 
|  | -foo | 
|  | +bar | 
|  | EOF | 
|  |  | 
|  | cat > expect2 << EOF | 
|  | diff --git a/file b/file | 
|  | index 7601807..5716ca5 100644 | 
|  | --- a/file | 
|  | +++ b/file | 
|  | @@ -1 +1 @@ | 
|  | -baz | 
|  | +bar | 
|  | diff --git a/file2 b/file2 | 
|  | new file mode 100644 | 
|  | index 0000000..1fe912c | 
|  | --- /dev/null | 
|  | +++ b/file2 | 
|  | @@ -0,0 +1 @@ | 
|  | +bar2 | 
|  | EOF | 
|  |  | 
|  | test_expect_success 'stash branch' ' | 
|  | echo foo > file && | 
|  | git commit file -m first | 
|  | echo bar > file && | 
|  | echo bar2 > file2 && | 
|  | git add file2 && | 
|  | git stash && | 
|  | 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 && | 
|  | test_cmp output expect && | 
|  | git diff > output && | 
|  | test_cmp output expect1 && | 
|  | git add file && | 
|  | git commit -m alternate\ second && | 
|  | git diff master..stashbranch > output && | 
|  | test_cmp output expect2 && | 
|  | test 0 = $(git stash list | wc -l) | 
|  | ' | 
|  |  | 
|  | test_done |