# compactionHeuristic=true is not used by interactive staging

7 messages from 2016-06-16 to 2016-06-16. Participants: Alex Prengère, Jeff King, Junio C Hamano, Stefan Beller.
Thread: https://gitlist.dev/t/42605

## Alex Prengère, 2016-06-14 14:22

Subject: compactionHeuristic=true is not used by interactive staging
Message-ID: <CAEtHF9Na7yppEzuutp5=98KjLucgq=7Xv9GPidhaYEuC0oeqQQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAEtHF9Na7yppEzuutp5%3D98KjLucgq%3D7Xv9GPidhaYEuC0oeqQQ%40mail.gmail.com

```
Hello,
I just did a fresh clone of git from Github and installed the version
2.9.0 on Fedora 22.

I tried the new compactionHeuristic = true, which is awesome.
The only thing that struck me was that this option was not used when
doing an interactive staging, meaning `git diff` and `git add -p` will
format patches differently. Perhaps this is intended and there is a
way to force interactive staging to use specific diff options, but I
did not find it in the doc.

Thanks,
Alex

```

## Jeff King, 2016-06-14 21:42

Subject: Re: compactionHeuristic=true is not used by interactive staging
Message-ID: <20160614214211.GB21560@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20160614214211.GB21560%40sigill.intra.peff.net
In-Reply-To: <CAEtHF9Na7yppEzuutp5=98KjLucgq=7Xv9GPidhaYEuC0oeqQQ@mail.gmail.com>

```
On Tue, Jun 14, 2016 at 04:22:54PM +0200, Alex Prengère wrote:

> Hello,
> I just did a fresh clone of git from Github and installed the version
> 2.9.0 on Fedora 22.
> 
> I tried the new compactionHeuristic = true, which is awesome.
> The only thing that struck me was that this option was not used when
> doing an interactive staging, meaning `git diff` and `git add -p` will
> format patches differently. Perhaps this is intended and there is a
> way to force interactive staging to use specific diff options, but I
> did not find it in the doc.

That's because it's handled in the "UI config", and plumbing commands
are not affected (and "add -p" is built on plumbing commands). The same
is true of diff.algorithm, for instance.

To make this work, add--interactive would have to manually enable
particular options that it thinks it can handle (and in fact this is
done with diff.algorithm already). So we'd need a patch similar to
2cc0f53 (add--interactive: respect diff.algorithm, 2013-06-12).

Nobody noticed so far because originally the compaction heuristic was on
by default, and so just worked everywhere. But we backed off on that at
the last minute after finding a few cases where the diff looks worse.

-Peff

```

## Junio C Hamano, 2016-06-14 21:45

Subject: Re: compactionHeuristic=true is not used by interactive staging
Message-ID: <xmqq37of8mx4.fsf@gitster.mtv.corp.google.com>
URL: https://gitlist.dev/e/xmqq37of8mx4.fsf%40gitster.mtv.corp.google.com
In-Reply-To: <20160614214211.GB21560@sigill.intra.peff.net>

```
Jeff King <peff@peff.net> writes:

> Nobody noticed so far because originally the compaction heuristic was on
> by default, and so just worked everywhere. But we backed off on that at
> the last minute after finding a few cases where the diff looks worse.

Yup, and that is why this is called "experimental" in the release
notes ;-)

```

## Alex Prengère, 2016-06-15 06:24

Subject: Re: compactionHeuristic=true is not used by interactive staging
Message-ID: <CAEtHF9Ne7a25cOF_6L=ZXRnmR4NbnUBDFR+6V-PryjtK8yNO8g@mail.gmail.com>
URL: https://gitlist.dev/e/CAEtHF9Ne7a25cOF_6L%3DZXRnmR4NbnUBDFR%2B6V-PryjtK8yNO8g%40mail.gmail.com
In-Reply-To: <xmqq37of8mx4.fsf@gitster.mtv.corp.google.com>

