@matheusbsbs / matheus-bagliano / commits / abb371a1ef
Fork 0

diff: don't retrieve binary blobs for diffstat

We only need the size, which is much cheaper to get, especially if it is a big binary file. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jeff King committed Feb 19, 2011 at 03:16 UTC abb371a1ef5bddee904551afdec38854f95e99bb
1 file changed +11 -4
diff.c
+11 -4
@@ -235,6 +235,15 @@ static int fill_mmfile(mmfile_t *mf, struct diff_filespec *one)
235 return 0;
236 }
237
238 +/* like fill_mmfile, but only for size, so we can avoid retrieving blob */
239 +static unsigned long diff_filespec_size(struct diff_filespec *one)
240 +{
241 + if (!DIFF_FILE_VALID(one))
242 + return 0;
243 + diff_populate_filespec(one, 1);
244 + return one->size;
245 +}
246 +
247 static int count_trailing_blank(mmfile_t *mf, unsigned ws_rule)
248 {
249 char *ptr = mf->ptr;
@@ -1813,11 +1822,9 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
1822 }
1823
1824 if (diff_filespec_is_binary(one) || diff_filespec_is_binary(two)) {
1816 - if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
1817 - die("unable to read files to diff");
1825 data->is_binary = 1;
1819 - data->added = mf2.size;
1820 - data->deleted = mf1.size;
1826 + data->added = diff_filespec_size(two);
1827 + data->deleted = diff_filespec_size(one);
1828 }
1829
1830 else if (complete_rewrite) {