diff options
author | Jeff King <peff@peff.net> | 2011-05-09 09:34:42 -0400 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2011-05-09 15:27:50 -0700 |
commit | ed747dd5216ba1fe6fa59da9585dcd6cced202bb (patch) | |
tree | b3d07c9cecee5fb7f13c3249ba629fbabdf3e7c3 /builtin | |
parent | e86226e34097ce22ed78a9e759564110f141dda0 (diff) | |
download | git-ed747dd5216ba1fe6fa59da9585dcd6cced202bb.tar.gz |
blame: add --line-porcelain output format
This is just like --porcelain, except that we always output
the commit information for each line, not just the first
time it is referenced. This can make quick and dirty scripts
much easier to write; see the example added to the blame
documentation.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/blame.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/builtin/blame.c b/builtin/blame.c index 1a45463ea4..26a5d424b8 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -1619,6 +1619,7 @@ static const char *format_time(unsigned long time, const char *tz_str, #define OUTPUT_SHOW_SCORE 0100 #define OUTPUT_NO_AUTHOR 0200 #define OUTPUT_SHOW_EMAIL 0400 +#define OUTPUT_LINE_PORCELAIN 01000 static void emit_porcelain_details(struct origin *suspect, int repeat) { @@ -1630,6 +1631,7 @@ static void emit_porcelain_details(struct origin *suspect, int repeat) static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent, int opt) { + int repeat = opt & OUTPUT_LINE_PORCELAIN; int cnt; const char *cp; struct origin *suspect = ent->suspect; @@ -1642,15 +1644,18 @@ static void emit_porcelain(struct scoreboard *sb, struct blame_entry *ent, ent->s_lno + 1, ent->lno + 1, ent->num_lines); - emit_porcelain_details(suspect, 0); + emit_porcelain_details(suspect, repeat); cp = nth_line(sb, ent->lno); for (cnt = 0; cnt < ent->num_lines; cnt++) { char ch; - if (cnt) + if (cnt) { printf("%s %d %d\n", hex, ent->s_lno + 1 + cnt, ent->lno + 1 + cnt); + if (repeat) + emit_porcelain_details(suspect, 1); + } putchar('\t'); do { ch = *cp++; @@ -2307,6 +2312,7 @@ int cmd_blame(int argc, const char **argv, const char *prefix) OPT_BIT('f', "show-name", &output_option, "Show original filename (Default: auto)", OUTPUT_SHOW_NAME), OPT_BIT('n', "show-number", &output_option, "Show original linenumber (Default: off)", OUTPUT_SHOW_NUMBER), OPT_BIT('p', "porcelain", &output_option, "Show in a format designed for machine consumption", OUTPUT_PORCELAIN), + OPT_BIT(0, "line-porcelain", &output_option, "Show porcelain format with per-line commit information", OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN), OPT_BIT('c', NULL, &output_option, "Use the same output mode as git-annotate (Default: off)", OUTPUT_ANNOTATE_COMPAT), OPT_BIT('t', NULL, &output_option, "Show raw timestamp (Default: off)", OUTPUT_RAW_TIMESTAMP), OPT_BIT('l', NULL, &output_option, "Show long commit SHA1 (Default: off)", OUTPUT_LONG_OBJECT_NAME), |