Merge branch 'as/diff-shortstat-ignore-binary'
authorJunio C Hamano <gitster@pobox.com>
Fri, 15 Jun 2012 22:00:53 +0000 (15:00 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 15 Jun 2012 22:00:53 +0000 (15:00 -0700)
# By Alexander Strasser
* as/diff-shortstat-ignore-binary:
diff: Only count lines in show_shortstats

1  2 
diff.c
t/t4012-diff-binary.sh
diff --combined diff.c
index 77edd5086fff30af36e92a151377c285de21aca3,ac624c477cfba345129be7513c91bccbcabab45c..1a594df4f45bf0bc8409e871535f7ebd34684c6c
--- 1/diff.c
--- 2/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;
                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;
        }
         * 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;
  
        /*
         * 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;
         * 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;
                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;
                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;
                }
  
                }
                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);
  
                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 {
                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 8b4e80de9627d9a8fa90a31edbe05c2c70f1d4b3,e6379f2d82401fb3c5309a050f285d6d3f788be8..6cebb3951bc7f4e9b772efed052c485d82d1a68d
@@@ -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 <diff >current &&
@@@ -107,23 -119,4 +119,23 @@@ test_expect_success 'diff --no-index wi
        test_cmp expected actual
  '
  
 +cat >expect <<EOF
 + binfile  |   Bin 0 -> 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