From: Junio C Hamano <gitster@pobox•com>
To: git@vger•kernel.org
Cc: "Collin Funk" <collin.funk1@gmail•com>,
"Jacob Keller" <jacob.keller@gmail•com>,
"Carlo Marcelo Arenas Belón" <carenas@gmail•com>
Subject: [PATCH] diff-no-index: do not reference .d_type member of struct dirent
Date: Wed, 18 Jun 2025 13:04:12 -0700 [thread overview]
Message-ID: <xmqqh60ces03.fsf@gitster.g> (raw)
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>
---
* get_dtype() was designed for a typical
- prepare the path in a strbuf B
- opendir(B)
- loop over readdir(B)
- do things to path (B + e->d_name)
code structure, but because this code path does not use a strbuf
(instead the path given to opendir is a "const char *"), the
entire thing becomes messier than necessary. get_dtype() has a
short-cut to avoid having to concatenate path+e->d_name and run
(l)stat() when e->d_type exists and known, but we need to open
code it here.
diff-no-index.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/diff-no-index.c b/diff-no-index.c
index 4aeeb98cfa..88ae4cee56 100644
--- a/diff-no-index.c
+++ b/diff-no-index.c
@@ -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;
}
--
2.50.0-228-g6e205fdad9
next reply other threads:[~2025-06-18 20:04 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-18 20:04 Junio C Hamano [this message]
2025-06-18 20:37 ` [PATCH] diff-no-index: do not reference .d_type member of struct dirent Collin Funk
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqh60ces03.fsf@gitster.g \
--to=gitster@pobox$(echo .)com \
--cc=carenas@gmail$(echo .)com \
--cc=collin.funk1@gmail$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=jacob.keller@gmail$(echo .)com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox