"git filter-branch --tag-name-filter" fails when the user-provided command attempts to trivially append text to the originally tag name, passed via stdin, due to an unexpected newline ('\n'). The newline is introduced due to "echo" piping the original tag name to the user-provided tag name filter command. The only portable usage of "echo" is without any options and escape sequences. Therefore, replacing "echo" with "printf" is a suitable, POSIX compliant alternative. Signed-off-by: Eric N. Vander Weele <ericvw@xxxxxxxxx> --- git-filter-branch.sh | 2 +- t/t7003-filter-branch.sh | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/git-filter-branch.sh b/git-filter-branch.sh index 98f1779..949cd30 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -503,7 +503,7 @@ if [ "$filter_tag_name" ]; then new_sha1="$(cat "../map/$sha1")" GIT_COMMIT="$sha1" export GIT_COMMIT - new_ref="$(echo "$ref" | eval "$filter_tag_name")" || + new_ref="$(printf "$ref" | eval "$filter_tag_name")" || die "tag name filter failed: $filter_tag_name" echo "$ref -> $new_ref ($sha1 -> $new_sha1)" diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh index 869e0bf..0db6808 100755 --- a/t/t7003-filter-branch.sh +++ b/t/t7003-filter-branch.sh @@ -269,6 +269,11 @@ test_expect_success 'Tag name filtering retains tag message' ' test_cmp expect actual ' +test_expect_success 'Tag name filter does not pass tag ref with newline' ' + git filter-branch -f --tag-name-filter "cat && printf "_append"" -- A && + git rev-parse A_append > /dev/null 2>&1 +' + faux_gpg_tag='object XXXXXX type commit tag S -- 2.6.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html