Imported Upstream version 2.12.1
[platform/upstream/git.git] / log-tree.c
index f70a30e..8c24157 100644 (file)
@@ -77,9 +77,8 @@ int parse_decorate_color_config(const char *var, const char *slot_name, const ch
 
 void add_name_decoration(enum decoration_type type, const char *name, struct object *obj)
 {
-       int nlen = strlen(name);
-       struct name_decoration *res = xmalloc(sizeof(*res) + nlen + 1);
-       memcpy(res->name, name, nlen + 1);
+       struct name_decoration *res;
+       FLEX_ALLOC_STR(res, name, name);
        res->type = type;
        res->next = add_decoration(&name_decoration, obj, res);
 }
@@ -160,12 +159,12 @@ void load_ref_decorations(int flags)
        }
 }
 
-static void show_parents(struct commit *commit, int abbrev)
+static void show_parents(struct commit *commit, int abbrev, FILE *file)
 {
        struct commit_list *p;
        for (p = commit->parents; p ; p = p->next) {
                struct commit *parent = p->item;
-               printf(" %s", find_unique_abbrev(parent->object.oid.hash, abbrev));
+               fprintf(file, " %s", find_unique_abbrev(parent->object.oid.hash, abbrev));
        }
 }
 
@@ -173,7 +172,7 @@ static void show_children(struct rev_info *opt, struct commit *commit, int abbre
 {
        struct commit_list *p = lookup_decoration(&opt->children, &commit->object);
        for ( ; p; p = p->next) {
-               printf(" %s", find_unique_abbrev(p->item->object.oid.hash, abbrev));
+               fprintf(opt->diffopt.file, " %s", find_unique_abbrev(p->item->object.oid.hash, abbrev));
        }
 }
 
@@ -264,8 +263,6 @@ void format_decorations_extended(struct strbuf *sb,
 
                        if (current_and_HEAD &&
                            decoration->type == DECORATION_REF_HEAD) {
-                               strbuf_addstr(sb, color_reset);
-                               strbuf_addstr(sb, color_commit);
                                strbuf_addstr(sb, " -> ");
                                strbuf_addstr(sb, color_reset);
                                strbuf_addstr(sb, decorate_get_color(use_color, current_and_HEAD->type));
@@ -287,11 +284,11 @@ void show_decorations(struct rev_info *opt, struct commit *commit)
        struct strbuf sb = STRBUF_INIT;
 
        if (opt->show_source && commit->util)
-               printf("\t%s", (char *) commit->util);
+               fprintf(opt->diffopt.file, "\t%s", (char *) commit->util);
        if (!opt->show_decorations)
                return;
        format_decorations(&sb, commit, opt->diffopt.use_color);
-       fputs(sb.buf, stdout);
+       fputs(sb.buf, opt->diffopt.file);
        strbuf_release(&sb);
 }
 
@@ -365,18 +362,18 @@ void log_write_email_headers(struct rev_info *opt, struct commit *commit,
                subject = "Subject: ";
        }
 
-       printf("From %s Mon Sep 17 00:00:00 2001\n", name);
+       fprintf(opt->diffopt.file, "From %s Mon Sep 17 00:00:00 2001\n", name);
        graph_show_oneline(opt->graph);
        if (opt->message_id) {
-               printf("Message-Id: <%s>\n", opt->message_id);
+               fprintf(opt->diffopt.file, "Message-Id: <%s>\n", opt->message_id);
                graph_show_oneline(opt->graph);
        }
        if (opt->ref_message_ids && opt->ref_message_ids->nr > 0) {
                int i, n;
                n = opt->ref_message_ids->nr;
-               printf("In-Reply-To: <%s>\n", opt->ref_message_ids->items[n-1].string);
+               fprintf(opt->diffopt.file, "In-Reply-To: <%s>\n", opt->ref_message_ids->items[n-1].string);
                for (i = 0; i < n; i++)
-                       printf("%s<%s>\n", (i > 0 ? "\t" : "References: "),
+                       fprintf(opt->diffopt.file, "%s<%s>\n", (i > 0 ? "\t" : "References: "),
                               opt->ref_message_ids->items[i].string);
                graph_show_oneline(opt->graph);
        }
@@ -433,7 +430,7 @@ static void show_sig_lines(struct rev_info *opt, int status, const char *bol)
        reset = diff_get_color_opt(&opt->diffopt, DIFF_RESET);
        while (*bol) {
                eol = strchrnul(bol, '\n');
-               printf("%s%.*s%s%s", color, (int)(eol - bol), bol, reset,
+               fprintf(opt->diffopt.file, "%s%.*s%s%s", color, (int)(eol - bol), bol, reset,
                       *eol ? "\n" : "");
                graph_show_oneline(opt->graph);
                bol = (*eol) ? (eol + 1) : eol;
@@ -554,17 +551,17 @@ void show_log(struct rev_info *opt)
 
                if (!opt->graph)
                        put_revision_mark(opt, commit);
-               fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit), stdout);
+               fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit), opt->diffopt.file);
                if (opt->print_parents)
-                       show_parents(commit, abbrev_commit);
+                       show_parents(commit, abbrev_commit, opt->diffopt.file);
                if (opt->children.name)
                        show_children(opt, commit, abbrev_commit);
                show_decorations(opt, commit);
                if (opt->graph && !graph_is_commit_finished(opt->graph)) {
-                       putchar('\n');
+                       putc('\n', opt->diffopt.file);
                        graph_show_remainder(opt->graph);
                }
-               putchar(opt->diffopt.line_termination);
+               putc(opt->diffopt.line_termination, opt->diffopt.file);
                return;
        }
 
