#!/bin/sh # # Copyright (c) 2011 David Caldwell # test_description='Test git stash --include-untracked' . ./test-lib.sh test_expect_success 'stash save --include-untracked 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 && echo 1 > file2 && echo 1 > HEAD && mkdir untracked && echo untracked >untracked/untracked && git stash --include-untracked && git diff-files --quiet && git diff-index --cached --quiet HEAD ' cat > expect <actual && test_cmp expect actual ' tracked=$(git rev-parse --short $(echo 1 | git hash-object --stdin)) untracked=$(git rev-parse --short $(echo untracked | git hash-object --stdin)) cat > expect.diff < expect.lstree <actual && test_cmp expect.diff actual && git ls-tree --name-only stash^3: >actual && test_cmp expect.lstree actual ' test_expect_success 'stash save --patch --include-untracked fails' ' test_must_fail git stash --patch --include-untracked ' test_expect_success 'stash save --patch --all fails' ' test_must_fail git stash --patch --all ' git clean --force --quiet cat > expect <actual && test_cmp expect actual && test "1" = "$(cat file2)" && test untracked = "$(cat untracked/untracked)" ' git clean --force --quiet -d test_expect_success 'stash save -u dirty index' ' echo 4 > file3 && git add file3 && test_tick && git stash -u ' blob=$(git rev-parse --short $(echo 4 | git hash-object --stdin)) cat > expect <actual && test_cmp expect actual ' git reset > /dev/null # Must direct output somewhere where it won't be considered an untracked file test_expect_success 'stash save --include-untracked -q is quiet' ' echo 1 > file5 && git stash save --include-untracked --quiet > .git/stash-output.out 2>&1 && test_line_count = 0 .git/stash-output.out && rm -f .git/stash-output.out ' test_expect_success 'stash save --include-untracked removed files' ' rm -f file && git stash save --include-untracked && echo 1 > expect && test_cmp expect file ' rm -f expect test_expect_success 'stash save --include-untracked removed files got stashed' ' git stash pop && test_path_is_missing file ' cat > .gitignore < ignored && mkdir ignored.d && echo ignored >ignored.d/untracked && git stash -u && test -s ignored && test -s ignored.d/untracked && test -s .gitignore ' test_expect_success 'stash save -u can stash with only untracked files different' ' echo 4 > file4 && git stash -u && test_path_is_missing file4 ' test_expect_success 'stash save --all does not respect .gitignore' ' git stash -a && test_path_is_missing ignored && test_path_is_missing ignored.d && test_path_is_missing .gitignore ' test_expect_success 'stash save --all is stash poppable' ' git stash pop && test -s ignored && test -s ignored.d/untracked && test -s .gitignore ' test_expect_success 'stash push --include-untracked with pathspec' ' >foo && >bar && git stash push --include-untracked -- foo && test_path_is_file bar && test_path_is_missing foo && git stash pop && test_path_is_file bar && test_path_is_file foo ' test_expect_success 'stash push with $IFS character' ' >"foo bar" && >foo && >bar && git add foo* && git stash push --include-untracked -- "foo b*" && test_path_is_missing "foo bar" && test_path_is_file foo && test_path_is_file bar && git stash pop && test_path_is_file "foo bar" && test_path_is_file foo && test_path_is_file bar ' cat > .gitignore <ignored.d/foo && echo "!ignored.d/foo" >> .gitignore && git stash save --include-untracked && test_path_is_missing ignored.d/foo && git stash pop && test_path_is_file ignored.d/foo ' test_expect_success 'stash -u -- doesnt print error' ' >untracked && git stash push -u -- untracked 2>actual && test_path_is_missing untracked && test_line_count = 0 actual ' test_expect_success 'stash -u -- leaves rest of working tree in place' ' >tracked && git add tracked && >untracked && git stash push -u -- untracked && test_path_is_missing untracked && test_path_is_file tracked ' test_expect_success 'stash -u -- clears changes in both' ' >tracked && git add tracked && >untracked && git stash push -u -- tracked untracked && test_path_is_missing tracked && test_path_is_missing untracked ' test_expect_success 'stash --all -- stashes ignored file' ' >ignored.d/bar && git stash push --all -- ignored.d/bar && test_path_is_missing ignored.d/bar ' test_expect_success 'stash --all -- clears changes in both' ' >tracked && git add tracked && >ignored.d/bar && git stash push --all -- tracked ignored.d/bar && test_path_is_missing tracked && test_path_is_missing ignored.d/bar ' test_expect_success 'stash -u -- leaves ignored file alone' ' >ignored.d/bar && git stash push -u -- ignored.d/bar && test_path_is_file ignored.d/bar ' test_expect_success 'stash -u -- shows no changes when there are none' ' git stash push -u -- non-existent >actual && echo "No local changes to save" >expect && test_i18ncmp expect actual ' test_expect_success 'stash -u with globs' ' >untracked.txt && git stash -u -- ":(glob)**/*.txt" && test_path_is_missing untracked.txt ' test_done