{"thread":{"id":"29375","subject":"[PATCH 0/5] Dynamic diff summary for merge/pull","startedAt":"2012-01-16T04:47:56Z","lastAt":"2012-01-16T04:48:01Z","messageCount":6,"participants":["Nguyễn Thái Ngọc Duy"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"182593","messageId":"1326689281-23788-1-git-send-email-pclouds@gmail.com","threadId":"29375","inReplyTo":null,"subject":"[PATCH 0/5] Dynamic diff summary for merge/pull","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2012-01-16T04:47:56Z","receivedAt":"2012-01-16T04:47:56Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"On Sat, Jan 14, 2012 at 2:49 AM, Linus Torvalds\n<torvalds@linux-foundation.org> wrote:\n> And what I've *really* wanted is to actually see the diff itself if\n> it\n> is small. So some kind of \"dynamic summary\": for one-liners (or\n> ten-liners), show the whole diff. For medium-sized changes, show the\n> whole diffstat. And for really big changes, show an outline and the\n> \"768 files changed, 179851 lines added, 7630 lines removed\" stats.\n>\n> IOW, whatever fits in, say, 50 lines or less.\n\nHere's an attempt to do that. The main patch is 4/5 to implement\n--dynstat. 5/5 just makes merge/pull pass --dynstat to diff machinery.\n\n--dynstat tries various diff output and use one that fits within 50\nlines:\n\n --patch + --shortstat\n --stat (maybe plus --summary)\n --dirstat + --shortstat\n --shortstat\n\nMany hardcoded constants should be more flexible (i.e. 50 lines limit\ncould be retrieved from terminal settigns), but that's minor for\nnow imo. I think we should also hint users to do\n\"git diff --stat --summary HEAD@{1} HEAD\" too via advice framework if\nwe turn --dynstat to default for merge/pull\n\nI have not run \"make test\" so it may break a few tests because of 2/2.\n\nNguyễn Thái Ngọc Duy (5):\n  diff: add space around \"=\"\n  diff: do not duplicate shortstat with \"git diff --stat --shortstat\"\n  diff: buffer dirstat output\n  diff: add --dynstat\n  merge: support setting merge.[diff]stat to dynstat\n\n builtin/merge.c |   30 +++++++++++--\n diff.c          |  127 +++++++++++++++++++++++++++++++++++++++++++++++--------\n diff.h          |    1 +\n 3 files changed, 135 insertions(+), 23 deletions(-)\n\n-- \n1.7.3.1.256.g2539c.dirty\n"},{"id":"182594","messageId":"1326689281-23788-2-git-send-email-pclouds@gmail.com","threadId":"29375","inReplyTo":"1326689281-23788-1-git-send-email-pclouds@gmail.com","subject":"[PATCH 1/5] diff: add space around \"=\"","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2012-01-16T04:47:57Z","receivedAt":"2012-01-16T04:47:57Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n diff.c |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/diff.c b/diff.c\nindex 374ecf3..d4223e2 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -1482,7 +1482,7 @@ static void show_shortstats(struct diffstat_t *data, struct diff_options *option\n \t\tif (!data->files[i]->is_binary &&\n \t\t    !data->files[i]->is_unmerged) {\n \t\t\tint added = data->files[i]->added;\n-\t\t\tint deleted= data->files[i]->deleted;\n+\t\t\tint deleted = data->files[i]->deleted;\n \t\t\tif (!data->files[i]->is_renamed &&\n \t\t\t    (added + deleted == 0)) {\n \t\t\t\ttotal_files--;\n-- \n1.7.3.1.256.g2539c.dirty\n"},{"id":"182596","messageId":"1326689281-23788-3-git-send-email-pclouds@gmail.com","threadId":"29375","inReplyTo":"1326689281-23788-1-git-send-email-pclouds@gmail.com","subject":"[PATCH 2/5] diff: do not duplicate shortstat with \"git diff --stat --shortstat\"","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2012-01-16T04:47:58Z","receivedAt":"2012-01-16T04:47:58Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n diff.c |    7 +++----\n 1 files changed, 3 insertions(+), 4 deletions(-)\n\ndiff --git a/diff.c b/diff.c\nindex d4223e2..203b054 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -1465,10 +1465,6 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)\n \t\t\tfprintf(options->file, \"%s ...\\n\", line_prefix);\n \t\textra_shown = 1;\n \t}\n-\tfprintf(options->file, \"%s\", line_prefix);\n-\tfprintf(options->file,\n-\t       \" %d files changed, %d insertions(+), %d deletions(-)\\n\",\n-\t       total_files, adds, dels);\n }\n \n static void show_shortstats(struct diffstat_t *data, struct diff_options *options)\n@@ -4218,6 +4214,9 @@ void diff_flush(struct diff_options *options)\n \tif (output_format & DIFF_FORMAT_DIRSTAT && DIFF_OPT_TST(options, DIRSTAT_BY_LINE))\n \t\tdirstat_by_line = 1;\n \n+\tif (output_format & DIFF_FORMAT_DIFFSTAT)\n+\t\toutput_format |= DIFF_FORMAT_SHORTSTAT;\n+\n \tif (output_format & (DIFF_FORMAT_DIFFSTAT|DIFF_FORMAT_SHORTSTAT|DIFF_FORMAT_NUMSTAT) ||\n \t    dirstat_by_line) {\n \t\tstruct diffstat_t diffstat;\n-- \n1.7.3.1.256.g2539c.dirty\n"},{"id":"182597","messageId":"1326689281-23788-4-git-send-email-pclouds@gmail.com","threadId":"29375","inReplyTo":"1326689281-23788-1-git-send-email-pclouds@gmail.com","subject":"[PATCH 3/5] diff: buffer dirstat output","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2012-01-16T04:47:59Z","receivedAt":"2012-01-16T04:47:59Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"This allows us to decide whether to print it later on.\n\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n diff.c |   18 ++++++++++++++----\n 1 files changed, 14 insertions(+), 4 deletions(-)\n\ndiff --git a/diff.c b/diff.c\nindex 203b054..8c448b5 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -1548,6 +1548,7 @@ struct dirstat_file {\n struct dirstat_dir {\n \tstruct dirstat_file *files;\n \tint alloc, nr, permille, cumulative;\n+\tstruct strbuf *sb;\n };\n \n static long gather_dirstat(struct diff_options *opt, struct dirstat_dir *dir,\n@@ -1597,8 +1598,8 @@ static long gather_dirstat(struct diff_options *opt, struct dirstat_dir *dir,\n \t\tif (this_dir) {\n \t\t\tint permille = this_dir * 1000 / changed;\n \t\t\tif (permille >= dir->permille) {\n-\t\t\t\tfprintf(opt->file, \"%s%4d.%01d%% %.*s\\n\", line_prefix,\n-\t\t\t\t\tpermille / 10, permille % 10, baselen, base);\n+\t\t\t\tstrbuf_addf(dir->sb, \"%s%4d.%01d%% %.*s\\n\", line_prefix,\n+\t\t\t\t\t    permille / 10, permille % 10, baselen, base);\n \t\t\t\tif (!dir->cumulative)\n \t\t\t\t\treturn 0;\n \t\t\t}\n@@ -1614,18 +1615,20 @@ static int dirstat_compare(const void *_a, const void *_b)\n \treturn strcmp(a->name, b->name);\n }\n \n-static void show_dirstat(struct diff_options *options)\n+static void show_dirstat(struct diff_options *options, struct strbuf *output)\n {\n \tint i;\n \tunsigned long changed;\n \tstruct dirstat_dir dir;\n \tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tstruct strbuf sb = STRBUF_INIT;\n \n \tdir.files = NULL;\n \tdir.alloc = 0;\n \tdir.nr = 0;\n \tdir.permille = options->dirstat_permille;\n \tdir.cumulative = DIFF_OPT_TST(options, DIRSTAT_CUMULATIVE);\n+\tdir.sb = output ? output : &sb;\n \n \tchanged = 0;\n \tfor (i = 0; i < q->nr; i++) {\n@@ -1711,6 +1714,9 @@ found_damage:\n \t/* Show all directories with more than x% of the changes */\n \tqsort(dir.files, dir.nr, sizeof(dir.files[0]), dirstat_compare);\n \tgather_dirstat(options, &dir, changed, \"\", 0);\n+\tif (!output)\n+\t\tfputs(sb.buf, options->file);\n+\tstrbuf_release(&sb);\n }\n \n static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *options)\n@@ -1718,6 +1724,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o\n \tint i;\n \tunsigned long changed;\n \tstruct dirstat_dir dir;\n+\tstruct strbuf sb = STRBUF_INIT;\n \n \tif (data->nr == 0)\n \t\treturn;\n@@ -1727,6 +1734,7 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o\n \tdir.nr = 0;\n \tdir.permille = options->dirstat_permille;\n \tdir.cumulative = DIFF_OPT_TST(options, DIRSTAT_CUMULATIVE);\n+\tdir.sb = &sb;\n \n \tchanged = 0;\n \tfor (i = 0; i < data->nr; i++) {\n@@ -1755,6 +1763,8 @@ static void show_dirstat_by_line(struct diffstat_t *data, struct diff_options *o\n \t/* Show all directories with more than x% of the changes */\n \tqsort(dir.files, dir.nr, sizeof(dir.files[0]), dirstat_compare);\n \tgather_dirstat(options, &dir, changed, \"\", 0);\n+\tfputs(sb.buf, options->file);\n+\tstrbuf_release(&sb);\n }\n \n static void free_diffstat_info(struct diffstat_t *diffstat)\n@@ -4239,7 +4249,7 @@ void diff_flush(struct diff_options *options)\n \t\tseparator++;\n \t}\n \tif ((output_format & DIFF_FORMAT_DIRSTAT) && !dirstat_by_line)\n-\t\tshow_dirstat(options);\n+\t\tshow_dirstat(options, NULL);\n \n \tif (output_format & DIFF_FORMAT_SUMMARY && !is_summary_empty(q)) {\n \t\tfor (i = 0; i < q->nr; i++) {\n-- \n1.7.3.1.256.g2539c.dirty\n"},{"id":"182598","messageId":"1326689281-23788-5-git-send-email-pclouds@gmail.com","threadId":"29375","inReplyTo":"1326689281-23788-1-git-send-email-pclouds@gmail.com","subject":"[PATCH 4/5] diff: add --dynstat","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2012-01-16T04:48:00Z","receivedAt":"2012-01-16T04:48:00Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n diff.c |  100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------\n diff.h |    1 +\n 2 files changed, 92 insertions(+), 9 deletions(-)\n\ndiff --git a/diff.c b/diff.c\nindex 8c448b5..b945ad6 100644\n--- a/diff.c\n+++ b/diff.c\n@@ -1226,6 +1226,7 @@ struct diffstat_t {\n \t\tunsigned is_renamed:1;\n \t\tuintmax_t added, deleted;\n \t} **files;\n+\tstruct strbuf dynstat;\n };\n \n static struct diffstat_file *diffstat_add(struct diffstat_t *diffstat,\n@@ -1779,6 +1780,7 @@ static void free_diffstat_info(struct diffstat_t *diffstat)\n \t\tfree(f);\n \t}\n \tfree(diffstat->files);\n+\tstrbuf_release(&diffstat->dynstat);\n }\n \n struct checkdiff_t {\n@@ -3332,6 +3334,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)\n \t\toptions->output_format |= DIFF_FORMAT_NUMSTAT;\n \telse if (!strcmp(arg, \"--shortstat\"))\n \t\toptions->output_format |= DIFF_FORMAT_SHORTSTAT;\n+\telse if (!strcmp(arg, \"--dynstat\"))\n+\t\toptions->output_format |= DIFF_FORMAT_DYNSTAT;\n \telse if (!strcmp(arg, \"-X\") || !strcmp(arg, \"--dirstat\"))\n \t\treturn parse_dirstat_opt(options, \"\");\n \telse if (!prefixcmp(arg, \"-X\"))\n@@ -3922,6 +3926,76 @@ static int check_pair_status(struct diff_filepair *p)\n \t}\n }\n \n+static int diff_flush_dynstat(struct diff_options *o, struct diffstat_t *diffstat)\n+{\n+\tstruct diff_queue_struct *q = &diff_queued_diff;\n+\tint i, adds = 0, dels = 0, summary_lines = 0, printed_lines = 0, total_files;\n+\n+\tmemset(diffstat, 0, sizeof(struct diffstat_t));\n+\tfor (i = 0; i < q->nr; i++) {\n+\t\tstruct diff_filepair *p = q->queue[i];\n+\t\tif (check_pair_status(p))\n+\t\t\tdiff_flush_stat(p, o, diffstat);\n+\t}\n+\n+\ttotal_files = diffstat->nr;\n+\tif (!total_files)\n+\t\treturn o->output_format;\n+\n+\t/* how many lines for --stat ? */\n+\tfor (i = 0; i < diffstat->nr; i++) {\n+\t\tstruct diffstat_file *f = diffstat->files[i];\n+\t\tif (!f->is_binary && !f->is_unmerged) {\n+\t\t\tif (!f->is_renamed && (f->added + f->deleted == 0))\n+\t\t\t\ttotal_files--;\n+\t\t\telse {\n+\t\t\t\tadds += f->added;\n+\t\t\t\tdels += f->deleted;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\t/* how many lines for --summary ? */\n+\tfor (i = 0; i < q->nr; i++) {\n+\t\tstruct diff_filepair *p = q->queue[i];\n+\t\tif ((p->status & (DIFF_STATUS_DELETED | DIFF_STATUS_ADDED |\n+\t\t\t\t DIFF_STATUS_COPIED | DIFF_STATUS_RENAMED)) ||\n+\t\t    p->score)\n+\t\t\tsummary_lines++;\n+\t}\n+\n+\tif (printed_lines + total_files < 50) {\n+\t\to->output_format |= DIFF_FORMAT_DIFFSTAT;\n+\t\tprinted_lines += total_files;\n+\t\tif (printed_lines + summary_lines < 50) {\n+\t\t\tprinted_lines += summary_lines;\n+\t\t\to->output_format |= DIFF_FORMAT_SUMMARY;\n+\t\t}\n+\t} else {\n+\t\tconst char *s;\n+\t\tint nr = 0;\n+\t\tshow_dirstat(o, &diffstat->dynstat);\n+\t\ts = diffstat->dynstat.buf;\n+\n+\t\t/* how many lines for --dirstat ? */\n+\t\twhile (s && (s = strchr(s, '\\n'))) {\n+\t\t\tnr++;\n+\t\t\ts++;\n+\t\t}\n+\t\tif (nr < 50)\n+\t\t\tprinted_lines += nr;\n+\t\telse\n+\t\t\tstrbuf_release(&diffstat->dynstat);\n+\t}\n+\n+\t/* how many lines for --patch ? */\n+\tif (adds + dels < 10 && printed_lines < 10)\n+\t\to->output_format |= DIFF_FORMAT_PATCH;\n+\n+\to->output_format |= DIFF_FORMAT_SHORTSTAT;\n+\treturn o->output_format;\n+}\n+\n static void flush_one_pair(struct diff_filepair *p, struct diff_options *opt)\n {\n \tint fmt = opt->output_format;\n@@ -4201,6 +4275,7 @@ void diff_flush(struct diff_options *options)\n \tint i, output_format = options->output_format;\n \tint separator = 0;\n \tint dirstat_by_line = 0;\n+\tstruct diffstat_t diffstat;\n \n \t/*\n \t * Order: raw, stat, summary, patch\n@@ -4221,6 +4296,19 @@ void diff_flush(struct diff_options *options)\n \t\tseparator++;\n \t}\n \n+\tmemset(&diffstat, 0, sizeof(struct diffstat_t));\n+\tstrbuf_init(&diffstat.dynstat, 0);\n+\tif (output_format & (DIFF_FORMAT_DIFFSTAT|DIFF_FORMAT_SHORTSTAT|DIFF_FORMAT_NUMSTAT|DIFF_FORMAT_DYNSTAT)) {\n+\t\tfor (i = 0; i < q->nr; i++) {\n+\t\t\tstruct diff_filepair *p = q->queue[i];\n+\t\t\tif (check_pair_status(p))\n+\t\t\t\tdiff_flush_stat(p, options, &diffstat);\n+\t\t}\n+\t}\n+\n+\tif (output_format & DIFF_FORMAT_DYNSTAT)\n+\t\toutput_format = diff_flush_dynstat(options, &diffstat);\n+\n \tif (output_format & DIFF_FORMAT_DIRSTAT && DIFF_OPT_TST(options, DIRSTAT_BY_LINE))\n \t\tdirstat_by_line = 1;\n \n@@ -4229,25 +4317,19 @@ void diff_flush(struct diff_options *options)\n \n \tif (output_format & (DIFF_FORMAT_DIFFSTAT|DIFF_FORMAT_SHORTSTAT|DIFF_FORMAT_NUMSTAT) ||\n \t    dirstat_by_line) {\n-\t\tstruct diffstat_t diffstat;\n-\n-\t\tmemset(&diffstat, 0, sizeof(struct diffstat_t));\n-\t\tfor (i = 0; i < q->nr; i++) {\n-\t\t\tstruct diff_filepair *p = q->queue[i];\n-\t\t\tif (check_pair_status(p))\n-\t\t\t\tdiff_flush_stat(p, options, &diffstat);\n-\t\t}\n \t\tif (output_format & DIFF_FORMAT_NUMSTAT)\n \t\t\tshow_numstat(&diffstat, options);\n \t\tif (output_format & DIFF_FORMAT_DIFFSTAT)\n \t\t\tshow_stats(&diffstat, options);\n+\t\tif ((output_format & DIFF_FORMAT_DYNSTAT) && diffstat.dynstat.len)\n+\t\t\tfputs(diffstat.dynstat.buf, options->file);\n \t\tif (output_format & DIFF_FORMAT_SHORTSTAT)\n \t\t\tshow_shortstats(&diffstat, options);\n \t\tif (output_format & DIFF_FORMAT_DIRSTAT)\n \t\t\tshow_dirstat_by_line(&diffstat, options);\n-\t\tfree_diffstat_info(&diffstat);\n \t\tseparator++;\n \t}\n+\tfree_diffstat_info(&diffstat);\n \tif ((output_format & DIFF_FORMAT_DIRSTAT) && !dirstat_by_line)\n \t\tshow_dirstat(options, NULL);\n \ndiff --git a/diff.h b/diff.h\nindex ae71f4c..6bebad8 100644\n--- a/diff.h\n+++ b/diff.h\n@@ -39,6 +39,7 @@ typedef struct strbuf *(*diff_prefix_fn_t)(struct diff_options *opt, void *data)\n #define DIFF_FORMAT_PATCH\t0x0010\n #define DIFF_FORMAT_SHORTSTAT\t0x0020\n #define DIFF_FORMAT_DIRSTAT\t0x0040\n+#define DIFF_FORMAT_DYNSTAT\t0x0080\n \n /* These override all above */\n #define DIFF_FORMAT_NAME\t0x0100\n-- \n1.7.3.1.256.g2539c.dirty\n"},{"id":"182595","messageId":"1326689281-23788-6-git-send-email-pclouds@gmail.com","threadId":"29375","inReplyTo":"1326689281-23788-1-git-send-email-pclouds@gmail.com","subject":"[PATCH 5/5] merge: support setting merge.[diff]stat to dynstat","fromName":"Nguyễn Thái Ngọc Duy","fromEmail":"pclouds@gmail.com","sentAt":"2012-01-16T04:48:01Z","receivedAt":"2012-01-16T04:48:01Z","isPatch":true,"sender":{"key":"pclouds@gmail.com","avatar":"https://avatars.githubusercontent.com/u/720?v=4"},"body":"\nSigned-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>\n---\n builtin/merge.c |   30 +++++++++++++++++++++++++-----\n 1 files changed, 25 insertions(+), 5 deletions(-)\n\ndiff --git a/builtin/merge.c b/builtin/merge.c\nindex 3a45172..b8280ce 100644\n--- a/builtin/merge.c\n+++ b/builtin/merge.c\n@@ -46,7 +46,13 @@ static const char * const builtin_merge_usage[] = {\n \tNULL\n };\n \n-static int show_diffstat = 1, shortlog_len = -1, squash;\n+enum show_diffstat {\n+\tNO_STAT,\n+\tDIFF_STAT,\n+\tDYNAMIC_STAT\n+};\n+\n+static int show_diffstat = NO_STAT, shortlog_len = -1, squash;\n static int option_commit = 1, allow_fast_forward = 1;\n static int fast_forward_only, option_edit;\n static int allow_trivial = 1, have_message;\n@@ -399,8 +405,15 @@ static void finish(struct commit *head_commit,\n \tif (new_head && show_diffstat) {\n \t\tstruct diff_options opts;\n \t\tdiff_setup(&opts);\n-\t\topts.output_format |=\n-\t\t\tDIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;\n+\t\tswitch (show_diffstat) {\n+\t\tcase DIFF_STAT:\n+\t\t\topts.output_format |=\n+\t\t\t\tDIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;\n+\t\t\tbreak;\n+\t\tcase DYNAMIC_STAT:\n+\t\t\topts.output_format |= DIFF_FORMAT_DYNSTAT;\n+\t\t\tbreak;\n+\t\t}\n \t\topts.detect_rename = DIFF_DETECT_RENAME;\n \t\tif (diff_setup_done(&opts) < 0)\n \t\t\tdie(_(\"diff_setup_done failed\"));\n@@ -554,8 +567,15 @@ static int git_merge_config(const char *k, const char *v, void *cb)\n \t\treturn 0;\n \t}\n \n-\tif (!strcmp(k, \"merge.diffstat\") || !strcmp(k, \"merge.stat\"))\n-\t\tshow_diffstat = git_config_bool(k, v);\n+\tif (!strcmp(k, \"merge.diffstat\") || !strcmp(k, \"merge.stat\")) {\n+\t\tint val = git_config_maybe_bool(k, v);\n+\t\tif (val != -1)\n+\t\t\tshow_diffstat = val ? DIFF_STAT : NO_STAT;\n+\t\telse if (!strcasecmp(v, \"dynstat\"))\n+\t\t\tshow_diffstat = DYNAMIC_STAT;\n+\t\telse\n+\t\t\tdie(_(\"unrecognized value \\\"%s\\\" for %s\"), v, k);\n+\t}\n \telse if (!strcmp(k, \"pull.twohead\"))\n \t\treturn git_config_string(&pull_twohead, k, v);\n \telse if (!strcmp(k, \"pull.octopus\"))\n-- \n1.7.3.1.256.g2539c.dirty\n"}]}