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") || 31 exit 32 test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1" 33 test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1" 34 exit 35 ;; 36esac 37test -z "$EXPECT_COUNT" || 38 test "$EXPECT_COUNT" =$(sed -e '/^#/d' -e '/^$/d' < "$1" | wc -l)|| 39 exit 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";; 50"#") 51echo'# comment'>>"$1";; 52">") 53echo>>"$1";; 54*) 55sed-n"${line}s/^pick/$action/p"<"$1".tmp >>"$1" 56 action=pick;; 57esac 58done 59echo'rebase -i script after editing:' 60cat"$1" 61EOF 62 63 test_set_editor "$(pwd)/fake-editor.sh" 64chmod a+x fake-editor.sh 65}