gc: default aggressive depth to 50
[gitweb.git] / combine-diff.c
index 12764fb733f3ca57f12c7fc567eec02d234c889e..5cae5fbd62180e08709d404cbf357adceb1d4d06 100644 (file)
 #include "sha1-array.h"
 #include "revision.h"
 
+static int compare_paths(const struct combine_diff_path *one,
+                         const struct diff_filespec *two)
+{
+       if (!S_ISDIR(one->mode) && !S_ISDIR(two->mode))
+               return strcmp(one->path, two->path);
+
+       return base_name_compare(one->path, strlen(one->path), one->mode,
+                                two->path, strlen(two->path), two->mode);
+}
+
 static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr, int n, int num_parent)
 {
        struct diff_queue_struct *q = &diff_queued_diff;
@@ -52,7 +62,7 @@ static struct combine_diff_path *intersect_paths(struct combine_diff_path *curr,
        i = 0;
        while ((p = *tail) != NULL) {
                cmp = ((i >= q->nr)
-                      ? -1 : strcmp(p->path, q->queue[i]->two->path));
+                      ? -1 : compare_paths(p, q->queue[i]->two));
 
                if (cmp < 0) {
                        /* p->path not in q->queue[]; drop it */
@@ -409,8 +419,10 @@ static void combine_diff(const unsigned char *parent, unsigned int mode,
        state.num_parent = num_parent;
        state.n = n;
 
-       xdi_diff_outf(&parent_file, result_file, consume_line, &state,
-                     &xpp, &xecfg);
+       if (xdi_diff_outf(&parent_file, result_file, consume_line, &state,
+                         &xpp, &xecfg))
+               die("unable to generate combined diff for %s",
+                   sha1_to_hex(parent));
        free(parent_file.ptr);
 
        /* Assign line numbers for this parent.
@@ -720,7 +732,7 @@ static void dump_sline(struct sline *sline, const char *line_prefix,
        const char *c_func = diff_get_color(use_color, DIFF_FUNCINFO);
        const char *c_new = diff_get_color(use_color, DIFF_FILE_NEW);
        const char *c_old = diff_get_color(use_color, DIFF_FILE_OLD);
-       const char *c_plain = diff_get_color(use_color, DIFF_PLAIN);
+       const char *c_context = diff_get_color(use_color, DIFF_CONTEXT);
        const char *c_reset = diff_get_color(use_color, DIFF_RESET);
 
        if (result_deleted)
@@ -783,7 +795,7 @@ static void dump_sline(struct sline *sline, const char *line_prefix,
                        }
                        if (comment_end)
                                printf("%s%s %s%s", c_reset,
-                                                   c_plain, c_reset,
+                                                   c_context, c_reset,
                                                    c_func);
                        for (i = 0; i < comment_end; i++)
                                putchar(hunk_comment[i]);
@@ -818,7 +830,7 @@ static void dump_sline(struct sline *sline, const char *line_prefix,
                                 */
                                if (!context)
                                        continue;
-                               fputs(c_plain, stdout);
+                               fputs(c_context, stdout);
                        }
                        else
                                fputs(c_new, stdout);
@@ -1396,7 +1408,9 @@ void diff_tree_combined(const unsigned char *sha1,
        if (show_log_first) {
                show_log(rev);
 
-               if (rev->verbose_header && opt->output_format)
+               if (rev->verbose_header && opt->output_format &&
+                   opt->output_format != DIFF_FORMAT_NO_OUTPUT &&
+                   !commit_format_is_empty(rev->commit_format))
                        printf("%s%c", diff_line_prefix(opt),
                               opt->line_termination);
        }