Re: Bug: git-rebase goofs up \n in commit messages
On Fri, May 25, 2007 at 09:59:43PM -0700, Junio C Hamano wrote:
> * I suspect we would declare either "war on echo" or "harder push
> for builtins" triggered by these.
Cry havoc! More fixes below (just a diff -- maybe we want to aggregate these into a single commit?).
These are the ones I noticed that use commit messages (which are probably the most likely to use backslash). There are _tons_ of uses for heads and filenames. I think we either should stop with commit messages, or go all-out and simply remove all uses of echo (because there are literally hundreds otherwise).
> - echo "$commit_only" |
> + printf "%s\n" "$commit_only" |
Is "\n" portable to all shells (i.e., do you need '\n')? It works with bash and dash, which are by far the most common, but who knows what evil lurks in the heart of Sun?
---
diff --git a/git-am.sh b/git-am.sh
index 543efd0..8b57129 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -18,7 +18,7 @@ stop_here () {
stop_here_user_resolve () {
if [ -n "$resolvemsg" ]; then
- echo "$resolvemsg"
+ printf '%s\n' "$resolvemsg"
stop_here $1
fi
cmdline=$(basename $0)
@@ -146,7 +146,7 @@ do
git_apply_opt="$git_apply_opt $1"; shift ;;
--resolvemsg=*)
- resolvemsg=$(echo "$1" | sed -e "s/^--resolvemsg=//"); shift ;;
+ resolvemsg=${1#--resolvemsg=}; shift ;;
--)
shift; break ;;
diff --git a/git-commit.sh b/git-commit.sh
diff --git a/git-merge.sh b/git-merge.sh
index 44e9b70..981d69d 100755
--- a/git-merge.sh
+++ b/git-merge.sh
@@ -335,7 +335,7 @@ f,*)
then
echo "Wonderful."
result_commit=$(
- echo "$merge_msg" |
+ printf '%s\n' "$merge_msg" |
git-commit-tree $result_tree -p HEAD -p "$1"
) || exit
finish "$result_commit" "In-index merge"
@@ -440,7 +440,7 @@ done
if test '' != "$result_tree"
then
parents=$(git-show-branch --independent "$head" "$@" | sed -e 's/^/-p /')
- result_commit=$(echo "$merge_msg" | git-commit-tree $result_tree $parents) || exit
+ result_commit=$(printf '%s\n' "$merge_msg" | git-commit-tree $result_tree $parents) || exit
finish "$result_commit" "Merge made by $wt_strategy."
dropsave
exit 0
@@ -479,7 +479,7 @@ else
do
echo $remote
done >"$GIT_DIR/MERGE_HEAD"
- echo "$merge_msg" >"$GIT_DIR/MERGE_MSG"
+ printf '%s\n' "$merge_msg" >"$GIT_DIR/MERGE_MSG"
fi
if test "$merge_was_ok" = t
diff --git a/git-tag.sh b/git-tag.sh
index 4a0a7b6..6f0b7a7 100755
--- a/git-tag.sh
+++ b/git-tag.sh
@@ -126,7 +126,7 @@ if [ "$annotate" ]; then
echo "#" ) > "$GIT_DIR"/TAG_EDITMSG
${VISUAL:-${EDITOR:-vi}} "$GIT_DIR"/TAG_EDITMSG || exit
else
- echo "$message" >"$GIT_DIR"/TAG_EDITMSG
+ printf '%s\n' "$message" >"$GIT_DIR"/TAG_EDITMSG
fi
grep -v '^#' <"$GIT_DIR"/TAG_EDITMSG |