diff options
Diffstat (limited to 'diffcore-rename.c')
| -rw-r--r-- | diffcore-rename.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/diffcore-rename.c b/diffcore-rename.c index 3b3c1ed535..73d003a08a 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -60,7 +60,8 @@ static int add_rename_dst(struct diff_filespec *two)  		memmove(rename_dst + first + 1, rename_dst + first,  			(rename_dst_nr - first - 1) * sizeof(*rename_dst));  	rename_dst[first].two = alloc_filespec(two->path); -	fill_filespec(rename_dst[first].two, two->sha1, two->sha1_valid, two->mode); +	fill_filespec(rename_dst[first].two, two->oid.hash, two->oid_valid, +		      two->mode);  	rename_dst[first].pair = NULL;  	return 0;  } @@ -260,12 +261,13 @@ struct file_similarity {  static unsigned int hash_filespec(struct diff_filespec *filespec)  { -	if (!filespec->sha1_valid) { +	if (!filespec->oid_valid) {  		if (diff_populate_filespec(filespec, 0))  			return 0; -		hash_sha1_file(filespec->data, filespec->size, "blob", filespec->sha1); +		hash_sha1_file(filespec->data, filespec->size, "blob", +			       filespec->oid.hash);  	} -	return sha1hash(filespec->sha1); +	return sha1hash(filespec->oid.hash);  }  static int find_identical_files(struct hashmap *srcs, @@ -287,7 +289,7 @@ static int find_identical_files(struct hashmap *srcs,  		struct diff_filespec *source = p->filespec;  		/* False hash collision? */ -		if (hashcmp(source->sha1, target->sha1)) +		if (oidcmp(&source->oid, &target->oid))  			continue;  		/* Non-regular files? If so, the modes must match! */  		if (!S_ISREG(source->mode) || !S_ISREG(target->mode)) { @@ -340,9 +342,11 @@ static int find_exact_renames(struct diff_options *options)  	int i, renames = 0;  	struct hashmap file_table; -	/* Add all sources to the hash table */ +	/* Add all sources to the hash table in reverse order, because +	 * later on they will be retrieved in LIFO order. +	 */  	hashmap_init(&file_table, NULL, rename_src_nr); -	for (i = 0; i < rename_src_nr; i++) +	for (i = rename_src_nr-1; i >= 0; i--)  		insert_file_table(&file_table, i, rename_src[i].p->one);  	/* Walk the destinations and find best source match */ @@ -464,7 +468,7 @@ void diffcore_rename(struct diff_options *options)  				 strcmp(options->single_follow, p->two->path))  				continue; /* not interested */  			else if (!DIFF_OPT_TST(options, RENAME_EMPTY) && -				 is_empty_blob_sha1(p->two->sha1)) +				 is_empty_blob_sha1(p->two->oid.hash))  				continue;  			else if (add_rename_dst(p->two) < 0) {  				warning("skipping rename detection, detected" @@ -474,7 +478,7 @@ void diffcore_rename(struct diff_options *options)  			}  		}  		else if (!DIFF_OPT_TST(options, RENAME_EMPTY) && -			 is_empty_blob_sha1(p->one->sha1)) +			 is_empty_blob_sha1(p->one->oid.hash))  			continue;  		else if (!DIFF_PAIR_UNMERGED(p) && !DIFF_FILE_VALID(p->two)) {  			/* @@ -537,7 +541,7 @@ void diffcore_rename(struct diff_options *options)  				rename_dst_nr * rename_src_nr, 50, 1);  	} -	mx = xcalloc(st_mult(num_create, NUM_CANDIDATE_PER_DST), sizeof(*mx)); +	mx = xcalloc(st_mult(NUM_CANDIDATE_PER_DST, num_create), sizeof(*mx));  	for (dst_cnt = i = 0; i < rename_dst_nr; i++) {  		struct diff_filespec *two = rename_dst[i].two;  		struct diff_score *m;  | 
