git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH] sequencer.c: terminate the last line of author-script properly

From
PWPhillip Wood <phillip.wood@talktalk.net>
Date
Jul 18, 2018, 09:45 UTC
Message-ID
<eb66f8fb-1535-37a8-526d-ed31f06c045c@talktalk.net>
In-Reply-To
<xmqqwou0xtar.fsf@gitster-ct.c.googlers.com>
Hi Junio
On 12/07/18 18:22, Junio C Hamano wrote:
Show 20 quoted lines
> 
> "Akinori MUSHA" <knu@iDaemons.org> writes:
> 
>> It looks like write_author_script() intends to write out a file in
>> Bourne shell syntax, but it doesn't put a closing single quote on the
>> last line.
> 
> s/closing single quote/& and the terminating newline/?
> 
>>
>> This patch makes .git/rebase-merge/author-script actually parsable by
>> sh(1) by adding a single quote and a linefeed to terminate the line
>> properly.
> 
> Sounds good.
> 
> I wonder why this breakage was left unnoticed for a long time,
> though.  It's not like writing and reading the author-script from C
> code was done first in the "rebase -i" and friends that are users of
> the sequencer machinery 

The only consumer of a faulty author script written by the sequencer is read_env_script() in sequencer.c which doesn't worry about checking that quotes are paired. The shell versions of rebase use the code in git-sh-setup.sh to create the author script which does write valid posix shell.

> (I think we had code to do so in "git am"
> that was rewritten in C first).

The code in builtin/am.c doesn't try to write valid posix shell (if one assumes it is the only consumer of the author script then it doesn't need to) which results in simpler code, but external scripts cannot safely eval it anymore.

>  Do we have a similar issue over
> there as well?  If not, perhaps if we reused the existing code that
> was not broken, we wouldn't have seen this breakage on the sequencer
> side?
Best Wishes
Phillip
Show 47 quoted lines
> Thanks.
> 
>>
>> Signed-off-by: Akinori MUSHA <knu@idaemons.org>
>> ---
>>   sequencer.c                   |  1 +
>>   t/t3404-rebase-interactive.sh | 13 +++++++++++++
>>   2 files changed, 14 insertions(+)
>>
>> diff --git a/sequencer.c b/sequencer.c
>> index 4034c0461..5f32b6df1 100644
>> --- a/sequencer.c
>> +++ b/sequencer.c
>> @@ -651,6 +651,7 @@ static int write_author_script(const char *message)
>>   			strbuf_addch(&buf, *(message++));
>>   		else
>>   			strbuf_addf(&buf, "'\\\\%c'", *(message++));
>> +	strbuf_addstr(&buf, "'\n");
>>   	res = write_message(buf.buf, buf.len, rebase_path_author_script(), 1);
>>   	strbuf_release(&buf);
>>   	return res;
>> diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
>> index 352a52e59..345b103eb 100755
>> --- a/t/t3404-rebase-interactive.sh
>> +++ b/t/t3404-rebase-interactive.sh
>> @@ -75,6 +75,19 @@ test_expect_success 'rebase --keep-empty' '
>>   	test_line_count = 6 actual
>>   '
>>   
>> +test_expect_success 'rebase -i writes out .git/rebase-merge/author-script in "edit" that sh(1) can parse' '
>> +	test_when_finished "git rebase --abort ||:" &&
>> +	git checkout master &&
>> +	set_fake_editor &&
>> +	FAKE_LINES="edit 1" git rebase -i HEAD^ &&
>> +	test -f .git/rebase-merge/author-script &&
>> +	unset GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_AUTHOR_DATE &&
>> +	eval "$(cat .git/rebase-merge/author-script)" &&
>> +	test "$(git show --quiet --pretty=format:%an)" = "$GIT_AUTHOR_NAME" &&
>> +	test "$(git show --quiet --pretty=format:%ae)" = "$GIT_AUTHOR_EMAIL" &&
>> +	test "$(git show --quiet --date=raw --pretty=format:@%ad)" = "$GIT_AUTHOR_DATE"
>> +'
>> +
>>   test_expect_success 'rebase -i with the exec command' '
>>   	git checkout master &&
>>   	(
>> -- 
>> 2.18.0
Previous: Junio C HamanoNext: Phillip Wood
Message 3 of 27 in “sequencer.c: terminate the last line of author-script properly”
  1. sequencer.c: terminate the last line of author-script properlyAkinori MUSHA, Jul 12, 2018
  2. Junio C HamanoJul 12, 2018
  3. Phillip WoodJul 18, 2018
  4. Phillip WoodJul 18, 2018
  5. sequencer: fix quoting in write_author_scriptPhillip Wood, Jul 18, 2018
  6. Junio C HamanoJul 24, 2018
  7. Johannes SchindelinJul 26, 2018
  8. Phillip WoodJul 27, 2018
  9. Johannes SchindelinJul 27, 2018
  10. Phillip WoodJul 30, 2018
  11. Junio C HamanoJul 18, 2018
  12. Junio C HamanoJul 18, 2018
  13. Phillip WoodJul 19, 2018
  14. Johannes SchindelinJul 26, 2018
  15. Junio C HamanoJul 26, 2018
  16. Junio C HamanoJul 12, 2018
  17. Eric SunshineJul 12, 2018
  18. Junio C HamanoJul 12, 2018
  19. Junio C HamanoJul 17, 2018
  20. Akinori MUSHAJul 18, 2018
  21. Johannes SchindelinJul 26, 2018
  22. Junio C HamanoJul 26, 2018
  23. Johannes SchindelinJul 27, 2018
  24. Junio C HamanoJul 12, 2018
  25. Phillip WoodJul 18, 2018
  26. Phillip WoodJul 18, 2018
  27. Phillip WoodJul 18, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.