All of lore.kernel.org
 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: 81+ 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-13 22:06               ` Junio C Hamano
2026-08-04 13:52             ` Phillip Wood [this message]
2026-08-23 19:38               ` [RFC PATCH v7 0/10] diff: add provider interface and initial providers Michael Montalbo
     [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 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.