Re: [PATCH] filter-branch: pass tag name via stdin without newline
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Dec 7, 2015, 02:55 UTC
- Message-ID
- <xmqqd1ujnf1i.fsf@gitster.mtv.corp.google.com>
- In-Reply-To
- <1449451046-19752-1-git-send-email-ericvw@gmail.com>
"Eric N. Vander Weele" <ericvw@gmail.com> writes:
Show 5 quoted lines
> "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.Is there any other place where we feed such an incomplete line (i.e. a line without the terminating LF) to the filters in this command?
I am guessing that the answer to that question would be no, and all existing scripts by users expect the newline at the end of each line. So I would have to say that "due to an unexpected newline" is a misleading statement--isn't it a bug in your filter that it did not expect one?
> The only portable usage of "echo" is without any options and escape > sequences. Therefore, replacing "echo" with "printf" is a suitable, > POSIX compliant alternative.
Yes, if we wanted to emit an incomplete line, we would be using
printf "%s" "$var"
instead of
echo -n "$var"
for portability. But that would not belong to the log message for this patch. If the patch were to correct a script that originally used "echo -n" to produce an incomplete line to instead use "printf", these three lines would have been a perfect log message.
Thanks.
Show 35 quoted lines
> Signed-off-by: Eric N. Vander Weele <ericvw@gmail.com> > --- > 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