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

Re: [PATCH 0/3] batch blob diff generation

From
Jeff King <peff@peff.net>
Date
Dec 16, 2024, 11:30 UTC
Message-ID
<20241216113042.GC2201417@coredump.intra.peff.net>
In-Reply-To
<xmqqa5cw8r8k.fsf@gitster.g>
On Sun, Dec 15, 2024 at 03:24:11PM -0800, Junio C Hamano wrote:
Show 16 quoted lines
> > Funny.  The raw diff format indeed was designed as an interchange
> > format from various "compare two sets of things" front-ends (like
> > diff-files, diff-cache, and diff-tree) that emits the raw format, to
> > be read by "diff-helper" (initially called "diff-tree-helper") that
> > takes the raw format and
> >
> >  - matches removed and added paths with similar contents to detect
> >    renames and copies
> >
> >  - computes the output in various formats including "patch".
> >
> > So I guess we came a full circle, finally ;-).  Looking in the archive
> > for messages exchanged between junkio@ and torvalds@ mentioning diff
> > before 2005-05-30 finds some interesting gems.
> >
> > https://lore.kernel.org/git/7v1x8zsamn.fsf_-_@assigned-by-dhcp.cox.net/

:) That same thread was linked when I posted the original diff-pairs many years ago.

Show 11 quoted lines
> So, if we were to do what Justin tried to do honoring the overall
> design of our diff machinery, I think what we can do is as follows:
> 
>  * Use the "diff --raw" output format as the input, but with a bit
>    of twist.
> 
>    (1) a narrow special case that takes only a single diff_filepair
>        of <old> and <new> blobs, and immediately run diff_queue() on
>        that single diff_filepair, which is Justin's use case.  For
>        this mode of operation, "flush after reach record of input"
>        may be sufficient.

My understanding was that he does not actually care about this case (just feeding two blobs), but is actually processing --raw output in the first place. Or did you just mean that we'd still be feeding raw output, but just getting the flush behavior?

Show 11 quoted lines
>    (2) as a general "interchange format" to feed "comparison between
>        two sets of <object, path>" into our diff machinery, we are
>        better off if we can treat the input stream as multiple
>        records that describes comparison between two sets.  Imagine
>        "git log --oneline --first-parent -2 --raw HEAD", where one
>        set of "diff --raw" records show the changed blobs with their
>        paths between HEAD~1 and HEAD, and another set does so for
>        HEAD~2 and HEAD~1.  We need to be able to tell where the
>        first set ends and the second set starts, so that rename
>        detection and other things, if requested, can be done within
>        each set.

Seems reasonable. For the use of diff-pairs at GitHub, I always just did full-tree things like rename detection in the initial diff-tree invocation. Since my goal was splitting/filtering, doing it after would yield wrong answers (since diff-pairs never sees the complete set).

But it's possible for somebody to want to filter the intermediate results, then do full-tree stuff on the result (or even just delay the cost of rename detection). And certainly it's possible to want to feed a whole bunch of unrelated diff segments without having to spawn a process for each.

So it's not something I wanted, but I agree it's good to plan for.
Show 20 quoted lines
>    My recommendation is to use a single blank line as a separator,
>    e.g.
> 
>         :100644 100644 ce31f93061 9829984b0a M	Documentation/git-refs.txt
>         :100644 100644 8b3882cff1 4a74f7c7bd M	refs.c
>         :100755 100755 1bfff3a7af f59bc4860f M	t/t1460-refs-migrate.sh
> 
>         :100644 100644 c11213f520 8953d1c6d3 M	refs/files-backend.c
>         :100644 100644 b2e3ba877d bec5962deb M	refs/reftable-backend.c
> 
>    so an application that wants to compare only one diff_filepair
>    at a time would issue something like
> 
>         :100644 100644 ce31f93061 9829984b0a M	Documentation/git-refs.txt
> 
>         :100644 100644 8b3882cff1 4a74f7c7bd M	refs.c
> 
>         :100755 100755 1bfff3a7af f59bc4860f M	t/t1460-refs-migrate.sh
> 
>    so the parsing machinery does not have to worry about case (1) above.

Yeah, that seems good. And it is backwards-compatible with the existing diff-pairs format (which just barfs on a blank line). That's not a big concern for the project, but it is nice that it makes life a bit simpler for folks who would eventually be tasked with switching from it to this new tool. ;)

Show 6 quoted lines
>  * Parse and append the input into diff_queue(), until you see an
>    blank line.
> 
>    - If at EOF you are done, but if you have something accumulated
>      in diff_queue(), show them (like below) first.  In any case, at
>      EOF, you are done.
Yep, makes sense.
>  * Run diffcore_std() followed by diff_flush() to have the contents
>    of the queue nicely formatted and emptied.  Go back to parsing
>    more input lines.

That makes sense. I don't think my diff-pairs runs diffcore_std() at all. The plumbing defaults mean it would always be a noop unless you explicitly passed in rename, etc, options, and I never wanted to do that.

We might have to check the interaction of diffcore code on a set of queued diffs that already have values for renames, etc. I.e., that:

  git diff-tree --raw -M |
  git diff-pairs -M

does not barf, since the input step in diff-pairs is going to set status to 'R', etc, in the pairs.

