]> git.ipfire.org Git - thirdparty/git.git/commit - sha1-file.c
sha1_name: cache readdir(3) results in find_short_object_filename()
authorRené Scharfe <l.s.r@web.de>
Thu, 22 Jun 2017 18:19:48 +0000 (20:19 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 22 Jun 2017 19:07:51 +0000 (12:07 -0700)
commitcc817ca3ef2267c21af9589a7f92190a3659906c
treedf2fef1adc0a4c45d9d7a3275a6aff2081b9e52e
parentfd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78
sha1_name: cache readdir(3) results in find_short_object_filename()

Read each loose object subdirectory at most once when looking for unique
abbreviated hashes.  This speeds up commands like "git log --pretty=%h"
considerably, which previously caused one readdir(3) call for each
candidate, even for subdirectories that were visited before.

The new cache is kept until the program ends and never invalidated.  The
same is already true for pack indexes.  The inherent racy nature of
finding unique short hashes makes it still fit for this purpose -- a
conflicting new object may be added at any time.  Tasks with higher
consistency requirements should not use it, though.

The cached object names are stored in an oid_array, which is quite
compact.  The bitmap for remembering which subdir was already read is
stored as a char array, with one char per directory -- that's not quite
as compact, but really simple and incurs only an overhead equivalent to
11 hashes after all.

Suggested-by: Jeff King <peff@peff.net>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Rene Scharfe <l.s.r@web.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
sha1_file.c
sha1_name.c