Use string length diff heuristic to skip Levenshtein Algo (#369)
[rsync.git] / generator.c
index 935c84f9c4bd8974c5e78477d80422ea4d8906d0..21c4a595a1cbc148516b138a62384bec1d961915 100644 (file)
@@ -875,9 +875,12 @@ static struct file_struct *find_fuzzy(struct file_struct *file, struct file_list
                        len = strlen(name);
                        suf = find_filename_suffix(name, len, &suf_len);
 
-                       dist = fuzzy_distance(name, len, fname, fname_len);
-                       /* Add some extra weight to how well the suffixes match. */
-                       dist += fuzzy_distance(suf, suf_len, fname_suf, fname_suf_len) * 10;
+                       dist = fuzzy_distance(name, len, fname, fname_len, lowest_dist);
+                       /* Add some extra weight to how well the suffixes match unless we've already disqualified
+                        * this file based on a heuristic. */
+                       if (dist < 0xFFFF0000U) {
+                               dist += fuzzy_distance(suf, suf_len, fname_suf, fname_suf_len, 0xFFFF0000U) * 10;
+                       }
                        if (DEBUG_GTE(FUZZY, 2)) {
                                rprintf(FINFO, "fuzzy distance for %s = %d.%05d\n",
                                        f_name(fp, NULL), (int)(dist>>16), (int)(dist&0xFFFF));