summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff King <peff@peff.net>2009-11-16 16:02:02 (GMT)
committerJunio C Hamano <gitster@pobox.com>2009-11-16 21:21:12 (GMT)
commit8282de94bc76360e0bf76da4076755696b049d23 (patch)
tree3dbea786126759feeedb8116c114375669d97555
parentf4f19fb63449e1beee02b0ec845319f7115fa9d0 (diff)
downloadgit-8282de94bc76360e0bf76da4076755696b049d23.zip
git-8282de94bc76360e0bf76da4076755696b049d23.tar.gz
git-8282de94bc76360e0bf76da4076755696b049d23.tar.bz2
diffcore-break: save cnt_data for other phases
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>
-rw-r--r--diffcore-break.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/diffcore-break.c b/diffcore-break.c
index 15562e4..3a7b60a 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -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.
*/