]> git.ipfire.org Git - thirdparty/git.git/blobdiff - range-diff.c
t1010: fix unnoticed failure on Windows
[thirdparty/git.git] / range-diff.c
index e9479794b46a51fd08b8ed287a50f35b7c92a4d5..cac89a2f4f2c8d4c6471f0a55bc725cf17a2d9b9 100644 (file)
@@ -26,17 +26,6 @@ struct patch_util {
        struct object_id oid;
 };
 
-static size_t find_end_of_line(char *buffer, unsigned long size)
-{
-       char *eol = memchr(buffer, '\n', size);
-
-       if (!eol)
-               return size;
-
-       *eol = '\0';
-       return eol + 1 - buffer;
-}
-
 /*
  * Reads the patches into a string list, with the `util` field being populated
  * as struct object_id (will need to be free()d).
@@ -49,7 +38,7 @@ static int read_patches(const char *range, struct string_list *list,
        struct patch_util *util = NULL;
        int in_header = 1;
        char *line, *current_filename = NULL;
-       int offset, len;
+       ssize_t len;
        size_t size;
 
        strvec_pushl(&cp.args, "log", "--no-color", "-p", "--no-merges",
@@ -86,11 +75,18 @@ static int read_patches(const char *range, struct string_list *list,
 
        line = contents.buf;
        size = contents.len;
-       for (offset = 0; size > 0; offset += len, size -= len, line += len) {
+       for (; size > 0; size -= len, line += len) {
                const char *p;
+               char *eol;
+
+               eol = memchr(line, '\n', size);
+               if (eol) {
+                       *eol = '\0';
+                       len = eol + 1 - line;
+               } else {
+                       len = size;
+               }
 
-               len = find_end_of_line(line, size);
-               line[len - 1] = '\0';
                if (skip_prefix(line, "commit ", &p)) {
                        if (util) {
                                string_list_append(list, buf.buf)->util = util;
@@ -132,7 +128,8 @@ static int read_patches(const char *range, struct string_list *list,
                        strbuf_addch(&buf, '\n');
                        if (!util->diff_offset)
                                util->diff_offset = buf.len;
-                       line[len - 1] = '\n';
+                       if (eol)
+                               *eol = '\n';
                        orig_len = len;
                        len = parse_git_diff_header(&root, &linenr, 0, line,
                                                    len, size, &patch);
@@ -485,6 +482,7 @@ static void output(struct string_list *a, struct string_list *b,
        else
                diff_setup(&opts);
 
+       opts.no_free = 1;
        if (!opts.output_format)
                opts.output_format = DIFF_FORMAT_PATCH;
        opts.flags.suppress_diff_headers = 1;
@@ -545,6 +543,8 @@ static void output(struct string_list *a, struct string_list *b,
        strbuf_release(&buf);
        strbuf_release(&dashes);
        strbuf_release(&indent);
+       opts.no_free = 0;
+       diff_free(&opts);
 }
 
 int show_range_diff(const char *range1, const char *range2,