Arch = $arch; $this->Toolchain = $toolchain; } function ToString () { return ($this->Arch . '-' . $this->Toolchain); } var $Arch; var $Toolchain; } $archs = array ("x86", "x86_64"); // mark all current releases as being checked mysql_select_db ($dbname, $link); mysql_query ("UPDATE `release` SET status='checking' WHERE status='current'"); foreach ($repos as $repo) { $archtoolchains = array (); $spec = new DOMDocument (); $spec->load ($repo . 'specs/global.xml'); $toolchains = $spec->getElementsByTagName ('toolchain'); $toolchainsDone = array (); foreach ($toolchains as $toolchainElement) { if (!in_array ($toolchainElement->childNodes->item (0)->nodeValue, $toolchainsDone)) { foreach ($archs as $arch) { $archtoolchains[] = new ArchToolchain ($arch, $toolchainElement->childNodes->item (0)->nodeValue); } $toolchainsDone[] = $toolchainElement->childNodes->item (0)->nodeValue; } } $specsdir = dir ($repo . 'specs'); while ($specfile = $specsdir->read ()) { if (substr ($specfile, -4) != '.xml') continue; if (substr ($specfile, 0, 4) == 'tag-') continue; if (substr ($specfile, 0, 5) == 'arch-') continue; if ($specfile == 'global.xml') continue; $spec = new DOMDocument (); $spec->load ($repo . 'specs/' . $specfile); $package = $spec->getElementsByTagName ('package')->item (0)->getAttribute ('name'); $summary = $spec->getElementsByTagName ('description')->item (0)->childNodes->item (0)->nodeValue; mysql_select_db ($bugzilladbname, $link); $component = mysql_query ("SELECT 1 FROM components WHERE value='" . mysql_escape_string ($package) . "' && program='paldo'", $link); if (mysql_num_rows ($component) == 0) mysql_query ("INSERT INTO components VALUES ('" . mysql_escape_string ($package) . "', 'paldo', 4, 0, '" . mysql_escape_string ($summary) . "')", $link); mysql_select_db ($dbname, $link); $releases = $spec->getElementsByTagName ('release'); foreach ($releases as $releaseElement) { $tag = $releaseElement->getAttribute ('tag'); $version = $releaseElement->getAttribute ('version'); $revision = $releaseElement->getAttribute ('revision'); $branch = $releaseElement->getAttribute ('branch'); if ($branch != 'stable' && $branch != 'testing' && $branch != 'unstable' && $branch != 'experimental') continue; $release = mysql_query ("SELECT releaseid FROM `release` WHERE package='" . mysql_escape_string ($package) . "' && tag='" . mysql_escape_string ($tag) . "' && version='" . mysql_escape_string ($version) . "' && revision=$revision && branch='" . mysql_escape_string ($branch) . "'", $link); if (mysql_num_rows ($release) == 1) { $releaseid = mysql_fetch_object ($release)->releaseid; mysql_query ("UPDATE `release` SET status='current' WHERE releaseid=$releaseid"); mysql_query ("DELETE FROM dependency WHERE releaseid=$releaseid"); mysql_query ("DELETE FROM sourcefile WHERE releaseid=$releaseid"); } else if (mysql_num_rows ($release) == 0) { mysql_query ("INSERT INTO `release` VALUES (NULL, '" . mysql_escape_string ($package) . "', '" . mysql_escape_string ($summary) . "', '" . mysql_escape_string ($tag) . "', '" . mysql_escape_string ($version) . "', $revision, '" . mysql_escape_string ($branch) . "', 'current')", $link); $releaseid = mysql_insert_id ($link); } else { // throw exception } $deps = $releaseElement->getElementsByTagName ('dep'); foreach ($deps as $depElement) { $dep_package = $depElement->getAttribute ('name'); $dep_tag = $depElement->getAttribute ('tag'); mysql_query ("INSERT INTO dependency VALUES ($releaseid, '" . mysql_escape_string ($dep_package) . "', '" . mysql_escape_string ($dep_tag) . "')", $link); } $varkeys = array ("\$VERSION", "\$TAG"); $varvalues = array ($version, $tag); $variables = $releaseElement->getElementsByTagName ("variable"); foreach ($variables as $varElement) { $varkeys[] = "\$" . $varElement->getAttribute ("name"); $varvalues[] = $varElement->textContent; } $sourcefiles = array (); $archives = $releaseElement->getElementsByTagName ('archive'); foreach ($archives as $archiveElement) $sourcefiles[] = $archiveElement->getAttribute ('name') . ".tar.bz2"; $patches = $releaseElement->getElementsByTagName ('patch'); foreach ($patches as $patchElement) $sourcefiles[] = $patchElement->getAttribute ('name') . ".patch.bz2"; $installs = $releaseElement->getElementsByTagName ('install'); foreach ($installs as $installElement) $sourcefiles[] = $installElement->getAttribute ('name'); foreach ($sourcefiles as $sourcefile) mysql_query ("INSERT INTO sourcefile VALUES ($releaseid, '" . mysql_escape_string (str_replace ($varkeys, $varvalues, $sourcefile)) . "')", $link); $binaries = mysql_query ("SELECT arch, toolchain FROM `binary` WHERE releaseid=$releaseid", $link); $knownarchtoolchains = array (); while ($binary = mysql_fetch_object ($binaries)) { $knownarchtoolchains[] = $binary->arch . '-' . $binary->toolchain; } foreach ($archtoolchains as $archtoolchain) { if (in_array ($archtoolchain->ToString (), $knownarchtoolchains)) { unset ($knownarchtoolchains[array_search ($archtoolchain->ToString (), $knownarchtoolchains)]); continue; } $release = $package . (strlen ($tag) > 0 ? '-' . $tag : '') . '-' . $archtoolchain->ToString () . '-' . $version . '-' . $revision; $info = @file ($repo . 'state/info/' . $release . '.info'); if ($info) { $info_table = array (); foreach ($info as $info_line) { $info_array = explode (':', $info_line, 2); $info_table[trim ($info_array[0])] = trim ($info_array[1]); } $installedsize = (int) $info_table['Installed-Size']; if (isset ($info_table['Build-Time'])) $buildduration = (int) $info_table['Build-Time']; else $buildduration = (int) $info_table['Build-Duration']; if (isset ($info_table['Build-Date'])) $builddate = strtotime ($info_table['Build-Date']); else $builddate = 0; $buildhost = $info_table['Build-Host']; mysql_query ("INSERT INTO `binary` VALUES (NULL, $releaseid, '" . mysql_escape_string ($archtoolchain->Arch) . "', '" . mysql_escape_string ($archtoolchain->Toolchain) . "', $installedsize, $buildduration, $builddate, '" . mysql_escape_string ($buildhost) . "')", $link); $binaryid = mysql_insert_id (); $filelist = @bzopen ($repo . 'state/files/' . $release . '.digest.bz2', 'r'); if ($filelist) { while (!feof ($filelist)) { $line = explode (' ', fgets ($filelist), 2); if (count ($line) == 0 || strlen (trim ($line[1])) == 0) break; if (substr ($line[1], 0, 9) == '/usr/src/' || substr ($line[1], 0, 6) == '/stage' || substr ($line[1], 0, 6) == '/upkg/') continue; mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line[1]) . "', 'regular', '" . mysql_escape_string ($line[0]) . "')", $link); echo mysql_error (); } bzclose ($filelist); } $filelist = @bzopen ($repo . 'state/files/' . $release . '.links.bz2', 'r'); if ($filelist) { while (!feof ($filelist)) { $line = explode (' ', fgets ($filelist), 2); if (count ($line) == 0 || strlen (trim ($line[1])) == 0) break; if (substr ($line[1], 0, 9) == '/usr/src/' || substr ($line[1], 0, 6) == '/stage' || substr ($line[1], 0, 6) == '/upkg/') continue; mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line[1]) . "', 'link', '" . mysql_escape_string ($line[0]) . "')", $link); } bzclose ($filelist); } $filelist = @bzopen ($repo . 'state/files/' . $release . '.dirs.bz2', 'r'); if ($filelist) { while (!feof ($filelist)) { $line = fgets ($filelist); if (strlen ($line) == 0) break; if (substr ($line, 0, 9) == '/usr/src/' || substr ($line, 0, 6) == '/stage' || substr ($line, 0, 6) == '/upkg/') continue; mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line) . "', 'directory', NULL)", $link); } bzclose ($filelist); } $filelist = @bzopen ($repo . 'state/files/' . $release . '.config.bz2', 'r'); if ($filelist) { while (!feof ($filelist)) { $line = explode (' ', fgets ($filelist), 2); if (count ($line) == 0 || strlen (trim ($line[1])) == 0) break; mysql_query ("INSERT INTO `file` VALUES (NULL, $binaryid, '" . mysql_escape_string ($line[1]) . "', 'config', '" . mysql_escape_string ($line[0]) . "')", $link); } bzclose ($filelist); } } } foreach ($knownarchtoolchains as $knownarchtoolchain) { mysql_query ("DELETE `binary`, `file` FROM `binary`, `file` WHERE `binary`.releaseid='" . $releaseid . "' && CONCAT_WS('-', `binary`.arch, `binary`.toolchain)='" . $knownarchtoolchain . "' && `binary`.binaryid=`file`.binaryid", $link); mysql_query ("DELETE FROM `binary` WHERE releaseid='" . $releaseid . "' && CONCAT_WS('-', `binary`.arch, `binary`.toolchain)='" . $knownarchtoolchain . "'", $link); } } } $specsdir->close (); } // releases which still have status checking aren't used anymore, update status in db to reflect that mysql_query ("UPDATE `release` SET status='old' WHERE status='checking'"); mysql_query ("DELETE `release`, `binary`, `file` FROM `release`, `binary`, `file` WHERE `release`.status='old' && `release`.releaseid=`binary`.releaseid && `binary`.binaryid=`file`.binaryid", $link); mysql_query ("DELETE `release`, `binary` FROM `release`, `binary` WHERE `release`.status='old' && `release`.releaseid=`binary`.releaseid", $link); mysql_query ("DELETE `release`, dependency FROM `release`, dependency WHERE `release`.status='old' && `release`.releaseid=dependency.releaseid", $link); mysql_query ("DELETE FROM `release` WHERE `release`.status='old'", $link); // delete not existing references in dependencies table mysql_query ("DELETE dependency FROM dependency LEFT JOIN `release` USING (releaseid) WHERE `release`.releaseid IS NULL", $link); /* CREATE TABLE `release` ( `releaseid` int(10) unsigned NOT NULL auto_increment, `package` varchar(64) NOT NULL default '', `version` varchar(16) NOT NULL default '', `installedsize` int(10) unsigned default NULL, `buildduration` int(10) unsigned default NULL, `builddate` int(11) default NULL, `buildhost` varchar(255) default NULL, PRIMARY KEY (`releaseid`), UNIQUE KEY `versionedname` (`package`,`version`) ) TYPE=MyISAM AUTO_INCREMENT=1 ; */ ?>