All of lore.kernel.org
 help / color / mirror / Atom feed
* [BUG] git log -L ... -s does not suppress diff output
@ 2019-02-25 17:03 Matthew Booth
  2019-02-25 17:18 ` Jeff King
  0 siblings, 1 reply; 6+ messages in thread
From: Matthew Booth @ 2019-02-25 17:03 UTC (permalink / raw)
  To: git

Example output:

=========
$ git --version
git version 2.20.1

$ git log -L 2957,3107:nova/compute/manager.py -s
commit 35ce77835bb271bad3c18eaf22146edac3a42ea0
<snip>

diff --git a/nova/compute/manager.py b/nova/compute/manager.py
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -2937,152 +2921,151 @@
     def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
                          injected_files, new_pass, orig_sys_metadata,
<snip>
=========

git log docs suggest it should not do this:

       -s, --no-patch
           Suppress diff output. Useful for commands like git show
that show the patch by default, or to cancel
           the effect of --patch.

Couldn't find anything in a search of the archives of this mailing
list, although that's obviously far from conclusive. Seems to be
longstanding, as it was mentioned on StackOverflow back in 2015:

https://stackoverflow.com/questions/31709785/git-line-log-git-l-suppress-diff

Matt
-- 
Matthew Booth
Red Hat OpenStack Engineer, Compute DFG

Phone: +442070094448 (UK)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [BUG] git log -L ... -s does not suppress diff output
  2019-02-25 17:03 [BUG] git log -L ... -s does not suppress diff output Matthew Booth
@ 2019-02-25 17:18 ` Jeff King
  2019-02-25 17:32   ` [PATCH] line-log: suppress diff output with "-s" Jeff King
  2019-02-25 18:46   ` [BUG] git log -L ... -s does not suppress diff output Randall S. Becker
  0 siblings, 2 replies; 6+ messages in thread
From: Jeff King @ 2019-02-25 17:18 UTC (permalink / raw)
  To: Matthew Booth; +Cc: git

On Mon, Feb 25, 2019 at 05:03:50PM +0000, Matthew Booth wrote:

> Example output:
> 
> =========
> $ git --version
> git version 2.20.1
> 
> $ git log -L 2957,3107:nova/compute/manager.py -s
> commit 35ce77835bb271bad3c18eaf22146edac3a42ea0
> <snip>
> 
> diff --git a/nova/compute/manager.py b/nova/compute/manager.py
> --- a/nova/compute/manager.py
> +++ b/nova/compute/manager.py
> @@ -2937,152 +2921,151 @@
>      def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
>                           injected_files, new_pass, orig_sys_metadata,
> <snip>
> =========

At first I wondered why you would want to do this, since the point of -L
is to walk through that diff. But I suppose you might want to see just
the commits, without the actual patch, and that's what "-s" ought to do.

> git log docs suggest it should not do this:
> 
>        -s, --no-patch
>            Suppress diff output. Useful for commands like git show
> that show the patch by default, or to cancel
>            the effect of --patch.
> 
> Couldn't find anything in a search of the archives of this mailing
> list, although that's obviously far from conclusive. Seems to be
> longstanding, as it was mentioned on StackOverflow back in 2015:

I think the issue is just that "-L" follows a very different code path
than the normal diff generator. Perhaps something like this helps?

diff --git a/line-log.c b/line-log.c
index 63df51a08f..ed46a3a493 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1106,7 +1106,8 @@ int line_log_print(struct rev_info *rev, struct commit *commit)
 	struct line_log_data *range = lookup_line_range(rev, commit);
 
 	show_log(rev);
-	dump_diff_hacky(rev, range);
+	if (!(rev->diffopt.output_format & DIFF_FORMAT_NO_OUTPUT))
+		dump_diff_hacky(rev, range);
 	return 1;
 }
 

-Peff

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH] line-log: suppress diff output with "-s"
  2019-02-25 17:18 ` Jeff King
@ 2019-02-25 17:32   ` Jeff King
  2019-02-25 17:59     ` SZEDER Gábor
  2019-02-25 18:46   ` [BUG] git log -L ... -s does not suppress diff output Randall S. Becker
  1 sibling, 1 reply; 6+ messages in thread
From: Jeff King @ 2019-02-25 17:32 UTC (permalink / raw)
  To: Matthew Booth; +Cc: git

On Mon, Feb 25, 2019 at 12:18:17PM -0500, Jeff King wrote:

> > git log docs suggest it should not do this:
> > 
> >        -s, --no-patch
> >            Suppress diff output. Useful for commands like git show
> > that show the patch by default, or to cancel
> >            the effect of --patch.
> > 
> > Couldn't find anything in a search of the archives of this mailing
> > list, although that's obviously far from conclusive. Seems to be
> > longstanding, as it was mentioned on StackOverflow back in 2015:
> 
> I think the issue is just that "-L" follows a very different code path
> than the normal diff generator. Perhaps something like this helps?

Here it is with a test and a commit message (I don't think any doc
update is necessary; as you noted, the docs already imply this is what
should happen).

-- >8 --
Subject: [PATCH] line-log: suppress diff output with "-s"

