diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/diff_tform.c | 37 | ||||
-rw-r--r-- | src/hashsig.c | 27 |
2 files changed, 27 insertions, 37 deletions
diff --git a/src/diff_tform.c b/src/diff_tform.c index d576317f0..9133a9b14 100644 --- a/src/diff_tform.c +++ b/src/diff_tform.c @@ -219,34 +219,18 @@ int git_diff_find_similar__hashsig_for_file( void **out, const git_diff_file *f, const char *path, void *p) { git_hashsig_option_t opt = (git_hashsig_option_t)(intptr_t)p; - int error = 0; GIT_UNUSED(f); - error = git_hashsig_create_fromfile((git_hashsig **)out, path, opt); - - if (error == GIT_EBUFS) { - error = 0; - giterr_clear(); - } - - return error; + return git_hashsig_create_fromfile((git_hashsig **)out, path, opt); } int git_diff_find_similar__hashsig_for_buf( void **out, const git_diff_file *f, const char *buf, size_t len, void *p) { git_hashsig_option_t opt = (git_hashsig_option_t)(intptr_t)p; - int error = 0; GIT_UNUSED(f); - error = git_hashsig_create((git_hashsig **)out, buf, len, opt); - - if (error == GIT_EBUFS) { - error = 0; - giterr_clear(); - } - - return error; + return git_hashsig_create((git_hashsig **)out, buf, len, opt); } void git_diff_find_similar__hashsig_free(void *sig, void *payload) @@ -258,8 +242,14 @@ void git_diff_find_similar__hashsig_free(void *sig, void *payload) int git_diff_find_similar__calc_similarity( int *score, void *siga, void *sigb, void *payload) { + int error; + GIT_UNUSED(payload); - *score = git_hashsig_compare(siga, sigb); + error = git_hashsig_compare(siga, sigb); + if (error < 0) + return error; + + *score = error; return 0; } @@ -273,6 +263,7 @@ static int normalize_find_opts( const git_diff_find_options *given) { git_config *cfg = NULL; + git_hashsig_option_t hashsig_opts; GITERR_CHECK_VERSION(given, GIT_DIFF_FIND_OPTIONS_VERSION, "git_diff_find_options"); @@ -354,11 +345,13 @@ static int normalize_find_opts( opts->metric->similarity = git_diff_find_similar__calc_similarity; if (opts->flags & GIT_DIFF_FIND_IGNORE_WHITESPACE) - opts->metric->payload = (void *)GIT_HASHSIG_IGNORE_WHITESPACE; + hashsig_opts = GIT_HASHSIG_IGNORE_WHITESPACE; else if (opts->flags & GIT_DIFF_FIND_DONT_IGNORE_WHITESPACE) - opts->metric->payload = (void *)GIT_HASHSIG_NORMAL; + hashsig_opts = GIT_HASHSIG_NORMAL; else - opts->metric->payload = (void *)GIT_HASHSIG_SMART_WHITESPACE; + hashsig_opts = GIT_HASHSIG_SMART_WHITESPACE; + hashsig_opts |= GIT_HASHSIG_ALLOW_SMALL_FILES; + opts->metric->payload = (void *)hashsig_opts; } return 0; diff --git a/src/hashsig.c b/src/hashsig.c index a6d5f2041..0ddfed902 100644 --- a/src/hashsig.c +++ b/src/hashsig.c @@ -35,7 +35,6 @@ struct git_hashsig { hashsig_heap mins; hashsig_heap maxs; git_hashsig_option_t opt; - int considered; }; #define HEAP_LCHILD_OF(I) (((I)<<1)+1) @@ -135,25 +134,23 @@ static void hashsig_in_progress_init( { int i; - switch (sig->opt) { - case GIT_HASHSIG_IGNORE_WHITESPACE: + /* no more than one can be set */ + assert(!(sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) || + !(sig->opt & GIT_HASHSIG_SMART_WHITESPACE)); + + if (sig->opt & GIT_HASHSIG_IGNORE_WHITESPACE) { for (i = 0; i < 256; ++i) prog->ignore_ch[i] = git__isspace_nonlf(i); prog->use_ignores = 1; - break; - case GIT_HASHSIG_SMART_WHITESPACE: + } else if (sig->opt & GIT_HASHSIG_SMART_WHITESPACE) { for (i = 0; i < 256; ++i) prog->ignore_ch[i] = git__isspace(i); prog->use_ignores = 1; - break; - default: + } else { memset(prog, 0, sizeof(*prog)); - break; } } -#define HASHSIG_IN_PROGRESS_INIT { 1 } - static int hashsig_add_hashes( git_hashsig *sig, const uint8_t *data, @@ -174,12 +171,13 @@ static int hashsig_add_hashes( if (use_ignores) for (; scan < end && git__isspace_nonlf(ch); ch = *scan) ++scan; - else if (sig->opt != GIT_HASHSIG_NORMAL) + else if (sig->opt & + (GIT_HASHSIG_IGNORE_WHITESPACE | GIT_HASHSIG_SMART_WHITESPACE)) for (; scan < end && ch == '\r'; ch = *scan) ++scan; /* peek at next character to decide what to do next */ - if (sig->opt == GIT_HASHSIG_SMART_WHITESPACE) + if (sig->opt & GIT_HASHSIG_SMART_WHITESPACE) use_ignores = (ch == '\n'); if (scan >= end) @@ -198,8 +196,6 @@ static int hashsig_add_hashes( hashsig_heap_insert(&sig->mins, (hashsig_t)state); hashsig_heap_insert(&sig->maxs, (hashsig_t)state); - sig->considered++; - while (scan < end && (*scan == '\n' || !*scan)) ++scan; } @@ -212,7 +208,8 @@ static int hashsig_add_hashes( static int hashsig_finalize_hashes(git_hashsig *sig) { - if (sig->mins.size < HASHSIG_HEAP_MIN_SIZE) { + if (sig->mins.size < HASHSIG_HEAP_MIN_SIZE && + !(sig->opt & GIT_HASHSIG_ALLOW_SMALL_FILES)) { giterr_set(GITERR_INVALID, "File too small for similarity signature calculation"); return GIT_EBUFS; |