# Copyright 2011-2012 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 import difflib from portage.versions import catsplit def similar_name_search(dbs, atom): cp_lower = atom.cp.lower() cat, pkg = catsplit(cp_lower) if cat == "null": cat = None all_cp = set() for db in dbs: all_cp.update(db.cp_all()) # discard dir containing no ebuilds all_cp.discard(atom.cp) orig_cp_map = {} for cp_orig in all_cp: orig_cp_map.setdefault(cp_orig.lower(), []).append(cp_orig) all_cp = set(orig_cp_map) if cat: matches = difflib.get_close_matches(cp_lower, all_cp) else: pkg_to_cp = {} for other_cp in list(all_cp): other_pkg = catsplit(other_cp)[1] if other_pkg == pkg: # Check for non-identical package that # differs only by upper/lower case. identical = True for cp_orig in orig_cp_map[other_cp]: if catsplit(cp_orig)[1] != \ catsplit(atom.cp)[1]: identical = False break if identical: # discard dir containing no ebuilds all_cp.discard(other_cp) continue pkg_to_cp.setdefault(other_pkg, set()).add(other_cp) pkg_matches = difflib.get_close_matches(pkg, pkg_to_cp) matches = [] for pkg_match in pkg_matches: matches.extend(pkg_to_cp[pkg_match]) matches_orig_case = [] for cp in matches: matches_orig_case.extend(orig_cp_map[cp]) return matches_orig_case