Git development
 help / color / mirror / Atom feed
From: Phillip Wood <phillip.wood123@gmail.com>
To: Michael Montalbo <mmontalbo@gmail.com>, git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: Re: [RFC PATCH v7 0/10] diff: add provider interface and initial providers
Date: Tue, 4 Aug 2026 14:52:36 +0100	[thread overview]
Message-ID: <1f8fe709-ef19-496e-9857-8c2d24b29c56@gmail.com> (raw)
In-Reply-To: <20260801174156.2998808-1-mmontalbo@gmail.com>

Hi Michael

On 01/08/2026 18:41, Michael Montalbo wrote:
> Every in-process diff in Git reduces, at one point, to a single
> question: given two blobs and the settings the diff runs under, which
> line ranges changed?  The answer is the diff's hunks: for each change,
> the position and length of the range on the old side and on the new.
> Each consumer asks in its own shape:
> 
> - blame diffs each suspect's blob against its parent's, taking only the
>    coordinates through xdiff's hunk callback;
> - the stat formats keep only the added and deleted counts;
> - patch output emits from the hunks, with xdiff interleaving context and
>    content around them;
> - log -L maps the tracked range across each commit from the coordinates.
> 
> In every case the answer is computed the same way: load both blobs and
> run xdiff.  That is the only source, so nothing that already holds the
> answer, or that would answer differently on purpose, can supply it
> instead.  Sometimes that is what we want, which is why patch-id and
> format-patch stay on the builtin computation throughout: patch-id needs
> identical hashes on every machine, and a format-patch must apply for
> recipients who share none of the sender's configuration.  Other times
> another source would be useful.

This explains the mechanics of the existing implementation, but doesn't 
really explain what the advantage of the change is beyond having a 
unified interface. What are things that are unlocked by this change? Are 
we doing it purely to cache the hunk headers or does it (as I suspect) 
unlock other features?

> This RFC sketches a direction.  The unified series shows one interface
> carrying two example providers and their interaction; it is not shaped
> to merge as one topic.  If the direction holds, the work returns as
> separate reviewable series (see Roadmap).  The two examples are
> demonstrations, each an RFC on its own: diff.<driver>.process, the RFC
> cooking as mm/diff-process-hunks, lets a configured external process
> answer with its own notion of which lines changed, and the diff-hunks
> store, new in this thread, remembers what xdiff computed and serves it
> back.  One is authoritative and external, one a cache and in-process.

What does it mean to be authoritative? Why isn't the xdiff code 
authoritative?

> Three pieces:
> 
> - A hunk provider interface (diff-provider.h) is the point of the
>    series.  A provider is an alternate source for the answer: asked with
>    the pair's object ids and the diff settings, before any blob is
>    loaded, it may supply the hunks in place of the builtin computation.
>    A miss falls through to that computation, and every answer passes one
>    shared validity check first.  The providers form a chain the
>    repository owns, built on first consultation and released in
>    repo_clear(), so provider state such as a running process never
>    outlives its repository.  

> Chain order is the authority,
I'm not sure what that phrase means

> and the
>    terminal provider is the builtin computation itself, so the interface
>    never exists without an implementor: patch 02 ships it answering every
>    request the way the consumers did before.  A consumer states its
>    request in one struct and reads one set of outcomes (answered,
>    unanswered, or failed); it never names a provider, and a provider>    added later maps onto those outcomes inside the interface, so consumer
>    code is written once.  Because every diff now walks the chain even
>    with no store or process configured, the default path was measured
>    against the pre-series base and runs within noise (a 5000-commit
>    log --stat and a long-history blame, ratio 1.00 either way).

So we can configure a provider for a particular file type via 
.gitattributes and diff.<driver>.process and then it is used 
automatically, if there is no provider configured we use xdiff?

> - The diff-hunks store shows the non-authoritative side: an in-process
>    cache at $GIT_DIR/objects/info/diff-hunks that may only reproduce the
>    builtin diff, so serving from it never changes a command's output.  It
>    is read by default and written only when a repository owner opts in,
>    warming it as a side effect of diff work the command already does:
> 
>        GIT_DIFF_HUNKS_WRITE=1 git log --all --stat >/dev/null
> 
>    A warmed store then serves the stat formats and blame from stored
>    coordinates instead of a fresh diff: on git.git a 5000-commit log
>    --stat runs about 1.9x faster, and blame reads the same entries
>    opportunistically (full numbers in [1]).  Its format and keying, what
>    it may not serve, and how it handles corruption and staleness are in
>    git-diff-hunks(1), gitformat-diff-hunks(5), and [2].  The interface
>    point is small: a cache drops in as the provider that stands aside
>    wherever an authoritative one answers.