```
I see, it makes sense ;-) Indeed it would seem logical to have all
commands showing diffs (diff, add -p, log -p, reset -p, etc..) respect
the diff options.

Thanks for your quick answer!

2016-06-14 23:45 GMT+02:00 Junio C Hamano <gitster@pobox.com>:
> Jeff King <peff@peff.net> writes:
>
>> Nobody noticed so far because originally the compaction heuristic was on
>> by default, and so just worked everywhere. But we backed off on that at
>> the last minute after finding a few cases where the diff looks worse.
>
> Yup, and that is why this is called "experimental" in the release
> notes ;-)

```

## Jeff King, 2016-06-16 12:27

Subject: [PATCH] add--interactive: respect diff.compactionHeuristic
Message-ID: <20160616122729.GC15988@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20160616122729.GC15988%40sigill.intra.peff.net
In-Reply-To: <CAEtHF9Ne7a25cOF_6L=ZXRnmR4NbnUBDFR+6V-PryjtK8yNO8g@mail.gmail.com>

```
On Wed, Jun 15, 2016 at 08:24:47AM +0200, Alex Prengère wrote:

> I see, it makes sense ;-) Indeed it would seem logical to have all
> commands showing diffs (diff, add -p, log -p, reset -p, etc..) respect
> the diff options.

Here's a patch to do so, similar to what we do for diff.algorithm.

-- >8 --
Subject: add--interactive: respect diff.compactionHeuristic

We use plumbing to generate the diff, so it doesn't
automatically pick up UI config like compactionHeuristic.
Let's forward it on, since interactive adding is porcelain.

Note that we only need to handle the "true" case. There's no
point in passing --no-compaction-heuristic when the variable
is false, since nothing else could have turned it on.

Signed-off-by: Jeff King <peff@peff.net>
---
 git-add--interactive.perl | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/git-add--interactive.perl b/git-add--interactive.perl
index 822f857..642cce1 100755
--- a/git-add--interactive.perl
+++ b/git-add--interactive.perl
@@ -45,6 +45,7 @@ my ($diff_new_color) =
 my $normal_color = $repo->get_color("", "reset");
 
 my $diff_algorithm = $repo->config('diff.algorithm');
+my $diff_compaction_heuristic = $repo->config_bool('diff.compactionheuristic');
 my $diff_filter = $repo->config('interactive.difffilter');
 
 my $use_readkey = 0;
@@ -749,6 +750,9 @@ sub parse_diff {
 	if (defined $diff_algorithm) {
 		splice @diff_cmd, 1, 0, "--diff-algorithm=${diff_algorithm}";
 	}
+	if ($diff_compaction_heuristic) {
+		splice @diff_cmd, 1, 0, "--compaction-heuristic";
+	}
 	if (defined $patch_mode_revision) {
 		push @diff_cmd, get_diff_reference($patch_mode_revision);
 	}
-- 
2.9.0.160.g4984cba


```

## Stefan Beller, 2016-06-16 16:50

Subject: Re: [PATCH] add--interactive: respect diff.compactionHeuristic
Message-ID: <CAGZ79kaPVFT=yeSAkmf55+qXcCgMkwpgkC8jXhuZvqj5mWtgLw@mail.gmail.com>
URL: https://gitlist.dev/e/CAGZ79kaPVFT%3DyeSAkmf55%2BqXcCgMkwpgkC8jXhuZvqj5mWtgLw%40mail.gmail.com
In-Reply-To: <20160616122729.GC15988@sigill.intra.peff.net>

