Merge branch 'bp/diff-no-index-strbuf-fix'
authorJunio C Hamano <gitster@pobox.com>
Wed, 23 May 2012 20:35:12 +0000 (13:35 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 23 May 2012 20:35:12 +0000 (13:35 -0700)
Fix regressions to "git diff --no-index" when it recurses down.

By Bobby Powers
* bp/diff-no-index-strbuf-fix:
diff --no-index: don't leak buffers in queue_diff
diff --no-index: reset temporary buffer lengths on directory iteration

diff-no-index.c
t/t4053-diff-no-index.sh [new file with mode: 0755]
index b44473e3c1fd5c2bdc4dce3af7aabc86fd37eb08..f0b0010aedd67f9b34f43426c47e837dfe2a522b 100644 (file)
@@ -68,6 +68,7 @@ static int queue_diff(struct diff_options *o,
                struct string_list p1 = STRING_LIST_INIT_DUP;
                struct string_list p2 = STRING_LIST_INIT_DUP;
                int i1, i2, ret = 0;
+               size_t len1 = 0, len2 = 0;
 
                if (name1 && read_directory(name1, &p1))
                        return -1;
@@ -80,18 +81,23 @@ static int queue_diff(struct diff_options *o,
                        strbuf_addstr(&buffer1, name1);
                        if (buffer1.len && buffer1.buf[buffer1.len - 1] != '/')
                                strbuf_addch(&buffer1, '/');
+                       len1 = buffer1.len;
                }
 
                if (name2) {
                        strbuf_addstr(&buffer2, name2);
                        if (buffer2.len && buffer2.buf[buffer2.len - 1] != '/')
                                strbuf_addch(&buffer2, '/');
+                       len2 = buffer2.len;
                }
 
                for (i1 = i2 = 0; !ret && (i1 < p1.nr || i2 < p2.nr); ) {
                        const char *n1, *n2;
                        int comp;
 
+                       strbuf_setlen(&buffer1, len1);
+                       strbuf_setlen(&buffer2, len2);
+
                        if (i1 == p1.nr)
                                comp = 1;
                        else if (i2 == p2.nr)
@@ -117,8 +123,8 @@ static int queue_diff(struct diff_options *o,
                }
                string_list_clear(&p1, 0);
                string_list_clear(&p2, 0);
-               strbuf_reset(&buffer1);
-               strbuf_reset(&buffer2);
+               strbuf_release(&buffer1);
+               strbuf_release(&buffer2);
 
                return ret;
        } else {
diff --git a/t/t4053-diff-no-index.sh b/t/t4053-diff-no-index.sh
new file mode 100755 (executable)
index 0000000..4dc8c67
--- /dev/null
@@ -0,0 +1,19 @@
+#!/bin/sh
+
+test_description='diff --no-index'
+
+. ./test-lib.sh
+
+test_expect_success 'setup' '
+       mkdir a &&
+       mkdir b &&
+       echo 1 >a/1 &&
+       echo 2 >a/2
+'
+
+test_expect_success 'git diff --no-index directories' '
+       git diff --no-index a b >cnt
+       test $? = 1 && test_line_count = 14 cnt
+'
+
+test_done