--- builtin/blame.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/builtin/blame.c b/builtin/blame.c index 126b8c9e5..89c1a862d 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -52,6 +52,7 @@ static int xdl_opts; static int abbrev = -1; static int no_whole_file_rename; static int show_progress; +static char *format_line; static struct date_mode blame_date_mode = { DATE_ISO8601 }; static size_t blame_date_width; @@ -1931,6 +1932,19 @@ static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent, putchar('\n'); } +static void pretty_info(char* revid, struct blame_entry *ent, struct strbuf *rev_buffer) +{ + struct pretty_print_context ctx = {0}; + struct rev_info rev; + + struct strbuf format = STRBUF_INIT; + strbuf_addstr(&format, format_line); + ctx.fmt = CMIT_FMT_USERFORMAT; + get_commit_format(format.buf, &rev); + pretty_print_commit(&ctx, ent->suspect->commit, rev_buffer); + strbuf_release(&format); +} + static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt) { int cnt; @@ -1939,11 +1953,15 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt) struct commit_info ci; char hex[GIT_SHA1_HEXSZ + 1]; int show_raw_time = !!(opt & OUTPUT_RAW_TIMESTAMP); + struct strbuf line_revision_buf = STRBUF_INIT; get_commit_info(suspect->commit, &ci, 1); sha1_to_hex_r(hex, suspect->commit->object.oid.hash); cp = nth_line(sb, ent->lno); + + if (format_line) + pretty_info(hex, ent, &line_revision_buf); for (cnt = 0; cnt < ent->num_lines; cnt++) { char ch; int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? GIT_SHA1_HEXSZ : abbrev; @@ -1968,6 +1986,10 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt) format_time(ci.author_time, ci.author_tz.buf, show_raw_time), ent->lno + 1 + cnt); + } else if (format_line) { + printf("%s", line_revision_buf.buf); + printf(" %*d) ", + max_digits, ent->lno + 1 + cnt); } else { if (opt & OUTPUT_SHOW_SCORE) printf(" %*d %02d", @@ -2007,6 +2029,7 @@ static void emit_other(struct scoreboard *sb, struct blame_entry *ent, int opt) if (sb->final_buf_size && cp[-1] != '\n') putchar('\n'); + strbuf_release(&line_revision_buf); commit_info_destroy(&ci); } @@ -2605,6 +2628,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL), OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")), + OPT_STRING(0, "format-line", &format_line, N_("format-line"), N_("Use pretty format for revisions")), OPT_STRING(0, "contents", &contents_from, N_("file"), N_("Use <file>'s contents as the final image")), { OPTION_CALLBACK, 'C', NULL, &opt, N_("score"), N_("Find line copies within and across files"), PARSE_OPT_OPTARG, blame_copy_callback }, { OPTION_CALLBACK, 'M', NULL, &opt, N_("score"), N_("Find line movements within and across files"), PARSE_OPT_OPTARG, blame_move_callback }, -- 2.11.0.rc1