|  | #!/bin/sh | 
|  | # | 
|  | # Copyright (c) 2008 Johannes Schindelin | 
|  | # | 
|  |  | 
|  | test_description='Test rebasing and stashing with dirty submodules' | 
|  |  | 
|  | . ./test-lib.sh | 
|  |  | 
|  | test_expect_success setup ' | 
|  |  | 
|  | echo file > file && | 
|  | git add file && | 
|  | test_tick && | 
|  | git commit -m initial && | 
|  | git clone . submodule && | 
|  | git add submodule && | 
|  | test_tick && | 
|  | git commit -m submodule && | 
|  | echo second line >> file && | 
|  | (cd submodule && git pull) && | 
|  | test_tick && | 
|  | git commit -m file-and-submodule -a | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'rebase with a dirty submodule' ' | 
|  |  | 
|  | (cd submodule && | 
|  | echo 3rd line >> file && | 
|  | test_tick && | 
|  | git commit -m fork -a) && | 
|  | echo unrelated >> file2 && | 
|  | git add file2 && | 
|  | test_tick && | 
|  | git commit -m unrelated file2 && | 
|  | echo other line >> file && | 
|  | test_tick && | 
|  | git commit -m update file && | 
|  | CURRENT=$(cd submodule && git rev-parse HEAD) && | 
|  | EXPECTED=$(git rev-parse HEAD~2:submodule) && | 
|  | GIT_TRACE=1 git rebase --onto HEAD~2 HEAD^ && | 
|  | STORED=$(git rev-parse HEAD:submodule) && | 
|  | test $EXPECTED = $STORED && | 
|  | test $CURRENT = $(cd submodule && git rev-parse HEAD) | 
|  |  | 
|  | ' | 
|  |  | 
|  | cat > fake-editor.sh << \EOF | 
|  | #!/bin/sh | 
|  | echo $EDITOR_TEXT | 
|  | EOF | 
|  | chmod a+x fake-editor.sh | 
|  |  | 
|  | test_expect_success 'interactive rebase with a dirty submodule' ' | 
|  |  | 
|  | test submodule = $(git diff --name-only) && | 
|  | HEAD=$(git rev-parse HEAD) && | 
|  | GIT_EDITOR="\"$(pwd)/fake-editor.sh\"" EDITOR_TEXT="pick $HEAD" \ | 
|  | git rebase -i HEAD^ && | 
|  | test submodule = $(git diff --name-only) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'rebase with dirty file and submodule fails' ' | 
|  |  | 
|  | echo yet another line >> file && | 
|  | test_tick && | 
|  | git commit -m next file && | 
|  | echo rewrite > file && | 
|  | test_tick && | 
|  | git commit -m rewrite file && | 
|  | echo dirty > file && | 
|  | test_must_fail git rebase --onto HEAD~2 HEAD^ | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_expect_success 'stash with a dirty submodule' ' | 
|  |  | 
|  | echo new > file && | 
|  | CURRENT=$(cd submodule && git rev-parse HEAD) && | 
|  | git stash && | 
|  | test new != $(cat file) && | 
|  | test submodule = $(git diff --name-only) && | 
|  | test $CURRENT = $(cd submodule && git rev-parse HEAD) && | 
|  | git stash apply && | 
|  | test new = $(cat file) && | 
|  | test $CURRENT = $(cd submodule && git rev-parse HEAD) | 
|  |  | 
|  | ' | 
|  |  | 
|  | test_done |