=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/patch/pch.c,v retrieving revision 1.39 retrieving revision 1.40 diff -c -r1.39 -r1.40 *** src/usr.bin/patch/pch.c 2012/04/11 08:07:13 1.39 --- src/usr.bin/patch/pch.c 2013/07/11 12:39:31 1.40 *************** *** 1,4 **** ! /* $OpenBSD: pch.c,v 1.39 2012/04/11 08:07:13 ajacoutot Exp $ */ /* * patch - a program to apply diffs to original files --- 1,4 ---- ! /* $OpenBSD: pch.c,v 1.40 2013/07/11 12:39:31 otto Exp $ */ /* * patch - a program to apply diffs to original files *************** *** 1465,1479 **** return path ? savestr(path) : NULL; } - /* - * Choose the name of the file to be patched based the "best" one - * available. - */ static char * ! best_name(const struct file_name *names, bool assume_exists) { size_t min_components, min_baselen, min_len, tmp; char *best = NULL; int i; /* --- 1465,1476 ---- return path ? savestr(path) : NULL; } static char * ! compare_names(const struct file_name *names, bool assume_exists, int phase) { size_t min_components, min_baselen, min_len, tmp; char *best = NULL; + char *path; int i; /* *************** *** 1485,1526 **** */ min_components = min_baselen = min_len = SIZE_MAX; for (i = INDEX_FILE; i >= OLD_FILE; i--) { ! if (names[i].path == NULL || ! (!names[i].exists && !assume_exists)) continue; ! if ((tmp = num_components(names[i].path)) > min_components) continue; ! min_components = tmp; ! if ((tmp = strlen(basename(names[i].path))) > min_baselen) continue; ! min_baselen = tmp; ! if ((tmp = strlen(names[i].path)) > min_len) continue; min_len = tmp; ! best = names[i].path; } if (best == NULL) { /* - * No files found, look for something we can checkout from - * RCS/SCCS dirs. Logic is identical to that above... - */ - min_components = min_baselen = min_len = SIZE_MAX; - for (i = INDEX_FILE; i >= OLD_FILE; i--) { - if (names[i].path == NULL || - checked_in(names[i].path) == NULL) - continue; - if ((tmp = num_components(names[i].path)) > min_components) - continue; - min_components = tmp; - if ((tmp = strlen(basename(names[i].path))) > min_baselen) - continue; - min_baselen = tmp; - if ((tmp = strlen(names[i].path)) > min_len) - continue; - min_len = tmp; - best = names[i].path; - } - /* * Still no match? Check to see if the diff could be creating * a new file. */ --- 1482,1525 ---- */ min_components = min_baselen = min_len = SIZE_MAX; for (i = INDEX_FILE; i >= OLD_FILE; i--) { ! path = names[i].path; ! if (path == NULL || ! (phase == 1 && !names[i].exists && !assume_exists) || ! (phase == 2 && checked_in(path) == NULL)) continue; ! if ((tmp = num_components(path)) > min_components) continue; ! if (tmp < min_components) { ! min_components = tmp; ! best = path; ! } ! if ((tmp = strlen(basename(path))) > min_baselen) continue; ! if (tmp < min_baselen) { ! min_baselen = tmp; ! best = path; ! } ! if ((tmp = strlen(path)) > min_len) continue; min_len = tmp; ! best = path; } + return best; + } + + /* + * Choose the name of the file to be patched based the "best" one + * available. + */ + static char * + best_name(const struct file_name *names, bool assume_exists) + { + char *best; + + best = compare_names(names, assume_exists, 1); if (best == NULL) { + best = compare_names(names, assume_exists, 2); /* * Still no match? Check to see if the diff could be creating * a new file. */ *************** *** 1528,1534 **** names[NEW_FILE].path != NULL) best = names[NEW_FILE].path; } - return best ? savestr(best) : NULL; } --- 1527,1532 ----