{"thread":{"id":"23910","subject":"[PATCH v4 1/6] Add a prefix output callback to diff output","startedAt":"2010-05-26T07:08:02Z","lastAt":"2010-05-26T07:08:03Z","messageCount":2,"participants":["Bo Yang"],"isPatch":true,"patchVersion":4,"patchTotal":6},"messages":[{"id":"142343","messageId":"1274857687-10514-1-git-send-email-struggleyb.nku@gmail.com","threadId":"23910","inReplyTo":null,"subject":"[PATCH v4 1/6] Add a prefix output callback to diff output","fromName":"Bo Yang","fromEmail":"struggleyb.nku@gmail.com","sentAt":"2010-05-26T07:08:02Z","receivedAt":"2010-05-26T07:08:02Z","isPatch":true,"sender":{"key":"struggleyb.nku@gmail.com","avatar":"https://avatars.githubusercontent.com/u/233030?v=4"},"body":"The callback allow to output some prefix string for\neach line of diff output.\n\nSigned-off-by: Bo Yang <struggleyb.nku@gmail.com>\n---\n diff.c |   62 +++++++++++++++++++++++++++++++++++---------------------------\n diff.h |    5 +++++\n 2 files changed, 40 insertions(+), 27 deletions(-)\n\ndiff --git a/diff.c b/diff.c\nindex 494f560..e2f910a 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -194,8 +194,8 @@ struct emit_callback {\n \tsane_truncate_fn truncate;\n \tconst char **label_path;\n \tstruct diff_words_data *diff_words;\n+\tstruct diff_options *opt;\n \tint *found_changesp;\n-\tFILE *file;\n \tstruct strbuf *header;\n };\n \n@@ -282,11 +282,19 @@ static void check_blank_at_eof(mmfile_t *mf1, mmfile_t *mf2,\n \tecbdata->blank_at_eof_in_postimage = (at - l2) + 1;\n }\n \n-static void emit_line_0(FILE *file, const char *set, const char *reset,\n+static void emit_line_0(struct diff_options *o, const char *set, const char *reset,\n \t\t\tint first, const char *line, int len)\n {\n \tint has_trailing_newline, has_trailing_carriage_return;\n \tint nofirst;\n+\tFILE *file = o->file;\n+\n+\tif (o->output_prefix) {\n+\t\tstruct strbuf *msg = NULL;\n+\t\tmsg = o->output_prefix(o, o->output_prefix_data);\n+\t\tassert(msg);\n+\t\tfwrite(msg->buf, msg->len, 1, file);\n+\t}\n \n \tif (len == 0) {\n \t\thas_trailing_newline = (first == '\\n');\n@@ -316,10 +324,10 @@ static void emit_line_0(FILE *file, const char *set, const char *reset,\n \t\tfputc('\\n', file);\n }\n \n-static void emit_line(FILE *file, const char *set, const char *reset,\n+static void emit_line(struct diff_options *o, const char *set, const char *reset,\n \t\t      const char *line, int len)\n {\n-\temit_line_0(file, set, reset, line[0], line+1, len-1);\n+\temit_line_0(o, set, reset, line[0], line+1, len-1);\n }\n \n static int new_blank_line_at_eof(struct emit_callback *ecbdata, const char *line, int len)\n@@ -341,15 +349,15 @@ static void emit_add_line(const char *reset,\n \tconst char *set = diff_get_color(ecbdata->color_diff, DIFF_FILE_NEW);\n \n \tif (!*ws)\n-\t\temit_line_0(ecbdata->file, set, reset, '+', line, len);\n+\t\temit_line_0(ecbdata->opt, set, reset, '+', line, len);\n \telse if (new_blank_line_at_eof(ecbdata, line, len))\n \t\t/* Blank line at EOF - paint '+' as well */\n-\t\temit_line_0(ecbdata->file, ws, reset, '+', line, len);\n+\t\temit_line_0(ecbdata->opt, ws, reset, '+', line, len);\n \telse {\n \t\t/* Emit just the prefix, then the rest. */\n-\t\temit_line_0(ecbdata->file, set, reset, '+', \"\", 0);\n+\t\temit_line_0(ecbdata->opt, set, reset, '+', \"\", 0);\n \t\tws_check_emit(line, len, ecbdata->ws_rule,\n-\t\t\t      ecbdata->file, set, reset, ws);\n+\t\t\t      ecbdata->opt->file, set, reset, ws);\n \t}\n }\n \n@@ -370,23 +378,23 @@ static void emit_hunk_header(struct emit_callback *ecbdata,\n \tif (len < 10 ||\n \t    memcmp(line, atat, 2) ||\n \t    !(ep = memmem(line + 2, len - 2, atat, 2))) {\n-\t\temit_line(ecbdata->file, plain, reset, line, len);\n+\t\temit_line(ecbdata->opt, plain, reset, line, len);\n \t\treturn;\n \t}\n \tep += 2; /* skip over @@ */\n \n \t/* The hunk header in fraginfo color */\n-\temit_line(ecbdata->file, frag, reset, line, ep - line);\n+\temit_line(ecbdata->opt, frag, reset, line, ep - line);\n \n \t/* blank before the func header */\n \tfor (cp = ep; ep - line < len; ep++)\n \t\tif (*ep != ' ' && *ep != '\\t')\n \t\t\tbreak;\n \tif (ep != cp)\n-\t\temit_line(ecbdata->file, plain, reset, cp, ep - cp);\n+\t\temit_line(ecbdata->opt, plain, reset, cp, ep - cp);\n \n \tif (ep < line + len)\n-\t\temit_line(ecbdata->file, func, reset, ep, line + len - ep);\n+\t\temit_line(ecbdata->opt, func, reset, ep, line + len - ep);\n }\n \n static struct diff_tempfile *claim_diff_tempfile(void) {\n@@ -446,7 +454,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb,\n \t\tlen = endp ? (endp - data + 1) : size;\n \t\tif (prefix != '+') {\n \t\t\tecb->lno_in_preimage++;\n-\t\t\temit_line_0(ecb->file, old, reset, '-',\n+\t\t\temit_line_0(ecb->opt, old, reset, '-',\n \t\t\t\t    data, len);\n \t\t} else {\n \t\t\tecb->lno_in_postimage++;\n@@ -458,7 +466,7 @@ static void emit_rewrite_lines(struct emit_callback *ecb,\n \tif (!endp) {\n \t\tconst char *plain = diff_get_color(ecb->color_diff,\n \t\t\t\t\t\t   DIFF_PLAIN);\n-\t\temit_line_0(ecb->file, plain, reset, '\\\\',\n+\t\temit_line_0(ecb->opt, plain, reset, '\\\\',\n \t\t\t    nneof, strlen(nneof));\n \t}\n }\n@@ -508,7 +516,7 @@ static void emit_rewrite_diff(const char *name_a,\n \tecbdata.color_diff = color_diff;\n \tecbdata.found_changesp = &o->found_changes;\n \tecbdata.ws_rule = whitespace_rule(name_b ? name_b : name_a);\n-\tecbdata.file = o->file;\n+\tecbdata.opt = o;\n \tif (ecbdata.ws_rule & WS_BLANK_AT_EOF) {\n \t\tmmfile_t mf1, mf2;\n \t\tmf1.ptr = (char *)data_one;\n@@ -840,7 +848,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)\n \tconst char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);\n \n \tif (ecbdata->header) {\n-\t\tfprintf(ecbdata->file, \"%s\", ecbdata->header->buf);\n+\t\tfprintf(ecbdata->opt->file, \"%s\", ecbdata->header->buf);\n \t\tstrbuf_reset(ecbdata->header);\n \t\tecbdata->header = NULL;\n \t}\n@@ -852,9 +860,9 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)\n \t\tname_a_tab = strchr(ecbdata->label_path[0], ' ') ? \"\\t\" : \"\";\n \t\tname_b_tab = strchr(ecbdata->label_path[1], ' ') ? \"\\t\" : \"\";\n \n-\t\tfprintf(ecbdata->file, \"%s--- %s%s%s\\n\",\n+\t\tfprintf(ecbdata->opt->file, \"%s--- %s%s%s\\n\",\n \t\t\tmeta, ecbdata->label_path[0], reset, name_a_tab);\n-\t\tfprintf(ecbdata->file, \"%s+++ %s%s%s\\n\",\n+\t\tfprintf(ecbdata->opt->file, \"%s+++ %s%s%s\\n\",\n \t\t\tmeta, ecbdata->label_path[1], reset, name_b_tab);\n \t\tecbdata->label_path[0] = ecbdata->label_path[1] = NULL;\n \t}\n@@ -872,15 +880,15 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)\n \t\tfind_lno(line, ecbdata);\n \t\temit_hunk_header(ecbdata, line, len);\n \t\tif (line[len-1] != '\\n')\n-\t\t\tputc('\\n', ecbdata->file);\n+\t\t\tputc('\\n', ecbdata->opt->file);\n \t\treturn;\n \t}\n \n \tif (len < 1) {\n-\t\temit_line(ecbdata->file, reset, reset, line, len);\n+\t\temit_line(ecbdata->opt, reset, reset, line, len);\n \t\tif (ecbdata->diff_words\n \t\t    && ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN)\n-\t\t\tfputs(\"~\\n\", ecbdata->file);\n+\t\t\tfputs(\"~\\n\", ecbdata->opt->file);\n \t\treturn;\n \t}\n \n@@ -896,11 +904,11 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)\n \t\t}\n \t\tdiff_words_flush(ecbdata);\n \t\tif (ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN) {\n-\t\t\temit_line(ecbdata->file, plain, reset, line, len);\n-\t\t\tfputs(\"~\\n\", ecbdata->file);\n+\t\t\temit_line(ecbdata->opt, plain, reset, line, len);\n+\t\t\tfputs(\"~\\n\", ecbdata->opt->file);\n \t\t} else {\n \t\t\t/* don't print the prefix character */\n-\t\t\temit_line(ecbdata->file, plain, reset, line+1, len-1);\n+\t\t\temit_line(ecbdata->opt, plain, reset, line+1, len-1);\n \t\t}\n \t\treturn;\n \t}\n@@ -912,7 +920,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)\n \t\tecbdata->lno_in_preimage++;\n \t\tif (line[0] == ' ')\n \t\t\tecbdata->lno_in_postimage++;\n-\t\temit_line(ecbdata->file, color, reset, line, len);\n+\t\temit_line(ecbdata->opt, color, reset, line, len);\n \t} else {\n \t\tecbdata->lno_in_postimage++;\n \t\temit_add_line(reset, ecbdata, line + 1, len - 1);\n@@ -1477,7 +1485,7 @@ static void checkdiff_consume(void *priv, char *line, unsigned long len)\n \t\tfprintf(data->o->file, \"%s:%d: %s.\\n\",\n \t\t\tdata->filename, data->lineno, err);\n \t\tfree(err);\n-\t\temit_line(data->o->file, set, reset, line, 1);\n+\t\temit_line(data->o, set, reset, line, 1);\n \t\tws_check_emit(line + 1, len - 1, data->ws_rule,\n \t\t\t      data->o->file, set, reset, ws);\n \t} else if (line[0] == ' ') {\n@@ -1787,7 +1795,7 @@ static void builtin_diff(const char *name_a,\n \t\tecbdata.ws_rule = whitespace_rule(name_b ? name_b : name_a);\n \t\tif (ecbdata.ws_rule & WS_BLANK_AT_EOF)\n \t\t\tcheck_blank_at_eof(&mf1, &mf2, &ecbdata);\n-\t\tecbdata.file = o->file;\n+\t\tecbdata.opt = o;\n \t\tecbdata.header = header.len ? &header : NULL;\n \t\txpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;\n \t\txecfg.ctxlen = o->context;\ndiff --git a/diff.h b/diff.h\nindex 9ace08c..b4eefa7 100644\n--- a/diff.h\n+++ b/diff.h\n@@ -9,6 +9,7 @@\n struct rev_info;\n struct diff_options;\n struct diff_queue_struct;\n+struct strbuf;\n \n typedef void (*change_fn_t)(struct diff_options *options,\n \t\t unsigned old_mode, unsigned new_mode,\n@@ -25,6 +26,8 @@ typedef void (*add_remove_fn_t)(struct diff_options *options,\n typedef void (*diff_format_fn_t)(struct diff_queue_struct *q,\n \t\tstruct diff_options *options, void *data);\n \n+typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data);\n+\n #define DIFF_FORMAT_RAW\t\t0x0001\n #define DIFF_FORMAT_DIFFSTAT\t0x0002\n #define DIFF_FORMAT_NUMSTAT\t0x0004\n@@ -130,6 +133,8 @@ struct diff_options {\n \tadd_remove_fn_t add_remove;\n \tdiff_format_fn_t format_callback;\n \tvoid *format_callback_data;\n+\tdiff_prefix_fn_t output_prefix;\n+\tvoid *output_prefix_data;\n };\n \n enum color_diff {\n-- \n1.6.0.4\n"},{"id":"142344","messageId":"1274857687-10514-2-git-send-email-struggleyb.nku@gmail.com","threadId":"23910","inReplyTo":"1274857687-10514-1-git-send-email-struggleyb.nku@gmail.com","subject":"[PATCH v4 2/6] Output the graph columns at the end of the commit message","fromName":"Bo Yang","fromEmail":"struggleyb.nku@gmail.com","sentAt":"2010-05-26T07:08:03Z","receivedAt":"2010-05-26T07:08:03Z","isPatch":true,"sender":{"key":"struggleyb.nku@gmail.com","avatar":"https://avatars.githubusercontent.com/u/233030?v=4"},"body":"There is an empty line between the commit message and the\ndiff output. Add the graph columns as prefix of this line.\n\nSigned-off-by: Bo Yang <struggleyb.nku@gmail.com>\n---\n log-tree.c |    6 ++++++\n 1 files changed, 6 insertions(+), 0 deletions(-)\n\ndiff --git a/log-tree.c b/log-tree.c\nindex d3ae969..2e2be7c 100644\n--- a/log-tree.c\n+++ b/log-tree.c\n@@ -469,6 +469,12 @@ int log_tree_diff_flush(struct rev_info *opt)\n \t\t\tint pch = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH;\n \t\t\tif ((pch & opt->diffopt.output_format) == pch)\n \t\t\t\tprintf(\"---\");\n+\t\t\tif (opt->diffopt.output_prefix) {\n+\t\t\t\tstruct strbuf *msg = NULL;\n+\t\t\t\tmsg = opt->diffopt.output_prefix(&opt->diffopt,\n+\t\t\t\t\topt->diffopt.output_prefix_data);\n+\t\t\t\tfwrite(msg->buf, msg->len, 1, stdout);\n+\t\t\t}\n \t\t\tputchar('\\n');\n \t\t}\n \t}\n-- \n1.6.0.4\n"}]}