public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Zac Medico" <zmedico@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/dbapi/, pym/_emerge/
Date: Sat, 24 Nov 2012 21:57:12 +0000 (UTC)	[thread overview]
Message-ID: <1353794211.abd18694835b9f8a5a515f9c6333a754703a0462.zmedico@gentoo> (raw)

commit:     abd18694835b9f8a5a515f9c6333a754703a0462
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sat Nov 24 21:56:51 2012 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sat Nov 24 21:56:51 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=abd18694

depgraph: split out similar_name_search func

This will allow the code to be re-used for bug #444596. Copyright
begins in 2011 since that's when the code for this feature was first
added in commit aa78cc8da18015b7d1e4eec277b5a7f940fe357c.

---
 pym/_emerge/depgraph.py                   |   50 +++-----------------------
 pym/portage/dbapi/_similar_name_search.py |   57 +++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 45 deletions(-)

diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index c97aa02..365fbf8 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -3,7 +3,6 @@
 
 from __future__ import print_function
 
-import difflib
 import errno
 import io
 import logging
@@ -19,6 +18,7 @@ from portage import _unicode_decode, _unicode_encode, _encodings
 from portage.const import PORTAGE_PACKAGE_ATOM, USER_CONFIG_PATH
 from portage.dbapi import dbapi
 from portage.dbapi.dep_expand import dep_expand
+from portage.dbapi._similar_name_search import similar_name_search
 from portage.dep import Atom, best_match_to_list, extract_affecting_use, \
 	check_required_use, human_readable_required_use, match_from_list, \
 	_repo_separator
@@ -3678,57 +3678,17 @@ class depgraph(object):
 				not cp_exists and \
 				self._frozen_config.myopts.get(
 				"--misspell-suggestions", "y") != "n":
-				cp = myparent.atom.cp.lower()
-				cat, pkg = portage.catsplit(cp)
-				if cat == "null":
-					cat = None
 
 				writemsg("\nemerge: searching for similar names..."
 					, noiselevel=-1)
 
-				all_cp = set()
-				all_cp.update(vardb.cp_all())
+				dbs = [vardb]
 				if "--usepkgonly" not in self._frozen_config.myopts:
-					all_cp.update(portdb.cp_all())
+					dbs.append(portdb)
 				if "--usepkg" in self._frozen_config.myopts:
-					all_cp.update(bindb.cp_all())
-				# discard dir containing no ebuilds
-				all_cp.discard(cp)
+					dbs.append(bindb)
 
-				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, all_cp)
-				else:
-					pkg_to_cp = {}
-					for other_cp in list(all_cp):
-						other_pkg = portage.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 portage.catsplit(cp_orig)[1] != \
-									portage.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])
-				matches = matches_orig_case
+				matches = similar_name_search(dbs, atom)
 
 				if len(matches) == 1:
 					writemsg("\nemerge: Maybe you meant " + matches[0] + "?\n"

diff --git a/pym/portage/dbapi/_similar_name_search.py b/pym/portage/dbapi/_similar_name_search.py
new file mode 100644
index 0000000..d569fbf
--- /dev/null
+++ b/pym/portage/dbapi/_similar_name_search.py
@@ -0,0 +1,57 @@
+# 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 = atom.cp.lower()
+	cat, pkg = catsplit(cp)
+	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(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, 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


             reply	other threads:[~2012-11-24 21:57 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-24 21:57 Zac Medico [this message]
  -- strict thread matches above, loose matches on Subject: below --
2017-04-03 20:03 [gentoo-commits] proj/portage:master commit in: pym/portage/dbapi/, pym/_emerge/ Zac Medico
2015-08-30 23:44 Zac Medico
2014-11-20  4:08 Zac Medico
2014-02-24  9:23 Alexander Berntsen
2013-03-13  5:56 Zac Medico
2013-01-23 16:19 Zac Medico
2013-01-05 15:20 Zac Medico
2012-12-23  5:33 Arfrever Frehtes Taifersar Arahesis
2012-04-22 18:57 Zac Medico
2012-04-21  6:51 Zac Medico
2012-02-17 22:19 Zac Medico
2012-02-16  0:33 Zac Medico
2012-02-14 23:40 Zac Medico
2012-02-10  1:28 Zac Medico
2012-02-08  1:16 Zac Medico
2012-02-08  0:36 Zac Medico
2011-10-28  2:34 Zac Medico
2011-10-16 20:26 Zac Medico
2011-10-15  5:10 Zac Medico
2011-06-03 10:16 Zac Medico
2011-05-24  5:31 Zac Medico
2011-05-24  0:33 Zac Medico
2011-05-09  5:16 Zac Medico
2011-03-26  7:39 Zac Medico
2011-03-26  3:24 Zac Medico
2011-03-25  4:34 Zac Medico
2011-03-25  4:34 Zac Medico
2011-03-25  4:34 Zac Medico

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1353794211.abd18694835b9f8a5a515f9c6333a754703a0462.zmedico@gentoo \
    --to=zmedico@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox