Return string from Package.__str__ (Bug 423209)
[gentoolkit.git] / pym / gentoolkit / package.py
index a4031a3a8ad93551d4731ebf2d8ae12cdf7e195e..cbb7131842b367ff464896fe73fedb74a282a611 100644 (file)
@@ -36,7 +36,7 @@ __all__ = (
 
 FORMAT_TMPL_VARS = (
        '$location', '$mask', '$mask2', '$cp', '$cpv', '$category', '$name',
-       '$version', '$revision', '$fullversion', '$slot', '$repo'
+       '$version', '$revision', '$fullversion', '$slot', '$repo', '$keywords'
 ) 
 
 # =======
@@ -47,7 +47,6 @@ import os
 from string import Template
 
 import portage
-from portage import settings
 from portage.util import LazyItemsDict
 
 import gentoolkit.pprinter as pp
@@ -56,6 +55,22 @@ from gentoolkit.cpv import CPV
 from gentoolkit.dbapi import PORTDB, VARDB
 from gentoolkit.keyword import determine_keyword
 from gentoolkit.flag import get_flags
+from gentoolkit.eprefix import EPREFIX
+
+# =======
+# Settings
+# =======
+
+if EPREFIX:
+       default_settings = portage.config(local_config=True, eprefix=EPREFIX)
+       default_settings.lock()
+       nolocal_settings = portage.config(local_config=False, eprefix=EPREFIX)
+       nolocal_settings.lock()
+else:
+       default_settings = portage.config(local_config=True)
+       default_settings.lock()
+       nolocal_settings = portage.config(local_config=False)
+       nolocal_settings.lock()
 
 # =======
 # Classes
@@ -64,7 +79,7 @@ from gentoolkit.flag import get_flags
 class Package(CPV):
        """Exposes the state of a given CPV."""
 
-       def __init__(self, cpv, validate=False):
+       def __init__(self, cpv, validate=False, local_config=True):
                if isinstance(cpv, CPV):
                        self.__dict__.update(cpv.__dict__)
                else:
@@ -76,6 +91,11 @@ class Package(CPV):
                        # CPV allows some things that Package must not
                        raise errors.GentoolkitInvalidPackage(self.cpv)
 
+               if local_config:
+                       self._settings = default_settings
+               else:
+                       self._settings = nolocal_settings
+
                # Set dynamically
                self._package_path = None
                self._dblink = None
@@ -93,7 +113,7 @@ class Package(CPV):
                return key in self.cpv
 
        def __str__(self):
-               return self.cpv
+               return str(self.cpv)
 
        @property
        def metadata(self):
@@ -123,8 +143,8 @@ class Package(CPV):
                        self._dblink = portage.dblink(
                                self.category,
                                "%s-%s" % (self.name, self.fullversion),
-                               settings["ROOT"],
-                               settings
+                               self._settings["ROOT"],
+                               self._settings
                        )
 
                return self._dblink
@@ -209,17 +229,16 @@ class Package(CPV):
 
                return bool(PORTDB.cpv_exists(self.cpv))
 
-       @staticmethod
-       def settings(key):
+       def settings(self, key):
                """Returns the value of the given key for this package (useful
                for package.* files."""
 
-               if settings.locked:
-                       settings.unlock()
+               if self._settings.locked:
+                       self._settings.unlock()
                try:
-                       result = settings[key]
+                       result = self._settings[key]
                finally:
-                       settings.lock()
+                       self._settings.lock()
                return result
 
        def mask_status(self):
@@ -234,11 +253,11 @@ class Package(CPV):
                        'missing keyword'
                """
 
-               if settings.locked:
-                       settings.unlock()
+               if self._settings.locked:
+                       self._settings.unlock()
                try:
                        result = portage.getmaskingstatus(self.cpv,
-                               settings=settings,
+                               settings=self._settings,
                                portdb=PORTDB)
                except KeyError:
                        # getmaskingstatus doesn't support packages without ebuilds in the
@@ -257,7 +276,7 @@ class Package(CPV):
 
                try:
                        result = portage.getmaskingreason(self.cpv,
-                               settings=settings,
+                               settings=self._settings,
                                portdb=PORTDB,
                                return_location=True)
                        if result is None:
@@ -372,7 +391,7 @@ class Package(CPV):
                if not ebuild:
                        return None
                if self._portdir_path is None:
-                       self._portdir_path = os.path.realpath(settings["PORTDIR"])
+                       self._portdir_path = os.path.realpath(self._settings["PORTDIR"])
                return (tree and tree != self._portdir_path)
 
        def is_masked(self):
@@ -470,6 +489,7 @@ class PackageFormatter(object):
                        "fullversion")
                fmt_vars.addLazySingleton("slot", self.format_slot)
                fmt_vars.addLazySingleton("repo", self.pkg.repo_name)
+               fmt_vars.addLazySingleton("keywords", self.format_keywords)
 
        def format_package_location(self):
                """Get the install status (in /var/db/?) and origin (from an overlay
@@ -570,5 +590,12 @@ class PackageFormatter(object):
                else:
                        return value
 
+       def format_keywords(self):
+               value = self.pkg.environment("KEYWORDS")
+               if self._do_format:
+                       return pp.keyword(value)
+               else:
+                       return value
+
 
 # vim: set ts=4 sw=4 tw=79: