Merge branch 'jc/rename'
* jc/rename: diffcore-rename: try matching up renames without populating filespec first.
This commit is contained in:
commit
4f12d529ab
@ -96,11 +96,15 @@ static struct diff_rename_src *register_rename_src(struct diff_filespec *one,
|
|||||||
return &(rename_src[first]);
|
return &(rename_src[first]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int is_exact_match(struct diff_filespec *src, struct diff_filespec *dst)
|
static int is_exact_match(struct diff_filespec *src,
|
||||||
|
struct diff_filespec *dst,
|
||||||
|
int contents_too)
|
||||||
{
|
{
|
||||||
if (src->sha1_valid && dst->sha1_valid &&
|
if (src->sha1_valid && dst->sha1_valid &&
|
||||||
!memcmp(src->sha1, dst->sha1, 20))
|
!memcmp(src->sha1, dst->sha1, 20))
|
||||||
return 1;
|
return 1;
|
||||||
|
if (!contents_too)
|
||||||
|
return 0;
|
||||||
if (diff_populate_filespec(src, 1) || diff_populate_filespec(dst, 1))
|
if (diff_populate_filespec(src, 1) || diff_populate_filespec(dst, 1))
|
||||||
return 0;
|
return 0;
|
||||||
if (src->size != dst->size)
|
if (src->size != dst->size)
|
||||||
@ -242,7 +246,7 @@ void diffcore_rename(struct diff_options *options)
|
|||||||
struct diff_queue_struct *q = &diff_queued_diff;
|
struct diff_queue_struct *q = &diff_queued_diff;
|
||||||
struct diff_queue_struct outq;
|
struct diff_queue_struct outq;
|
||||||
struct diff_score *mx;
|
struct diff_score *mx;
|
||||||
int i, j, rename_count;
|
int i, j, rename_count, contents_too;
|
||||||
int num_create, num_src, dst_cnt;
|
int num_create, num_src, dst_cnt;
|
||||||
|
|
||||||
if (!minimum_score)
|
if (!minimum_score)
|
||||||
@ -273,18 +277,25 @@ void diffcore_rename(struct diff_options *options)
|
|||||||
|
|
||||||
/* We really want to cull the candidates list early
|
/* We really want to cull the candidates list early
|
||||||
* with cheap tests in order to avoid doing deltas.
|
* with cheap tests in order to avoid doing deltas.
|
||||||
|
* The first round matches up the up-to-date entries,
|
||||||
|
* and then during the second round we try to match
|
||||||
|
* cache-dirty entries as well.
|
||||||
*/
|
*/
|
||||||
|
for (contents_too = 0; contents_too < 2; contents_too++) {
|
||||||
for (i = 0; i < rename_dst_nr; i++) {
|
for (i = 0; i < rename_dst_nr; i++) {
|
||||||
struct diff_filespec *two = rename_dst[i].two;
|
struct diff_filespec *two = rename_dst[i].two;
|
||||||
|
if (rename_dst[i].pair)
|
||||||
|
continue; /* dealt with an earlier round */
|
||||||
for (j = 0; j < rename_src_nr; j++) {
|
for (j = 0; j < rename_src_nr; j++) {
|
||||||
struct diff_filespec *one = rename_src[j].one;
|
struct diff_filespec *one = rename_src[j].one;
|
||||||
if (!is_exact_match(one, two))
|
if (!is_exact_match(one, two, contents_too))
|
||||||
continue;
|
continue;
|
||||||
record_rename_pair(i, j, MAX_SCORE);
|
record_rename_pair(i, j, MAX_SCORE);
|
||||||
rename_count++;
|
rename_count++;
|
||||||
break; /* we are done with this entry */
|
break; /* we are done with this entry */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Have we run out the created file pool? If so we can avoid
|
/* Have we run out the created file pool? If so we can avoid
|
||||||
* doing the delta matrix altogether.
|
* doing the delta matrix altogether.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user