```
On Thu, Jun 16, 2016 at 5:27 AM, Jeff King <peff@peff.net> wrote:
> On Wed, Jun 15, 2016 at 08:24:47AM +0200, Alex Prengère wrote:
>
>> I see, it makes sense ;-) Indeed it would seem logical to have all
>> commands showing diffs (diff, add -p, log -p, reset -p, etc..) respect
>> the diff options.
>
> Here's a patch to do so, similar to what we do for diff.algorithm.
>
> -- >8 --
> Subject: add--interactive: respect diff.compactionHeuristic
>
> We use plumbing to generate the diff, so it doesn't
> automatically pick up UI config like compactionHeuristic.
> Let's forward it on, since interactive adding is porcelain.
>
> Note that we only need to handle the "true" case. There's no
> point in passing --no-compaction-heuristic when the variable
> is false, since nothing else could have turned it on.

because we don't want to implement --[no-]compaction-heuristic
as a command line switch to git-add?
Fine with me.

Stepping back and looking how the compaction heuristic turned out,
I think this is what we did not want to see, i.e. the need to bring it in
every command, but rather enable and release it. But we backed off
of the default-on, and now people may ask for the  --no-compaction-heuristic
in interactive add eventually, when they run into a corner case.

For now:
Reviewed-by: Stefan Beller <sbeller@google.com>

Thanks,
Stefan



>
> Signed-off-by: Jeff King <peff@peff.net>
> ---
>  git-add--interactive.perl | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/git-add--interactive.perl b/git-add--interactive.perl
> index 822f857..642cce1 100755
> --- a/git-add--interactive.perl
> +++ b/git-add--interactive.perl
> @@ -45,6 +45,7 @@ my ($diff_new_color) =
>  my $normal_color = $repo->get_color("", "reset");
>
>  my $diff_algorithm = $repo->config('diff.algorithm');
> +my $diff_compaction_heuristic = $repo->config_bool('diff.compactionheuristic');
>  my $diff_filter = $repo->config('interactive.difffilter');
>
>  my $use_readkey = 0;
> @@ -749,6 +750,9 @@ sub parse_diff {
>         if (defined $diff_algorithm) {
>                 splice @diff_cmd, 1, 0, "--diff-algorithm=${diff_algorithm}";
>         }
> +       if ($diff_compaction_heuristic) {
> +               splice @diff_cmd, 1, 0, "--compaction-heuristic";
> +       }
>         if (defined $patch_mode_revision) {
>                 push @diff_cmd, get_diff_reference($patch_mode_revision);
>         }
> --
> 2.9.0.160.g4984cba
>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

```

## Jeff King, 2016-06-16 23:40

Subject: Re: [PATCH] add--interactive: respect diff.compactionHeuristic
Message-ID: <20160616234043.GC15013@sigill.intra.peff.net>
URL: https://gitlist.dev/e/20160616234043.GC15013%40sigill.intra.peff.net
In-Reply-To: <CAGZ79kaPVFT=yeSAkmf55+qXcCgMkwpgkC8jXhuZvqj5mWtgLw@mail.gmail.com>

```
On Thu, Jun 16, 2016 at 09:50:45AM -0700, Stefan Beller wrote:

> > -- >8 --
> > Subject: add--interactive: respect diff.compactionHeuristic
> >
> > We use plumbing to generate the diff, so it doesn't
> > automatically pick up UI config like compactionHeuristic.
> > Let's forward it on, since interactive adding is porcelain.
> >
> > Note that we only need to handle the "true" case. There's no
> > point in passing --no-compaction-heuristic when the variable
> > is false, since nothing else could have turned it on.
> 
> because we don't want to implement --[no-]compaction-heuristic
> as a command line switch to git-add?
> Fine with me.

We could, but I don't think it is worth the effort (and anyway, it would
override the config :) ).

> Stepping back and looking how the compaction heuristic turned out,
> I think this is what we did not want to see, i.e. the need to bring it in
> every command, but rather enable and release it. But we backed off
> of the default-on, and now people may ask for the  --no-compaction-heuristic
> in interactive add eventually, when they run into a corner case.

Yeah, I'm not excited to be plumbing it through, especially if we just
end up flipping it on by default. But perhaps people would still want to
be able to do the opposite (turning it off for a specific case via the
config). I dunno.

> For now:
> Reviewed-by: Stefan Beller <sbeller@google.com>

Thanks.

-Peff

```
