#!/bin/sh # # Copyright (c) 2008 Johannes Schindelin # test_description='Test rebasing, stashing, etc. with 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 && git branch added-submodule ' 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_expect_success 'rebasing submodule that should conflict' ' git reset --hard && git checkout added-submodule && git add submodule && test_tick && git commit -m third && ( cd submodule && git commit --allow-empty -m extra ) && git add submodule && test_tick && git commit -m fourth && test_must_fail git rebase --onto HEAD^^ HEAD^ HEAD^0 && git ls-files -s submodule >actual && ( cd submodule && echo "160000 $(git rev-parse HEAD^) 1 submodule" && echo "160000 $(git rev-parse HEAD^^) 2 submodule" && echo "160000 $(git rev-parse HEAD) 3 submodule" ) >expect && test_cmp expect actual ' test_done