diff-files --stat: do not dump core with unmerged index.
[git.git] / diff.c
diff --git a/diff.c b/diff.c
index c120239..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;
 };
@@ -245,11 +247,11 @@ static void show_stats(struct diffstat_t* data)
        if (data->nr == 0)
                return;
 
-       printf("---\n");
-
        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);
@@ -294,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;
                }
@@ -426,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;
@@ -438,8 +449,8 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
                xdemitcb_t ecb;
 
                xpp.flags = XDF_NEED_MINIMAL;
-               xecfg.ctxlen = 3;
-               xecfg.flags = XDL_EMIT_FUNCNAMES;
+               xecfg.ctxlen = 0;
+               xecfg.flags = 0;
                ecb.outf = xdiff_outf;
                ecb.priv = diffstat;
                xdl_diff(&mf1, &mf2, &xpp, &xecfg, &ecb);