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

Re: [REGRESSION ps/stash-in-c] git stash show -v

From
Thomas Gummerer <t.gummerer@gmail.com>
Date
Mar 20, 2019, 21:45 UTC
Message-ID
<20190320214504.GC32487@hank.intra.tgummerer.com>
In-Reply-To
<xmqqwokuwe9w.fsf@gitster-ct.c.googlers.com>
On 03/20, Junio C Hamano wrote:
Show 24 quoted lines
> Thomas Gummerer <t.gummerer@gmail.com> writes:
> 
> > Subject: [PATCH] stash: setup default diff output format if necessary
> >
> > In the scripted 'git stash show' when no arguments are passed, we just
> > pass '--stat' to 'git diff'.  When any argument is passed to 'stash
> > show', we no longer pass '--stat' to 'git diff', and pass whatever
> > flags are passed directly through to 'git diff'.
> >
> > By default 'git diff' shows the patch output.  So when we a user uses
> > 'git stash show -v', they would be shown the diff, because that's the
> > default behaviour of 'git diff', but not actually directly triggered
> > by passing the '-v'.
> >
> > In the C version of 'git stash show', we try to emulate that
> > behaviour using the internal diff API.  However we forgot to set up
> > the default output format, in case it wasn't set by any of the flags
> > that were passed through.
> 
> Well explained.  It might have avoided such a bug if the code did
> not manually stuff the diffopt.* structure fields (instead, e.g.
> prepare an array of strings like {"diff", "--stat", NULL} and let
> the option parser diff_opt_parse() to do its job), but that is
> lamenting over water under the bridge.

I actually think this is still a valid point. I'm not too familiar with the diff API, which is why I missed this during my review in the first place, but I feel like using 'diff_opt_parse()' is still the right choice here. Both to fix this bug and to avoid potential further ones.

Let me give implementing using that a try, I have a feeling like that might turn out to be better code.

Show 32 quoted lines
> > So 'git stash show -v' in the builtin
> > version of stash would be completely silent, while it would show the
> > diff before.
> 
> That sounds reasonable.  Thanks for a quick diagnosis and a fix.
> 
> > Fix this by setting up the default output format for 'git diff'.
> >
> > Reported-by: Denton Liu <liu.denton@gmail.com>
> > Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com>
> > ---
> >  builtin/stash.c  |  4 ++++
> >  t/t3903-stash.sh | 18 ++++++++++++++++++
> >  2 files changed, 22 insertions(+)
> >
> > diff --git a/builtin/stash.c b/builtin/stash.c
> > index 51df092633..012662ce68 100644
> > --- a/builtin/stash.c
> > +++ b/builtin/stash.c
> > @@ -761,6 +761,10 @@ static int show_stash(int argc, const char **argv, const char *prefix)
> >  		free_stash_info(&info);
> >  		usage_with_options(git_stash_show_usage, options);
> >  	}
> > +	if (!rev.diffopt.output_format) {
> > +		rev.diffopt.output_format = DIFF_FORMAT_PATCH;
> > +		diff_setup_done(&rev.diffopt);
> > +	}
> 
> Hmph.  Does this result in setup_done() called twice?  As it would
> indicate another bug in the original code if setup_done() was never
> called, I am assuming that another setup_done() call in the same
> codeflow is already there.
No, it is not called anywhere, will fix that as well in v2.
Show 31 quoted lines
> >  	rev.diffopt.flags.recursive = 1;
> >  	setup_diff_pager(&rev.diffopt);
> > diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh
> > index 97cc71fbaf..e0a50ab267 100755
> > --- a/t/t3903-stash.sh
> > +++ b/t/t3903-stash.sh
> > @@ -612,6 +612,24 @@ test_expect_success 'stash show -p - no stashes on stack, stash-like argument' '
> >  	test_cmp expected actual
> >  '
> >  
> > +test_expect_success 'stash show -v shows diff' '
> > +	git reset --hard &&
> > +	echo foo >>file &&
> > +	STASH_ID=$(git stash create) &&
> > +	git reset --hard &&
> > +	cat >expected <<-EOF &&
> > +	diff --git a/file b/file
> > +	index 7601807..71b52c4 100644
> > +	--- a/file
> > +	+++ b/file
> > +	@@ -1 +1,2 @@
> > +	 baz
> > +	+foo
> > +	EOF
> > +	git stash show -v ${STASH_ID} >actual &&
> > +	test_cmp expected actual
> > +'
> > +
> >  test_expect_success 'drop: fail early if specified stash is not a stash ref' '
> >  	git stash clear &&
> >  	test_when_finished "git reset --hard HEAD && git stash clear" &&
Previous: Junio C HamanoNext: Junio C Hamano
Message 4 of 15 in “[REGRESSION ps/stash-in-c] git stash show -v”
  1. Denton LiuMar 19, 2019
  2. Thomas GummererMar 19, 2019
  3. Junio C HamanoMar 20, 2019
  4. Thomas GummererMar 20, 2019
  5. Junio C HamanoMar 20, 2019
  6. Jeff KingMar 20, 2019
  7. Duy NguyenMar 20, 2019
  8. Thomas GummererMar 20, 2019
  9. stash: setup default diff output format if necessaryThomas Gummerer, Mar 20, 2019
  10. Denton LiuMar 20, 2019
  11. Denton LiuMar 20, 2019
  12. Thomas GummererMar 28, 2019
  13. Jeff KingMar 21, 2019
  14. Junio C HamanoMar 22, 2019
  15. Jeff KingMar 22, 2019

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.