-Peff
Previous: Junio C HamanoNext: Justin Tobler
Message 20 of 78 in “batch blob diff generation”
  1. 0/3 batch blob diff generationJustin Tobler, Dec 13, 2024
  2. 1/3 builtin: introduce diff-blob commandJustin Tobler, Dec 13, 2024
  3. 2/3 builtin/diff-blob: add "--stdin" optionJustin Tobler, Dec 13, 2024
  4. 3/3 builtin/diff-blob: Add "-z" optionJustin Tobler, Dec 13, 2024
  5. Jeff KingDec 13, 2024
  6. Junio C HamanoDec 13, 2024
  7. Jeff KingDec 13, 2024
  8. Junio C HamanoDec 15, 2024
  9. Junio C HamanoDec 15, 2024
  10. Jeff KingDec 16, 2024
  11. Junio C HamanoDec 16, 2024
  12. Jeff KingDec 18, 2024
  13. Junio C HamanoDec 18, 2024
  14. Jeff KingDec 20, 2024
  15. Jeff KingDec 20, 2024
  16. Justin ToblerDec 13, 2024
  17. Jeff KingDec 16, 2024
  18. Junio C HamanoDec 13, 2024
  19. Junio C HamanoDec 15, 2024
  20. Jeff KingDec 16, 2024
  21. 0/3 batch blob diff generationJustin Tobler, Feb 12, 2025
  22. 1/3 diff: return diff_filepair from diff queue helpersJustin Tobler, Feb 12, 2025
  23. Karthik NayakFeb 12, 2025
  24. Justin ToblerFeb 12, 2025
  25. Patrick SteinhardtFeb 12, 2025
  26. Justin ToblerFeb 12, 2025
  27. Patrick SteinhardtFeb 13, 2025
  28. 2/3 builtin: introduce diff-pairs commandJustin Tobler, Feb 12, 2025
  29. Patrick SteinhardtFeb 12, 2025
  30. Karthik NayakFeb 12, 2025
  31. Justin ToblerFeb 25, 2025
  32. Jean-Noël AvilaFeb 12, 2025
  33. Junio C HamanoFeb 12, 2025
  34. Justin ToblerFeb 19, 2025
  35. Junio C HamanoFeb 19, 2025
  36. Junio C HamanoFeb 19, 2025
  37. Justin ToblerFeb 20, 2025
  38. Justin ToblerFeb 20, 2025
  39. Junio C HamanoFeb 20, 2025
  40. Phillip WoodFeb 17, 2025
  41. Justin ToblerFeb 19, 2025
  42. Junio C HamanoFeb 19, 2025
  43. Justin ToblerFeb 19, 2025
  44. Phillip WoodFeb 26, 2025
  45. 3/3 builtin/diff-pairs: allow explicit diff queue flushJustin Tobler, Feb 12, 2025
  46. Patrick SteinhardtFeb 12, 2025
  47. Phillip WoodFeb 17, 2025
  48. Justin ToblerFeb 19, 2025
  49. 0/3 batch blob diff generationJustin Tobler, Feb 25, 2025
  50. 1/3 diff: return diff_filepair from diff queue helpersJustin Tobler, Feb 25, 2025
  51. Junio C HamanoFeb 26, 2025
  52. 2/3 builtin: introduce diff-pairs commandJustin Tobler, Feb 25, 2025
  53. Junio C HamanoFeb 26, 2025
  54. Justin ToblerFeb 27, 2025
  55. Karthik NayakFeb 27, 2025
  56. Justin ToblerFeb 27, 2025
  57. Patrick SteinhardtFeb 27, 2025
  58. Justin ToblerFeb 27, 2025
  59. 3/3 builtin/diff-pairs: allow explicit diff queue flushJustin Tobler, Feb 25, 2025
  60. phillip.wood123@gmail.comFeb 26, 2025
  61. Justin ToblerFeb 27, 2025
  62. 0/4 batch blob diff generationJustin Tobler, Feb 28, 2025
  63. 1/4 diff: return diff_filepair from diff queue helpersJustin Tobler, Feb 28, 2025
  64. 2/4 diff: add option to skip resolving diff statusesJustin Tobler, Feb 28, 2025
  65. Patrick SteinhardtFeb 28, 2025
  66. Justin ToblerFeb 28, 2025
  67. 3/4 builtin: introduce diff-pairs commandJustin Tobler, Feb 28, 2025
  68. Patrick SteinhardtFeb 28, 2025
  69. Justin ToblerFeb 28, 2025
  70. 4/4 builtin/diff-pairs: allow explicit diff queue flushJustin Tobler, Feb 28, 2025
  71. 0/4 batch blob diff generationJustin Tobler, Feb 28, 2025
  72. 1/4 diff: return diff_filepair from diff queue helpersJustin Tobler, Feb 28, 2025
  73. Junio C HamanoMar 3, 2025
  74. 2/4 diff: add option to skip resolving diff statusesJustin Tobler, Feb 28, 2025
  75. Junio C HamanoMar 3, 2025
  76. 3/4 builtin: introduce diff-pairs commandJustin Tobler, Feb 28, 2025
  77. Junio C HamanoMar 3, 2025
  78. 4/4 builtin/diff-pairs: allow explicit diff queue flushJustin Tobler, Feb 28, 2025

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.