summaryrefslogtreecommitdiff
path: root/portato/backend/package.py
diff options
context:
space:
mode:
Diffstat (limited to 'portato/backend/package.py')
-rw-r--r--portato/backend/package.py114
1 files changed, 108 insertions, 6 deletions
diff --git a/portato/backend/package.py b/portato/backend/package.py
index 82e0b22..6e32776 100644
--- a/portato/backend/package.py
+++ b/portato/backend/package.py
@@ -15,12 +15,12 @@ from portato.helper import *
from portage_helper import *
import flags
-import portage, portage_dep, gentoolkit
+import portage, portage_dep
from portage_util import unique_array
import types
-class Package (gentoolkit.Package):
+class Package:
"""This is a subclass of the gentoolkit.Package-class which a lot of additional functionality we need in Portato."""
def __init__ (self, cpv):
@@ -29,14 +29,30 @@ class Package (gentoolkit.Package):
@param cpv: The cpv or gentoolkit.Package which describes the package to create.
@type cpv: string (cat/pkg-ver) or gentoolkit.Package-object."""
- if isinstance(cpv, gentoolkit.Package):
- cpv = cpv.get_cpv()
- gentoolkit.Package.__init__(self, cpv)
+ self._cpv = cpv
+ self._scpv = portage.catpkgsplit(self._cpv)
+
+ if not self._scpv:
+ raise FatalError("invalid cpv: %s" % cpv)
+ self._db = None
+ self._settings = settings
+ self._settingslock = settingslock
+
try:
- self._status = portage.getmaskingstatus(self.get_cpv(), settings = gentoolkit.settings)
+ self._status = portage.getmaskingstatus(self.get_cpv(), settings = settings)
except KeyError: # package is not located in the system
self._status = None
+ def is_installed(self):
+ """Returns true if this package is installed (merged)"""
+ self._initdb()
+ return os.path.exists(self._db.getpath())
+
+ def is_overlay(self):
+ """Returns true if the package is in an overlay."""
+ dir,ovl = portage.portdb.findname2(self._cpv)
+ return ovl != settings["PORTDIR"]
+
def is_in_system (self):
"""Returns False if the package could not be found in the portage system.
@@ -302,6 +318,10 @@ class Package (gentoolkit.Package):
return dep_pkgs
+ def get_cpv(self):
+ """Returns full Category/Package-Version string"""
+ return self._cpv
+
def get_cp (self):
"""Returns the cp-string.
@@ -310,6 +330,88 @@ class Package (gentoolkit.Package):
return self.get_category()+"/"+self.get_name()
+ def get_name(self):
+ """Returns base name of package, no category nor version"""
+ return self._scpv[1]
+
+ def get_version(self):
+ """Returns version of package, with revision number"""
+ v = self._scpv[2]
+ if self._scpv[3] != "r0":
+ v += "-" + self._scpv[3]
+ return v
+
+ def get_category(self):
+ """Returns category of package"""
+ return self._scpv[0]
+
+ def get_settings(self, key):
+ """Returns the value of the given key for this package (useful
+ for package.* files."""
+ self._settingslock.acquire()
+ self._settings.setcpv(self._cpv)
+ v = self._settings[key]
+ self._settingslock.release()
+ return v
+
+ def get_ebuild_path(self,in_vartree=0):
+ """Returns the complete path to the .ebuild file"""
+ if in_vartree:
+ return vartree.getebuildpath(self._cpv)
+ else:
+ return portage.portdb.findname(self._cpv)
+
+ def get_package_path(self):
+ """Returns the path to where the ChangeLog, Manifest, .ebuild files reside"""
+ p = self.get_ebuild_path()
+ sp = p.split("/")
+ if len(sp):
+ return string.join(sp[:-1],"/")
+
+ def get_env_var(self, var, tree=""):
+ """Returns one of the predefined env vars DEPEND, RDEPEND, SRC_URI,...."""
+ if tree == "":
+ mytree = vartree
+ if not self.is_installed():
+ mytree = porttree
+ else:
+ mytree = tree
+ r = mytree.dbapi.aux_get(self._cpv,[var])
+ if not r:
+ raise FatalError("Could not find the package tree")
+ if len(r) != 1:
+ raise FatalError("Should only get one element!")
+ return r[0]
+
+ def get_use_flags(self):
+ """Returns the USE flags active at time of installation"""
+ self._initdb()
+ if self.is_installed():
+ return self._db.getfile("USE")
+ return ""
+
+ def compare_version(self,other):
+ """Compares this package's version to another's CPV; returns -1, 0, 1"""
+ v1 = self._scpv
+ v2 = portage.catpkgsplit(other.get_cpv())
+ # if category is different
+ if v1[0] != v2[0]:
+ return cmp(v1[0],v2[0])
+ # if name is different
+ elif v1[1] != v2[1]:
+ return cmp(v1[1],v2[1])
+ # Compaare versions
+ else:
+ return portage.pkgcmp(v1[1:],v2[1:])
+
+ def _initdb(self):
+ """Internal helper function; loads package information from disk,
+ when necessary"""
+ if not self._db:
+ cat = self.get_category()
+ pnv = self.get_name()+"-"+self.get_version()
+ self._db = portage.dblink(cat,pnv,settings["ROOT"],settings)
+
def matches (self, criterion):
"""This checks, whether this package matches a specific verisioning criterion - e.g.: "<=net-im/foobar-1.2".