@@ -590,7 +587,7 @@ void show_log(struct rev_info *opt)
                if (opt->diffopt.line_termination == '\n' &&
                    !opt->missing_newline)
                        graph_show_padding(opt->graph);
-               putchar(opt->diffopt.line_termination);
+               putc(opt->diffopt.line_termination, opt->diffopt.file);
        }
        opt->shown_one = 1;
 
@@ -604,32 +601,32 @@ void show_log(struct rev_info *opt)
         * Print header line of header..
         */
 
-       if (opt->commit_format == CMIT_FMT_EMAIL) {
+       if (cmit_fmt_is_mail(opt->commit_format)) {
                log_write_email_headers(opt, commit, &ctx.subject, &extra_headers,
                                        &ctx.need_8bit_cte);
        } else if (opt->commit_format != CMIT_FMT_USERFORMAT) {
-               fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), stdout);
+               fputs(diff_get_color_opt(&opt->diffopt, DIFF_COMMIT), opt->diffopt.file);
                if (opt->commit_format != CMIT_FMT_ONELINE)
-                       fputs("commit ", stdout);
+                       fputs("commit ", opt->diffopt.file);
 
                if (!opt->graph)
                        put_revision_mark(opt, commit);
                fputs(find_unique_abbrev(commit->object.oid.hash, abbrev_commit),
-                     stdout);
+                     opt->diffopt.file);
                if (opt->print_parents)
-                       show_parents(commit, abbrev_commit);
+                       show_parents(commit, abbrev_commit, opt->diffopt.file);
                if (opt->children.name)
                        show_children(opt, commit, abbrev_commit);
                if (parent)
