While investigating ref iteration performance in builtins like 'for-each-ref' and 'show-ref', I found two small improvement opportunities. The first patch tweaks the logic around prefix matching in 'cache_ref_iterator_advance' so that we correctly skip refs that do not actually match a given prefix. The unnecessary iteration doesn't seem to be causing any bugs in the ref iteration commands that I've tested, but it doesn't hurt to be more precise (and it helps with some other patches I'm working on ;) ). The next three patches update how 'loose_fill_ref_dir' determines the type of ref cache entry to create (directory or regular). On platforms that include d_type information in 'struct dirent' (as far as I can tell, all except NonStop & certain versions of Cygwin), this allows us to skip calling 'stat'. In ad-hoc testing, this improved performance of 'git for-each-ref' by about 20%. Thanks! * Victoria Victoria Dye (4): ref-cache.c: fix prefix matching in ref iteration dir.[ch]: expose 'get_dtype' dir.[ch]: add 'follow_symlink' arg to 'get_dtype' files-backend.c: avoid stat in 'loose_fill_ref_dir' diagnose.c | 42 +++--------------------------------------- dir.c | 33 +++++++++++++++++++++++++++++++++ dir.h | 16 ++++++++++++++++ refs/files-backend.c | 14 +++++--------- refs/ref-cache.c | 3 ++- 5 files changed, 59 insertions(+), 49 deletions(-) base-commit: 3a06386e314565108ad56a9bdb8f7b80ac52fb69 Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1594%2Fvdye%2Fvdye%2Fref-iteration-cleanup-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1594/vdye/vdye/ref-iteration-cleanup-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/1594 -- gitgitgadget