Skip to content
  • Junio C Hamano's avatar
    Add basic infrastructure to assign attributes to paths · d0bfd026
    Junio C Hamano authored
    
    
    This adds the basic infrastructure to assign attributes to
    paths, in a way similar to what the exclusion mechanism does
    based on $GIT_DIR/info/exclude and .gitignore files.
    
    An attribute is just a simple string that does not contain any
    whitespace.  They can be specified in $GIT_DIR/info/attributes
    file, and .gitattributes file in each directory.
    
    Each line in these files defines a pattern matching rule.
    Similar to the exclusion mechanism, a later match overrides an
    earlier match in the same file, and entries from .gitattributes
    file in the same directory takes precedence over the ones from
    parent directories.  Lines in $GIT_DIR/info/attributes file are
    used as the lowest precedence default rules.
    
    A line is either a comment (an empty line, or a line that begins
    with a '#'), or a rule, which is a whitespace separated list of
    tokens.  The first token on the line is a shell glob pattern.
    The rest are names of attributes, each of which can optionally
    be prefixed with '!'.  Such a line means "if a path matches this
    glob, this attribute is set (or unset -- if the attribute name
    is prefixed with '!').  For glob matching, the same "if the
    pattern does not have a slash in it, the basename of the path is
    matched with fnmatch(3) against the pattern, otherwise, the path
    is matched with the pattern with FNM_PATHNAME" rule as the
    exclusion mechanism is used.
    
    This does not define what an attribute means.  Tying an
    attribute to various effects it has on git operation for paths
    that have it will be specified separately.
    
    Signed-off-by: default avatarJunio C Hamano <junkio@cox.net>
    d0bfd026