Merge branch 'nk/diff-files-vs-fsmonitor'

"git diff" and other commands that share the same machinery to
compare with working tree files have been taught to take advantage
of the fsmonitor data when available.

* nk/diff-files-vs-fsmonitor:
  p7519-fsmonitor: add a git add benchmark
  p7519-fsmonitor: refactor to avoid code duplication
  perf lint: add make test-lint to perf tests
  t/perf: add fsmonitor perf test for git diff
  t/perf/p7519-fsmonitor.sh: warm cache on first git status
  t/perf/README: elaborate on output format
  fsmonitor: use fsmonitor data in `git diff`
This commit is contained in:
Junio C Hamano
2020-11-09 14:06:25 -08:00
6 changed files with 82 additions and 51 deletions

View File

@ -98,6 +98,8 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
diff_set_mnemonic_prefix(&revs->diffopt, "i/", "w/");
refresh_fsmonitor(istate);
if (diff_unmerged_stage < 0)
diff_unmerged_stage = 2;
entries = istate->cache_nr;
@ -198,8 +200,17 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
if (ce_uptodate(ce) || ce_skip_worktree(ce))
continue;
/* If CE_VALID is set, don't look at workdir for file removal */
if (ce->ce_flags & CE_VALID) {
/*
* When CE_VALID is set (via "update-index --assume-unchanged"
* or via adding paths while core.ignorestat is set to true),
* the user has promised that the working tree file for that
* path will not be modified. When CE_FSMONITOR_VALID is true,
* the fsmonitor knows that the path hasn't been modified since
* we refreshed the cached stat information. In either case,
* we do not have to stat to see if the path has been removed
* or modified.
*/
if (ce->ce_flags & (CE_VALID | CE_FSMONITOR_VALID)) {
changed = 0;
newmode = ce->ce_mode;
} else {