From: Junio C Hamano <gits...@pobox.com>

This function used to be called with check=NULL to signal it to
collect all attributes in the global check_all_attr[] array.

Because the longer term plan is to allocate check_all_attr[] and
attr_stack data structures per git_attr_check instance (i.e. "check"
here) to make the attr subsystem thread-safe, it is unacceptable.

Pass "Are we grabbing all attributes defined in the system?" bit as
a separate argument and pass it from the callers.

Signed-off-by: Junio C Hamano <gits...@pobox.com>
Signed-off-by: Stefan Beller <sbel...@google.com>
---
 attr.c | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/attr.c b/attr.c
index 1098300e54..92b3130f1e 100644
--- a/attr.c
+++ b/attr.c
@@ -760,11 +760,12 @@ static void empty_attr_check_elems(struct git_attr_check 
*check)
 
 /*
  * Collect attributes for path into the array pointed to by
- * check_all_attr.  If check is not NULL, only attributes in
- * check[] are collected. Otherwise all attributes are collected.
+ * check_all_attr.  If collect_all is zero, only attributes in
+ * check[] are collected.  Otherwise, check[] is cleared and
+ * any and all attributes that are visible are collected in it.
  */
 static void collect_some_attrs(const char *path, int pathlen,
-                              struct git_attr_check *check)
+                              struct git_attr_check *check, int collect_all)
 
 {
        struct attr_stack *stk;
@@ -785,10 +786,11 @@ static void collect_some_attrs(const char *path, int 
pathlen,
        }
 
        prepare_attr_stack(path, dirlen);
+
        for (i = 0; i < attr_nr; i++)
                check_all_attr[i].value = ATTR__UNKNOWN;
 
-       if (check && !cannot_trust_maybe_real) {
+       if (!collect_all && !cannot_trust_maybe_real) {
                struct git_attr_check_elem *celem = check->check;
 
                rem = 0;
@@ -807,6 +809,17 @@ static void collect_some_attrs(const char *path, int 
pathlen,
        rem = attr_nr;
        for (stk = attr_stack; 0 < rem && stk; stk = stk->prev)
                rem = fill(path, pathlen, basename_offset, stk, rem);
+
+       if (collect_all) {
+               empty_attr_check_elems(check);
+               for (i = 0; i < attr_nr; i++) {
+                       const struct git_attr *attr = check_all_attr[i].attr;
+                       const char *value = check_all_attr[i].value;
+                       if (value == ATTR__UNSET || value == ATTR__UNKNOWN)
+                               continue;
+                       git_attr_check_append(check, attr)->value = value;
+               }
+       }
 }
 
 static int git_check_attrs(const char *path, int pathlen,
@@ -815,7 +828,7 @@ static int git_check_attrs(const char *path, int pathlen,
        int i;
        struct git_attr_check_elem *celem = check->check;
 
-       collect_some_attrs(path, pathlen, check);
+       collect_some_attrs(path, pathlen, check, 0);
 
        for (i = 0; i < check->check_nr; i++) {
                const char *value = 
check_all_attr[celem[i].attr->attr_nr].value;
@@ -829,19 +842,7 @@ static int git_check_attrs(const char *path, int pathlen,
 
 void git_all_attrs(const char *path, struct git_attr_check *check)
 {
-       int i;
-
-       git_attr_check_clear(check);
-       collect_some_attrs(path, strlen(path), NULL);
-
-       for (i = 0; i < attr_nr; i++) {
-               const char *name = check_all_attr[i].attr->name;
-               const char *value = check_all_attr[i].value;
-               if (value == ATTR__UNSET || value == ATTR__UNKNOWN)
-                       continue;
-               git_attr_check_append(check, git_attr(name));
-               check->check[check->check_nr - 1].value = value;
-       }
+       collect_some_attrs(path, strlen(path), check, 1);
 }
 
 void git_attr_set_direction(enum git_attr_direction new, struct index_state 
*istate)
-- 
2.10.1.714.ge3da0db

Reply via email to