]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fsmonitor: skip lstat deletion check during git diff-index
authorNipunn Koorapati <nipunn@dropbox.com>
Wed, 17 Mar 2021 21:22:21 +0000 (21:22 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 18 Mar 2021 20:31:11 +0000 (13:31 -0700)
Teach git to honor fsmonitor rather than issuing an lstat
when checking for dirty local deletes. Eliminates O(files)
lstats during `git diff HEAD`

Signed-off-by: Nipunn Koorapati <nipunn@dropbox.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-lib.c

index b73cc1859a49eb8b7f3cf7321680dfda4d96c705..3fb538ad18e9934aca027a3146d58bc33d5725cc 100644 (file)
@@ -30,7 +30,7 @@
  */
 static int check_removed(const struct cache_entry *ce, struct stat *st)
 {
-       if (lstat(ce->name, st) < 0) {
+       if (!(ce->ce_flags & CE_FSMONITOR_VALID) && lstat(ce->name, st) < 0) {
                if (!is_missing_file_error(errno))
                        return -1;
                return 1;
@@ -574,6 +574,7 @@ int run_diff_index(struct rev_info *revs, unsigned int option)
        struct object_id oid;
        const char *name;
        char merge_base_hex[GIT_MAX_HEXSZ + 1];
+       struct index_state *istate = revs->diffopt.repo->index;
 
        if (revs->pending.nr != 1)
                BUG("run_diff_index must be passed exactly one tree");
@@ -581,6 +582,8 @@ int run_diff_index(struct rev_info *revs, unsigned int option)
        trace_performance_enter();
        ent = revs->pending.objects;
 
+       refresh_fsmonitor(istate);
+
        if (merge_base) {
                diff_get_merge_base(revs, &oid);
                name = oid_to_hex_r(merge_base_hex, &oid);