In sha1_loose_object_info(), use access() (indirectly invoked through has_loose_object()) instead of lstat() if we do not need the on-disk size, as it should be faster on Windows [1]. [1] https://public-inbox.org/git/alpine.DEB.2.21.1.1707191450570.4193@virtualbox/ Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- Thanks for the information - here's a patch. Do you, by any chance, know of a web page (or similar thing) that I can cite for this? --- sha1_file.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/sha1_file.c b/sha1_file.c index fca165f13..81962b019 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -2920,20 +2920,19 @@ static int sha1_loose_object_info(const unsigned char *sha1, /* * If we don't care about type or size, then we don't - * need to look inside the object at all. Note that we - * do not optimize out the stat call, even if the - * caller doesn't care about the disk-size, since our - * return value implicitly indicates whether the - * object even exists. + * need to look inside the object at all. We only check + * for its existence. */ if (!oi->typep && !oi->typename && !oi->sizep && !oi->contentp) { - const char *path; - struct stat st; - if (stat_sha1_file(sha1, &st, &path) < 0) - return -1; - if (oi->disk_sizep) + if (oi->disk_sizep) { + const char *path; + struct stat st; + if (stat_sha1_file(sha1, &st, &path) < 0) + return -1; *oi->disk_sizep = st.st_size; - return 0; + return 0; + } + return has_loose_object(sha1) ? 0 : -1; } map = map_sha1_file(sha1, &mapsize); -- 2.14.0.rc0.284.gd933b75aa4-goog