When "-L" is in use, we ignore any diff output format that the user
provides to us, and just always print a patch (with extra context lines
covering the whole area of interest). It's not entirely clear what we
should do with all formats (e.g., should "--stat" show just the diffstat
of the touched lines, or the stat for the whole file?).

But "-s" is pretty clear: the user probably wants to see just the
commits that touched those lines, without any diff at all. Let's at
least make that work.

Signed-off-by: Jeff King <peff@peff.net>
---
This punts completely on the larger question of what should happen with
other formats like "--stat", "--raw", etc. They'll continue to be
ignored entirely and we'll generate the line-log patch. Possibly we
should detect and complain?

 line-log.c          | 3 ++-
 t/t4211-line-log.sh | 7 +++++++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/line-log.c b/line-log.c
index 24e21731c4..863f5cbe0f 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1106,7 +1106,8 @@ int line_log_print(struct rev_info *rev, struct commit *commit)
 	struct line_log_data *range = lookup_line_range(rev, commit);
 
 	show_log(rev);
-	dump_diff_hacky(rev, range);
+	if (!(rev->diffopt.output_format & DIFF_FORMAT_NO_OUTPUT))
+		dump_diff_hacky(rev, range);
 	return 1;
 }
 
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh
index bd5fe4d148..c9f2036f68 100755
--- a/t/t4211-line-log.sh
+++ b/t/t4211-line-log.sh
@@ -115,4 +115,11 @@ test_expect_success 'range_set_union' '
 	git log $(for x in $(test_seq 200); do echo -L $((2*x)),+1:c.c; done)
 '
 
+test_expect_success '-s shows only line-log commits' '
+	git log --format="commit %s" -L1,24:b.c >expect.raw &&
+	grep ^commit expect.raw >expect &&
+	git log --format="commit %s" -L1,24:b.c -s >actual &&
+	test_cmp expect actual
+'
+
 test_done
-- 
2.21.0.672.g12e864cee7


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] line-log: suppress diff output with "-s"
  2019-02-25 17:32   ` [PATCH] line-log: suppress diff output with "-s" Jeff King
@ 2019-02-25 17:59     ` SZEDER Gábor
  2019-02-25 18:55       ` Jeff King
  0 siblings, 1 reply; 6+ messages in thread
From: SZEDER Gábor @ 2019-02-25 17:59 UTC (permalink / raw)
  To: Jeff King; +Cc: Matthew Booth, git

On Mon, Feb 25, 2019 at 12:32:49PM -0500, Jeff King wrote:
> diff --git a/line-log.c b/line-log.c
> index 24e21731c4..863f5cbe0f 100644
> --- a/line-log.c
> +++ b/line-log.c
> @@ -1106,7 +1106,8 @@ int line_log_print(struct rev_info *rev, struct commit *commit)
>  	struct line_log_data *range = lookup_line_range(rev, commit);

Note that the result of this lookup_line_range() call is only used
when we do show the diff below; if we don't, there is no use calling
it.

>  	show_log(rev);
> -	dump_diff_hacky(rev, range);
> +	if (!(rev->diffopt.output_format & DIFF_FORMAT_NO_OUTPUT))
> +		dump_diff_hacky(rev, range);
>  	return 1;
>  }
>  

^ permalink raw reply	[flat|nested] 6+ messages in thread

* RE: [BUG] git log -L ... -s does not suppress diff output
  2019-02-25 17:18 ` Jeff King
  2019-02-25 17:32   ` [PATCH] line-log: suppress diff output with "-s" Jeff King
@ 2019-02-25 18:46   ` Randall S. Becker
  1 sibling, 0 replies; 6+ messages in thread
From: Randall S. Becker @ 2019-02-25 18:46 UTC (permalink / raw)
  To: 'Jeff King', 'Matthew Booth'; +Cc: git

On February 25, 2019 12:18, Jeff King wrote:
> To: Matthew Booth <mbooth@redhat.com>
> Cc: git@vger.kernel.org
> Subject: Re: [BUG] git log -L ... -s does not suppress diff output
> 
> On Mon, Feb 25, 2019 at 05:03:50PM +0000, Matthew Booth wrote:
> 
> > Example output:
> >
> > =========
> > $ git --version
> > git version 2.20.1
> >
> > $ git log -L 2957,3107:nova/compute/manager.py -s commit
> > 35ce77835bb271bad3c18eaf22146edac3a42ea0
> > <snip>
> >
> > diff --git a/nova/compute/manager.py b/nova/compute/manager.py
> > --- a/nova/compute/manager.py
> > +++ b/nova/compute/manager.py
> > @@ -2937,152 +2921,151 @@
> >      def rebuild_instance(self, context, instance, orig_image_ref, image_ref,
> >                           injected_files, new_pass, orig_sys_metadata,
> > <snip> =========
> 
> At first I wondered why you would want to do this, since the point of -L is to
> walk through that diff. But I suppose you might want to see just the commits,
> without the actual patch, and that's what "-s" ought to do.
> 
> > git log docs suggest it should not do this:
> >
> >        -s, --no-patch
> >            Suppress diff output. Useful for commands like git show
> > that show the patch by default, or to cancel
> >            the effect of --patch.
> >
> > Couldn't find anything in a search of the archives of this mailing
> > list, although that's obviously far from conclusive. Seems to be
> > longstanding, as it was mentioned on StackOverflow back in 2015:
> 
> I think the issue is just that "-L" follows a very different code path than the
> normal diff generator. Perhaps something like this helps?
> 
> diff --git a/line-log.c b/line-log.c
> index 63df51a08f..ed46a3a493 100644
> --- a/line-log.c
> +++ b/line-log.c
> @@ -1106,7 +1106,8 @@ int line_log_print(struct rev_info *rev, struct
> commit *commit)
>  	struct line_log_data *range = lookup_line_range(rev, commit);
> 
>  	show_log(rev);
> -	dump_diff_hacky(rev, range);
> +	if (!(rev->diffopt.output_format & DIFF_FORMAT_NO_OUTPUT))
> +		dump_diff_hacky(rev, range);
>  	return 1;
>  }

