Make 'make' quieter while building git
[gitweb.git] / diff.c
diff --git a/diff.c b/diff.c
index d1eae7214d863d5a87735059d509afcdf60507d7..e225de230599bb35d9fe5b219ff4b8e8de9bfd97 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -382,6 +382,7 @@ struct emit_callback {
        int nparents, color_diff;
        const char **label_path;
        struct diff_words_data *diff_words;
+       int *found_changesp;
 };
 
 static void free_diff_words_data(struct emit_callback *ecbdata)
@@ -501,6 +502,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
        const char *set = diff_get_color(ecbdata->color_diff, DIFF_METAINFO);
        const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
 
+       *(ecbdata->found_changesp) = 1;
+
        if (ecbdata->label_path[0]) {
                const char *name_a_tab, *name_b_tab;
 
@@ -1098,6 +1101,7 @@ static void builtin_diff(const char *name_a,
                if (complete_rewrite) {
                        emit_rewrite_diff(name_a, name_b, one, two,
                                        o->color_diff);
+                       o->found_changes = 1;
                        goto free_ab_and_return;
                }
        }
@@ -1115,6 +1119,7 @@ static void builtin_diff(const char *name_a,
                else
                        printf("Binary files %s and %s differ\n",
                               lbl[0], lbl[1]);
+               o->found_changes = 1;
        }
        else {
                /* Crazy xdl interfaces.. */
@@ -1127,6 +1132,7 @@ static void builtin_diff(const char *name_a,
                memset(&ecbdata, 0, sizeof(ecbdata));
                ecbdata.label_path = lbl;
                ecbdata.color_diff = o->color_diff;
+               ecbdata.found_changesp = &o->found_changes;
                xpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;
                xecfg.ctxlen = o->context;
                xecfg.flags = XDL_EMIT_FUNCNAMES;
@@ -1430,7 +1436,7 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
                }
        }
        else {
-               char type[20];
+               enum object_type type;
                struct sha1_size_cache *e;
 
                if (size_only) {
@@ -1439,11 +1445,12 @@ int diff_populate_filespec(struct diff_filespec *s, int size_only)
                                s->size = e->size;
                                return 0;
                        }
-                       if (!sha1_object_info(s->sha1, type, &s->size))
+                       type = sha1_object_info(s->sha1, &s->size);
+                       if (type < 0)
                                locate_size_cache(s->sha1, 0, s->size);
                }
                else {
-                       s->data = read_sha1_file(s->sha1, type, &s->size);
+                       s->data = read_sha1_file(s->sha1, &type, &s->size);
                        s->should_free = 1;
                }
        }
@@ -2455,7 +2462,8 @@ static void diff_resolve_rename_copy(void)
                                p->status = DIFF_STATUS_RENAMED;
                }
                else if (hashcmp(p->one->sha1, p->two->sha1) ||
-                        p->one->mode != p->two->mode)
+                        p->one->mode != p->two->mode ||
+                        is_null_sha1(p->one->sha1))
                        p->status = DIFF_STATUS_MODIFIED;
                else {
                        /* This is a "no-change" entry and should not