git-add: adjust to the get_pathspec() changes.
[gitweb.git] / t / t3404-rebase-interactive.sh
index 817f614cde29f12e01724901e1f0b966a28d04b3..e33ea4e9f4c33cc1f94cd184c371a8fa05bedf3b 100755 (executable)
@@ -61,26 +61,31 @@ test_expect_success 'setup' '
        git tag I
 '
 
-cat > fake-editor.sh << EOF
+cat > fake-editor.sh <<\EOF
 #!/bin/sh
-test "\$1" = .git/COMMIT_EDITMSG && {
-       test -z "\$FAKE_COMMIT_MESSAGE" || echo "\$FAKE_COMMIT_MESSAGE" > "\$1"
-       test -z "\$FAKE_COMMIT_AMEND" || echo "\$FAKE_COMMIT_AMEND" >> "\$1"
+case "$1" in
+*/COMMIT_EDITMSG)
+       test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1"
+       test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1"
        exit
-}
-test -z "\$FAKE_LINES" && exit
-grep -v "^#" < "\$1" > "\$1".tmp
-rm "\$1"
-cat "\$1".tmp
+       ;;
+esac
+test -z "$EXPECT_COUNT" ||
+       test "$EXPECT_COUNT" = $(sed -e '/^#/d' -e '/^$/d' < "$1" | wc -l) ||
+       exit
+test -z "$FAKE_LINES" && exit
+grep -v '^#' < "$1" > "$1".tmp
+rm -f "$1"
+cat "$1".tmp
 action=pick
-for line in \$FAKE_LINES; do
-       case \$line in
-       squash)
-               action="\$line";;
+for line in $FAKE_LINES; do
+       case $line in
+       squash|edit)
+               action="$line";;
        *)
-               echo sed -n "\${line}s/^pick/\$action/p"
-               sed -n "\${line}p" < "\$1".tmp
-               sed -n "\${line}s/^pick/\$action/p" < "\$1".tmp >> "\$1"
+               echo sed -n "${line}s/^pick/$action/p"
+               sed -n "${line}p" < "$1".tmp
+               sed -n "${line}s/^pick/$action/p" < "$1".tmp >> "$1"
                action=pick;;
        esac
 done
@@ -95,6 +100,14 @@ test_expect_success 'no changes are a nop' '
        test $(git rev-parse I) = $(git rev-parse HEAD)
 '
 
+test_expect_success 'test the [branch] option' '
+       git checkout -b dead-end &&
+       git rm file6 &&
+       git commit -m "stop here" &&
+       git rebase -i F branch2 &&
+       test $(git rev-parse I) = $(git rev-parse HEAD)
+'
+
 test_expect_success 'rebase on top of a non-conflicting commit' '
        git checkout branch1 &&
        git tag original-branch1 &&
@@ -136,7 +149,8 @@ test_expect_success 'stop on conflicting pick' '
        diff -u expect .git/.dotest-merge/patch &&
        diff -u expect2 file1 &&
        test 4 = $(grep -v "^#" < .git/.dotest-merge/done | wc -l) &&
-       test 0 = $(grep -v "^#" < .git/.dotest-merge/todo | wc -l)
+       test 0 = $(grep -ve "^#" -e "^$" < .git/.dotest-merge/git-rebase-todo |
+               wc -l)
 '
 
 test_expect_success 'abort' '
@@ -167,7 +181,13 @@ test_expect_success 'squash' '
 '
 
 test_expect_success 'retain authorship when squashing' '
-       git show HEAD | grep "^Author: Nitfol"
+       git show HEAD | grep "^Author: Twerp Snog"
+'
+
+test_expect_success '-p handles "no changes" gracefully' '
+       HEAD=$(git rev-parse HEAD) &&
+       git rebase -i -p HEAD^ &&
+       test $HEAD = $(git rev-parse HEAD)
 '
 
 test_expect_success 'preserve merges with -p' '
@@ -251,4 +271,73 @@ test_expect_success 'interrupted squash works as expected' '
        test $one = $(git rev-parse HEAD~2)
 '
 
+test_expect_success 'interrupted squash works as expected (case 2)' '
+       for n in one two three four
+       do
+               echo $n >> conflict &&
+               git add conflict &&
+               git commit -m $n
+       done &&
+       one=$(git rev-parse HEAD~3) &&
+       ! FAKE_LINES="3 squash 1 2" git rebase -i HEAD~3 &&
+       (echo one; echo four) > conflict &&
+       git add conflict &&
+       ! git rebase --continue &&
+       (echo one; echo two; echo four) > conflict &&
+       git add conflict &&
+       ! git rebase --continue &&
+       echo resolved > conflict &&
+       git add conflict &&
+       git rebase --continue &&
+       test $one = $(git rev-parse HEAD~2)
+'
+
+test_expect_success 'ignore patch if in upstream' '
+       HEAD=$(git rev-parse HEAD) &&
+       git checkout -b has-cherry-picked HEAD^ &&
+       echo unrelated > file7 &&
+       git add file7 &&
+       test_tick &&
+       git commit -m "unrelated change" &&
+       git cherry-pick $HEAD &&
+       EXPECT_COUNT=1 git rebase -i $HEAD &&
+       test $HEAD = $(git rev-parse HEAD^)
+'
+
+test_expect_success '--continue tries to commit, even for "edit"' '
+       parent=$(git rev-parse HEAD^) &&
+       test_tick &&
+       FAKE_LINES="edit 1" git rebase -i HEAD^ &&
+       echo edited > file7 &&
+       git add file7 &&
+       FAKE_COMMIT_MESSAGE="chouette!" git rebase --continue &&
+       test edited = $(git show HEAD:file7) &&
+       git show HEAD | grep chouette &&
+       test $parent = $(git rev-parse HEAD^)
+'
+
+test_expect_success 'rebase a detached HEAD' '
+       grandparent=$(git rev-parse HEAD~2) &&
+       git checkout $(git rev-parse HEAD) &&
+       test_tick &&
+       FAKE_LINES="2 1" git rebase -i HEAD~2 &&
+       test $grandparent = $(git rev-parse HEAD~2)
+'
+
+test_expect_success 'rebase a commit violating pre-commit' '
+
+       mkdir -p .git/hooks &&
+       PRE_COMMIT=.git/hooks/pre-commit &&
+       echo "#!/bin/sh" > $PRE_COMMIT &&
+       echo "test -z \"\$(git diff --cached --check)\"" >> $PRE_COMMIT &&
+       chmod a+x $PRE_COMMIT &&
+       echo "monde! " >> file1 &&
+       test_tick &&
+       ! git commit -m doesnt-verify file1 &&
+       git commit -m doesnt-verify --no-verify file1 &&
+       test_tick &&
+       FAKE_LINES=2 git rebase -i HEAD~2
+
+'
+
 test_done