query($sql); // Check to see if there are any ebuilds $sql = "SELECT COUNT(1) FROM ebuild WHERE status = 0;"; $count = $db->getOne($sql); // If there aren't any, then import *all* packages if(!$count) $all = true; else { // If there are, get the last modified time $sql = "SELECT MAX(mtime) FROM ebuild WHERE status = 0;"; $mtime = $db->getOne($sql); if(is_null($mtime)) $all = true; else { $x = time() - $mtime; $x = $x / 60; $mmin = intval($x) + 1; } } $tree = new PortageTree(); $categories = $tree->getCategories(); $arr_import = array(); // Find all the ebuilds that are currently in the db // FIXME rewrite to exclude update/delete statuses? $arr = $arr_db = array(); if(!$all) { // Find all the packages that have been updated in the last 24 hours // Need to check the packages themselves, because something may have // been deleted. $cache = $tree->getTree()."/metadata/cache/"; $exec = "find $cache -type f -mmin -$mmin"; $arr = shell::cmd($exec); if($verbose) { shell::msg($exec); shell::msg("(".count($arr).") new/updated ebuilds found since last sync."); } foreach($arr as $dir) { $atom = str_replace($tree->getTree()."/metadata/cache/", "", $dir); $e = new PortageEbuild($atom); $arr_import[$e->category][] = $e->pn; $arr_import[$e->category] = array_unique($arr_import[$e->category]); } ksort($arr_import); } elseif($all) { foreach($categories as $name) { $c = new PortageCategory($name); $arr_import[$name] = $c->getPackages(); } } if($debug || $all) { shell::msg("Checking ALL categories"); } elseif($verbose) { shell::msg("(".count($arr_import).") RECENTLY MODIFIED categories "); } // Get the package IDs for reference // and the mtimes of the ebuilds for verification $sql = "SELECT p.id AS package_id, c.name AS category_name, p.name AS package_name, e.pf AS ebuild_name, e.mtime, e.id AS ebuild FROM ebuild e RIGHT OUTER JOIN package p ON e.package = p.id INNER JOIN category c ON p.category = c.id ORDER BY c.name, p.name;"; $arr = $db->getAll($sql); if(count($arr)) { foreach($arr as $row) { extract($row); $arr_db[$category_name][$package_name] = $package_id; if($ebuild_name) { $arr_ebuild_ids[$category_name][$package_name][$ebuild_name] = $ebuild; } } } if(count($arr_import)) { foreach($arr_import as $category_name => $arr_category) { foreach($arr_category as $package_name) { // FIXME always snags the last few, so says they are // being updated even if they're not (to duplicate, delete // all ebuilds, and run this twice in a row). if($verbose) shell::msg("[$category_name/$package_name]"); $arr_insert = array(); $arr_delete = array(); if(count($arr_ebuild_ids[$category_name][$package_name])) $arr_db_ebuilds = array_keys($arr_ebuild_ids[$category_name][$package_name]); else $arr_db_ebuilds = array(); $obj_package = new PortagePackage($category_name, $package_name); $package_id =& $arr_db[$category_name][$package_name]; // If there are any old ebuilds (in the DB), then compare the new (in portage) if(count($arr_db_ebuilds)) { $arr_fs_ebuilds = $obj_package->getEbuilds(); // Check old against new $arr_delete = array_diff($arr_db_ebuilds, $arr_fs_ebuilds); $arr_insert = array_diff($arr_fs_ebuilds, $arr_db_ebuilds); // Next, look at the mtimes and see if any need to be updated if(count($arr_fs_ebuilds)) { foreach($arr_fs_ebuilds as $ebuild_name) { $obj_ebuild = new PortageEbuild("$category_name/$ebuild_name"); $ebuild = $arr_ebuild_ids[$category_name][$package_name][$ebuild_name]; if($ebuild) { $db_ebuild = new DBEbuild($ebuild); if($obj_ebuild->mtime != $db_ebuild->mtime || $obj_ebuild->ctime != $db_ebuild->ctime) { if($verbose) { shell::msg("[update] $category_name/$ebuild_name"); } // Flag as being updated $db_ebuild->status = 2; if($obj_ebuild->mtime != $db_ebuild->mtime) $db_ebuild->mtime = $obj_ebuild->mtime; if($obj_ebuild->ctime != $db_ebuild->ctime) $db_ebuild->ctime = $obj_ebuild->ctime; } } } } if(count($arr_delete)) { foreach($arr_delete as $ebuild_name) { if($verbose) shell::msg("[delete] $category_name/$ebuild_name"); $ebuild = $arr_ebuild_ids[$category_name][$package_name][$ebuild_name]; if($ebuild) { $db_ebuild = new DBEbuild($ebuild); $db_ebuild->status = 3; } } } } // Otherwise, insert all of them else { $arr_insert = $obj_package->getEbuilds(); } if(count($arr_insert)) { $arr_insert = array_unique($arr_insert); foreach($arr_insert as $ebuild_name) { if($verbose) shell::msg("[insert] $category_name/$ebuild_name"); $obj_ebuild = new PortageEbuild("$category_name/$ebuild_name"); $arr = array( 'package' => $package_id, 'pf' => $obj_ebuild->pf, 'pv' => $obj_ebuild->pv, 'pr' => $obj_ebuild->pr, 'pvr' => $obj_ebuild->pvr, 'alpha' => $obj_ebuild->_alpha, 'beta' => $obj_ebuild->_beta, 'pre' => $obj_ebuild->_pre, 'rc' => $obj_ebuild->_rc, 'p' => $obj_ebuild->_p, 'version' => $obj_ebuild->version, 'slot' => $obj_ebuild->slot, 'mtime' => $obj_ebuild->mtime, 'ctime' => $obj_ebuild->ctime, 'status' => 1, ); $db->autoExecute('ebuild', $arr, MDB2_AUTOQUERY_INSERT); } } } } } ?>