|  | #!/bin/sh | 
|  |  | 
|  | test_description='stash can handle submodules' | 
|  |  | 
|  | . ./test-lib.sh | 
|  | . "$TEST_DIRECTORY"/lib-submodule-update.sh | 
|  |  | 
|  | git_stash () { | 
|  | git status -su >expect && | 
|  | ls -1pR * >>expect && | 
|  | may_only_be_test_must_fail "$2" && | 
|  | $2 git read-tree -u -m "$1" && | 
|  | if test -n "$2" | 
|  | then | 
|  | return | 
|  | fi && | 
|  | git stash && | 
|  | git status -su >actual && | 
|  | ls -1pR * >>actual && | 
|  | test_cmp expect actual && | 
|  | git stash apply | 
|  | } | 
|  |  | 
|  | KNOWN_FAILURE_STASH_DOES_IGNORE_SUBMODULE_CHANGES=1 | 
|  | KNOWN_FAILURE_CHERRY_PICK_SEES_EMPTY_COMMIT=1 | 
|  | KNOWN_FAILURE_NOFF_MERGE_DOESNT_CREATE_EMPTY_SUBMODULE_DIR=1 | 
|  | test_submodule_switch_func "git_stash" | 
|  |  | 
|  | setup_basic () { | 
|  | test_when_finished "rm -rf main sub" && | 
|  | git init sub && | 
|  | ( | 
|  | cd sub && | 
|  | test_commit sub_file | 
|  | ) && | 
|  | git init main && | 
|  | ( | 
|  | cd main && | 
|  | git -c protocol.file.allow=always submodule add ../sub && | 
|  | test_commit main_file | 
|  | ) | 
|  | } | 
|  |  | 
|  | test_expect_success 'stash push with submodule.recurse=true preserves dirty submodule worktree' ' | 
|  | setup_basic && | 
|  | ( | 
|  | cd main && | 
|  | git config submodule.recurse true && | 
|  | echo "x" >main_file.t && | 
|  | echo "y" >sub/sub_file.t && | 
|  | git stash push && | 
|  | test_must_fail git -C sub diff --quiet | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_expect_success 'stash push and pop with submodule.recurse=true preserves dirty submodule worktree' ' | 
|  | setup_basic && | 
|  | ( | 
|  | cd main && | 
|  | git config submodule.recurse true && | 
|  | echo "x" >main_file.t && | 
|  | echo "y" >sub/sub_file.t && | 
|  | git stash push && | 
|  | git stash pop && | 
|  | test_must_fail git -C sub diff --quiet | 
|  | ) | 
|  | ' | 
|  |  | 
|  | test_done |