I had a very quick look at the documentation in patch that implements 
this. Am I right in thinking it stores xdl_opts directly so that we 
cannot change the in-memory representation without breaking the cache? 
Are there plans to garbage collect cache entries when the corresponding 
blobs are removed?

> - diff.<driver>.process shows the authoritative side: an external
>    process, configured per driver, whose answers may deliberately differ
>    from the builtin diff and outrank the store.  Git asks it for a pair by
>    object names alone, so it answers before any blob is read, which suits
>    a cache or a process that fetches the blobs itself.  Consulting is
>    opt-in per command, following the allow_textconv precedent, and a pair
>    the process cannot answer falls back to the builtin diff.  The
>    protocol, the per-command gate, how failures are handled, and the
>    versioning that lets it grow are in gitattributes(5) and footnotes [3]
>    and [4].  The interface point, again, is small: an external,
>    authoritative provider joins the same chain ahead of the cache, and
>    neither consumer learns it is there.  A later content-carrying request
>    would extend it to the pairs and consumers this identity-only form
>    leaves on the builtin diff.
> 
> The series stops at the coordinates.

Does this mean the offsets and lengths in the hunk header? I can't see 
any reference to "coordinates" in the existing code.

> A consumer that needs the changed
> text, such as patch output, would have only its hunk selection replaced,
> with xdiff still emitting content from the blobs; that machinery is the
> content enrichment sketched in the Roadmap.  Establishing the framework
> on coordinates first keeps this series one design: the question, the
> interface, and two providers answering by identity.

