1#!/bin/sh 2 3# After setting the fake editor with this function, you can 4# 5# - override the commit message with $FAKE_COMMIT_MESSAGE 6# - amend the commit message with $FAKE_COMMIT_AMEND 7# - check that non-commit messages have a certain line count with $EXPECT_COUNT 8# - check the commit count in the commit message header with $EXPECT_HEADER_COUNT 9# - rewrite a rebase -i script as directed by $FAKE_LINES. 10# $FAKE_LINES consists of a sequence of words separated by spaces. 11# The following word combinations are possible: 12# 13# "<lineno>" -- add a "pick" line with the SHA1 taken from the 14# specified line. 15# 16# "<cmd> <lineno>" -- add a line with the specified command 17# ("squash", "fixup", "edit", or "reword") and the SHA1 taken 18# from the specified line. 19# 20# "#" -- Add a comment line. 21# 22# ">" -- Add a blank line. 23 24set_fake_editor () { 25echo"#!$SHELL_PATH">fake-editor.sh 26cat>> fake-editor.sh <<\EOF 27case"$1"in 28*/COMMIT_EDITMSG) 29test -z"$EXPECT_HEADER_COUNT"|| 30test"$EXPECT_HEADER_COUNT"="$(sed -n '1s/^# This is a combination of \(.*\)commits\./\1/p' < "$1")"|| 31exit 32test -z"$FAKE_COMMIT_MESSAGE"||echo"$FAKE_COMMIT_MESSAGE">"$1" 33test -z"$FAKE_COMMIT_AMEND"||echo"$FAKE_COMMIT_AMEND">>"$1" 34exit 35;; 36esac 37test -z"$EXPECT_COUNT"|| 38test"$EXPECT_COUNT"=$(sed -e '/^#/d' -e '/^$/d' < "$1" | wc -l)|| 39exit 40test -z"$FAKE_LINES"&&exit 41grep-v'^#'<"$1">"$1".tmp 42rm-f"$1" 43echo'rebase -i script before editing:' 44cat"$1".tmp 45action=pick 46for line in$FAKE_LINES;do 47case$linein 48 squash|fixup|edit|reword) 49 action="$line";; 50exec*) 51echo"$line"|sed's/_/ /g'>>"$1";; 52"#") 53echo'# comment'>>"$1";; 54">") 55echo>>"$1";; 56*) 57sed-n"${line}s/^pick/$action/p"<"$1".tmp >>"$1" 58 action=pick;; 59esac 60done 61echo'rebase -i script after editing:' 62cat"$1" 63EOF 64 65 test_set_editor "$(pwd)/fake-editor.sh" 66chmod a+x fake-editor.sh 67} 68 69# After set_cat_todo_editor, rebase -i will write the todo list (ignoring 70# blank lines and comments) to stdout, and exit failure (so you should run 71# it with test_must_fail). This can be used to verify the expected user 72# experience, for todo list changes that do not affect the outcome of 73# rebase; or as an extra check in addition to checking the outcome. 74 75set_cat_todo_editor () { 76 write_script fake-editor.sh <<-\EOF 77grep"^[^#]""$1" 78exit1 79 EOF 80 test_set_editor "$(pwd)/fake-editor.sh" 81} 82 83# checks that the revisions in "$2" represent a linear range with the 84# subjects in "$1" 85test_linear_range () { 86 revlist_merges=$(git rev-list --merges "$2")&& 87test -z"$revlist_merges"&& 88 expected=$1 89set --$(git log --reverse --format=%s "$2") 90test"$expected"="$*" 91} 92 93reset_rebase () { 94 test_might_fail git rebase --abort&& 95 git reset--hard&& 96 git clean -f 97} 98 99cherry_pick () { 100 git cherry-pick -n"$2"&& 101 git commit -m"$1"&& 102 git tag "$1" 103} 104 105revert () { 106 git revert -n"$2"&& 107 git commit -m"$1"&& 108 git tag "$1" 109} 110 111make_empty () { 112 git commit --allow-empty -m"$1"&& 113 git tag "$1" 114}