mailinfo: ignore blanks after in-body headers.
[git.git] / builtin-log.c
index ac4822d..f4d974a 100644 (file)
@@ -51,6 +51,7 @@ int cmd_whatchanged(int argc, const char **argv, char **envp)
        init_revisions(&rev);
        rev.diff = 1;
        rev.diffopt.recursive = 1;
+       rev.simplify_history = 0;
        return cmd_log_wc(argc, argv, envp, &rev);
 }
 
@@ -85,8 +86,25 @@ static int istitlechar(char c)
                (c >= '0' && c <= '9') || c == '.' || c == '_';
 }
 
+static char *extra_headers = NULL;
+static int extra_headers_size = 0;
+
+static int git_format_config(const char *var, const char *value)
+{
+       if (!strcmp(var, "format.headers")) {
+               int len = strlen(value);
+               extra_headers_size += len + 1;
+               extra_headers = realloc(extra_headers, extra_headers_size);
+               extra_headers[extra_headers_size - len - 1] = 0;
+               strcat(extra_headers, value);
+               return 0;
+       }
+       return git_default_config(var, value);
+}
+
+
 static FILE *realstdout = NULL;
-static char *output_directory = NULL;
+static const char *output_directory = NULL;
 
 static void reopen_stdout(struct commit *commit, int nr, int keep_subject)
 {
@@ -95,7 +113,7 @@ static void reopen_stdout(struct commit *commit, int nr, int keep_subject)
        int len = 0;
 
        if (output_directory) {
-               strncpy(filename, output_directory, 1010);
+               safe_strncpy(filename, output_directory, 1010);
                len = strlen(filename);
                if (filename[len - 1] != '/')
                        filename[len++] = '/';
@@ -162,6 +180,9 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
        rev.ignore_merges = 1;
        rev.diffopt.output_format = DIFF_FORMAT_PATCH;
 
+       git_config(git_format_config);
+       rev.extra_headers = extra_headers;
+
        /*
         * Parse the arguments before setup_revisions(), or something
         * like "git fmt-patch -o a123 HEAD^.." may fail; a123 is
@@ -186,14 +207,14 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
                        keep_subject = 1;
                        rev.total = -1;
                }
-               else if (!strcmp(argv[i], "-o")) {
-                       if (argc < 3)
-                               die ("Which directory?");
-                       if (mkdir(argv[i + 1], 0777) < 0 && errno != EEXIST)
-                               die("Could not create directory %s",
-                                               argv[i + 1]);
-                       output_directory = strdup(argv[i + 1]);
+               else if (!strcmp(argv[i], "--output-directory") ||
+                        !strcmp(argv[i], "-o")) {
                        i++;
+                       if (argc <= i)
+                               die("Which directory?");
+                       if (output_directory)
+                               die("Two output directories?");
+                       output_directory = argv[i];
                }
                else if (!strcmp(argv[i], "--signoff") ||
                         !strcmp(argv[i], "-s")) {
@@ -223,6 +244,14 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
        if (argc > 1)
                die ("unrecognized argument: %s", argv[1]);
 
+       if (output_directory) {
+               if (use_stdout)
+                       die("standard output, or directory, which one?");
+               if (mkdir(output_directory, 0777) < 0 && errno != EEXIST)
+                       die("Could not create directory %s",
+                           output_directory);
+       }
+
        if (rev.pending_objects && rev.pending_objects->next == NULL) {
                rev.pending_objects->item->flags |= UNINTERESTING;
                add_head(&rev);
@@ -273,8 +302,6 @@ int cmd_format_patch(int argc, const char **argv, char **envp)
                if (!use_stdout)
                        fclose(stdout);
        }
-       if (output_directory)
-               free(output_directory);
        free(list);
        return 0;
 }