Signed-off-by: Nguyễn Thái Ngọc Duy <pclo...@gmail.com>
---
 builtin/for-each-ref.c | 48 +++++++++++++++++++++++++++++-------------------
 1 file changed, 29 insertions(+), 19 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 14151b4..08d4eb1 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -864,15 +864,14 @@ static void sort_refs(struct ref_sort *sort, struct 
refinfo **refs, int num_refs
        qsort(refs, num_refs, sizeof(struct refinfo *), compare_refs);
 }
 
-static void print_value(struct refinfo *ref, int atom, int quote_style)
+static void print_value(struct strbuf *sb, struct refinfo *ref,
+                       int atom, int quote_style)
 {
        struct atom_value *v;
-       struct strbuf sb_buf = STRBUF_INIT;
-       struct strbuf *sb = &sb_buf;
        get_value(ref, atom, &v);
        switch (quote_style) {
        case QUOTE_NONE:
-               fputs(v->s, stdout);
+               strbuf_addstr(sb, v->s);
                break;
        case QUOTE_SHELL:
                sq_quote_buf(sb, v->s);
@@ -887,10 +886,6 @@ static void print_value(struct refinfo *ref, int atom, int 
quote_style)
                tcl_quote_buf(sb, v->s);
                break;
        }
-       if (quote_style != QUOTE_NONE) {
-               fputs(sb->buf, stdout);
-               strbuf_release(sb);
-       }
 }
 
 static int hex1(char ch)
@@ -911,7 +906,7 @@ static int hex2(const char *cp)
                return -1;
 }
 
-static void emit(const char *cp, const char *ep)
+static void emit(struct strbuf *sb, const char *cp, const char *ep)
 {
        while (*cp && (!ep || cp < ep)) {
                if (*cp == '%') {
@@ -920,32 +915,47 @@ static void emit(const char *cp, const char *ep)
                        else {
                                int ch = hex2(cp + 1);
                                if (0 <= ch) {
-                                       putchar(ch);
+                                       strbuf_addch(sb, ch);
                                        cp += 3;
                                        continue;
                                }
                        }
                }
-               putchar(*cp);
+               strbuf_addch(sb, *cp);
                cp++;
        }
 }
 
-static void show_ref(struct refinfo *info, const char *format, int quote_style)
+static void show_ref(struct strbuf *sb, struct refinfo *info,
+                    const char *format, int quote_style)
 {
        const char *cp, *sp, *ep;
 
        for (cp = format; *cp && (sp = find_next(cp)); cp = ep + 1) {
                ep = strchr(sp, ')');
                if (cp < sp)
-                       emit(cp, sp);
-               print_value(info, parse_atom(sp + 2, ep), quote_style);
+                       emit(sb, cp, sp);
+               print_value(sb, info, parse_atom(sp + 2, ep), quote_style);
        }
        if (*cp) {
                sp = cp + strlen(cp);
-               emit(cp, sp);
+               emit(sb, cp, sp);
+       }
+       strbuf_addch(sb, '\n');
+}
+
+static void show_refs(struct refinfo **refs, int maxcount,
+                     const char *format, int quote_style)
+{
+       struct strbuf sb = STRBUF_INIT;
+       int i;
+
+       for (i = 0; i < maxcount; i++) {
+               strbuf_reset(&sb);
+               show_ref(&sb, refs[i], format, quote_style);
+               fputs(sb.buf, stdout);
        }
-       putchar('\n');
+       strbuf_release(&sb);
 }
 
 static struct ref_sort *default_sort(void)
@@ -988,7 +998,7 @@ static char const * const for_each_ref_usage[] = {
 
 int cmd_for_each_ref(int argc, const char **argv, const char *prefix)
 {
-       int i, num_refs;
+       int num_refs;
        const char *format = "%(objectname) %(objecttype)\t%(refname)";
        struct ref_sort *sort = NULL, **sort_tail = &sort;
        int maxcount = 0, quote_style = 0;
@@ -1042,7 +1052,7 @@ int cmd_for_each_ref(int argc, const char **argv, const 
char *prefix)
 
        if (!maxcount || num_refs < maxcount)
                maxcount = num_refs;
-       for (i = 0; i < maxcount; i++)
-               show_ref(refs[i], format, quote_style);
+
+       show_refs(refs, maxcount, format, quote_style);
        return 0;
 }
-- 
1.8.2.83.gc99314b

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to