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

Re: [PATCH 8/8] diff.c: rewrite emit_line_0 more understandably

From
Stefan Beller <sbeller@google.com>
Date
Aug 13, 2018, 18:57 UTC
Message-ID
<CAGZ79kZ=bs84WGeA5TbVUTbQL2ECUSwEJanMKmeWw+xKp-rH5Q@mail.gmail.com>
In-Reply-To
<nycvar.QRO.7.76.6.1808131429550.71@tvgsbejvaqbjf.bet>

On Mon, Aug 13, 2018 at 5:42 AM Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:

Show 20 quoted lines
>
> Hi Stefan,
>
> On Fri, 10 Aug 2018, Stefan Beller wrote:
>
> > emit_line_0 has no nested conditions, but puts out all its arguments
> > (if set) in order.
>
> Well, currently `emit_line_0()` *has* nested conditions: `first == '\n'`
> inside `len == 0`.
>
> And these nested conditions make things hard to read, so resolving that
> to a simpler workflow makes a ton of sense. You can sell that better by
> starting the commit message with something along the lines that you are
> making the overly complex logic easier to follow.
>
> > There is still a slight confusion with set and set_sign, but let's defer
> > that to a later patch.
>
> There is no later patch in this here patch series.

yup, I got overly excited when writing this commit message, as for what we could try next.

> I would therefore
> appreciate it if you could spend the paragraph or two on explaining
> yourself here.
noted.
Show 15 quoted lines
>
> > at "diff: add an internal option to dual-color diffs of diffs",
> > 2018-07-21), as there we broadened the meaning of 'first' to also
> > signal an early return.
>
> Did we? I thought we introduced the possibility of passing *just* a first
> character or *just* a "rest of the line". I might misremember, though.
>
> > The change in 'emit_line' makes sure that 'first' is never content, but
>
> <tongue-in-cheek>Awwww, you want to make 'first' sad all the time? That's
> not nice of you...</tongue-in-cheek>
>
> Seriously again, the adjective "content" has a different meaning than the
> noun and this ambiguity made this sentence very hard for me to parse.

So what is a good noun for the stuff that Git stores? ("stuff" is not a good one)

Show 5 quoted lines
> > always under our control, a sign or special character in the beginning
> > of the line (or 0, in which case we ignore it).
>
> It would be good to reword this paragraph to say that from now on, we will
> only pass a diff marker as `first`, or 0.
Makes sense.
Show 11 quoted lines
> > +     if (!len && !first)
> > +             goto end_of_line;
> > +
> > +     if (reverse && want_color(o->use_color)) {
>
> Since you implied `reverse` to mean that a non-`NULL` `set` *as well as*
> `set_sign` were passed in, and since a non-`NULL` `set` *implies* that we
> want color, you could drop that `want_color(o->use_color)` here.
>
> But as I stated above, I am not a fan of having such unintuitive
> implications in the code.
okay. So we'd want to be explicit about reverse again?
Show 14 quoted lines
> > +     fwrite(line, len, 1, file);
> > +     needs_reset |= len > 0;
>
> First of all, this should be a `||=`, not a `|=`.
>
> And then, this code is skipped by the `if (!len) goto end_of_line;` part
> above, so `len > 0` is *always* 1 at this point.
>
> But then, I wonder why we bother all that much. After all, we want to
> reset whenever we used color. So why not simply initialize
>
>         int need_reset = reverse || set_sign || set;
>
> and be done with it?

I just removed that line and all tests still pass. :/ I could have sworn of a failing test when writing the code that ensures that content (noun), that contains color codes, would still look okay by having a reset at the end of the line, so really we'd need to have

  need_reset = reverse || set_sign || set || (len > 0);
I'll dig into this again.

Thanks, Stefan

Previous: Johannes SchindelinNext: Stefan Beller
Message 20 of 32 in “Resending sb/range-diff-colors”
  1. 0/8 Resending sb/range-diff-colorsStefan Beller, Aug 10, 2018
  2. 1/8 test_decode_color: understand FAINT and ITALICStefan Beller, Aug 10, 2018
  3. 2/8 t3206: add color test for range-diff --dual-colorStefan Beller, Aug 10, 2018
  4. Johannes SchindelinAug 13, 2018
  5. Stefan BellerAug 13, 2018
  6. 3/8 diff.c: simplify caller of emit_line_0Stefan Beller, Aug 10, 2018
  7. Johannes SchindelinAug 13, 2018
  8. 4/8 diff.c: reorder arguments for emit_line_ws_markupStefan Beller, Aug 10, 2018
  9. Johannes SchindelinAug 13, 2018
  10. 5/8 diff.c: add set_sign to emit_line_0Stefan Beller, Aug 10, 2018
  11. Johannes SchindelinAug 13, 2018
  12. Stefan BellerAug 13, 2018
  13. 6/8 diff: use emit_line_0 once per lineStefan Beller, Aug 10, 2018
  14. Johannes SchindelinAug 13, 2018
  15. 7/8 diff.c: compute reverse locally in emit_line_0Stefan Beller, Aug 10, 2018
  16. Johannes SchindelinAug 13, 2018
  17. Stefan BellerAug 13, 2018
  18. 8/8 diff.c: rewrite emit_line_0 more understandablyStefan Beller, Aug 10, 2018
  19. Johannes SchindelinAug 13, 2018
  20. Stefan BellerAug 13, 2018
  21. Stefan BellerAug 13, 2018
  22. 0/8 Resending sb/range-diff-colorsStefan Beller, Aug 14, 2018
  23. 1/8 test_decode_color: understand FAINT and ITALICStefan Beller, Aug 14, 2018
  24. 2/8 t3206: add color test for range-diff --dual-colorStefan Beller, Aug 14, 2018
  25. 3/8 diff.c: simplify caller of emit_line_0Stefan Beller, Aug 14, 2018
  26. 4/8 diff.c: reorder arguments for emit_line_ws_markupStefan Beller, Aug 14, 2018
  27. 5/8 diff.c: add set_sign to emit_line_0Stefan Beller, Aug 14, 2018
  28. 6/8 diff: use emit_line_0 once per lineStefan Beller, Aug 14, 2018
  29. 7/8 diff.c: omit check for line prefix in emit_line_0Stefan Beller, Aug 14, 2018
  30. 8/8 diff.c: rewrite emit_line_0 more understandablyStefan Beller, Aug 14, 2018
  31. Johannes SchindelinAug 14, 2018
  32. Stefan BellerAug 14, 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.