• Show log

    Commit

  • Hash : e28e17e6
    Author : Patrick Steinhardt
    Date : 2018-02-01T10:36:33

    attr: avoid stat'ting files for bare repositories
    
    Depending on whether the path we want to look up an attribute for is a
    file or a directory, the fnmatch function will be called with different
    flags. Because of this, we have to first stat(3) the path to determine
    whether it is a file or directory in `git_attr_path__init`. This is
    wasteful though in bare repositories, where we can already be assured
    that the path will never exist at all due to there being no worktree. In
    this case, we will execute an unnecessary syscall, which might be
    noticeable on networked file systems.
    
    What happens right now is that we always pass the `GIT_DIR_FLAG_UNKOWN`
    flag to `git_attr_path__init`, which causes it to `stat` the file itself
    to determine its type. As it is calling `git_path_isdir` on the path,
    which will always return `false` in case the path does not exist, we end
    up with the path always being treated as a file in case of a bare
    repository. As such, we can just check the bare-repository case in all
    callers and then pass in `GIT_DIR_FLAG_FALSE` ourselves, avoiding the
    need to `stat`. While this may not always be correct, it at least is no
    different from our current behavior.