1# Helper functions used by interactive rebase tests. 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", "reword" or "drop") and the SHA1 taken 18# from the specified line. 19# 20# "exec_cmd_with_args" -- add an "exec cmd with args" line. 21# 22# "#" -- Add a comment line. 23# 24# ">" -- Add a blank line. 25 26set_fake_editor () { 27 write_script fake-editor.sh <<-\EOF 28 case "$1" in 29 */COMMIT_EDITMSG) 30 test -z "$EXPECT_HEADER_COUNT" || 31 test "$EXPECT_HEADER_COUNT" = "$(sed -n '1s/^# This is a combination of \(.*\) commits\./\1/p' < "$1")" || 32 test "# # GETTEXT POISON #" = "$(sed -n '1p' < "$1")" || 33 exit 34 test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1" 35 test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1" 36 exit 37 ;; 38 esac 39 test -z "$EXPECT_COUNT" || 40 test "$EXPECT_COUNT" = $(sed -e '/^#/d' -e '/^$/d' < "$1" | wc -l) || 41 exit 42 test -z "$FAKE_LINES" && exit 43 grep -v '^#' < "$1" > "$1".tmp 44 rm -f "$1" 45 echo 'rebase -i script before editing:' 46 cat "$1".tmp 47 action=pick 48 for line in $FAKE_LINES; do 49 case $line in 50 squash|fixup|edit|reword|drop) 51 action="$line";; 52 exec*) 53 echo "$line" | sed 's/_/ /g' >> "$1";; 54 "#") 55 echo '# comment' >> "$1";; 56 ">") 57 echo >> "$1";; 58 bad) 59 action="badcmd";; 60 fakesha) 61 echo "$action XXXXXXX False commit" >> "$1" 62 action=pick;; 63 *) 64 sed -n "${line}s/^pick/$action/p" < "$1".tmp >> "$1" 65 action=pick;; 66 esac 67 done 68 echo 'rebase -i script after editing:' 69 cat "$1" 70 EOF 71 72 test_set_editor "$(pwd)/fake-editor.sh" 73} 74 75# After set_cat_todo_editor, rebase -i will write the todo list (ignoring 76# blank lines and comments) to stdout, and exit failure (so you should run 77# it with test_must_fail). This can be used to verify the expected user 78# experience, for todo list changes that do not affect the outcome of 79# rebase; or as an extra check in addition to checking the outcome. 80 81set_cat_todo_editor () { 82 write_script fake-editor.sh <<-\EOF 83 grep "^[^#]" "$1" 84 exit 1 85 EOF 86 test_set_editor "$(pwd)/fake-editor.sh" 87} 88 89# checks that the revisions in "$2" represent a linear range with the 90# subjects in "$1" 91test_linear_range () { 92 revlist_merges=$(git rev-list --merges "$2") && 93 test -z "$revlist_merges" && 94 expected=$1 95 set -- $(git log --reverse --format=%s "$2") 96 test "$expected" = "$*" 97} 98 99reset_rebase () { 100 test_might_fail git rebase --abort && 101 git reset --hard && 102 git clean -f 103} 104 105cherry_pick () { 106 git cherry-pick -n "$2" && 107 git commit -m "$1" && 108 git tag "$1" 109} 110 111revert () { 112 git revert -n "$2" && 113 git commit -m "$1" && 114 git tag "$1" 115} 116 117make_empty () { 118 git commit --allow-empty -m "$1" && 119 git tag "$1" 120}