This series has been bounced around a bit (from Junio to Stefan) and finally landed in my lap. The end result of Stefan's attempt at the series still had a couple of things that needed more tweaking. It also has a few patches on top which added functionality to pathspecs to be able to query into the attribute system, which I've dropped from this series due to this series' length. As a reminder the intent of this series is to revamp the attribute system so that it can be thread-safe as well as a couple of other quality of life changes. This entailed removing dependencies on writing global data structures during the attribute collection process. Major changes are as follows: * The global array used to collect attributes needed to be made local and as a result was pushed out to the attr_check structure the caller prepares before querying the attribute system. * As it turns out the attribute stack ends up being used as a read-only structure during the collection process and as such parts of the attribute stack can be shared between different threads calling into the system. To enable this sharing the attribute stack frames are stored in a hashmap and can be read out (or created and stored in the hashmap) based on the directory name of the path being queried. This is possible because if a particular stack frame is included in the overall stack for a particular query, all of the frames underneath it will be the same for all queries that use this frame (only exception is the info frame which is handled special case, see the patch for details). I took many of the first patches of this series as is from the series Stefan prepared as as such may only need a cursory glace. I did modify and change some of the later patches authored by Junio to address a couple of naming changes and to redistribute some code between patches so those patches would need a closer look. Thanks again to all the work Junio and Stefan put into this before I got a hold of it. Any comments are appreciated! Thanks, Brandon Williams Brandon Williams (8): attr: pass struct attr_check to collect_some_attrs attr: use hashmap for attribute dictionary attr: eliminate global check_all_attr array attr: remove maybe-real, maybe-macro from git_attr attr: tighten const correctness with git_attr and match_attr attr: store attribute stacks in hashmap attr: push the bare repo check into read_attr() attr: reformat git_attr_set_direction() function Junio C Hamano (17): commit.c: use strchrnul() to scan for one line attr.c: use strchrnul() to scan for one line attr.c: update a stale comment on "struct match_attr" attr.c: explain the lack of attr-name syntax check in parse_attr() attr.c: complete a sentence in a comment attr.c: mark where #if DEBUG ends more clearly attr.c: simplify macroexpand_one() attr.c: tighten constness around "git_attr" structure attr.c: plug small leak in parse_attr_line() attr.c: add push_stack() helper attr.c: outline the future plans by heavily commenting attr: rename function and struct related to checking attributes attr: (re)introduce git_check_attr() and struct attr_check attr: convert git_all_attrs() to use "struct attr_check" attr: convert git_check_attrs() callers to use the new API attr: retire git_check_attrs() API attr: change validity check for attribute names to use positive logic Nguyễn Thái Ngọc Duy (1): attr: support quoting pathname patterns in C style Stefan Beller (1): Documentation: fix a typo Documentation/gitattributes.txt | 10 +- Documentation/technical/api-gitattributes.txt | 86 ++- archive.c | 24 +- attr.c | 932 +++++++++++++++++--------- attr.h | 50 +- builtin/check-attr.c | 66 +- builtin/pack-objects.c | 19 +- commit.c | 3 +- common-main.c | 3 + convert.c | 25 +- ll-merge.c | 33 +- t/t0003-attributes.sh | 26 + userdiff.c | 19 +- ws.c | 19 +- 14 files changed, 834 insertions(+), 481 deletions(-) -- 2.11.0.390.gc69c2f50cf-goog