Fix target selection logic, which did not comply with the man page.

Instead of using the file with the least order of path name components,
shortest filename and finally the shortest basename (with the search
stopping as soon as one of these conditions is true), the first filename
checked was used as the reference, and another filename was only selected
if all of the above comparisons are in favour of the latter file.

This was wrong, because filenames with path less components were only
considered, if both of the other conditions were true as well. In fact,
the first filename to be checked had good chances to be selected in the
end, since it only needed to be better with regard to any one of the
three criteria ...

Reviewed by:	delphij@freebsd.org
This commit is contained in:
Stefan Eßer 2013-05-23 20:57:20 +00:00
parent 08ad1a7ac6
commit 6b239879f8

View File

@ -1537,10 +1537,16 @@ best_name(const struct file_name *names, bool assume_exists)
continue;
if ((tmp = num_components(names[i].path)) > min_components)
continue;
min_components = tmp;
if (tmp < min_components) {
min_components = tmp;
best = names[i].path;
}
if ((tmp = strlen(basename(names[i].path))) > min_baselen)
continue;
min_baselen = tmp;
if (tmp < min_baselen) {
min_baselen = tmp;
best = names[i].path;
}
if ((tmp = strlen(names[i].path)) > min_len)
continue;
min_len = tmp;