New get_cpv_all() which returns a dictionary of tree:[cpv-list].  It can be limited by trees and categories input parameters.  It does not apply any masking.
Fix get_cp_list portage function call not keyword specifying the mytree parameter.
some whitespace cleanup.
diff --git a/pym/portage/api/data_connect.py b/pym/portage/api/data_connect.py
index cb41ce0..825cb45 100644
--- a/pym/portage/api/data_connect.py
+++ b/pym/portage/api/data_connect.py
@@ -302,7 +302,7 @@
     ebuild = settings.portdb[root].findname(cpv)
     pkgdir = os.path.dirname(ebuild)
     mf = manifest.Manifest(pkgdir, settings.settings["DISTDIR"])
-    iuse, final_use = get_flags(cpv, final_setting=True, 
+    iuse, final_use = get_flags(cpv, final_setting=True,
         root=root, settings=default_settings)
     #writemsg_level( "DATA_CONNECT: get_size; Attempting to get "
         #"fetchlist final use= " + str(final_use), level=logging.DEBUG)
@@ -355,7 +355,7 @@
     if settings.portdb[root].cpv_exists(cpv): # if in portage tree
         try:
             #writemsg_level(" * DATA_CONNECT: get_properties()", level=logging.DEBUG)
-            prop_dict = dict(zip(settings.keys, 
+            prop_dict = dict(zip(settings.keys,
                 settings.portdb[root].aux_get(cpv, portage.auxdbkeys)))
         except IOError as e: # Sync being performed may delete files
             writemsg_level(" * DATA_CONNECT: get_properties(): IOError: %s"
@@ -367,7 +367,7 @@
             #pass
     else:
         if settings.vardb[root].cpv_exists(cpv): # elif in installed pkg tree
-            prop_dict = dict(zip(settings.keys, 
+            prop_dict = dict(zip(settings.keys,
                 settings.vardb[root].aux_get(cpv, portage.auxdbkeys)))
     if want_dict:
         # return an empty dict instead of None
@@ -514,9 +514,9 @@
     """
     This returns a list of all keys in our tree or trees
     @param categories: optional list of categories to search or
-        defaults to settings.portdb.settings.categories
+        defaults to settings.portdb[root].settings.categories
     @param trees: optional list of trees to search the categories in or
-        defaults to settings.portdb.porttrees
+        defaults to settings.portdb[root].porttrees
     @param settings: optional portage config settings instance.
         defaults to portage.api.settings.default_settings
     @rtype list of [cat/pkg,...]
@@ -543,7 +543,36 @@
         defaults to portage.api.settings.default_settings
     """
     root, settings = ensure_settings(root, settings)
-    return settings.portdb[root].cp_list(cp, trees)
+    return settings.portdb[root].cp_list(cp, mytree=trees)
+
+
+def get_cpv_all(root=None, categories=None,
+        trees=None, settings=None):
+    """
+    This function returns all cpv's for a given tree or trees without
+    applying any repo priorities.  For a list of visible cpv's using proper
+    repo priorities and masking, use get_allnodes().
+    This returns a dictoinary of lists of all keys in our tree or trees
+    @param categories: optional list of categories to search or
+        defaults to settings.portdb[root].settings.categories
+    @param trees: optional list of trees to search the categories in or
+        defaults to settings.portdb[root].porttrees
+    @param settings: optional portage config settings instance.
+        defaults to portage.api.settings.default_settings
+    @rtype dict of lists of {tree:[cat/pkg-ver,...],}
+    """
+    root, settings = ensure_settings(root, settings)
+    if trees is None:
+        trees = settings.portdb[root].porttrees
+    cpvs = {}
+    for tree in trees:
+        cps = get_cp_all(root=root, categories=categories,
+            trees=[tree], settings=settings)
+        cpvs[tree] = []
+        for c_p in cps:
+            cpvs[tree].append(get_cp_list(root=root, cp=c_p,
+                trees=[tree], settings=settings))
+    return cpvs
 
 
 def findLicensePath(license_name, root=None, settings=None):