John Keeping <[email protected]> writes:
> When the source file is empty, the calculation of the merge score
> results in a division by zero. Since the merge score is initialized to
> zero, it makes sense to just leave it as it is if the source size is
> zero. This means that we still use the extent of damage metric to
> decide whether to break the filepair.
Well spotted. An empty blob to another blob that is larger than 400
bytes will trigger div0, and it makes sense to leave merge-score to
0 (i.e. do not show as whole-delete-then-whole-add after rename
detection is done and the broken filepair is merged back).
Actually, if src->size is 0, we probably shouldn't break the filepair
in the first place. That is, if your preimage and postimage looked
like these:
== preimage == == postimage ==
F (empty file) F (a large file)
E (a new empty file)
do we want to see F renamed to E and then a new file created as F
while running "git diff -B -M"? I doubt it.
So in that sense, this might be a better solution. I dunno.
diffcore-break.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/diffcore-break.c b/diffcore-break.c
index 44f8678..eabafd5 100644
--- a/diffcore-break.c
+++ b/diffcore-break.c
@@ -67,6 +67,8 @@ static int should_break(struct diff_filespec *src,
max_size = ((src->size > dst->size) ? src->size : dst->size);
if (max_size < MINIMUM_BREAK_SIZE)
return 0; /* we do not break too small filepair */
+ if (src->size == 0)
+ return 0; /* we do not let empty files get renamed */
if (diffcore_count_changes(src, dst,
&src->cnt_data, &dst->cnt_data,
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html