rendered paste body<?php
set_time_limit (0);
require_once ('config.php');
$link = mysql_connect ($dbhost, $dbuser, $dbpassword);
mysql_select_db ($dbname, $link);
class ArchToolchain
{
function ArchToolchain ($arch, $toolchain)
{
$this->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 ;
*/
?>