summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Dibb <beandog@gentoo.org>2009-12-15 20:49:23 +0000
committerSteve Dibb <beandog@gentoo.org>2009-12-15 20:49:23 +0000
commit02b91d354e1b212418d8c512592d34e723b6126a (patch)
tree887d9abffba7b826696820d3d91bcc0df15a60d0
parentinitial commit (diff)
downloadznurt-org-backend-02b91d354e1b212418d8c512592d34e723b6126a.tar.gz
znurt-org-backend-02b91d354e1b212418d8c512592d34e723b6126a.tar.bz2
znurt-org-backend-02b91d354e1b212418d8c512592d34e723b6126a.zip
git-svn-id: file:///var/svn/portage@2 3218660a-b0cf-4799-a991-8ddcc5b9e0f3
-rw-r--r--class.portage.atom.php67
-rw-r--r--class.portage.category.php54
-rw-r--r--class.portage.ebuild.php494
-rw-r--r--class.portage.license.php45
-rw-r--r--class.portage.package.changelog.php65
-rw-r--r--class.portage.package.mask.php38
-rw-r--r--class.portage.package.php150
-rw-r--r--class.portage.tree.php154
-rw-r--r--class.portage.use_flag.php38
9 files changed, 1105 insertions, 0 deletions
diff --git a/class.portage.atom.php b/class.portage.atom.php
new file mode 100644
index 0000000..8062d0d
--- /dev/null
+++ b/class.portage.atom.php
@@ -0,0 +1,67 @@
+<?
+
+ class PortageAtom extends PortageEbuild {
+
+ // Ranges
+ private $gt; // greater than >
+ private $lt; // lesser than <
+ private $eq; // equals =
+ private $ar; // any revision ~
+ private $av; // any version *
+
+ private $arr_chars;
+ private $arr_ranges;
+
+ public $ebuild_atom;
+
+ function __construct($str) {
+
+ $this->gt = false;
+ $this->lt = false;
+ $this->eq = false;
+ $this->ar = false;
+ $this->av = false;
+
+ // Find the ranges
+ if($str[0] == '>')
+ $this->gt = true;
+
+ if($str[0] == '<')
+ $this->lt = true;
+
+ if($str[0] == '=' || $str[1] == '=')
+ $this->eq = true;
+
+ if($str[0] == '~')
+ $this->ar = true;
+
+ $end = $str[strlen($str) - 1];
+
+ if($end == '*')
+ $this->av = true;
+
+ $this->arr_chars = array('>', '<', '=', '~', '*');
+
+ foreach($this->arr_chars as $char)
+ $str = str_replace($char, '', $str);
+
+ $this->arr_ranges = array('gt', 'lt', 'eq', 'ar', 'av');
+
+ $this->ebuild_atom = $str;
+
+
+ parent::__construct($this->ebuild_atom);
+
+ }
+
+ function __get($str) {
+
+ if(in_array($str, $this->arr_ranges))
+ return $this->$str;
+ else
+ return parent::__get($str);
+ }
+
+ }
+
+?> \ No newline at end of file
diff --git a/class.portage.category.php b/class.portage.category.php
new file mode 100644
index 0000000..5f4c193
--- /dev/null
+++ b/class.portage.category.php
@@ -0,0 +1,54 @@
+<?
+
+ class PortageCategory extends PortageTree {
+
+ private $name;
+ protected $dir;
+
+ function __construct($str = null) {
+
+ parent::__construct();
+
+ if($str)
+ $this->setCategory($str);
+
+ }
+
+ public function __get($var) {
+ return $this->$var;
+ }
+
+ public function __toString() {
+ return $this->name;
+ }
+
+ protected function setCategory($str) {
+
+ $str = basename($str);
+ $dir = $this->getTree()."/".$str;
+
+ if(is_dir($dir)) {
+ $this->name = $str;
+ $this->dir = $dir;
+
+ $scandir = scandir($this->dir);
+ $scandir = preg_grep('/^\.{1,2}$/', $scandir, PREG_GREP_INVERT);
+
+ foreach($scandir as $name)
+ if(is_dir($this->dir."/".$name))
+ $arr[] = $name;
+
+ sort($arr);
+
+ $this->arr_packages = $arr;
+
+ }
+
+ }
+
+ public function getPackages() {
+ return $this->arr_packages;
+ }
+
+ }
+?> \ No newline at end of file
diff --git a/class.portage.ebuild.php b/class.portage.ebuild.php
new file mode 100644
index 0000000..d96f46a
--- /dev/null
+++ b/class.portage.ebuild.php
@@ -0,0 +1,494 @@
+<?
+
+ /**
+ * Notes on the standard
+ *
+ * =foo-bar/baz_2-1.2.3_alpha0
+ *
+ * Package names (baz_2), if they end in a number, will never stop on that
+ * number with a dash (-2 vs _2). So, you can always infer that the
+ * version will start with the first dash and integer. (-1.2.3..)
+ */
+
+ class PortageEbuild {
+
+ // Versioning
+ private $version;
+ private $_alpha;
+ private $_beta;
+ private $_pre;
+ private $_rc;
+ private $_p;
+
+ private $atom;
+ private $slot;
+
+ // Ebuild Variables
+ // P = package (vim)
+ // V = version + suffix (6.3_beta3)
+ // R = revision (r1)
+
+ // PV
+ private $p; // Package name and version (excluding revision, if any), for example vim-6.3_beta3.
+ // PVR
+ private $pf; // Full package name, ${PN}-${PVR}, for example vim-6.3_beta3-r1.
+ // P
+ private $pn; // Package name, for example vim.
+ // R
+ private $pr; // Package revision, or 0 if no revision exists.
+ // V
+ /** Confirmed, this includes any suffices (beta, alpha, rc, etc.) */
+ private $pv; // Package version (excluding revision, if any), for example 6.3_beta3.
+ // VR
+ private $pvr; // Package version and revision (if any), for example 6.3_beta3, 6.3_beta3-r1.
+
+ // File properties
+ private $filename;
+ private $mtime;
+
+ private $category;
+
+ private $arr_metadata;
+ private $arr_metadata_keys;
+ private $arr_versions;
+ public $arr_components;
+ private $has_version;
+
+ function __construct($str) {
+
+ $this->atom = trim($str);
+ $this->arr_suffix = array('alpha', 'beta', 'rc', 'pre', 'p');
+ $this->portage = '/usr/portage';
+ $this->cache = $this->portage.'/metadata/cache';
+
+ $this->has_version = $this->hasVersion();
+
+ $this->filename = $this->portage."/".$this->getCategory()."/".$this->getPackageName()."/".$this->getFullPackageName().".ebuild";
+
+ $this->filename_cache = $this->cache."/".$this->getCategory()."/".$this->getFullPackageName();
+
+
+ $this->arr_metadata_keys = array('depend', 'rdepend', 'slot', 'src_uri', 'restrict', 'homepage', 'license', 'description', 'keywords', 'inherited', 'iuse', 'cdepend', 'pdepend', 'provide', 'eapi', 'properties', 'defined_phases');
+
+
+
+ // Run this first to check if it has a version or not
+// $this->getPackageName();
+
+ }
+
+ public function __get($var) {
+
+ if(is_null($this->$var)) {
+
+ if(in_array($var, $this->arr_metadata_keys)) {
+
+ if(is_null($this->arr_metadata))
+ $this->arr_metadata = $this->metadata();
+ return $this->arr_metadata[$var];
+ }
+
+ switch($var) {
+
+ // Suffixes
+ case 'version':
+ case '_alpha':
+ case '_beta':
+ case '_pre':
+ case '_rc':
+ case '_p':
+ return $this->getSuffix($var);
+
+ // 'r' is the only one that could
+ // get a bit confusing, since there's so many
+ // other ways to get these.
+ // 'pr' is the correct way, since portage
+ // has a stored variable for it.
+ case 'pr':
+ case 'r':
+ case '_r':
+ case 'revision':
+ return $this->getSuffix('pr');
+ break;
+
+ // Other
+ case 'category':
+ return $this->getCategory();
+ break;
+
+ case 'slot':
+ return $this->getSlot();
+ break;
+
+ // Ebuild Variables
+ case 'p':
+ return $this->getPackageNameAndVersionMinusRevision();
+ break;
+
+ case 'pn':
+ case 'package':
+ return $this->getPackageName();
+ break;
+
+ case 'pf':
+ return $this->getFullPackageName();
+ break;
+
+ case 'pv':
+ return $this->getPackageVersionMinusRevision();
+ break;
+
+ case 'pvr':
+ return $this->getPackageVersionAndRevision();
+ break;
+
+ case 'mtime':
+ return $this->getMtime();
+ break;
+
+ case 'filename':
+ return $this->filename;
+ break;
+
+ }
+
+ }
+
+ return $this->$var;
+ }
+
+ /**
+ * Gather information about the ebuild
+ * from the metadata cache
+ *
+ * Line item reference:
+ *
+ * 0. DEPEND
+ * 1. RDEPEND
+ * 2. SLOT
+ * 3. SRC_URI
+ * 4. RESTRICT
+ * 5. HOMEPAGE
+ * 6. LICENSE
+ * 7. DESCRIPTION
+ * 8. KEYWORDS
+ * 9. INHERITED (eclasses)
+ * 10. IUSE
+ * 11. CDEPEND (always empty)
+ * 12. PDEPEND
+ * 13. PROVIDE
+ * 14. EAPI
+ * 15. PROPERTIES
+ * 16. DEFINED_PHASES (functions called)
+ * 17. - 21. unused
+ *
+ */
+ function metadata() {
+
+ if(!is_null($this->arr_metadata))
+ return $this->arr_metadata;
+
+ if(!file_exists($this->filename))
+ return array();
+
+ $file = file($this->filename_cache, FILE_IGNORE_NEW_LINES);
+
+ // Kill off the empty lines
+ $arr = array_slice($file, 0, 17, true);
+
+ $arr = array_combine($this->arr_metadata_keys, $arr);
+
+ return $arr;
+
+ }
+
+
+ function getCategory() {
+
+ $var = 'category';
+
+ $arr = explode("/", $this->atom);
+
+ if(!count($arr) || count($arr) == 1)
+ $this->$var = null;
+ else {
+
+ // Old code from another class, for reference
+// $atom = preg_replace('/^!?[><]?=?~?/', '', $atom);
+// $tmp = explode('/', $atom);
+
+ $str = current($arr);
+// $str = preg_replace("/[^a-z_-]/", "", $str);
+ $this->$var = $str;
+ }
+
+ return $this->$var;
+
+ }
+
+ function getFullPackageName() {
+
+ $var = 'pf';
+
+ if($this->has_version)
+ return $this->$var = $this->getPackageName()."-".$this->getPackageVersionAndRevision();
+ else
+ return "";
+
+ }
+
+ function getMajorVersion() {
+ $this->getComponents();
+ $arr = explode(".", $this->version);
+ return $arr[0];
+ }
+
+ function getMinorVersion() {
+ $this->getComponents();
+ $arr = explode(".", $this->version);
+ return $arr[1];
+ }
+
+ function getPackageName() {
+
+// $var = 'pn';
+//
+// $str = $this->stripCategory();
+// $str = $this->stripSlot($str);
+//
+// // Will only return the package name
+// $pattern = '/\-\d+((\.?\d+)+)?([A-Za-z]+)?((_(alpha|beta|pre|rc|p)\d*)+)?(\-r\d+)?(\:.+)?$/';
+// $arr = preg_split($pattern, $str);
+//
+// // Check to see if it has a version or not (p.mask)
+// if(count($arr) == 1)
+// $this->has_version = false;
+//
+// $this->$var = $arr[0];
+//
+// return $this->$var;
+
+
+ return $this->pn;
+
+ }
+
+ function getPackageNameAndVersionMinusRevision() {
+
+ $arr = $this->getComponents();
+
+ return $this->p = $this->getPackageName."-".$arr['pv'];
+ }
+
+ function getPackageVersionMinusRevision() {
+
+ $var = 'pv';
+
+ if(!$this->has_version)
+ return $this->$var = "";
+
+ $arr = $this->getComponents();
+
+ $str = $arr['version'];
+
+ foreach($this->arr_suffix as $tmp) {
+
+ if(!is_null($arr[$tmp])) {
+
+ // Can't use empty, since it will break on
+ // _suffix0
+ if(strlen($arr[$tmp]) == 0)
+ $str .= "_$tmp";
+ else
+ $str .= "_$tmp".$arr[$tmp];
+ }
+ }
+
+ return $this->$var = $str;
+
+ }
+
+ function getPackageVersionAndRevision() {
+
+ $var = 'pvr';
+
+ if(!$this->has_version)
+ return $this->$var = "";
+
+ $arr = $this->getComponents();
+
+ $str = $this->getPackageVersionMinusRevision();
+
+ if($arr['r'])
+ $str .= "-r".$arr['r'];
+ return $this->$var = $str;
+ }
+
+ function getSlot() {
+
+ $var = 'slot';
+
+ if(strpos($this->atom, ':') > 0) {
+ $str = end(explode(':', $this->atom));
+ }
+ else
+ $str = 0;
+
+ $this->$var = $str;
+
+ return $this->$var;
+
+ }
+
+ // This could really use a better name.
+ function getSuffix($var) {
+
+ if(in_array($var, array('_alpha', '_beta', '_pre', '_rc', '_p', 'pr', 'version'))) {
+ $arr = $this->getComponents();
+ if($var[0] == "_")
+ $str = str_replace("_", "", $var);
+ return $this->$var = $arr[$str];
+ }
+
+ }
+
+ /**
+ * Simplified way to get specific version information
+ */
+ function getComponents() {
+
+ $arr_components = array();
+
+ if(count($this->arr_components)) {
+ return $this->arr_components;
+ }
+
+ if(!$this->has_version)
+ return array('version' => '', 'pv' => '');
+
+ $str = $this->stripPackage($str);
+
+ $arr = explode("-", $str);
+
+ // We might be done at this point, depending on
+ // the details of the atom passed in.
+ if(!count($arr))
+ return $this->arr_components = $arr_components;
+
+ $arr_components['pv'] = array_shift($arr);
+
+ // Have the exploded one first so the version is the first value
+ $arr = array_merge(explode("_", $arr_components['pv']), $arr);
+
+ // This format of the version isn't used in portage anywhere,
+ // but it could be useful for package.masks or something
+ // similar. It's basically the version without any of the
+ // suffices. (vim-6.3_beta3 => 6.3)
+ $arr_components['version'] = $this->version = array_shift($arr);
+
+ // See if we have more
+ if(count($arr)) {
+
+ foreach($arr as $str) {
+
+ // Each value is returned as a trimmed string *if* it
+ // can find that there is a suffix version of it. The
+ // reason for this is because there are three possible
+ // outcomes: the value is not set (null), it is set, but
+ // there is no number (empty string), or it has a value
+ // (integer).
+
+ if(substr($str, 0, 5) == "alpha")
+ $arr_components['alpha'] = $this->_alpha = trim(substr($str, 5));
+ elseif(substr($str, 0, 4) == "beta")
+ $arr_components['beta'] = $this->_beta = trim(substr($str, 4));
+ elseif(substr($str, 0, 3) == "pre")
+ $arr_components['pre'] = $this->_pre = trim(substr($str, 3));
+ elseif(substr($str, 0, 2) == "rc")
+ $arr_components['rc'] = $this->_rc = trim(substr($str, 2));
+ // Shouldn't need the extra checks for pre/rc since the
+ // whole thing is going to look at each string once, and
+ // in order .. but weirder things have happened. More
+ // checks never hurt.
+ elseif($str[0] == "p" && !(substr($str, 0, 3) == "pre"))
+ $arr_components['p'] = $this->_p = trim(substr($str, 1));
+ elseif($str[0] == "r" && !(substr($str, 0, 2) == "rc"))
+ $arr_components['r'] = $this->pr = trim(substr($str, 1));
+
+ }
+ }
+
+ return $this->arr_components = $arr_components;
+
+ }
+
+ function hasVersion() {
+
+ $str = $this->stripCategory();
+ $str = $this->stripSlot($str);
+
+ // Same pattern as in getPackageName()
+ $pattern = '/\-\d+((\.?\d+)+)?([A-Za-z]+)?((_(alpha|beta|pre|rc|p)\d*)+)?(\-r\d+)?(\:.+)?$/';
+ $arr = preg_split($pattern, $str);
+
+ $this->pn = $arr[0];
+
+ // Check to see if it has a version or not (p.mask)
+ if(count($arr) == 1) {
+ $this->version = "";
+ $this->pf = "";
+ $this->pv = "";
+ $this->pvr = "";
+ return false;
+ } else
+ return true;
+
+ }
+
+ function stripCategory() {
+
+ if(strpos($this->atom, '/') > 0) {
+ $arr = explode("/", $this->atom);
+
+ if(count($arr) > 1) {
+ $str = $arr[1];
+ }
+
+ return $str;
+ } else {
+ return $this->atom;
+ }
+ }
+
+ function stripPackage($str) {
+
+ $str = $this->stripCategory();
+ $str = $this->stripSlot($str);
+ $str = str_replace($this->getPackageName()."-", "", $str);
+ return $str;
+
+ }
+
+ function stripSlot($str) {
+
+ if(!is_null($this->getSlot())) {
+ $str = str_replace(":".$this->getSlot(), "", $str);
+ } else
+ $str =& $this->atom;
+
+ return $str;
+
+ }
+
+ function getMtime() {
+
+ if(file_exists($this->filename))
+ return filemtime($this->filename);
+ else
+ return null;
+
+ }
+
+ }
+
+?> \ No newline at end of file
diff --git a/class.portage.license.php b/class.portage.license.php
new file mode 100644
index 0000000..f269181
--- /dev/null
+++ b/class.portage.license.php
@@ -0,0 +1,45 @@
+<?
+
+ class PortageLicense extends PortageTree {
+
+ private $name;
+ private $pdf;
+
+ function __construct($license = null) {
+
+ parent::__construct();
+
+ if($license)
+ $this->setLicense($license);
+
+ }
+
+ public function setLicense($str) {
+
+ $str = basename($str);
+
+ if(file_exists($this->getTree()."/licenses/$str")) {
+
+ if(substr($str, -4, 4) == ".pdf") {
+ $this->name = basename($str, ".pdf");
+ $this->pdf = true;
+ } else {
+ $this->name = $str;
+ $this->pdf = false;
+ }
+
+ }
+
+ }
+
+ public function getName() {
+ return $this->name;
+ }
+
+ public function isPDF() {
+ return $this->pdf;
+ }
+
+
+ }
+?> \ No newline at end of file
diff --git a/class.portage.package.changelog.php b/class.portage.package.changelog.php
new file mode 100644
index 0000000..bdadbb5
--- /dev/null
+++ b/class.portage.package.changelog.php
@@ -0,0 +1,65 @@
+<?
+
+ class PackageChangelog {
+
+ private $recent_changes;
+ public $recent_date;
+
+ function __construct($str, $date = null) {
+
+ $this->changelog = $str;
+
+ if(!is_null($date))
+ $this->date = $date;
+
+ }
+
+
+ function getRecentChanges() {
+
+ $pattern_date = "/^\d{1,2}\s\w{3}\s\d{4}/";
+// $pattern_dev = "/<\w+@gentoo\.org>/";
+
+ $arr = explode("\n", $this->changelog);
+// print_r($arr);
+
+ // Cut off the header
+ $arr = array_slice($arr, 4);
+
+ // Get the date of the latest changes
+ $str = trim($arr[0]);
+
+ preg_match_all($pattern_date, $str, $matches);
+ $this->recent_date = $date = current(current($matches));
+
+ $start = false;
+
+ $recent_changes = "";
+
+ foreach($arr as $str) {
+
+ $first_char = substr($str, 0, 1);
+ $last_char = substr($str, -1, 1);
+
+ if(($first_char == "*" || empty($str)) && $start) {
+ break;
+ }
+
+ if($start) {
+ $recent_changes .= " ".trim($str);
+ }
+
+ if($last_char == ":") {
+ $start = true;
+ }
+
+ }
+
+ return $recent_changes;
+
+ }
+
+
+ }
+
+?> \ No newline at end of file
diff --git a/class.portage.package.mask.php b/class.portage.package.mask.php
new file mode 100644
index 0000000..88936cb
--- /dev/null
+++ b/class.portage.package.mask.php
@@ -0,0 +1,38 @@
+<?
+
+ class PackageMask extends PortageTree {
+
+
+ private $filename;
+
+ function __construct($profile = 'portage') {
+
+ parent::__construct();
+
+ switch($profile) {
+
+ case 'portage':
+ $filename = 'package.mask';
+ break;
+
+ }
+
+ $this->filename = $this->getTree()."/profiles/$filename";
+
+ }
+
+ function getMaskedPackages() {
+
+ $arr = file($this->filename, FILE_IGNORE_NEW_LINES);
+
+ $arr = preg_grep("/(^#|^$)/", $arr, PREG_GREP_INVERT);
+
+ sort($arr);
+
+ return $arr;
+
+ }
+
+ }
+
+?> \ No newline at end of file
diff --git a/class.portage.package.php b/class.portage.package.php
new file mode 100644
index 0000000..c974949
--- /dev/null
+++ b/class.portage.package.php
@@ -0,0 +1,150 @@
+<?
+
+ class PortagePackage extends PortageCategory {
+
+ private $name;
+ private $changelog;
+ private $arr_ebuilds;
+ private $arr_herds;
+ private $arr_maintainers;
+
+ private $changelog_filename;
+
+ private $metadata_filename;
+ private $metadata_xml;
+
+ function __construct($category = null, $package = null) {
+
+ parent::__construct();
+
+ if($category && $package)
+ $this->setPackage($category, $package);
+
+ }
+
+ public function __get($var) {
+ return $this->$var;
+ }
+
+ public function __toString() {
+ return $this->name;
+ }
+
+ private function setPackage($category, $package) {
+
+ parent::setCategory($category);
+
+ $package = basename($package);
+ $dir = $this->dir."/".$package;
+
+ if(is_dir($dir)) {
+ $this->name = $package;
+
+ $scandir = scandir($dir);
+ $arr = preg_grep('/\.ebuild$/', $scandir);
+ $arr = preg_replace("/\.ebuild$/", "", $arr);
+
+ sort($arr);
+
+ $this->arr_ebuilds = $arr;
+
+ }
+
+ if(file_exists("$dir/metadata.xml")) {
+ $this->metadata_filename = "$dir/metadata.xml";
+ $this->metadata_xml = simplexml_load_file($this->metadata_filename);
+ }
+
+ if(file_exists("$dir/ChangeLog")) {
+ $this->changelog_filename = "$dir/ChangeLog";
+ $str = file_get_contents($this->changelog_filename);
+ $str = trim($str);
+ $this->changelog = $str;
+ }
+
+ }
+
+ public function getCategory() {
+ return parent::getName();
+ }
+
+ public function getEbuilds() {
+ return $this->arr_ebuilds;
+ }
+
+ public function getHerds() {
+
+ $arr = array();
+
+ if(!$this->metadata_filename)
+ return $arr;
+
+ if(!$this->metadata_xml)
+ $this->metadata_xml = simplexml_load_file($this->metadata_filename);
+
+ if($this->metadata_xml->herd) {
+ foreach($this->metadata_xml->herd as $name) {
+ $arr[] = (string)$name;
+ }
+ }
+
+ sort($arr);
+
+ return $arr;
+
+ }
+
+ public function getMaintainers() {
+
+ $arr = array();
+
+ if(!$this->metadata_filename)
+ return $arr;
+
+ if(!$this->metadata_xml)
+ $this->metadata_xml = simplexml_load_file($this->metadata_filename);
+
+ if($this->metadata_xml->maintainer) {
+ $x = 0;
+ foreach($this->metadata_xml->maintainer as $maintainer) {
+ if($maintainer->name)
+ $arr[$x]['name'] = (string)$maintainer->name;
+ if($maintainer->email)
+ $arr[$x]['email'] = (string)$maintainer->email;
+ $x++;
+ }
+ }
+
+ return $arr;
+
+ }
+
+ public function getUseFlags() {
+
+ $arr = array();
+
+ if(!$this->metadata_filename)
+ return $arr;
+
+ if(!$this->metadata_xml)
+ $this->metadata_xml = simplexml_load_file($this->metadata_filename);
+
+ // Getting attributes is always a pain
+ // http://us.php.net/manual/en/function.simplexml-element-attributes.php
+ if($this->metadata_xml->use) {
+ foreach($this->metadata_xml->use->flag as $flag) {
+ foreach($flag->attributes() as $key => $name) {
+ if($key == 'name') {
+ $name = (string)$name;
+ $arr[$name] = (string)$flag;
+ }
+ }
+ }
+ }
+ ksort($arr);
+ return $arr;
+
+ }
+
+ }
+?> \ No newline at end of file
diff --git a/class.portage.tree.php b/class.portage.tree.php
new file mode 100644
index 0000000..4cb17da
--- /dev/null
+++ b/class.portage.tree.php
@@ -0,0 +1,154 @@
+<?
+
+ class PortageTree {
+
+ // Strings
+ protected $tree;
+
+ // Arrays
+ protected $arr_licenses;
+
+ function __construct($tree = "/usr/portage") {
+ if($tree)
+ $this->setTree($tree);
+ }
+
+ function getTree() {
+ return $this->tree;
+ }
+
+ function setTree($x) {
+ if(is_string($x) && is_dir($x))
+ $this->tree = $x;
+ }
+
+ function getArches($prefix = false) {
+
+ $filename = $this->getTree().'/profiles/arch.list';
+ $arr = file($filename, FILE_IGNORE_NEW_LINES);
+
+ $barrier = key(preg_grep("/^\s*$/", $arr));
+
+ if($prefix) {
+ $arr = array_slice($arr, $barrier);
+ } else {
+ $arr = array_slice($arr, 0, $barrier);
+ }
+
+ $arr = preg_grep('/^[a-z]/', $arr);
+ sort($arr);
+
+ foreach($arr as $value) {
+ $arches[] = $value;
+ }
+
+ return $arches;
+
+ }
+
+ public function getCategories() {
+
+ $filename = $this->getTree().'/profiles/categories';
+ $arr = file($filename, FILE_IGNORE_NEW_LINES);
+
+ $arr = preg_grep('/^[a-z]/', $arr);
+ sort($arr);
+
+ foreach($arr as $value) {
+ $categories[] = $value;
+ }
+
+ return $categories;
+
+ }
+
+ public function getEclasses() {
+
+ $scandir = scandir($this->getTree().'/eclass/');
+
+ $scandir = preg_grep('/\.eclass$/', $scandir);
+ sort($scandir);
+ foreach($scandir as $filename) {
+ $filename = preg_replace("/\.eclass$/", "", $filename);
+ $arr[] = $filename;
+ }
+
+ $this->arr_eclasses = $arr;
+
+ return $arr;
+
+ }
+
+ function getLicenses() {
+
+ $scandir = scandir($this->getTree().'/licenses/');
+ $scandir = preg_grep('/^\.{1,2}$/', $scandir, PREG_GREP_INVERT);
+ sort($scandir);
+ foreach($scandir as $filename) {
+ $arr[] = $filename;
+ }
+
+ $this->arr_licenses = $arr;
+
+ return $arr;
+
+ }
+
+ /** Use Flags **/
+
+ /**
+ * Get the use flags for any file w/use flags
+ *
+ * @param filename filename of use flags
+ * @return array
+ */
+ protected function arrUseFlags($filename) {
+
+ $arr_file = file($filename, FILE_IGNORE_NEW_LINES);
+
+ $arr_file = preg_grep('/^.+\s+\-\s+/', $arr_file);
+
+ sort($arr_file);
+
+ foreach($arr_file as $str) {
+ $arr = explode(' - ', $str);
+ $desc = str_replace($arr[0].' - ', '', $str);
+ $arr_use_flags[$arr[0]] = $desc;
+ }
+
+ return $arr_use_flags;
+ }
+
+ /**
+ * Get the global use flags
+ *
+ */
+ public function getUseFlags() {
+ return array_keys($this->arrUseFlags($this->getTree()."/profiles/use.desc"));
+ }
+
+ /**
+ * Create an array of the current list of herds
+ *
+ * @return array
+ */
+ function getHerds() {
+
+ $arr = array();
+
+ $filename = $this->getTree().'/metadata/herds.xml';
+
+ if(file_exists($filename)) {
+ $obj_xml = simplexml_load_file($filename);
+
+ foreach($obj_xml->herd as $obj) {
+ $herd = (string)$obj->name;
+ $arr[] = $herd;
+ }
+ sort($arr);
+ }
+ return $arr;
+ }
+
+ }
+?> \ No newline at end of file
diff --git a/class.portage.use_flag.php b/class.portage.use_flag.php
new file mode 100644
index 0000000..9be0497
--- /dev/null
+++ b/class.portage.use_flag.php
@@ -0,0 +1,38 @@
+<?
+
+ class PortageUseFlag extends PortageTree {
+
+ private $name;
+ private $description;
+ private $global;
+ private $local;
+
+ private $arr_use_flags;
+
+ function __construct($str = null) {
+
+ parent::__construct();
+
+ $this->arr_use_flags = $this->arrUseFlags($this->getTree()."/profiles/use.desc");
+
+ if($str)
+ $this->setFlag($str);
+
+ }
+
+ private function setFlag($str) {
+ if($this->arr_use_flags[$str])
+ $this->name = $str;
+ }
+
+ public function getName() {
+ return $this->name;
+ }
+
+ public function getDescription() {
+ return $this->arr_use_flags[$this->getName()];
+ }
+
+
+ }
+?> \ No newline at end of file