Skip to content
  • Jeff King's avatar
    attr: don't confuse prefixes with leading directories · 1afca444
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When we prepare the attribute stack for a lookup on a path,
    we start with the cached stack from the previous lookup
    (because it is common to do several lookups in the same
    directory hierarchy). So the first thing we must do in
    preparing the stack is to pop any entries that point to
    directories we are no longer interested in.
    
    For example, if our stack contains gitattributes for:
    
      foo/bar/baz
      foo/bar
      foo
    
    but we want to do a lookup in "foo/bar/bleep", then we want
    to pop the top element, but retain the others.
    
    To do this we walk down the stack from the top, popping
    elements that do not match our lookup directory. However,
    the test do this simply checked strncmp, meaning we would
    mistake "foo/bar/baz" as a leading directory of
    "foo/bar/baz_plus". We must also check that the character
    after our match is '/', meaning we matched the whole path
    component.
    
    There are two special cases to consider:
    
      1. The top of our attr stack has the empty path. So we
         must not check for '/', but rather special-case the
         empty path, which always matches.
    
      2. Typically when matching paths in this way, you would
         also need to check for a full string match (i.e., the
         character after is '\0'). We don't need to do so in
         this case, though, because our path string is actually
         just the directory component of the path to a file
         (i.e., we know that it terminates with "/", because the
         filename comes after that).
    
    Helped-by: default avatarMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    1afca444