From: Junio C Hamano Date: Fri, 15 Jun 2012 22:00:53 +0000 (-0700) Subject: Merge branch 'as/diff-shortstat-ignore-binary' X-Git-Tag: v1.7.11~3 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/0b6e913c8be236ba801b49d21490409f13af7cd9?hp=-c Merge branch 'as/diff-shortstat-ignore-binary' # By Alexander Strasser * as/diff-shortstat-ignore-binary: diff: Only count lines in show_shortstats --- 0b6e913c8be236ba801b49d21490409f13af7cd9 diff --combined diff.c index 77edd5086f,ac624c477c..1a594df4f4 --- a/diff.c +++ b/diff.c @@@ -1443,8 -1443,8 +1443,8 @@@ static void show_stats(struct diffstat_ { int i, len, add, del, adds = 0, dels = 0; uintmax_t max_change = 0, max_len = 0; - int total_files = data->nr; - int width, name_width, graph_width, number_width = 4, count; + int total_files = data->nr, count; + int width, name_width, graph_width, number_width = 0, bin_width = 0; const char *reset, *add_c, *del_c; const char *line_prefix = ""; int extra_shown = 0; @@@ -1480,21 -1480,8 +1480,21 @@@ if (max_len < len) max_len = len; - if (file->is_binary || file->is_unmerged) + if (file->is_unmerged) { + /* "Unmerged" is 8 characters */ + bin_width = bin_width < 8 ? 8 : bin_width; continue; + } + if (file->is_binary) { + /* "Bin XXX -> YYY bytes" */ + int w = 14 + decimal_width(file->added) + + decimal_width(file->deleted); + bin_width = bin_width < w ? w : bin_width; + /* Display change counts aligned with "Bin" */ + number_width = 3; + continue; + } + if (max_change < change) max_change = change; } @@@ -1519,22 -1506,12 +1519,22 @@@ * stat_name_width fixes the maximum width of the filename, * and is also used to divide available columns if there * aren't enough. + * + * Binary files are displayed with "Bin XXX -> YYY bytes" + * instead of the change count and graph. This part is treated + * similarly to the graph part, except that it is not + * "scaled". If total width is too small to accomodate the + * guaranteed minimum width of the filename part and the + * separators and this message, this message will "overflow" + * making the line longer than the maximum width. */ if (options->stat_width == -1) - width = term_columns(); + width = term_columns() - options->output_prefix_length; else width = options->stat_width ? options->stat_width : 80; + number_width = decimal_width(max_change) > number_width ? + decimal_width(max_change) : number_width; if (options->stat_graph_width == -1) options->stat_graph_width = diff_stat_graph_width; @@@ -1548,14 -1525,10 +1548,14 @@@ /* * First assign sizes that are wanted, ignoring available width. + * strlen("Bin XXX -> YYY bytes") == bin_width, and the part + * starting from "XXX" should fit in graph_width. */ - graph_width = (options->stat_graph_width && - options->stat_graph_width < max_change) ? - options->stat_graph_width : max_change; + graph_width = max_change + 4 > bin_width ? max_change : bin_width - 4; + if (options->stat_graph_width && + options->stat_graph_width < graph_width) + graph_width = options->stat_graph_width; + name_width = (options->stat_name_width > 0 && options->stat_name_width < max_len) ? options->stat_name_width : max_len; @@@ -1564,12 -1537,8 +1564,12 @@@ * Adjust adjustable widths not to exceed maximum width */ if (name_width + number_width + 6 + graph_width > width) { - if (graph_width > width * 3/8 - number_width - 6) + if (graph_width > width * 3/8 - number_width - 6) { graph_width = width * 3/8 - number_width - 6; + if (graph_width < 6) + graph_width = 6; + } + if (options->stat_graph_width && graph_width > options->stat_graph_width) graph_width = options->stat_graph_width; @@@ -1614,7 -1583,7 +1614,7 @@@ if (data->files[i]->is_binary) { fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); - fprintf(options->file, " Bin"); + fprintf(options->file, " %*s", number_width, "Bin"); if (!added && !deleted) { putc('\n', options->file); continue; @@@ -1631,7 -1600,7 +1631,7 @@@ else if (data->files[i]->is_unmerged) { fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); - fprintf(options->file, " Unmerged\n"); + fprintf(options->file, " Unmerged\n"); continue; } @@@ -1660,9 -1629,8 +1660,9 @@@ } fprintf(options->file, "%s", line_prefix); show_name(options->file, prefix, name, len); - fprintf(options->file, "%5"PRIuMAX"%s", added + deleted, - added + deleted ? " " : ""); + fprintf(options->file, " %*"PRIuMAX"%s", + number_width, added + deleted, + added + deleted ? " " : ""); show_graph(options->file, '+', add, add_c, reset); show_graph(options->file, '-', del, del_c, reset); fprintf(options->file, "\n"); @@@ -1700,7 -1668,7 +1700,7 @@@ static void show_shortstats(struct diff continue; if (!data->files[i]->is_renamed && (added + deleted == 0)) { total_files--; - } else { + } else if (!data->files[i]->is_binary) { /* don't count bytes */ adds += added; dels += deleted; } @@@ -2402,7 -2370,6 +2402,7 @@@ static void builtin_diffstat(const cha { mmfile_t mf1, mf2; struct diffstat_file *data; + int same_contents; data = diffstat_add(diffstat, name_a, name_b); @@@ -2411,11 -2378,9 +2411,11 @@@ return; } + same_contents = !hashcmp(one->sha1, two->sha1); + if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) { data->is_binary = 1; - if (!hashcmp(one->sha1, two->sha1)) { + if (same_contents) { data->added = 0; data->deleted = 0; } else { @@@ -2431,7 -2396,7 +2431,7 @@@ data->added = count_lines(two->data, two->size); } - else { + else if (!same_contents) { /* Crazy xdl interfaces.. */ xpparam_t xpp; xdemitconf_t xecfg; diff --combined t/t4012-diff-binary.sh index 8b4e80de96,e6379f2d82..6cebb3951b --- a/t/t4012-diff-binary.sh +++ b/t/t4012-diff-binary.sh @@@ -36,6 -36,18 +36,18 @@@ test_expect_success '"apply --stat" out test_i18ncmp expected current ' + test_expect_success 'diff --shortstat output for binary file change' ' + echo " 4 files changed, 2 insertions(+), 2 deletions(-)" >expected && + git diff --shortstat >current && + test_i18ncmp expected current + ' + + test_expect_success 'diff --shortstat output for binary file change only' ' + echo " 1 file changed, 0 insertions(+), 0 deletions(-)" >expected && + git diff --shortstat -- b >current && + test_i18ncmp expected current + ' + test_expect_success 'apply --numstat notices binary file change' ' git diff >diff && git apply --numstat current && @@@ -107,23 -119,4 +119,23 @@@ test_expect_success 'diff --no-index wi test_cmp expected actual ' +cat >expect < 1026 bytes + textfile | 10000 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +EOF + +test_expect_success 'diff --stat with binary files and big change count' ' + echo X | dd of=binfile bs=1k seek=1 && + git add binfile && + i=0 && + while test $i -lt 10000; do + echo $i && + i=$(($i + 1)) + done >textfile && + git add textfile && + git diff --cached --stat binfile textfile >output && + grep " | " output >actual && + test_cmp expect actual +' + test_done