]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'nd/log-decorate-color-head-arrow'
authorJunio C Hamano <gitster@pobox.com>
Mon, 8 Aug 2016 21:48:42 +0000 (14:48 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 8 Aug 2016 21:48:42 +0000 (14:48 -0700)
An entry "git log --decorate" for the tip of the current branch is
shown as "HEAD -> name" (where "name" is the name of the branch);
paint the arrow in the same color as "HEAD", not in the color for
commits.

* nd/log-decorate-color-head-arrow:
  log: decorate HEAD -> branch with the same color for arrow and HEAD

1  2 
log-tree.c

diff --combined log-tree.c
index d0062e6788e95620bb6e1a534661dbb70bdbb098,c70f992a963945610051bcbe20463da2e21d0dbf..bfb735c84556f0c6f4d3f17dc4ed18774b8db817
@@@ -77,8 -77,9 +77,8 @@@ int parse_decorate_color_config(const c
  
  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);
  }
@@@ -96,12 -97,11 +96,12 @@@ static int add_ref_decoration(const cha
  
        assert(cb_data == NULL);
  
 -      if (starts_with(refname, "refs/replace/")) {
 +      if (starts_with(refname, git_replace_ref_base)) {
                struct object_id original_oid;
                if (!check_replace_refs)
                        return 0;
 -              if (get_oid_hex(refname + 13, &original_oid)) {
 +              if (get_oid_hex(refname + strlen(git_replace_ref_base),
 +                              &original_oid)) {
                        warning("invalid replace ref %s", refname);
                        return 0;
                }
                if (!obj)
                        break;
                if (!obj->parsed)
 -                      parse_object(obj->sha1);
 +                      parse_object(obj->oid.hash);
                add_name_decoration(DECORATION_REF_TAG, refname, obj);
        }
        return 0;
@@@ -159,12 -159,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.sha1, abbrev));
 +              fprintf(file, " %s", find_unique_abbrev(parent->object.oid.hash, abbrev));
        }
  }
  
@@@ -172,7 -172,7 +172,7 @@@ static void show_children(struct rev_in
  {
        struct commit_list *p = lookup_decoration(&opt->children, &commit->object);
        for ( ; p; p = p->next) {
 -              printf(" %s", find_unique_abbrev(p->item->object.sha1, abbrev));
 +              fprintf(opt->diffopt.file, " %s", find_unique_abbrev(p->item->object.oid.hash, abbrev));
        }
  }
  
@@@ -263,8 -263,6 +263,6 @@@ void format_decorations_extended(struc
  
                        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));
@@@ -286,11 -284,11 +284,11 @@@ void show_decorations(struct rev_info *
        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);
  }
  
