Use sigaction and SA_RESTART in read-tree.c; add option in Makefile.
[git.git] / diffcore-break.c
index b0c8461..95b5eb4 100644 (file)
@@ -58,14 +58,22 @@ static int should_break(struct diff_filespec *src,
        if (!S_ISREG(src->mode) || !S_ISREG(dst->mode))
                return 0; /* leave symlink rename alone */
 
+       if (src->sha1_valid && dst->sha1_valid &&
+           !memcmp(src->sha1, dst->sha1, 20))
+               return 0; /* they are the same */
+
        if (diff_populate_filespec(src, 0) || diff_populate_filespec(dst, 0))
                return 0; /* error but caught downstream */
 
        base_size = ((src->size < dst->size) ? src->size : dst->size);
+       if (base_size < MINIMUM_BREAK_SIZE)
+               return 0; /* we do not break too small filepair */
 
        delta = diff_delta(src->data, src->size,
                           dst->data, dst->size,
                           &delta_size, 0);
+       if (!delta)
+               return 0; /* error but caught downstream */
 
        /* Estimate the edit size by interpreting delta. */
        if (count_delta(delta, delta_size,
@@ -168,8 +176,7 @@ void diffcore_break(int break_score)
                    !S_ISDIR(p->one->mode) && !S_ISDIR(p->two->mode) &&
                    !strcmp(p->one->path, p->two->path)) {
                        if (should_break(p->one, p->two,
-                                        break_score, &score) &&
-                           MINIMUM_BREAK_SIZE <= p->one->size) {
+                                        break_score, &score)) {
                                /* Split this into delete and create */
                                struct diff_filespec *null_one, *null_two;
                                struct diff_filepair *dp;
@@ -231,8 +238,8 @@ static void merge_broken(struct diff_filepair *p,
 
        dp = diff_queue(outq, d->one, c->two);
        dp->score = p->score;
-       diff_free_filespec(d->two);
-       diff_free_filespec(c->one);
+       diff_free_filespec_data(d->two);
+       diff_free_filespec_data(c->one);
        free(d);
        free(c);
 }