-                       printf(" (from %s)",
+                       fprintf(opt->diffopt.file, " (from %s)",
                               find_unique_abbrev(parent->object.oid.hash,
                                                  abbrev_commit));
-               fputs(diff_get_color_opt(&opt->diffopt, DIFF_RESET), stdout);
+               fputs(diff_get_color_opt(&opt->diffopt, DIFF_RESET), opt->diffopt.file);
                show_decorations(opt, commit);
                if (opt->commit_format == CMIT_FMT_ONELINE) {
-                       putchar(' ');
+                       putc(' ', opt->diffopt.file);
                } else {
-                       putchar('\n');
+                       putc('\n', opt->diffopt.file);
                        graph_show_oneline(opt->graph);
                }
                if (opt->reflog_info) {
@@ -684,9 +681,12 @@ void show_log(struct rev_info *opt)
        ctx.fmt = opt->commit_format;
        ctx.mailmap = opt->mailmap;
        ctx.color = opt->diffopt.use_color;
+       ctx.expand_tabs_in_log = opt->expand_tabs_in_log;
        ctx.output_encoding = get_log_output_encoding();
        if (opt->from_ident.mail_begin && opt->from_ident.name_begin)
                ctx.from_ident = &opt->from_ident;
+       if (opt->graph)
+               ctx.graph_width = graph_width(opt->graph);
        pretty_print_commit(&ctx, commit, &msgbuf);
 
        if (opt->add_signoff)
@@ -694,7 +694,7 @@ void show_log(struct rev_info *opt)
 
        if ((ctx.fmt != CMIT_FMT_USERFORMAT) &&
            ctx.notes_message && *ctx.notes_message) {
-               if (ctx.fmt == CMIT_FMT_EMAIL) {
+               if (cmit_fmt_is_mail(ctx.fmt)) {
                        strbuf_addstr(&msgbuf, "---\n");
                        opt->shown_dashes = 1;
                }
@@ -702,7 +702,7 @@ void show_log(struct rev_info *opt)
        }
 
        if (opt->show_log_size) {
-               printf("log size %i\n", (int)msgbuf.len);
+               fprintf(opt->diffopt.file, "log size %i\n", (int)msgbuf.len);
                graph_show_oneline(opt->graph);
        }
 
@@ -715,14 +715,11 @@ void show_log(struct rev_info *opt)
        else
                opt->missing_newline = 0;
 
-       if (opt->graph)
-               graph_show_commit_msg(opt->graph, &msgbuf);
-       else
-               fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
+       graph_show_commit_msg(opt->graph, opt->diffopt.file, &msgbuf);
        if (opt->use_terminator && !commit_format_is_empty(opt->commit_format)) {
                if (!opt->missing_newline)
                        graph_show_padding(opt->graph);
-               putchar(opt->diffopt.line_termination);
+               putc(opt->diffopt.line_termination, opt->diffopt.file);
        }
 
        strbuf_release(&msgbuf);
@@ -759,7 +756,7 @@ int log_tree_diff_flush(struct rev_info *opt)
                                struct strbuf *msg = NULL;
                                msg = opt->diffopt.output_prefix(&opt->diffopt,
                                        opt->diffopt.output_prefix_data);
-                               fwrite(msg->buf, msg->len, 1, stdout);
+                               fwrite(msg->buf, msg->len, 1, opt->diffopt.file);
                        }
 
                        /*
@@ -774,8 +771,8 @@ int log_tree_diff_flush(struct rev_info *opt)
                         */
                        if (!opt->shown_dashes &&
                            (pch & opt->diffopt.output_format) == pch)
-                               printf("---");
-                       putchar('\n');
+                               fprintf(opt->diffopt.file, "---");
+                       putc('\n', opt->diffopt.file);
                }
        }
        diff_flush(&opt->diffopt);
@@ -862,17 +859,18 @@ static int log_tree_diff(struct rev_info *opt, struct commit *commit, struct log
 int log_tree_commit(struct rev_info *opt, struct commit *commit)
 {
        struct log_info log;
-       int shown;
+       int shown, close_file = opt->diffopt.close_file;
 
        log.commit = commit;
        log.parent = NULL;
        opt->loginfo = &log;
+       opt->diffopt.close_file = 0;
 
        if (opt->line_level_traverse)
                return line_log_print(opt, commit);
 
        if (opt->track_linear && !opt->linear && !opt->reverse_output_stage)
-               printf("\n%s\n", opt->break_bar);
+               fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
        shown = log_tree_diff(opt, commit, &log);
        if (!shown && opt->loginfo && opt->always_show_header) {
                log.parent = NULL;
@@ -880,8 +878,10 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit)
                shown = 1;
        }
        if (opt->track_linear && !opt->linear && opt->reverse_output_stage)
-               printf("\n%s\n", opt->break_bar);
+               fprintf(opt->diffopt.file, "\n%s\n", opt->break_bar);
        opt->loginfo = NULL;
-       maybe_flush_or_die(stdout, "stdout");
+       maybe_flush_or_die(opt->diffopt.file, "stdout");
+       if (close_file)
+               fclose(opt->diffopt.file);
        return shown;
 }