diff-files --stat: do not dump core with unmerged index.
authorJunio C Hamano <junkio@cox.net>
Sun, 16 Apr 2006 01:38:32 +0000 (18:38 -0700)
committerJunio C Hamano <junkio@cox.net>
Sun, 16 Apr 2006 02:22:48 +0000 (19:22 -0700)
Signed-off-by: Junio C Hamano <junkio@cox.net>
diff.c

diff --git a/diff.c b/diff.c
index cda8d20..46e8529 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -202,6 +202,8 @@ struct diffstat_t {
        int alloc;
        struct diffstat_file {
                char *name;
+               unsigned is_unmerged:1;
+               unsigned is_binary:1;
                unsigned int added, deleted;
        } **files;
 };
@@ -248,6 +250,8 @@ static void show_stats(struct diffstat_t* data)
        for (i = 0; i < data->nr; i++) {
                struct diffstat_file *file = data->files[i];
 
+               if (file->is_binary || file->is_unmerged)
+                       continue;
                if (max_change < file->added + file->deleted)
                        max_change = file->added + file->deleted;
                len = strlen(file->name);
@@ -292,11 +296,15 @@ static void show_stats(struct diffstat_t* data)
                if (max + len > 70)
                        max = 70 - len;
 
-               if (added < 0) {
-                       /* binary file */
+               if (data->files[i]->is_binary) {
                        printf(" %s%-*s |  Bin\n", prefix, len, name);
                        goto free_diffstat_file;
-               } else if (added + deleted == 0) {
+               }
+               else if (data->files[i]->is_unmerged) {
+                       printf(" %s%-*s |  Unmerged\n", prefix, len, name);
+                       goto free_diffstat_file;
+               }
+               else if (added + deleted == 0) {
                        total_files--;
                        goto free_diffstat_file;
                }
@@ -424,11 +432,16 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
 
        data = diffstat_add(diffstat, name_a ? name_a : name_b);
 
+       if (!one || !two) {
+               data->is_unmerged = 1;
+               return;
+       }
+
        if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
                die("unable to read files to diff");
 
        if (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2))
-               data->added = -1;
+               data->is_binary = 1;
        else {
                /* Crazy xdl interfaces.. */
                xpparam_t xpp;