зеркало из https://github.com/microsoft/git.git
git-rebase--interactive.sh: use printf instead of echo to print commit message
On systems with an echo which defaults to the XSI-conformant behavior (Solaris, or others using Ksh), echo will interpret certain backslashed characters as control sequences. This can cause a problem for interactive rebase when it is used to rebase commits whose commit "subject" (the first line) contains any of these backslashed sequences. In this case, echo will substitute the control sequence for the backslashed characters and either the rebased commit message will differ from the original, or the rebase process will fail. Neither is desirable. So work around this issue by replacing the echo statements used to print out portions of the commit message, with printf. Also, add a test to test for this breakage. Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil> Acked-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
ec136663c7
Коммит
938791cd01
|
@ -119,7 +119,7 @@ run 'git rebase --continue'"
|
||||||
export GIT_CHERRY_PICK_HELP
|
export GIT_CHERRY_PICK_HELP
|
||||||
|
|
||||||
warn () {
|
warn () {
|
||||||
echo "$*" >&2
|
printf '%s\n' "$*" >&2
|
||||||
}
|
}
|
||||||
|
|
||||||
output () {
|
output () {
|
||||||
|
@ -606,7 +606,7 @@ skip_unnecessary_picks () {
|
||||||
fd=1
|
fd=1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
echo "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd
|
printf '%s\n' "$command${sha1:+ }$sha1${rest:+ }$rest" >&$fd
|
||||||
done <"$TODO" >"$TODO.new" 3>>"$DONE" &&
|
done <"$TODO" >"$TODO.new" 3>>"$DONE" &&
|
||||||
mv -f "$TODO".new "$TODO" &&
|
mv -f "$TODO".new "$TODO" &&
|
||||||
case "$(peek_next_command)" in
|
case "$(peek_next_command)" in
|
||||||
|
@ -649,12 +649,12 @@ rearrange_squash () {
|
||||||
case " $used" in
|
case " $used" in
|
||||||
*" $sha1 "*) continue ;;
|
*" $sha1 "*) continue ;;
|
||||||
esac
|
esac
|
||||||
echo "$pick $sha1 $message"
|
printf '%s\n' "$pick $sha1 $message"
|
||||||
while read -r squash action msg
|
while read -r squash action msg
|
||||||
do
|
do
|
||||||
case "$message" in
|
case "$message" in
|
||||||
"$msg"*)
|
"$msg"*)
|
||||||
echo "$action $squash $action! $msg"
|
printf '%s\n' "$action $squash $action! $msg"
|
||||||
used="$used$squash "
|
used="$used$squash "
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
@ -895,7 +895,7 @@ first and then run 'git rebase --continue' again."
|
||||||
do
|
do
|
||||||
if test t != "$PRESERVE_MERGES"
|
if test t != "$PRESERVE_MERGES"
|
||||||
then
|
then
|
||||||
echo "pick $shortsha1 $rest" >> "$TODO"
|
printf '%s\n' "pick $shortsha1 $rest" >> "$TODO"
|
||||||
else
|
else
|
||||||
sha1=$(git rev-parse $shortsha1)
|
sha1=$(git rev-parse $shortsha1)
|
||||||
if test -z "$REBASE_ROOT"
|
if test -z "$REBASE_ROOT"
|
||||||
|
@ -914,7 +914,7 @@ first and then run 'git rebase --continue' again."
|
||||||
if test f = "$preserve"
|
if test f = "$preserve"
|
||||||
then
|
then
|
||||||
touch "$REWRITTEN"/$sha1
|
touch "$REWRITTEN"/$sha1
|
||||||
echo "pick $shortsha1 $rest" >> "$TODO"
|
printf '%s\n' "pick $shortsha1 $rest" >> "$TODO"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
|
@ -637,13 +637,19 @@ test_expect_success 'set up commits with funny messages' '
|
||||||
git commit -a -m "end with slash\\" &&
|
git commit -a -m "end with slash\\" &&
|
||||||
echo >>file1 &&
|
echo >>file1 &&
|
||||||
test_tick &&
|
test_tick &&
|
||||||
|
git commit -a -m "something (\000) that looks like octal" &&
|
||||||
|
echo >>file1 &&
|
||||||
|
test_tick &&
|
||||||
|
git commit -a -m "something (\n) that looks like a newline" &&
|
||||||
|
echo >>file1 &&
|
||||||
|
test_tick &&
|
||||||
git commit -a -m "another commit"
|
git commit -a -m "another commit"
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'rebase-i history with funny messages' '
|
test_expect_success 'rebase-i history with funny messages' '
|
||||||
git rev-list A..funny >expect &&
|
git rev-list A..funny >expect &&
|
||||||
test_tick &&
|
test_tick &&
|
||||||
FAKE_LINES="1 2" git rebase -i A &&
|
FAKE_LINES="1 2 3 4" git rebase -i A &&
|
||||||
git rev-list A.. >actual &&
|
git rev-list A.. >actual &&
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
|
Загрузка…
Ссылка в новой задаче