Carlo Marcelo Arenas Belón <carenas@xxxxxxxxx> writes: > Since 09fb155f11 (diff --no-index: support limiting by pathspec, > 2025-05-21) will fail to build in platforms that don't have a > d_type member on their struct dirent (ex: AIX, NonStop). > > Use the DTYPE() macro instead of a nake reference to d_type. This may allow you to compile and build, but does the resulting binary do what you want it to? > if (!match_leading_pathspec(NULL, pathspec, > match.buf, match.len, > - 0, NULL, e->d_type == DT_DIR ? 1 : 0)) > + 0, NULL, DTYPE(e) == DT_DIR ? 1 : 0)) On a platform without d_type member, DTYPE() macro gives DT_UNKNOWN that is not DT_DIR, so essentially you are always passing 0 even when you are looking at a directory (in which case you must pass 1) to match_leading_pathspec(). So I somehow doubt this is a correct fix. I do not know if get_dtype() helper function is easily applicable to this codepath, so I wrote this in a longhand... diff-no-index.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git c/diff-no-index.c w/diff-no-index.c index 7c95222ba6..677df91fc5 100644 --- c/diff-no-index.c +++ w/diff-no-index.c @@ -41,12 +41,28 @@ 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 (dtype != DT_UNKNOWN) { + is_dir = dtype == DT_DIR; + } else { + struct stat st; + struct strbuf pathbuf = STRBUF_INIT; + strbuf_addstr(&pathbuf, path); + strbuf_complete(&pathbuf, '/'); + strbuf_addstr(&pathbuf, e->d_name); + if (!lstat(&st, pathbuf.buf)) + is_dir = S_ISDIR(st.st_mode); + else + ; /* punt */ + strbuf_release(&pathbuf); + } if (!match_leading_pathspec(NULL, pathspec, match.buf, match.len, - 0, NULL, DTYPE(e) == DT_DIR ? 1 : 0)) + 0, NULL, is_dir)) continue; }