1#!/bin/sh
   2#
   3# Copyright (c) 2008 Johannes Schindelin
   4#
   5test_description='Test rebasing and stashing with dirty submodules'
   7. ./test-lib.sh
   9test_expect_success setup '
  11        echo file > file &&
  13        git add file &&
  14        test_tick &&
  15        git commit -m initial &&
  16        git clone . submodule &&
  17        git add submodule &&
  18        test_tick &&
  19        git commit -m submodule &&
  20        echo second line >> file &&
  21        (cd submodule && git pull) &&
  22        test_tick &&
  23        git commit -m file-and-submodule -a
  24'
  26test_expect_success 'rebase with a dirty submodule' '
  28        (cd submodule &&
  30         echo 3rd line >> file &&
  31         test_tick &&
  32         git commit -m fork -a) &&
  33        echo unrelated >> file2 &&
  34        git add file2 &&
  35        test_tick &&
  36        git commit -m unrelated file2 &&
  37        echo other line >> file &&
  38        test_tick &&
  39        git commit -m update file &&
  40        CURRENT=$(cd submodule && git rev-parse HEAD) &&
  41        EXPECTED=$(git rev-parse HEAD~2:submodule) &&
  42        GIT_TRACE=1 git rebase --onto HEAD~2 HEAD^ &&
  43        STORED=$(git rev-parse HEAD:submodule) &&
  44        test $EXPECTED = $STORED &&
  45        test $CURRENT = $(cd submodule && git rev-parse HEAD)
  46'
  48cat > fake-editor.sh << \EOF
  50#!/bin/sh
  51echo $EDITOR_TEXT
  52EOF
  53chmod a+x fake-editor.sh
  54test_expect_success 'interactive rebase with a dirty submodule' '
  56        test submodule = $(git diff --name-only) &&
  58        HEAD=$(git rev-parse HEAD) &&
  59        GIT_EDITOR="\"$(pwd)/fake-editor.sh\"" EDITOR_TEXT="pick $HEAD" \
  60                git rebase -i HEAD^ &&
  61        test submodule = $(git diff --name-only)
  62'
  64test_expect_success 'rebase with dirty file and submodule fails' '
  66        echo yet another line >> file &&
  68        test_tick &&
  69        git commit -m next file &&
  70        echo rewrite > file &&
  71        test_tick &&
  72        git commit -m rewrite file &&
  73        echo dirty > file &&
  74        test_must_fail git rebase --onto HEAD~2 HEAD^
  75'
  77test_expect_success 'stash with a dirty submodule' '
  79        echo new > file &&
  81        CURRENT=$(cd submodule && git rev-parse HEAD) &&
  82        git stash &&
  83        test new != $(cat file) &&
  84        test submodule = $(git diff --name-only) &&
  85        test $CURRENT = $(cd submodule && git rev-parse HEAD) &&
  86        git stash apply &&
  87        test new = $(cat file) &&
  88        test $CURRENT = $(cd submodule && git rev-parse HEAD)
  89'
  91test_done