[PATCH v2 3/4] fsmonitor: avoid overriding `cache_changed` bits
- From
Johannes Schindelin via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Mar 26, 2023, 22:45 UTC
- Message-ID
- <89b3cd9a66823829ce6e425e827b70bc2816d3cd.1679870743.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1497.v2.git.1679870743.gitgitgadget@gmail.com>
From: Johannes Schindelin <johannes.schindelin@gmx.de>
As of e636a7b4d030 (read-cache: be specific what part of the index has changed, 2014-06-13), the paradigm `cache_changed = 1` fell out of fashion and it became a bit field instead.
This is important because some bits have specific meaning and should not be unset without care, e.g. `SPLIT_INDEX_ORDERED`.
However, b5a816975206 (mark_fsmonitor_valid(): mark the index as changed if needed, 2019-05-24) did use the `cache_changed` attribute as if it were a Boolean instead of a bit field.
That not only would override the `SPLIT_INDEX_ORDERED` bit when marking index entries as valid via the FSMonitor, but worse: it would set the `SOMETHING_OTHER` bit (whose value is 1). This means that Git would unnecessarily force a full index to be written out when a split index was asked for.
Let's instead use the bit that is specifically intended to indicate FSMonitor-triggered changes, allowing the split-index feature to work as designed.
Noticed-by: Jeff Hostetler <jeffhost@microsoft.com> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- fsmonitor.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fsmonitor.h b/fsmonitor.h index edf7ce5203b..778707b131b 100644 --- a/fsmonitor.h +++ b/fsmonitor.h @@ -86,7 +86,7 @@ static inline void mark_fsmonitor_valid(struct index_state *istate, struct cache !(ce->ce_flags & CE_FSMONITOR_VALID)) { if (S_ISGITLINK(ce->ce_mode)) return; - istate->cache_changed = 1; + istate->cache_changed |= FSMONITOR_CHANGED; ce->ce_flags |= CE_FSMONITOR_VALID; trace_printf_key(&trace_fsmonitor, "mark_fsmonitor_clean '%s'", ce->name); }
-- gitgitgadget