Code

diffcore-break: save cnt_data for other phases
authorJeff King <peff@peff.net>
Mon, 16 Nov 2009 16:02:02 +0000 (11:02 -0500)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Nov 2009 21:21:12 +0000 (13:21 -0800)
The "break" phase works by counting changes between two
blobs with the same path. We do this by splitting the file
into chunks (or lines for text oriented files) and then
keeping a count of chunk hashes.

The "rename" phase counts changes between blobs at two
different paths. However, it uses the exact same set of
chunk hashes (which are immutable for a given sha1).

The rename phase can therefore use the same hash data as
break. Unfortunately, we were throwing this data away after
computing it in the break phase. This patch instead attaches
it to the filespec and lets it live through the rename
phase, working under the assumption that most of the time
that breaks are being computed, renames will be too.

We only do this optimization for files which have actually
been broken, as those ones will be candidates for rename
detection (and it is a time-space tradeoff, so we don't want
to waste space keeping useless data).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diffcore-break.c

index 15562e45560726475bc395d3a89a212d6e2a1aba..3a7b60a037b2e3c869afe76a23b671cfd5311338 100644 (file)
@@ -69,7 +69,7 @@ static int should_break(struct diff_filespec *src,
                return 0; /* we do not break too small filepair */
 
        if (diffcore_count_changes(src, dst,
-                                  NULL, NULL,
+                                  &src->cnt_data, &dst->cnt_data,
                                   0,
                                   &src_copied, &literal_added))
                return 0;
@@ -204,8 +204,8 @@ void diffcore_break(int break_score)
                                dp->score = score;
                                dp->broken_pair = 1;
 
-                               diff_free_filespec_data(p->one);
-                               diff_free_filespec_data(p->two);
+                               diff_free_filespec_blob(p->one);
+                               diff_free_filespec_blob(p->two);
                                free(p); /* not diff_free_filepair(), we are
                                          * reusing one and two here.
                                          */