This seems like an interesting proposal and the diff headers seem like a 
good place for initial phase to stop. It would be helpful to have a 
clearer explanation of the features this interface would support (i.e. 
what's the motivation for these changes) and a lot less jargon in the 
interface description.

Thanks

Phillip


> 
> Shape of the series:
> 
>    01     documentation: how external diff drivers relate to the
>           features layered on the diff
>    02     the provider interface: the request and outcome types, the
>           emit entry point, the shared validity check, and the
>           repository-owned chain with its terminal builtin provider
>    03     the store: on-disk format, library, and the diff-hunks command
>    04     recording: the stat walk computes, sums, and records
>           trim-stable pairs (writes gated off by default)
>    05     reading: the consult entry point and the store's registration
>           as a provider; the request gains the object ids and diff
>           options
>    06     blame reading through the interface's emit path
>    07-09  process preparation: sub-process lifecycle split, a gentle
>           status read for an optional process, and the
>           diff.<driver>.process config
>    10     the process provider, oid-only, at the head of the chain, with
>           the per-command gate; the request gains the path
> 
> Roadmap:
> 
> This RFC asks whether the direction is right, not for these ten patches
> to merge as one topic.  If it holds, the work returns in reviewable
> pieces:
> 
> - the interface and the store (patches 01 through 06): a cache with
>    measured numbers and no external-process machinery
> 
> - the process provider (patches 07 through 10) on the same interface
> 
> - the content enrichment (the content-carrying request, patch output and
>    log -L consulting, and the xdiff machinery that feeds a provider's
>    hunks into emission) once the identity-keyed framework settles.
> 
> Several design questions are left for those series.
> 
> mm/diff-process-hunks in seen would be dropped in favor of this thread
> and its split.
> 
> The series applies on the line-log topic (mm/line-log-limited-ops)
> rebased onto current master.  The topic rewrites the same
> builtin_diffstat() region this series touches, and current master
> includes 061a68e443 (sub-process: use gentle handshake to avoid die()
> on startup failure), which this topic leans on: a process that dies
> during the handshake degrades to the builtin diff like every other
> failure.  A trial merge against seen shows no interaction with other
> topics beyond the mm/diff-process-hunks replacement above.
> 
> The base (line-log topic on current master) and the full series are
> available at:
> 
>    git fetch https://github.com/mmontalbo/git mm/line-log-stat-formats-followup
>    git fetch https://github.com/mmontalbo/git mm/hunk-providers-oid-first
> 
> Changes since v6:
> 
> This is a restructuring, not an incremental reroll, so a range-diff
> against v6 is unreadable; the map of what changed:
> 
> - The series now leads with the hunk provider interface and brings the
>    diff-hunks store in as its in-process implementation (patches 02
>    through 06, new to this thread).  It keeps only the identity-keyed
>    half of the external diff process protocol from mm/diff-process-hunks.
> - v6's gitattributes documentation, sub-process split, and userdiff
>    config return close to their v6 form as patches 01, 07, and 09.  Patch
>    08 is new: a gentle status read so a protocol error in an optional
>    process degrades to the builtin diff instead of dying.
> - v6's protocol patch returns as patch 10, reduced to the oid-only
>    request, consulting through the interface, and carrying a per-command
>    gate (v6's bypass patch folds into it).
> - v6's blame and stat consults return as identity-keyed consults
>    (patches 05, 06, and 10); their content legs, along with v6's xdiff
>    external-hunks machinery, content-carrying request, and line-log
>    consult, are withheld for the content enrichment.
> 
> Footnotes:
> 
> [1] Store numbers, measured with hyperfine against the same build with
>      core.diffHunks=false.  The warm is a full cold build of the store;
>      the blame speedup is file-dependent (see the coverage limitation):
> 
>      git.git (82,912 commits, --all)
>        warm log --all --stat      20.9 s        store 28 MB, verify 39 ms
>        log --stat -5000           1.91x    (1.38 s -> 0.72 s)
>        blame diff.c               1.26x     (509 ms -> 403 ms)
>        blame hit rate             54% (896 of 1653 pairs)
> 
>      linux (1,445,548 commits, --all)
>        warm log --all --stat      714 s       store 298 MB, verify 415 ms
>        log --stat -5000           1.43x    (2.29 s -> 1.60 s)
>        blame kernel/sched/core.c  1.43x     (1.59 s -> 1.11 s)
>        blame hit rate             74% (2414 of 3263 pairs)
> 
> [2] The store is its own file because nothing existing is addressed by a
>      blob pair: notes attach to single objects, commit-graph chunks to
>      commits.  One entry per pair, keyed by (old blob, new blob,
>      xdl_opts) and recorded only when the pair's trimmed and untrimmed
>      diffs agree, serves blame at zero context and the stat formats at
>      any -U (divergent pairs are 0.4-0.5% of a warm and always compute).
>      The writer fsyncs and commits atomically, and a reader bounds-checks
>      every record and treats an unparsable file as absent; the trailing
>      checksum is checked by git diff-hunks verify, not on every read, the
>      same read-time trust the commit-graph and multi-pack-index take.
>      There is deliberately no fsck integration, expiry, or background
>      maintenance: the store is derivable at any time, so the recovery
>      path is git diff-hunks clear and a re-warm.  New commits make it
>      incomplete, not wrong; a later warm seeds from the file and pays
>      only for what is new.
> 
> [3] Consulting the process is allowed per command, like textconv: git
>      diff, git log and git show, and git blame consult it; the plumbing
>      diff commands do not unless --ext-diff or --diff-process is given,
>      and the interactive-patch machinery, format-patch, and range-diff
>      stay builtin.  Options the process is never told about select no
>      process, and an object id is sent only when it names the exact bytes
>      diffed (a pair under an active object replacement is not sent).  The
>      command comes from local configuration, as with filter.<name>
>      .process: attributes select only a driver name, so cloning cannot
>      cause a process to run.  gitattributes(5) has the full gate.
> 
> [4] The protocol is versioned and capability-negotiated, and extends
>      without breaking deployed processes: a process ignores request keys
>      it does not know, Git ignores trailing tokens on a hunk line so
>      fields can be appended, and new request forms arrive as capabilities
>      a process may decline.  Announcing a capability Git did not request
>      aborts the command, the filter protocol's handshake rule.  The
>      content-carrying request is the natural first extension; markers for
>      formatting-only changes and function or token boundaries are
>      candidates beyond it.
> 
> Michael Montalbo (10):
>    gitattributes: document how external diff drivers relate to diff
>      features
>    diff: introduce a hunk provider interface
>    diff-hunks: add the store format, library, and command
>    diff: record precomputed hunks during stat output
>    diff: read precomputed hunks for stat output
>    blame: read precomputed hunks
>    sub-process: separate process lifecycle from hashmap management
>    sub-process: add a gentle status read
>    userdiff: add diff.<driver>.process config
>    diff: consult oid-only hunk providers via diff.<driver>.process
> 
>   .gitignore                               |    1 +
>   Documentation/Makefile                   |    1 +
>   Documentation/config.adoc                |    2 +
>   Documentation/config/core.adoc           |   10 +-
>   Documentation/config/diff-hunks.adoc     |    8 +
>   Documentation/config/diff.adoc           |    6 +
>   Documentation/diff-algorithm-option.adoc |    3 +
>   Documentation/diff-options.adoc          |   15 +-
>   Documentation/git-diff-hunks.adoc        |  146 +++
>   Documentation/gitattributes.adoc         |  171 ++++
>   Documentation/gitformat-diff-hunks.adoc  |  129 +++
>   Documentation/meson.build                |    2 +
>   Makefile                                 |    5 +
>   blame.c                                  |   81 +-
>   builtin.h                                |    1 +
>   builtin/blame.c                          |    9 +-
>   builtin/diff-hunks.c                     |   53 ++
>   builtin/diff-tree.c                      |    3 +
>   builtin/diff.c                           |   11 +
>   builtin/log.c                            |   19 +
>   chunk-format.c                           |   62 +-
>   chunk-format.h                           |   14 +
>   command-list.txt                         |    2 +
>   diff-hunks.c                             | 1034 ++++++++++++++++++++++
>   diff-hunks.h                             |  141 +++
>   diff-process.c                           |  669 ++++++++++++++
>   diff-provider-internal.h                 |  130 +++
>   diff-provider.c                          |  190 ++++
>   diff-provider.h                          |  159 ++++
>   diff.c                                   |  294 +++++-
>   diff.h                                   |   47 +
>   environment.c                            |    1 +
>   git.c                                    |    1 +
>   meson.build                              |    4 +
>   odb.c                                    |    2 +
>   odb.h                                    |    4 +
>   range-diff.c                             |    6 +
>   repo-settings.c                          |    1 +
>   repo-settings.h                          |    1 +
>   repository.c                             |    3 +
>   repository.h                             |    8 +
>   sub-process.c                            |   52 +-
>   sub-process.h                            |   19 +-
>   t/helper/meson.build                     |    1 +
>   t/helper/test-diff-process-backend.c     |  349 ++++++++
>   t/helper/test-tool.c                     |    1 +
>   t/helper/test-tool.h                     |    1 +
>   t/meson.build                            |    3 +
>   t/perf/p4218-diff-hunks.sh               |   48 +
>   t/t4080-diff-process.sh                  |  593 +++++++++++++
>   t/t4220-diff-hunks.sh                    |  819 +++++++++++++++++
>   t/t4220/README                           |   55 ++
>   t/t4220/trim-divergent-new               |  319 +++++++
>   t/t4220/trim-divergent-old               |  316 +++++++
>   userdiff.c                               |    7 +
>   userdiff.h                               |    2 +
>   write-or-die.h                           |    7 +-
>   xdiff-interface.h                        |   12 +
>   58 files changed, 5989 insertions(+), 64 deletions(-)
>   create mode 100644 Documentation/config/diff-hunks.adoc
>   create mode 100644 Documentation/git-diff-hunks.adoc
>   create mode 100644 Documentation/gitformat-diff-hunks.adoc
>   create mode 100644 builtin/diff-hunks.c
>   create mode 100644 diff-hunks.c
>   create mode 100644 diff-hunks.h
>   create mode 100644 diff-process.c
>   create mode 100644 diff-provider-internal.h
>   create mode 100644 diff-provider.c
>   create mode 100644 diff-provider.h
>   create mode 100644 t/helper/test-diff-process-backend.c
>   create mode 100755 t/perf/p4218-diff-hunks.sh
>   create mode 100755 t/t4080-diff-process.sh
>   create mode 100755 t/t4220-diff-hunks.sh
>   create mode 100644 t/t4220/README
>   create mode 100644 t/t4220/trim-divergent-new
>   create mode 100644 t/t4220/trim-divergent-old
> 
> 
> base-commit: 9a0c4701dcd5725c4184599322b52933ff5005ca
> prerequisite-patch-id: 6270dea79c9f06530737cefa3e1a0a39a1be7877
> prerequisite-patch-id: 46fcc16a7a2ed760a1134d2a92c87699f3ec7bdb
> prerequisite-patch-id: c1e3da243003d060e429bc2196ae02b3453f01f9
> prerequisite-patch-id: 4ad4e273494d4e8503706c21bfdc90a5d7ce116a
> prerequisite-patch-id: f7fa1367756daafa83f4f030a5c7b6dc3dbb70d7
> prerequisite-patch-id: 829e76c9fec655a07f9383086a35bff3290b1c74
> prerequisite-patch-id: 5c5a0d61ae9b6d628d05f1eb5df046758f3111a8


  parent reply	other threads:[~2026-08-04 13:52 UTC|newest]

Thread overview: 79+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-22  2:11 [PATCH 0/5] [RFC] diff: add diff.<driver>.process for external hunk providers Michael Montalbo via GitGitGadget
2026-05-22  2:11 ` [PATCH 1/5] xdiff: support external hunks via xpparam_t Michael Montalbo via GitGitGadget
2026-05-22  5:29   ` Junio C Hamano
2026-05-22 19:06     ` Michael Montalbo
2026-05-24  8:50       ` Junio C Hamano
2026-05-24 18:01         ` Michael Montalbo
2026-05-22  2:11 ` [PATCH 2/5] userdiff: add diff.<driver>.process config Michael Montalbo via GitGitGadget
2026-05-22  2:11 ` [PATCH 3/5] diff: add long-running diff process via diff.<driver>.process Michael Montalbo via GitGitGadget
2026-05-22  2:11 ` [PATCH 4/5] blame: consult diff process for zero-hunk detection Michael Montalbo via GitGitGadget
2026-05-22  2:11 ` [PATCH 5/5] diff-process-normalize: add built-in whitespace normalizer Michael Montalbo via GitGitGadget
2026-05-22  5:29 ` [PATCH 0/5] [RFC] diff: add diff.<driver>.process for external hunk providers Junio C Hamano
2026-05-22 17:19   ` Michael Montalbo
2026-05-25 18:29 ` [PATCH v2 0/4] " Michael Montalbo via GitGitGadget
2026-05-25 18:29   ` [PATCH v2 1/4] xdiff: support external hunks via xpparam_t Michael Montalbo via GitGitGadget
2026-05-25 18:29   ` [PATCH v2 2/4] userdiff: add diff.<driver>.process config Michael Montalbo via GitGitGadget
2026-05-25 18:29   ` [PATCH v2 3/4] diff: add long-running diff process via diff.<driver>.process Michael Montalbo via GitGitGadget
2026-05-26  1:56     ` Junio C Hamano
2026-05-29  0:51       ` Michael Montalbo
2026-05-26  2:26     ` Junio C Hamano
2026-05-29  0:55       ` Michael Montalbo
2026-05-25 18:29   ` [PATCH v2 4/4] blame: consult diff process for zero-hunk detection Michael Montalbo via GitGitGadget
2026-05-29 20:48   ` [PATCH v3 0/6] [RFC] diff: add diff.<driver>.process for external hunk providers Michael Montalbo via GitGitGadget
2026-05-29 20:48     ` [PATCH v3 1/6] xdiff: support external hunks via xpparam_t Michael Montalbo via GitGitGadget
2026-05-29 20:48     ` [PATCH v3 2/6] userdiff: add diff.<driver>.process config Michael Montalbo via GitGitGadget
2026-05-29 20:48     ` [PATCH v3 3/6] sub-process: separate process lifecycle from hashmap management Michael Montalbo via GitGitGadget
2026-05-29 20:48     ` [PATCH v3 4/6] diff: add long-running diff process via diff.<driver>.process Michael Montalbo via GitGitGadget
2026-06-07 14:36       ` Johannes Schindelin
2026-06-07 17:04         ` Michael Montalbo
2026-06-08 12:26           ` Junio C Hamano
2026-06-07 20:36         ` Michael Montalbo
2026-06-08 17:19           ` Junio C Hamano
2026-06-08 12:06         ` Junio C Hamano
2026-05-29 20:48     ` [PATCH v3 5/6] diff: bypass diff process with --no-ext-diff and in format-patch Michael Montalbo via GitGitGadget
2026-05-29 20:48     ` [PATCH v3 6/6] blame: consult diff process for no-hunk detection Michael Montalbo via GitGitGadget
2026-05-31 10:44     ` [PATCH v3 0/6] [RFC] diff: add diff.<driver>.process for external hunk providers Junio C Hamano
2026-06-01  4:28       ` Michael Montalbo
2026-06-14 18:59     ` [PATCH v4 " Michael Montalbo via GitGitGadget
2026-06-14 18:59       ` [PATCH v4 1/6] xdiff: support external hunks via xpparam_t Michael Montalbo via GitGitGadget
2026-06-14 18:59       ` [PATCH v4 2/6] userdiff: add diff.<driver>.process config Michael Montalbo via GitGitGadget
2026-06-14 18:59       ` [PATCH v4 3/6] sub-process: separate process lifecycle from hashmap management Michael Montalbo via GitGitGadget
2026-06-14 18:59       ` [PATCH v4 4/6] diff: add long-running diff process via diff.<driver>.process Michael Montalbo via GitGitGadget
2026-06-14 18:59       ` [PATCH v4 5/6] diff: bypass diff process with --no-ext-diff and in format-patch Michael Montalbo via GitGitGadget
2026-06-14 18:59       ` [PATCH v4 6/6] blame: consult diff process for no-hunk detection Michael Montalbo via GitGitGadget
2026-07-15 21:01       ` [PATCH v5 0/9] [RFC] diff: add diff.<driver>.process for external hunk providers Michael Montalbo via GitGitGadget
2026-07-15 21:01         ` [PATCH v5 1/9] gitattributes: document how external diff drivers relate to diff features Michael Montalbo via GitGitGadget
2026-07-15 21:01         ` [PATCH v5 2/9] xdiff: support external hunks via xpparam_t Michael Montalbo via GitGitGadget
2026-07-15 21:01         ` [PATCH v5 3/9] userdiff: add diff.<driver>.process config Michael Montalbo via GitGitGadget
2026-07-15 21:01         ` [PATCH v5 4/9] sub-process: separate process lifecycle from hashmap management Michael Montalbo via GitGitGadget
2026-07-15 21:01         ` [PATCH v5 5/9] diff: add long-running diff process via diff.<driver>.process Michael Montalbo via GitGitGadget
2026-07-15 21:01         ` [PATCH v5 6/9] diff: bypass diff process with --no-ext-diff and in format-patch Michael Montalbo via GitGitGadget
2026-07-15 21:02         ` [PATCH v5 7/9] blame: consult diff process for no-hunk detection Michael Montalbo via GitGitGadget
2026-07-15 21:02         ` [PATCH v5 8/9] diff: consult diff process for --stat counts Michael Montalbo via GitGitGadget
2026-07-15 21:02         ` [PATCH v5 9/9] line-log: consult diff process for range tracking Michael Montalbo via GitGitGadget
2026-07-16 16:40         ` [PATCH v5 0/9] [RFC] diff: add diff.<driver>.process for external hunk providers Junio C Hamano
2026-07-16 17:31           ` Michael Montalbo
2026-07-26 18:51         ` [PATCH v6 " Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 1/9] gitattributes: document how external diff drivers relate to diff features Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 2/9] xdiff: support external hunks via xpparam_t Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 3/9] userdiff: add diff.<driver>.process config Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 4/9] sub-process: separate process lifecycle from hashmap management Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 5/9] diff: add long-running diff process via diff.<driver>.process Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 6/9] diff: bypass diff process with --no-ext-diff and in format-patch Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 7/9] blame: consult diff process for no-hunk detection Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 8/9] diff: consult diff process for --stat counts Michael Montalbo via GitGitGadget
2026-07-26 18:51           ` [PATCH v6 9/9] line-log: consult diff process for range tracking Michael Montalbo via GitGitGadget
2026-08-01 17:41           ` [RFC PATCH v7 0/10] diff: add provider interface and initial providers Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 01/10] gitattributes: document how external diff drivers relate to diff features Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 02/10] diff: introduce a hunk provider interface Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 03/10] diff-hunks: add the store format, library, and command Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 04/10] diff: record precomputed hunks during stat output Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 05/10] diff: read precomputed hunks for " Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 06/10] blame: read precomputed hunks Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 07/10] sub-process: separate process lifecycle from hashmap management Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 08/10] sub-process: add a gentle status read Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 09/10] userdiff: add diff.<driver>.process config Michael Montalbo
2026-08-01 17:41             ` [RFC PATCH v7 10/10] diff: consult oid-only hunk providers via diff.<driver>.process Michael Montalbo
2026-08-04  3:15               ` Michael Montalbo
2026-08-04 13:52             ` Phillip Wood [this message]
     [not found]     ` <pull.2120.v4.git.1781463332.gitgitgadget@gmail.com>
2026-06-15 21:14       ` [PREVIEW v4 0/6] [RFC] diff: add diff.<driver>.process for external hunk providers Michael Montalbo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1f8fe709-ef19-496e-9857-8c2d24b29c56@gmail.com \
    --to=phillip.wood123@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=mmontalbo@gmail.com \
    --cc=phillip.wood@dunelm.org.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox