From: Junio C Hamano <gitster@pobox.com>
To: "Victoria Dye via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Victoria Dye <vdye@github.com>
Subject: Re: [PATCH 2/4] dir.[ch]: expose 'get_dtype'
Date: Fri, 06 Oct 2023 15:00:17 -0700 [thread overview]
Message-ID: <xmqq1qe78l8u.fsf@gitster.g> (raw)
In-Reply-To: <24014010ea350a2ea8676b6560ca1d60838c56ef.1696615769.git.gitgitgadget@gmail.com> (Victoria Dye via GitGitGadget's message of "Fri, 06 Oct 2023 18:09:27 +0000")
"Victoria Dye via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Victoria Dye <vdye@github.com>
>
> Move 'get_dtype()' from 'diagnose.c' to 'dir.c' and add its declaration to
> 'dir.h' so that it is accessible to callers in other files. The function and
> its documentation are moved verbatim except for a small addition to the
> description clarifying what the 'path' arg represents.
>
> Signed-off-by: Victoria Dye <vdye@github.com>
> ---
> diagnose.c | 36 ------------------------------------
> dir.c | 28 ++++++++++++++++++++++++++++
> dir.h | 11 +++++++++++
> 3 files changed, 39 insertions(+), 36 deletions(-)
OK. diagnose.c should still have access to the function as it
includes <dir.h>, and to anybody that includes <dir.h> and sees the
declaration of get_dtype(), DT_FOO should be visible because <dir.h>
includes <statinfo.h> that has fallback definition of DT_FOO.
Looking simple and straight-forward.
> diff --git a/diagnose.c b/diagnose.c
> index 8430064000b..fc4d344bd63 100644
> --- a/diagnose.c
> +++ b/diagnose.c
> @@ -71,42 +71,6 @@ static int dir_file_stats(struct object_directory *object_dir, void *data)
> return 0;
> }
>
> -/*
> - * Get the d_type of a dirent. If the d_type is unknown, derive it from
> - * stat.st_mode.
> - *
> - * Note that 'path' is assumed to have a trailing slash. It is also modified
> - * in-place during the execution of the function, but is then reverted to its
> - * original value before returning.
> - */
> -static unsigned char get_dtype(struct dirent *e, struct strbuf *path)
> -{
> - struct stat st;
> - unsigned char dtype = DTYPE(e);
> - size_t base_path_len;
> -
> - if (dtype != DT_UNKNOWN)
> - return dtype;
> -
> - /* d_type unknown in dirent, try to fall back on lstat results */
> - base_path_len = path->len;
> - strbuf_addstr(path, e->d_name);
> - if (lstat(path->buf, &st))
> - goto cleanup;
> -
> - /* determine d_type from st_mode */
> - if (S_ISREG(st.st_mode))
> - dtype = DT_REG;
> - else if (S_ISDIR(st.st_mode))
> - dtype = DT_DIR;
> - else if (S_ISLNK(st.st_mode))
> - dtype = DT_LNK;
> -
> -cleanup:
> - strbuf_setlen(path, base_path_len);
> - return dtype;
> -}
> -
> static int count_files(struct strbuf *path)
> {
> DIR *dir = opendir(path->buf);
> diff --git a/dir.c b/dir.c
> index 8486e4d56ff..5e01af3a25e 100644
> --- a/dir.c
> +++ b/dir.c
> @@ -2235,6 +2235,34 @@ static int get_index_dtype(struct index_state *istate,
> return DT_UNKNOWN;
> }
>
> +unsigned char get_dtype(struct dirent *e, struct strbuf *path)
> +{
> + struct stat st;
> + unsigned char dtype = DTYPE(e);
> + size_t base_path_len;
> +
> + if (dtype != DT_UNKNOWN)
> + return dtype;
> +
> + /* d_type unknown in dirent, try to fall back on lstat results */
> + base_path_len = path->len;
> + strbuf_addstr(path, e->d_name);
> + if (lstat(path->buf, &st))
> + goto cleanup;
> +
> + /* determine d_type from st_mode */
> + if (S_ISREG(st.st_mode))
> + dtype = DT_REG;
> + else if (S_ISDIR(st.st_mode))
> + dtype = DT_DIR;
> + else if (S_ISLNK(st.st_mode))
> + dtype = DT_LNK;
> +
> +cleanup:
> + strbuf_setlen(path, base_path_len);
> + return dtype;
> +}
> +
> static int resolve_dtype(int dtype, struct index_state *istate,
> const char *path, int len)
> {
> diff --git a/dir.h b/dir.h
> index ad06682fd54..28c630ce806 100644
> --- a/dir.h
> +++ b/dir.h
> @@ -363,6 +363,17 @@ struct dir_struct {
>
> struct dirent *readdir_skip_dot_and_dotdot(DIR *dirp);
>
> +/*
> + * Get the d_type of a dirent. If the d_type is unknown, derive it from
> + * stat.st_mode using the path to the dirent's containing directory (path) and
> + * the name of the dirent itself.
> + *
> + * Note that 'path' is assumed to have a trailing slash. It is also modified
> + * in-place during the execution of the function, but is then reverted to its
> + * original value before returning.
> + */
> +unsigned char get_dtype(struct dirent *e, struct strbuf *path);
> +
> /*Count the number of slashes for string s*/
> int count_slashes(const char *s);
next prev parent reply other threads:[~2023-10-06 22:00 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-06 18:09 [PATCH 0/4] Performance improvement & cleanup in loose ref iteration Victoria Dye via GitGitGadget
2023-10-06 18:09 ` [PATCH 1/4] ref-cache.c: fix prefix matching in " Victoria Dye via GitGitGadget
2023-10-06 21:51 ` Junio C Hamano
2023-10-09 10:04 ` Patrick Steinhardt
2023-10-09 16:21 ` Victoria Dye
2023-10-09 18:15 ` Junio C Hamano
2023-10-06 18:09 ` [PATCH 2/4] dir.[ch]: expose 'get_dtype' Victoria Dye via GitGitGadget
2023-10-06 22:00 ` Junio C Hamano [this message]
2023-10-06 18:09 ` [PATCH 3/4] dir.[ch]: add 'follow_symlink' arg to 'get_dtype' Victoria Dye via GitGitGadget
2023-10-06 18:09 ` [PATCH 4/4] files-backend.c: avoid stat in 'loose_fill_ref_dir' Victoria Dye via GitGitGadget
2023-10-06 22:12 ` Junio C Hamano
2023-10-06 19:09 ` [PATCH 0/4] Performance improvement & cleanup in loose ref iteration Junio C Hamano
2023-10-09 10:04 ` Patrick Steinhardt
2023-10-09 21:49 ` Victoria Dye
2023-10-10 7:21 ` Patrick Steinhardt
2023-10-09 21:58 ` [PATCH v2 " Victoria Dye via GitGitGadget
2023-10-09 21:58 ` [PATCH v2 1/4] ref-cache.c: fix prefix matching in " Victoria Dye via GitGitGadget
2023-10-10 7:21 ` Patrick Steinhardt
2023-10-09 21:58 ` [PATCH v2 2/4] dir.[ch]: expose 'get_dtype' Victoria Dye via GitGitGadget
2023-10-09 21:58 ` [PATCH v2 3/4] dir.[ch]: add 'follow_symlink' arg to 'get_dtype' Victoria Dye via GitGitGadget
2023-10-09 21:58 ` [PATCH v2 4/4] files-backend.c: avoid stat in 'loose_fill_ref_dir' Victoria Dye via GitGitGadget
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=xmqq1qe78l8u.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=vdye@github.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.