]> git.ipfire.org Git - thirdparty/git.git/commit
name-hash: stop storing trailing '/' on paths in index_state.dir_hash
authorEric Sunshine <sunshine@sunshineco.com>
Tue, 17 Sep 2013 07:06:16 +0000 (03:06 -0400)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 Sep 2013 17:08:07 +0000 (10:08 -0700)
commitd28eec267374c476de490bff736a627da94575c5
tree00d7242d3d58faca44e07ac39237a9e87b7f3253
parentebbd7439b1b7cce0e8c68fe3e220d71cc58dd980
name-hash: stop storing trailing '/' on paths in index_state.dir_hash

When 5102c617 (Add case insensitivity support for directories when using
git status, 2010-10-03) added directories to the name-hash there was
only a single hash table in which both real cache entries and leading
directory prefixes were registered. To distinguish between the two types
of entries, directories were stored with a trailing '/'.

2092678c (name-hash.c: fix endless loop with core.ignorecase=true,
2013-02-28), however, moved directories to a separate hash table
(index_state.dir_hash) but retained the (now) redundant trailing '/',
thus callers continue to bear the burden of ensuring the slash's
presence before searching the index for a directory. Eliminate this
redundancy by storing paths in the dir-hash without the trailing '/'.

An important benefit of this change is that it eliminates undocumented
and dangerous behavior of dir.c:directory_exists_in_index_icase() in
which it assumes not only that it can validly access one character
beyond the end of its incoming directory argument, but also that that
character will unconditionally be a '/'. This perilous behavior was
"tolerated" because the string passed in by its lone caller always had a
'/' in that position, however, things broke [1] when 2eac2a4c (ls-files
-k: a directory only can be killed if the index has a non-directory,
2013-08-15) added a new caller which failed to respect the undocumented
assumption.

[1]: http://thread.gmane.org/gmane.comp.version-control.git/232727

Signed-off-by: Eric Sunshine <sunshine@sunshineco.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
dir.c
name-hash.c
read-cache.c