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

There are too many repetitious "I have this new attr_stack element;
push it at the top of the stack" sequence.  The new helper function
push_stack() gives us a way to express what is going on at these
places, and as a side effect, halves the number of times we mention
the attr_stack global variable.

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

diff --git a/attr.c b/attr.c
index 88fcb7c..a504cb3 100644
--- a/attr.c
+++ b/attr.c
@@ -521,6 +521,18 @@ static int git_attr_system(void)
 
 static GIT_PATH_FUNC(git_path_info_attributes, INFOATTRIBUTES_FILE)
 
+static void push_stack(struct attr_stack **attr_stack_p,
+                      struct attr_stack *elem, char *origin, size_t originlen)
+{
+       if (elem) {
+               elem->origin = origin;
+               if (origin)
+                       elem->originlen = originlen;
+               elem->prev = *attr_stack_p;
+               *attr_stack_p = elem;
+       }
+}
+
 static void bootstrap_attr_stack(void)
 {
        struct attr_stack *elem;
@@ -528,52 +540,35 @@ static void bootstrap_attr_stack(void)
        if (attr_stack)
                return;
 
-       elem = read_attr_from_array(builtin_attr);
-       elem->origin = NULL;
-       elem->prev = attr_stack;
-       attr_stack = elem;
-
-       if (git_attr_system()) {
-               elem = read_attr_from_file(git_etc_gitattributes(), 1);
-               if (elem) {
-                       elem->origin = NULL;
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
-               }
-       }
+       push_stack(&attr_stack, read_attr_from_array(builtin_attr), NULL, 0);
+
+       if (git_attr_system())
+               push_stack(&attr_stack,
+                          read_attr_from_file(git_etc_gitattributes(), 1),
+                          NULL, 0);
 
        if (!git_attributes_file)
                git_attributes_file = xdg_config_home("attributes");
-       if (git_attributes_file) {
-               elem = read_attr_from_file(git_attributes_file, 1);
-               if (elem) {
-                       elem->origin = NULL;
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
-               }
-       }
+       if (git_attributes_file)
+               push_stack(&attr_stack,
+                          read_attr_from_file(git_attributes_file, 1),
+                          NULL, 0);
 
        if (!is_bare_repository() || direction == GIT_ATTR_INDEX) {
                elem = read_attr(GITATTRIBUTES_FILE, 1);
-               elem->origin = xstrdup("");
-               elem->originlen = 0;
-               elem->prev = attr_stack;
-               attr_stack = elem;
+               push_stack(&attr_stack, elem, xstrdup(""), 0);
                debug_push(elem);
        }
 
        elem = read_attr_from_file(git_path_info_attributes(), 1);
        if (!elem)
                elem = xcalloc(1, sizeof(*elem));
-       elem->origin = NULL;
-       elem->prev = attr_stack;
-       attr_stack = elem;
+       push_stack(&attr_stack, elem, NULL, 0);
 }
 
 static void prepare_attr_stack(const char *path, int dirlen)
 {
        struct attr_stack *elem, *info;
-       int len;
        const char *cp;
 
        /*
@@ -633,20 +628,21 @@ static void prepare_attr_stack(const char *path, int 
dirlen)
 
                assert(attr_stack->origin);
                while (1) {
-                       len = strlen(attr_stack->origin);
+                       size_t len = strlen(attr_stack->origin);
+                       char *origin;
+
                        if (dirlen <= len)
                                break;
                        cp = memchr(path + len + 1, '/', dirlen - len - 1);
                        if (!cp)
                                cp = path + dirlen;
-                       strbuf_add(&pathbuf, path, cp - path);
-                       strbuf_addch(&pathbuf, '/');
-                       strbuf_addstr(&pathbuf, GITATTRIBUTES_FILE);
+                       strbuf_addf(&pathbuf,
+                                   "%.*s/%s", (int)(cp - path), path,
+                                   GITATTRIBUTES_FILE);
                        elem = read_attr(pathbuf.buf, 0);
                        strbuf_setlen(&pathbuf, cp - path);
-                       elem->origin = strbuf_detach(&pathbuf, 
&elem->originlen);
-                       elem->prev = attr_stack;
-                       attr_stack = elem;
+                       origin = strbuf_detach(&pathbuf, &len);
+                       push_stack(&attr_stack, elem, origin, len);
                        debug_push(elem);
                }
 
@@ -656,8 +652,7 @@ static void prepare_attr_stack(const char *path, int dirlen)
        /*
         * Finally push the "info" one at the top of the stack.
         */
-       info->prev = attr_stack;
-       attr_stack = info;
+       push_stack(&attr_stack, info, NULL, 0);
 }
 
 static int path_matches(const char *pathname, int pathlen,
-- 
2.10.1.469.g00a8914

Reply via email to