I hit this about 6 months ago while trying to show off git to some colleagues - it was on 2.8.5. Sadly I forgot about it. Glad it came back.
Thanks.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] line-log: suppress diff output with "-s"
  2019-02-25 17:59     ` SZEDER Gábor
@ 2019-02-25 18:55       ` Jeff King
  0 siblings, 0 replies; 6+ messages in thread
From: Jeff King @ 2019-02-25 18:55 UTC (permalink / raw)
  To: SZEDER Gábor; +Cc: Matthew Booth, git

On Mon, Feb 25, 2019 at 06:59:18PM +0100, SZEDER Gábor wrote:

> On Mon, Feb 25, 2019 at 12:32:49PM -0500, Jeff King wrote:
> > diff --git a/line-log.c b/line-log.c
> > index 24e21731c4..863f5cbe0f 100644
> > --- a/line-log.c
> > +++ b/line-log.c
> > @@ -1106,7 +1106,8 @@ int line_log_print(struct rev_info *rev, struct commit *commit)
> >  	struct line_log_data *range = lookup_line_range(rev, commit);
> 
> Note that the result of this lookup_line_range() call is only used
> when we do show the diff below; if we don't, there is no use calling
> it.

Thanks. I think sometimes we can depend on an optimizing compiler to
delay the initialization until use, but in this case the function call
is much too complex to be reordered. Here's a v2 which bumps it down.

-- >8 --
Subject: [PATCH v2] line-log: suppress diff output with "-s"

When "-L" is in use, we ignore any diff output format that the user
provides to us, and just always print a patch (with extra context lines
covering the whole area of interest). It's not entirely clear what we
should do with all formats (e.g., should "--stat" show just the diffstat
of the touched lines, or the stat for the whole file?).

But "-s" is pretty clear: the user probably wants to see just the
commits that touched those lines, without any diff at all. Let's at
least make that work.

Signed-off-by: Jeff King <peff@peff.net>
---
 line-log.c          | 6 ++++--
 t/t4211-line-log.sh | 7 +++++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/line-log.c b/line-log.c
index 24e21731c4..59248e37cc 100644
--- a/line-log.c
+++ b/line-log.c
@@ -1103,10 +1103,12 @@ static int process_all_files(struct line_log_data **range_out,
 
 int line_log_print(struct rev_info *rev, struct commit *commit)
 {
-	struct line_log_data *range = lookup_line_range(rev, commit);
 
 	show_log(rev);
-	dump_diff_hacky(rev, range);
+	if (!(rev->diffopt.output_format & DIFF_FORMAT_NO_OUTPUT)) {
+		struct line_log_data *range = lookup_line_range(rev, commit);
+		dump_diff_hacky(rev, range);
+	}
 	return 1;
 }
 
diff --git a/t/t4211-line-log.sh b/t/t4211-line-log.sh
index bd5fe4d148..c9f2036f68 100755
--- a/t/t4211-line-log.sh
+++ b/t/t4211-line-log.sh
@@ -115,4 +115,11 @@ test_expect_success 'range_set_union' '
 	git log $(for x in $(test_seq 200); do echo -L $((2*x)),+1:c.c; done)
 '
 
+test_expect_success '-s shows only line-log commits' '
+	git log --format="commit %s" -L1,24:b.c >expect.raw &&
+	grep ^commit expect.raw >expect &&
+	git log --format="commit %s" -L1,24:b.c -s >actual &&
+	test_cmp expect actual
+'
+
 test_done
-- 
2.21.0.674.ga8a7ac9a24


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2019-02-25 18:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-02-25 17:03 [BUG] git log -L ... -s does not suppress diff output Matthew Booth
2019-02-25 17:18 ` Jeff King
2019-02-25 17:32   ` [PATCH] line-log: suppress diff output with "-s" Jeff King
2019-02-25 17:59     ` SZEDER Gábor
2019-02-25 18:55       ` Jeff King
2019-02-25 18:46   ` [BUG] git log -L ... -s does not suppress diff output Randall S. Becker

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.