Skip to content

Commit

Permalink
Improve robustness of diff rename detection
Browse files Browse the repository at this point in the history
Under some strange circumstances, diffs can end up listing files
that we can't actually open successfully.  Instead of aborting
the git_diff_find_similar, this makes it so that those files just
won't be considered as valid rename/copy targets instead.
  • Loading branch information
arrbee committed May 15, 2013
1 parent dcb0f7c commit 09fae31
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/diff_tform.c
Original file line number Diff line number Diff line change
Expand Up @@ -386,8 +386,12 @@ static int similarity_calc(

/* TODO: apply wd-to-odb filters to file data if necessary */

if (!(error = git_buf_joinpath(
&path, git_repository_workdir(diff->repo), file->path)))
if ((error = git_buf_joinpath(
&path, git_repository_workdir(diff->repo), file->path)) < 0)
return error;

/* if path is not a regular file, just skip this item */
if (git_path_isfile(path.ptr))
error = opts->metric->file_signature(
&cache[file_idx], file, path.ptr, opts->metric->payload);

Expand All @@ -398,8 +402,11 @@ static int similarity_calc(

/* TODO: add max size threshold a la diff? */

if ((error = git_blob_lookup(&blob, diff->repo, &file->oid)) < 0)
return error;
if (git_blob_lookup(&blob, diff->repo, &file->oid) < 0) {
/* if lookup fails, just skip this item in similarity calc */
giterr_clear();
return 0;
}

blobsize = git_blob_rawsize(blob);
if (!git__is_sizet(blobsize)) /* ? what to do ? */
Expand Down Expand Up @@ -437,7 +444,7 @@ static int similarity_measure(
return -1;
if (!cache[b_idx] && similarity_calc(diff, opts, b_idx, cache) < 0)
return -1;

/* some metrics may not wish to process this file (too big / too small) */
if (!cache[a_idx] || !cache[b_idx])
return 0;
Expand Down

0 comments on commit 09fae31

Please sign in to comment.