Merge branch 'cc/multi-promisor'
[gitweb.git] / range-diff.c
index 5f64380fe4d0597ac271ab2ab38da26ee0841291..ba1e9a4265a6cb3e6ae77b2f32f9fd64bee04cc6 100644 (file)
@@ -46,7 +46,7 @@ static int read_patches(const char *range, struct string_list *list)
        struct strbuf buf = STRBUF_INIT, contents = STRBUF_INIT;
        struct patch_util *util = NULL;
        int in_header = 1;
-       char *line;
+       char *line, *current_filename = NULL;
        int offset, len;
        size_t size;
 
@@ -125,6 +125,12 @@ static int read_patches(const char *range, struct string_list *list)
                        else
                                strbuf_addstr(&buf, patch.new_name);
 
+                       free(current_filename);
+                       if (patch.is_delete > 0)
+                               current_filename = xstrdup(patch.old_name);
+                       else
+                               current_filename = xstrdup(patch.new_name);
+
                        if (patch.new_mode && patch.old_mode &&
                            patch.old_mode != patch.new_mode)
                                strbuf_addf(&buf, " (mode change %06o => %06o)",
@@ -133,8 +139,10 @@ static int read_patches(const char *range, struct string_list *list)
                        strbuf_addstr(&buf, " ##");
                } else if (in_header) {
                        if (starts_with(line, "Author: ")) {
+                               strbuf_addstr(&buf, " ## Metadata ##\n");
                                strbuf_addstr(&buf, line);
                                strbuf_addstr(&buf, "\n\n");
+                               strbuf_addstr(&buf, " ## Commit message ##\n");
                        } else if (starts_with(line, "    ")) {
                                p = line + len - 2;
                                while (isspace(*p) && p >= line)
@@ -145,7 +153,11 @@ static int read_patches(const char *range, struct string_list *list)
                        continue;
                } else if (skip_prefix(line, "@@ ", &p)) {
                        p = strstr(p, "@@");
-                       strbuf_addstr(&buf, p ? p : "@@");
+                       strbuf_addstr(&buf, "@@");
+                       if (current_filename && p[2])
+                               strbuf_addf(&buf, " %s:", current_filename);
+                       if (p)
+                               strbuf_addstr(&buf, p + 2);
                } else if (!line[0])
                        /*
                         * A completely blank (not ' \n', which is context)
@@ -177,6 +189,7 @@ static int read_patches(const char *range, struct string_list *list)
        if (util)
                string_list_append(list, buf.buf)->util = util;
        strbuf_release(&buf);
+       free(current_filename);
 
        if (finish_command(&cp))
                return -1;
@@ -391,8 +404,9 @@ static void output_pair_header(struct diff_options *diffopt,
        fwrite(buf->buf, buf->len, 1, diffopt->file);
 }
 
-static struct userdiff_driver no_func_name = {
-       .funcname = { "$^", 0 }
+static struct userdiff_driver section_headers = {
+       .funcname = { "^ ## (.*) ##$\n"
+                     "^.?@@ (.*)$", REG_EXTENDED }
 };
 
 static struct diff_filespec *get_filespec(const char *name, const char *p)
@@ -404,7 +418,7 @@ static struct diff_filespec *get_filespec(const char *name, const char *p)
        spec->size = strlen(p);
        spec->should_munmap = 0;
        spec->is_stdin = 1;
-       spec->driver = &no_func_name;
+       spec->driver = &section_headers;
 
        return spec;
 }