diff options
author | Russell Belfer <rb@github.com> | 2013-02-22 10:21:02 -0800 |
---|---|---|
committer | Russell Belfer <rb@github.com> | 2013-02-22 10:21:02 -0800 |
commit | 0a0089131f6e3c0d6be35c47dd243c87cf8c3fc9 (patch) | |
tree | b863f9571bac1d10f724b0e864b1b68226c0073a | |
parent | f8275890676a56735b1af1abde859722f040a61c (diff) | |
download | libgit2-0a0089131f6e3c0d6be35c47dd243c87cf8c3fc9.tar.gz |
Minor improvements to find_similar code
This moves a couple of checks outside of the inner loop of the
find_similar rename/copy detection phase that are only dependent
on the "from" side of a detection.
Also, this replaces the inefficient initialization of the
options structure when a value is not provided explicitly by the
user.
-rw-r--r-- | src/diff_tform.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/src/diff_tform.c b/src/diff_tform.c index 66a4702f2..958d2bfec 100644 --- a/src/diff_tform.c +++ b/src/diff_tform.c @@ -210,7 +210,6 @@ static int normalize_find_opts( git_diff_find_options *given) { git_config *cfg = NULL; - const char *val; if (diff->repo != NULL && git_repository_config__weakptr(&cfg, diff->repo) < 0) @@ -219,8 +218,9 @@ static int normalize_find_opts( if (given != NULL) memcpy(opts, given, sizeof(*opts)); else { - git_diff_find_options init = GIT_DIFF_FIND_OPTIONS_INIT; - memmove(opts, &init, sizeof(init)); + const char *val = NULL; + + GIT_INIT_STRUCTURE(opts, GIT_DIFF_FIND_OPTIONS_VERSION); opts->flags = GIT_DIFF_FIND_RENAMES; @@ -486,6 +486,17 @@ int git_diff_find_similar( GIT_MODE_TYPE(GIT_FILEMODE_BLOB)) continue; + /* don't check UNMODIFIED files as source unless given option */ + if (from->status == GIT_DELTA_UNMODIFIED && + !FLAG_SET(opts, GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED)) + continue; + + /* skip all but DELETED files unless copy detection is on */ + if (!FLAG_SET(opts, GIT_DIFF_FIND_COPIES) && + from->status != GIT_DELTA_DELETED && + (from->flags & GIT_DIFF_FLAG__TO_SPLIT) == 0) + continue; + git_vector_foreach(&diff->deltas, j, to) { if (i == j) continue; @@ -510,18 +521,7 @@ int git_diff_find_similar( continue; } - /* skip all but DELETED files unless copy detection is on */ - if (!FLAG_SET(opts, GIT_DIFF_FIND_COPIES) && - from->status != GIT_DELTA_DELETED && - (from->flags & GIT_DIFF_FLAG__TO_SPLIT) == 0) - continue; - - /* don't check UNMODIFIED files as source unless given option */ - if (from->status == GIT_DELTA_UNMODIFIED && - !FLAG_SET(opts, GIT_DIFF_FIND_COPIES_FROM_UNMODIFIED)) - continue; - - /* cap on maximum files we'll examine */ + /* cap on maximum files we'll examine (per "from" file) */ if (++tried_targets > opts.target_limit) break; |