@@@ -341,8 -339,7 +339,8 @@@ void log_write_email_headers(struct rev
  {
        const char *subject = NULL;
        const char *extra_headers = opt->extra_headers;
 -      const char *name = sha1_to_hex(commit->object.sha1);
 +      const char *name = oid_to_hex(opt->zero_commit ?
 +                                    &null_oid : &commit->object.oid);
  
        *need_8bit_cte_p = 0; /* unknown */
        if (opt->total > 0) {
                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);
        }
@@@ -432,7 -429,7 +430,7 @@@ static void show_sig_lines(struct rev_i
        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;
@@@ -469,7 -466,7 +467,7 @@@ static int which_parent(const unsigned 
        const struct commit_list *parent;
  
        for (nth = 0, parent = commit->parents; parent; parent = parent->next) {
 -              if (!hashcmp(parent->item->object.sha1, sha1))
 +              if (!hashcmp(parent->item->object.oid.hash, sha1))
                        return nth;
                nth++;
        }
@@@ -503,13 -500,13 +501,13 @@@ static void show_one_mergetag(struct co
        if (parse_tag_buffer(tag, extra->value, extra->len))
                strbuf_addstr(&verify_message, "malformed mergetag\n");
        else if (is_common_merge(commit) &&
 -               !hashcmp(tag->tagged->sha1,
 -                        commit->parents->next->item->object.sha1))
 +               !oidcmp(&tag->tagged->oid,
 +                        &commit->parents->next->item->object.oid))
                strbuf_addf(&verify_message,
                            "merged tag '%s'\n", tag->tag);
 -      else if ((nth = which_parent(tag->tagged->sha1, commit)) < 0)
 +      else if ((nth = which_parent(tag->tagged->oid.hash, commit)) < 0)
                strbuf_addf(&verify_message, "tag %s names a non-parent %s\n",
 -                                  tag->tag, tag->tagged->sha1);
 +                                  tag->tag, tag->tagged->oid.hash);
        else
                strbuf_addf(&verify_message,
                            "parent #%d, tagged '%s'\n", nth + 1, tag->tag);
@@@ -553,17 -550,17 +551,17 @@@ void show_log(struct rev_info *opt
  
                if (!opt->graph)
                        put_revision_mark(opt, commit);
 -              fputs(find_unique_abbrev(commit->object.sha1, 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;
        }
  
                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;
  
         * 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.sha1, 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);
                if (parent)
 -                      printf(" (from %s)",
 -                             find_unique_abbrev(parent->object.sha1,
 +                      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) {
                         */
                        show_reflog_message(opt->reflog_info,
                                            opt->commit_format == CMIT_FMT_ONELINE,
 -                                          opt->date_mode,
 +                                          &opt->date_mode,
                                            opt->date_mode_explicit);
                        if (opt->commit_format == CMIT_FMT_ONELINE)
                                return;
                struct strbuf notebuf = STRBUF_INIT;
  
                raw = (opt->commit_format == CMIT_FMT_USERFORMAT);
 -              format_display_notes(commit->object.sha1, &notebuf,
 +              format_display_notes(commit->object.oid.hash, &notebuf,
                                     get_log_output_encoding(), raw);
                ctx.notes_message = notebuf.len
                        ? strbuf_detach(&notebuf, NULL)
        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)
  
        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;
                }
        }
  
        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);
        }
  
        if (opt->graph)
                graph_show_commit_msg(opt->graph, &msgbuf);
        else
 -              fwrite(msgbuf.buf, sizeof(char), msgbuf.len, stdout);
 +              fwrite(msgbuf.buf, sizeof(char), msgbuf.len, opt->diffopt.file);
        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);
@@@ -761,7 -755,7 +759,7 @@@ int log_tree_diff_flush(struct rev_inf
                                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);
                        }
  
                        /*
                         */
                        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);
@@@ -799,19 -793,19 +797,19 @@@ static int log_tree_diff(struct rev_inf
  {
        int showed_log;
        struct commit_list *parents;
 -      unsigned const char *sha1;
 +      struct object_id *oid;
  
        if (!opt->diff && !DIFF_OPT_TST(&opt->diffopt, EXIT_WITH_STATUS))
                return 0;
  
        parse_commit_or_die(commit);
 -      sha1 = commit->tree->object.sha1;
 +      oid = &commit->tree->object.oid;
  
        /* Root commit? */
        parents = get_saved_parents(opt, commit);
        if (!parents) {
                if (opt->show_root_diff) {
 -                      diff_root_tree_sha1(sha1, "", &opt->diffopt);
 +                      diff_root_tree_sha1(oid->hash, "", &opt->diffopt);
                        log_tree_diff_flush(opt);
                }
                return !opt->loginfo;
                         * we merged _in_.
                         */
                        parse_commit_or_die(parents->item);
 -                      diff_tree_sha1(parents->item->tree->object.sha1,
 -                                     sha1, "", &opt->diffopt);
 +                      diff_tree_sha1(parents->item->tree->object.oid.hash,
 +                                     oid->hash, "", &opt->diffopt);
                        log_tree_diff_flush(opt);
                        return !opt->loginfo;
                }
                struct commit *parent = parents->item;
  
                parse_commit_or_die(parent);
 -              diff_tree_sha1(parent->tree->object.sha1,
 -                             sha1, "", &opt->diffopt);
 +              diff_tree_sha1(parent->tree->object.oid.hash,
 +                             oid->hash, "", &opt->diffopt);
                log_tree_diff_flush(opt);
  
                showed_log |= !opt->loginfo;
  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;
                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;
  }