]> git.ipfire.org Git - thirdparty/git.git/commitdiff
diff-no-index: do not reference .d_type member of struct dirent
authorJunio C Hamano <gitster@pobox.com>
Wed, 18 Jun 2025 20:04:12 +0000 (13:04 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 18 Jun 2025 20:05:29 +0000 (13:05 -0700)
Some platforms like AIX lack .d_type member in "struct dirent"; use
the DTYPE(e) macro instead of a direct reference to e->d_type and
when it yields DT_UNKNOWN, find the real type with get_dtype().

Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-no-index.c

index 4aeeb98cfa8fbafb5f64b394d8e14933bc073e2d..88ae4cee56ba41819cb7d6c332feb59b6e0fe5a8 100644 (file)
@@ -41,12 +41,24 @@ static int read_directory_contents(const char *path, struct string_list *list,
 
        while ((e = readdir_skip_dot_and_dotdot(dir))) {
                if (pathspec) {
+                       int is_dir = 0;
+
                        strbuf_setlen(&match, len);
                        strbuf_addstr(&match, e->d_name);
+                       if (NOT_CONSTANT(DTYPE(e)) != DT_UNKNOWN) {
+                               is_dir = (DTYPE(e) == DT_DIR);
+                       } else {
+                               struct strbuf pathbuf = STRBUF_INIT;
+
+                               strbuf_addstr(&pathbuf, path);
+                               strbuf_complete(&pathbuf, '/');
+                               is_dir = get_dtype(e, &pathbuf, 0) == DT_DIR;
+                               strbuf_release(&pathbuf);
+                       }
 
                        if (!match_leading_pathspec(NULL, pathspec,
                                                    match.buf, match.len,
-                                                   0, NULL, e->d_type == DT_DIR ? 1 : 0))
+                                                   0, NULL, is_dir))
                                continue;
                }