Skip to content
  • Eric Sunshine's avatar
    name-hash: stop storing trailing '/' on paths in index_state.dir_hash · d28eec26
    Eric Sunshine authored and Junio C Hamano's avatar Junio C Hamano committed
    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: default avatarEric Sunshine <sunshine@sunshineco.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    d28eec26