Skip to content

Commit

Permalink
Merge branch 'jc/rename'
Browse files Browse the repository at this point in the history
* jc/rename:
  diffcore-rename: try matching up renames without populating filespec first.
  • Loading branch information
Junio C Hamano committed Jul 10, 2006
2 parents 405a99a + 17e6019 commit 4f12d52
Showing 1 changed file with 22 additions and 11 deletions.
33 changes: 22 additions & 11 deletions diffcore-rename.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,15 @@ static struct diff_rename_src *register_rename_src(struct diff_filespec *one,
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 &&
!memcmp(src->sha1, dst->sha1, 20))
return 1;
if (!contents_too)
return 0;
if (diff_populate_filespec(src, 1) || diff_populate_filespec(dst, 1))
return 0;
if (src->size != dst->size)
Expand Down Expand Up @@ -242,7 +246,7 @@ void diffcore_rename(struct diff_options *options)
struct diff_queue_struct *q = &diff_queued_diff;
struct diff_queue_struct outq;
struct diff_score *mx;
int i, j, rename_count;
int i, j, rename_count, contents_too;
int num_create, num_src, dst_cnt;

if (!minimum_score)
Expand Down Expand Up @@ -273,16 +277,23 @@ void diffcore_rename(struct diff_options *options)

/* We really want to cull the candidates list early
* 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 (i = 0; i < rename_dst_nr; i++) {
struct diff_filespec *two = rename_dst[i].two;
for (j = 0; j < rename_src_nr; j++) {
struct diff_filespec *one = rename_src[j].one;
if (!is_exact_match(one, two))
continue;
record_rename_pair(i, j, MAX_SCORE);
rename_count++;
break; /* we are done with this entry */
for (contents_too = 0; contents_too < 2; contents_too++) {
for (i = 0; i < rename_dst_nr; i++) {
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++) {
struct diff_filespec *one = rename_src[j].one;
if (!is_exact_match(one, two, contents_too))
continue;
record_rename_pair(i, j, MAX_SCORE);
rename_count++;
break; /* we are done with this entry */
}
}
}

Expand Down

0 comments on commit 4f12d52

Please sign in to comment.