From 6fd2b5d30b183d17ff81f2f9b69446c497e78294 Mon Sep 17 00:00:00 2001 From: "Johan \"Papa\" Cwiklinski" Date: Sun, 30 May 2010 12:51:35 +0200 Subject: Apply coding standards, add license (not tested yet) ; refs #46,48 --- refresh.php | 1094 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 676 insertions(+), 418 deletions(-) diff --git a/refresh.php b/refresh.php index eb612de..3be354f 100644 --- a/refresh.php +++ b/refresh.php @@ -1,437 +1,695 @@ . + * + * @category Main + * @package RPMPHP + * + * @author Remi Collet + * @author Johan Cwiklinski + * @copyright 2010 Remi Collet + * @license http://www.gnu.org/licenses/agpl-3.0-standalone.html AGPL License 3.0 or (at your option) any later version + * @link http://github.com/remicollet/rpmphp/ + * @since The begining of times. +*/ chdir(dirname($_SERVER["SCRIPT_FILENAME"])); if (isset($_SERVER["SERVER_NAME"])) { - echo "
";
-	ini_set("max_execution_time", "0");
-	ini_set("memory_limit", "-1");
+    echo "
";
+    ini_set("max_execution_time", "0");
+    ini_set("memory_limit", "-1");
 
-	die("This script is launched twice a day, be patient");
+    die("This script is launched twice a day, be patient");
 }
 require "config.inc.php";
 
-function addUpstream ($db, $type, $channel, $name, $state, $ver, $statename="") {
-
-	$sql1 = "INSERT INTO `upstream` SET type='$type', name='$name'";
-	$db->exec($sql1);
-
-	$sql2 = "UPDATE `upstream` SET channel='$channel', $state='$ver'";
-	if ($statename) $sql2 .= ", state='$statename'";
-	$sql2 .= " WHERE type='$type' AND name='$name'";
-	$nb = $db->exec($sql2);
-	if ($nb===false) echo date("r : ") . "SQL ERROR($sql2) = " . implode(" ", $db->errorInfo()) . "\n";
-
-	return $nb;
+/**
+* To document
+*
+* @param Object $db        Database reference
+* @param string $type      type
+* @param string $channel   channel
+* @param string $name      name
+* @param string $state     state
+* @param string $ver       version
+* @param string $statename state name
+*
+* @return rows updated
+*/
+function addUpstream ($db, $type, $channel, $name, $state, $ver, $statename="")
+{
+
+    $sql1 = "INSERT INTO `upstream` SET type='$type', name='$name'";
+    $db->exec($sql1);
+
+    $sql2 = "UPDATE `upstream` SET channel='$channel', $state='$ver'";
+    if ($statename) {
+        $sql2 .= ", state='$statename'";
+    }
+    $sql2 .= " WHERE type='$type' AND name='$name'";
+    $nb = $db->exec($sql2);
+    if ($nb===false) {
+        echo date("r : ") . "SQL ERROR($sql2) = " .
+            implode(" ", $db->errorInfo()) . "\n";
+    }
+
+    return $nb;
 }
+
 if ($_SERVER['argc']>1 && in_array('help', $_SERVER['argv'])) {
-	echo "Options in: repo owner R pear pecl old\n";
-	echo "Defaults:   repo owner R pear pecl\n";
-	die("\n");
+    echo "Options in: repo owner R pear pecl old\n";
+    echo "Defaults:   repo owner R pear pecl\n";
+    die("\n");
 }
 
 try {
-	$db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
-
-	// -------------------------------------------------------------------
-	//	Fedora Packages
-	// -------------------------------------------------------------------
-	echo date("r : ") . "Refreshing " . MYBASE . " database\n";
-
-	if ($_SERVER['argc']==1 || in_array('repo', $_SERVER['argv'])) {
-	if (in_array('empty', $_SERVER['argv'])) {
-		$res=$db->query("SELECT * FROM repo WHERE stamp IS NULL");
-	} else if (in_array('old', $_SERVER['argv'])) {
-		$res=$db->query("SELECT * FROM repo");
-	} else {
-		$res=$db->query("SELECT * FROM repo WHERE active=1");
-	}
-	if (!$res) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-	else while ($row = $res->fetchObject()) {
-		echo date("r : ") . "REPOSITORY " . $row->main . " " . $row->sub . "\n";
-		$TimRemote = 0;
-		$repomd = simplexml_load_file($row->url . "repodata/repomd.xml");
-		if ($repomd) foreach($repomd->data as $data) if ($data->attributes()=="primary") {
-			$TimRemote = $data->timestamp;
-			$UrlRemote = $row->url . $data->location->attributes();
-		}
-		if ($TimRemote > $row->stamp) {
-			echo date("r : ") . "Loading $UrlRemote\n";
-
-			//$fic=gzopen("primary.xml.gz", "r");
-			$fic=gzopen($UrlRemote, "r");
-			if ($fic) {
-				$txt="";
-				while ($buf=gzread($fic,8196))
-					$txt .= $buf;
-				echo date("r : ") . "Read " . strlen($txt) . " bytes\n";
-				gzclose($fic);
-
-				$primary = simplexml_load_string($txt);
-				echo date("r : ") . "Read " . $primary->attributes() . " packages\n";
-				unset($txt);
-
-				$sql = sprintf("DELETE FROM rpm WHERE repo_main='%s' AND repo_sub='%s'",
-					$row->main, $row->sub);
-				$nb=$db->exec($sql);
-				if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-				else  echo date("r : ") . "Delete $nb packages\n";
-
-				$tot=0;
-				foreach ($primary->package as $package) if ($package->attributes()=='rpm'){
-					$ver = $package->version->attributes();
-					$sql = sprintf("INSERT INTO rpm SET repo_main='%s', repo_sub='%s', name='%s', epoch='%s', ver='%s', rel='%s', summary='%s', url='%s'",
-						$row->main, $row->sub, $package->name, $ver['epoch'], $ver['ver'], $ver['rel'], addslashes($package->summary), $package->url);
-					$nb=$db->exec($sql);
-					if ($nb) $tot+=$nb;
-					else  echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-				}
-				echo date("r : ") . "Write $tot packages\n";
-
-				$sql=sprintf("UPDATE repo SET stamp=%d WHERE ID=%d", $TimRemote, $row->ID);
-				$nb=$db->exec($sql);
-				if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-
-				unset($primary);
-			} else {
-				echo date("r : ") . "ERROR : can't read $UrlRemote\n";
-			}
-		} else {
-			echo date("r : ") . "no update needed : $TimRemote / " . $row->stamp . "\n";
-		}
-	}
-	} // If ask
-
-	// -------------------------------------------------------------------
-	//	Upstream Version
-	// -------------------------------------------------------------------
-	$sql="CREATE TABLE IF NOT EXISTS `upstream` (
-  		`name` varchar(100) NOT NULL,
-  		`type` varchar(20) NOT NULL,
-  		`channel` varchar(20) NOT NULL,
-  		`stable` varchar(20) DEFAULT NULL,
-  		`unstable` varchar(20) DEFAULT NULL,
-		`state` varchar(20) DEFAULT NULL,
-		PRIMARY KEY (`name`,`type`),
-  		KEY `name` (`name`),
-  		KEY `type` (`type`),
-  		KEY `channel` (`channel`))";
-
-	if ($db->exec($sql)!==false)
-	  	echo date("r : ") . "Check table 'upstream' ok\n";
-	else  	echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-
-	// -------------------------------------------------------------------
-	if ($_SERVER['argc']==1 || in_array('pecl', $_SERVER['argv'])) {
-	echo date("r : ") . "PECL listLatestReleases - stable\n";
-
-	$request = xmlrpc_encode_request("package.listLatestReleases", "stable");
-	$context = stream_context_create(array('http' => array(
-	    'method' => "POST",
-	    'header' => "Content-Type: text/xml",
-	    'content' => $request
-	)));
-	$file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
-	$stable = xmlrpc_decode($file);
-	if (xmlrpc_is_fault($stable)) {
-	 	echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
-	} else {
-		$sql = sprintf("DELETE FROM upstream WHERE type='pecl' AND channel='pecl'");
-		$nb=$db->exec($sql);
-		if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-		else  echo date("r : ") . "Delete $nb packages\n";
-
-		$nb=0;
-		foreach ($stable as $name => $info) {
-			$rpmname="php-pecl-".str_replace("_","-",$name);
-
-			$nb += addUpstream($db, "pecl", "pecl", $rpmname, "stable", $info["version"]);
-		}
-		echo date("r : ") . "Write $nb packages\n";
-	 	// echo date("r : ") . "saved " . file_put_contents("cache/pecl-stable", serialize($stable)) . " bytes\n";
-	}
-
-	// -------------------------------------------------------------------
-	echo date("r : ") . "PECL listLatestReleases - unstable\n";
-
-	$request = xmlrpc_encode_request("package.listLatestReleases", array());
-	$context = stream_context_create(array('http' => array(
-	    'method' => "POST",
-	    'header' => "Content-Type: text/xml",
-	    'content' => $request
-	)));
-	$file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
-	$unstable = xmlrpc_decode($file);
-	if (xmlrpc_is_fault($unstable)) {
-	    echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
-	} else {
-		$nb=0;
-		foreach ($unstable as $name => $info) {
-			$rpmname="php-pecl-".str_replace("_","-",$name);
-
-			$nb += addUpstream($db, "pecl", "pecl", $rpmname, "unstable", $info["version"], $info["state"]);
-		}
-		echo date("r : ") . "Write $nb packages\n";
-	 	//echo date("r : ") . "saved " . file_put_contents("cache/pecl-unstable", serialize($unstable)) . " bytes\n";
-	}
-	} // if in options
-
-	// -------------------------------------------------------------------
-	if ($_SERVER['argc']==1 || in_array('pear', $_SERVER['argv'])) {
- 	echo date("r : ") . "PEAR reading channels\n";
-	$channels=array(
-		"pear"	    => "pear.php.net"
-		,"doctrine" => "pear.phpdoctrine.org"
-		,"ezc"      => "components.ez.no"
-		,"pdepend"  => "pear.pdepend.org"
-		,"phing"    => "pear.phing.info"
-		,"phpdb"    => "pear.phpdb.org"
-		,"phpmd"    => "pear.phpmd.org"
-		,"phpunit"  => "pear.phpunit.de"
-		,"swift"    => "pear.swiftmailer.org"
-		,"symphony" => "pear.symfony-project.com"
-		);
-	try {
-		$nbtot=0;
-
-		foreach ($channels as $channelname => $channelurl) {
-
-			$channel = @simplexml_load_file("http://$channelurl/channel.xml");
-			if (!$channel) throw new Exception("can't read PEAR site (channel of $channelname)");
-
-			$rest = $channel->servers->primary->rest->baseurl[0];
-			echo date("r : ") . "PEAR reading channel=$channelname, baseurl = $rest\n";
-
-			$categories = @simplexml_load_file($rest."c/categories.xml");
-			if (!$categories) throw new Exception("can't read PEAR site (categories)");
-
-			$sql = sprintf("DELETE FROM upstream WHERE type='pear' AND channel='$channelname'");
-			$nb=$db->exec($sql);
-			if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-			else  echo date("r : ") . "Delete $nb packages\n";
-
-			$nb=0;
-			if (!isset($categories->c[0])) {
-				echo date("r : ") . "Reading ALL\n"; // ezc only
-				$pitxt = @file_get_contents($rest."p/packages.xml");
-				if (!$pitxt) throw new Exception("can't read PEAR site (".$rest."p/packagesinfo.xml)");
-				$allpi = @simplexml_load_string($pitxt);
-				foreach ($allpi->p as $name) {
-					$pitxt = @file_get_contents($rest."r/".strtolower($name)."/allreleases.xml");
-					if (!$pitxt) throw new Exception("can't read PEAR site (".$rest."r/".strtolower($name)."/allreleases.xml");
-					$pi = @simplexml_load_string($pitxt);
-
-					$rpmname1="php-".$channelname."-".str_replace("_","-",$name);
-					$rpmname2="php-".$channelname."-".$name;
-
-					//echo $rpmname ."/".(string)$pi->r[0]->v."/". (string)$pi->r[0]->s."\n";
-					addUpstream($db, "pear", $channelname, $rpmname1, "unstable", (string)$pi->r[0]->v, (string)$pi->r[0]->s);
-					addUpstream($db, "pear", $channelname, $rpmname2, "unstable", (string)$pi->r[0]->v, (string)$pi->r[0]->s);
-					foreach($pi->r as $rev) if ($rev->s=='stable') {
-						//echo $rpmname ."/".(string)$rev->v."/". (string)$rev->s."\n";
-						addUpstream($db, "pear", $channelname, $rpmname1, "stable", (string)$rev->v);
-						addUpstream($db, "pear", $channelname, $rpmname2, "stable", (string)$rev->v);
-						break;
-					}
-					$nb++;
-				}
-
-			} else foreach ($categories->c as $cat) {
-				echo date("r : ") . "Reading $cat\n";
-
-				$pitxt = @file_get_contents($rest."c/".urlencode($cat)."/packagesinfo.xml");
-				if (!$pitxt) throw new Exception("can't read PEAR site (".$rest."c/".urlencode($cat)."/packagesinfo.xml)");
-				$pitxt = "/U", "", str_replace("\r\n", "\n", substr($pitxt, 2)));
-
-				$pi = @simplexml_load_string($pitxt);
-				if (!$pi) throw new Exception("can't read response ($cat)");
-				foreach ($pi->pi as $ps) if (isset($ps->p->n) && isset($ps->a->r)) {
-					$name=(string)$ps->p->n;
-
-					if ($channelname=='phing' && $name=='phing') {
-						$rpmname1="php-pear-phing";
-					} else if ($channelname=='phpunit' && $name=='PHPUnit') {
-						$rpmname1="php-pear-PHPUnit";
-					} else {
-						$rpmname1="php-".$channelname."-".str_replace("_","-",$name);
-					}
-					$rpmname2="php-".$channelname."-".$name;
-
-					addUpstream($db, "pear", $channelname, $rpmname1, "unstable", (string)$ps->a->r[0]->v, (string)$ps->a->r[0]->s);
-					addUpstream($db, "pear", $channelname, $rpmname2, "unstable", (string)$ps->a->r[0]->v, (string)$ps->a->r[0]->s);
-					foreach($ps->a->r as $rev) if ($rev->s=='stable') {
-						addUpstream($db, "pear", $channelname, $rpmname1, "stable", (string)$rev->v);
-						addUpstream($db, "pear", $channelname, $rpmname2, "stable", (string)$rev->v);
-						break;
-					}
-					$nb++;
-					// echo $ps->p->n."\n";
-				}
-			}
-		 	echo date("r : ") . "read $nb packages in $channelname\n";
-			$nbtot += $nb;
-		}
-	 	echo date("r : ") . "read $nbtot packages in all channels\n";
-
-	} catch (Exception $e) {
-		echo date("r : ") . 'ERROR ' .  $e->getMessage(), "\n";
-	}
-	} // if in options
-	// -------------------------------------------------------------------
-	if ($_SERVER['argc']==1 || in_array('R', $_SERVER['argv'])) {
-
-      $repos = array(
-         array("name"=>"R",      "state"=>"stable",   "url" => "http://cran.at.r-project.org/src/contrib/PACKAGES"),
-       //array("name"=>"R-forge","state"=>"unstable", "url" => "http://r-forge.r-project.org/src/contrib/PACKAGES"),
-         array("name"=>"biocp",  "state"=>"stable",   "url" => "http://www.bioconductor.org/packages/release/bioc/src/contrib/PACKAGES"),
-         array("name"=>"biocp",  "state"=>"unstable", "url" => "http://www.bioconductor.org/packages/devel/bioc/src/contrib/PACKAGES"),
-         array("name"=>"bioca",  "state"=>"stable",   "url" => "http://www.bioconductor.org/packages/release/data/annotation/src/contrib/PACKAGES"),
-         array("name"=>"bioca",  "state"=>"unstable", "url" => "http://www.bioconductor.org/packages/devel/data/annotation/src/contrib/PACKAGES"),
-         array("name"=>"bioce",  "state"=>"stable",   "url" => "http://www.bioconductor.org/packages/release/data/experiment/src/contrib/PACKAGES"),
-         array("name"=>"bioce",  "state"=>"unstable", "url" => "http://www.bioconductor.org/packages/devel/data/experiment/src/contrib/PACKAGES")
-         );
-      $tottot=0;
-      foreach ($repos as $repo) {
-         echo date("r : ") . "Reading " . $repo["name"] . " (" . $repo["state"] . ")\n";
-         $index = @file_get_contents($repo["url"]);
-         if (!$index) {
-            echo date("r : ") . "Can't read [" . $repo["url"] . "], skip this channel\n";
-            continue;
-         }
-         if ($repo["state"]=="stable") {
-            $sql = sprintf("DELETE FROM upstream WHERE type='R' AND channel='%s'", $repo["name"]);
+    $db = new PDO ("mysql:dbname=" . MYBASE . ";host=" . MYHOST, MYUSER, MYPASS);
+
+    // -------------------------------------------------------------------
+    //	Fedora Packages
+    // -------------------------------------------------------------------
+    echo date("r : ") . "Refreshing " . MYBASE . " database\n";
+
+    if ($_SERVER['argc']==1 || in_array('repo', $_SERVER['argv'])) {
+        if (in_array('empty', $_SERVER['argv'])) {
+            $res=$db->query("SELECT * FROM repo WHERE stamp IS NULL");
+        } else if (in_array('old', $_SERVER['argv'])) {
+            $res=$db->query("SELECT * FROM repo");
+        } else {
+            $res=$db->query("SELECT * FROM repo WHERE active=1");
+        }
+        if (!$res) {
+            echo date("r : ") . "SQL ERROR = " .
+                implode(" ", $db->errorInfo()) . "\n";
+        } else {
+            while ($row = $res->fetchObject()) {
+                echo date("r : ") . "REPOSITORY " . $row->main . " " .
+                    $row->sub . "\n";
+                $TimRemote = 0;
+                $repomd = simplexml_load_file($row->url . "repodata/repomd.xml");
+                if ($repomd) {
+                    foreach ($repomd->data as $data) {
+                        if ($data->attributes()=="primary") {
+                            $TimRemote = $data->timestamp;
+                            $UrlRemote = $row->url . $data->location->attributes();
+                        }
+                    }
+                }
+                if ($TimRemote > $row->stamp) {
+                    echo date("r : ") . "Loading $UrlRemote\n";
+
+                    //$fic=gzopen("primary.xml.gz", "r");
+                    $fic=gzopen($UrlRemote, "r");
+                    if ($fic) {
+                        $txt="";
+                        while ($buf=gzread($fic, 8196)) {
+                            $txt .= $buf;
+                        }
+                        echo date("r : ") . "Read " . strlen($txt) . " bytes\n";
+                        gzclose($fic);
+
+                        $primary = simplexml_load_string($txt);
+                        echo date("r : ") . "Read " . $primary->attributes() .
+                            " packages\n";
+                        unset($txt);
+
+                        $sql = sprintf(
+                            "DELETE FROM rpm WHERE repo_main='%s' AND repo_sub='%s'",
+                            $row->main,
+                            $row->sub
+                        );
+                        $nb=$db->exec($sql);
+                        if ($nb===false) {
+                            echo date("r : ") . "SQL ERROR = " .
+                                implode(" ", $db->errorInfo()) . "\n";
+                        } else {
+                            echo date("r : ") . "Delete $nb packages\n";
+                        }
+
+                        $tot=0;
+                        foreach ($primary->package as $package) {
+                            if ($package->attributes()=='rpm') {
+                                $ver = $package->version->attributes();
+                                $sql = sprintf(
+                                    "INSERT INTO rpm SET repo_main='%s', repo_sub='%s', name='%s', epoch='%s', ver='%s', rel='%s', summary='%s', url='%s'",
+                                    $row->main,
+                                    $row->sub,
+                                    $package->name,
+                                    $ver['epoch'],
+                                    $ver['ver'],
+                                    $ver['rel'],
+                                    addslashes($package->summary),
+                                    $package->url
+                                );
+                                $nb=$db->exec($sql);
+                                if ($nb) {
+                                    $tot+=$nb;
+                                } else {
+                                    echo date("r : ") . "SQL ERROR = " .
+                                        implode(" ", $db->errorInfo()) . "\n";
+                                }
+                            }
+                        }
+                        echo date("r : ") . "Write $tot packages\n";
+
+                        $sql=sprintf(
+                            "UPDATE repo SET stamp=%d WHERE ID=%d",
+                            $TimRemote,
+                            $row->ID
+                        );
+                        $nb=$db->exec($sql);
+                        if ($nb===false) {
+                            echo date("r : ") . "SQL ERROR = " .
+                                implode(" ", $db->errorInfo()) . "\n";
+                        }
+
+                        unset($primary);
+                    } else {
+                        echo date("r : ") . "ERROR : can't read $UrlRemote\n";
+                    }
+                } else {
+                    echo date("r : ") . "no update needed : $TimRemote / " .
+                        $row->stamp . "\n";
+                }
+            }
+        }
+    } // If ask
+
+    // -------------------------------------------------------------------
+    //	Upstream Version
+    // -------------------------------------------------------------------
+    $sql="CREATE TABLE IF NOT EXISTS `upstream` (
+            `name` varchar(100) NOT NULL,
+            `type` varchar(20) NOT NULL,
+            `channel` varchar(20) NOT NULL,
+            `stable` varchar(20) DEFAULT NULL,
+            `unstable` varchar(20) DEFAULT NULL,
+            `state` varchar(20) DEFAULT NULL,
+            PRIMARY KEY (`name`,`type`),
+            KEY `name` (`name`),
+            KEY `type` (`type`),
+            KEY `channel` (`channel`))";
+
+    if ($db->exec($sql)!==false) {
+        echo date("r : ") . "Check table 'upstream' ok\n";
+    } else {
+        echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
+    }
+
+    // -------------------------------------------------------------------
+    if ($_SERVER['argc']==1 || in_array('pecl', $_SERVER['argv'])) {
+        echo date("r : ") . "PECL listLatestReleases - stable\n";
+
+        $request = xmlrpc_encode_request("package.listLatestReleases", "stable");
+        $context = stream_context_create(
+            array(
+                'http' => array(
+                    'method' => "POST",
+                    'header' => "Content-Type: text/xml",
+                    'content' => $request
+                )
+            )
+        );
+        $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
+        $stable = xmlrpc_decode($file);
+        if (xmlrpc_is_fault($stable)) {
+            echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ($stable[faultCode])";
+        } else {
+            $sql = sprintf("DELETE FROM upstream WHERE type='pecl' AND channel='pecl'");
             $nb=$db->exec($sql);
-            if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-            else  echo date("r : ") . "Delete $nb packages\n";
-         }
-         $results=array();
-         if (preg_match_all('/Package: *(.*)\nVersion: *(.*)\n/i',$index,$results,PREG_SET_ORDER)) {
-            $tot=0;
-            foreach ($results as $result) {
-               //echo $result[1]." = ".$result[2]."\n";
-               $rpmname = "R-".$result[1];
-               $ver = str_replace('-', '.', $result[2]);
-               if (addUpstream($db, "R", $repo["name"], $rpmname, $repo["state"], $ver, ($repo["state"]=="stable"?"":"devel"))) {
-                  $tot++;
-               }
+            if ($nb===false) {
+                echo date("r : ") . "SQL ERROR = " .
+                    implode(" ", $db->errorInfo()) . "\n";
+            } else {
+                echo date("r : ") . "Delete $nb packages\n";
             }
-            echo date("r : ") . "Write $tot packages in this channel\n";
-            $tottot += $tot;
-         } else {
-            echo date("r : ") . "No package in this channel\n";
-         }
-      }
-      echo date("r : ") . "Write $tottot packages in all channels\n";
-/*
- * OLD VERSION parsing the HTML pages
-	$repos = array(
-		array("name"=>"R", 	"state"=>"stable", 	"url"	=> "http://cran.r-project.org/web/packages/"),
-		array("name"=>"biocp", 	"state"=>"stable", 	"url"	=> "http://bioconductor.org/packages/release/bioc/"),
-		array("name"=>"biocp", 	"state"=>"unstable", 	"url"	=> "http://bioconductor.org/packages/devel/bioc/"),
-		array("name"=>"bioca", 	"state"=>"stable", 	"url"	=> "http://bioconductor.org/packages/release/data/annotation/"),
-		array("name"=>"bioca", 	"state"=>"unstable", 	"url"	=> "http://bioconductor.org/packages/devel/data/annotation/"),
-		array("name"=>"bioce", 	"state"=>"stable", 	"url"	=> "http://bioconductor.org/packages/release/data/experiment/"),
-		array("name"=>"bioce", 	"state"=>"unstable", 	"url"	=> "http://bioconductor.org/packages/devel/data/experiment/")
-		);
-	$tottot=0;
-	foreach ($repos as $repo) {
-		echo date("r : ") . "Reading " . $repo["name"] . " (" . $repo["state"] . ")\n";
-		$index = @file_get_contents($repo["url"]);
-		if (!$index) {
-			echo date("r : ") . "Can't read [" . $repo["url"] . "], skip this channel\n";
-			continue;
-		}
-		if ($repo["state"]=="stable") {
-			$sql = sprintf("DELETE FROM upstream WHERE type='R' AND channel='%s'", $repo["name"]);
-			$nb=$db->exec($sql);
-			if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-			else  echo date("r : ") . "Delete $nb packages\n";
-		}
-		if ($repo["name"] == "R") {
-			$pos = strpos($index, 'ID="available-packages');
-			$pat1 = '/(.*)<\/A>/iU';
-		} else {
-			$pos = 0;
-			$pat1 = '/(.*)<\/A>/iu';
-		}
-		$results=array();
-		if (preg_match_all($pat1,$index,$results,PREG_SET_ORDER,$pos)) {
-			$tot=0;
-			foreach ($results as $result) {
-				$page = @file_get_contents($repo["url"].$result[1]);
-				$name = $result[2];
-				$rpmname = "R-".$result[2];
-				$ver=array();
-				if (!$page) {
-					echo date("r : ") . "Can't read [" . $repo["url"].$result[1] . "], skip this package\n";
-
-				} else if (preg_match("/".$name."_((\d|-|\.)*)\.tar.gz/", $page, $ver)) {
-
-					$ver = str_replace('-', '.', $ver[1]);
-					$nb = addUpstream($db, "R", $repo["name"], $rpmname, $repo["state"], $ver, ($repo["state"]=="stable"?"":"devel"));
-
-				}
-
-				if ($nb) $tot+=$nb;
-
-			}
-			echo date("r : ") . "Write $tot packages in this channel\n";
-			$tottot += $tot;
-		} // Each package
-	} // Each repo
-	echo date("r : ") . "Write $tottot packages in all channels\n";
-   */
-	} // If R in options
-
-	// -------------------------------------------------------------------
-	//	Package Owners from pkgdb (thanks Smootherfrog)
-	// -------------------------------------------------------------------
-	if ($_SERVER['argc']==1 || in_array('owner', $_SERVER['argv'])) {
-
-	$sql="CREATE TABLE IF NOT EXISTS `acls` (
-  		`ID` int(11) NOT NULL AUTO_INCREMENT,
-  		`collection` varchar(100) NOT NULL,
-  		`name` varchar(100) NOT NULL,
-  		`summary` varchar(200) NOT NULL,
-  		`owner` varchar(50) DEFAULT NULL,
-  		`qa` varchar(50) DEFAULT NULL,
-  		`cc` varchar(100) DEFAULT NULL,
-  		PRIMARY KEY (`ID`),
-  		KEY `name` (`name`),
-  		KEY `collection` (`collection`),
-  		KEY `owner` (`owner`)) ENGINE=MyISAM";
-
-	if ($db->exec($sql)!==false)
-	  	echo date("r : ") . "Check table 'acls' ok\n";
-	else  	echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-
-	$fic=fopen("https://admin.fedoraproject.org/pkgdb/lists/bugzilla?tg_format=plain", "r");
-	if (!$fic) {
-		echo date("r : ") . "ERROR reading pkgdb\n";
-	} else {
-		$sql="TRUNCATE `acls`";
-		$nb=$db->exec($sql);
-		if ($nb===false) echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-		else  echo date("r : ") . "Delete $nb packages\n";
-
-		for ($tot=0 ; $line=fgetcsv($fic,1024,'|') ; ) if (count($line)>5 && substr($line[0],0,1)!='#') {
-			for ($i=0; $i<6; $i++) $line[$i]=trim($line[$i]);
-			$sql=sprintf("INSERT INTO `acls` SET collection='%s', name='%s', summary='%s'", $line[0], $line[1], addslashes($line[2]));
-			if (!empty($line[3])) $sql .= sprintf(", owner='%s'", $line[3]);
-			if (!empty($line[4])) $sql .= sprintf(", qa='%s'", $line[4]);
-			if (!empty($line[5])) $sql .= sprintf(", cc='%s'", $line[5]);
-			$nb=$db->exec($sql);
-			if ($nb) $tot+=$nb;
-			else  echo date("r : ") . "SQL ERROR = " . implode(" ", $db->errorInfo()) . "\n";
-		}
-		fclose($fic);
-	 	echo date("r : ") . "wrote $tot package's owner\n";
-	}
-	} // If in options
 
-}
-catch(PDOException $e) {
-	printf("%s ERREUR : %s\n", date("r"),  $e->getMessage());
+            $nb=0;
+            foreach ($stable as $name => $info) {
+                $rpmname="php-pecl-".str_replace("_", "-", $name);
+
+                $nb += addUpstream(
+                    $db,
+                    "pecl",
+                    "pecl",
+                    $rpmname,
+                    "stable",
+                    $info["version"]
+                );
+            }
+            echo date("r : ") . "Write $nb packages\n";
+            // echo date("r : ") . "saved " . file_put_contents("cache/pecl-stable", serialize($stable)) . " bytes\n";
+        }
+
+        // -------------------------------------------------------------------
+        echo date("r : ") . "PECL listLatestReleases - unstable\n";
+
+        $request = xmlrpc_encode_request("package.listLatestReleases", array());
+        $context = stream_context_create(
+            array(
+                'http' => array(
+                    'method' => "POST",
+                    'header' => "Content-Type: text/xml",
+                    'content' => $request
+                )
+            )
+        );
+        $file = file_get_contents("http://pecl.php.net/xmlrpc.php", false, $context) or die ("Can't file_get_contents(http://pecl.php.net/xmlrpc.php)");
+        $unstable = xmlrpc_decode($file);
+        if (xmlrpc_is_fault($unstable)) {
+            echo date("r : ") . "ERROR xmlrpc: $stable[faultString] ".
+                "($stable[faultCode])";
+        } else {
+            $nb=0;
+            foreach ($unstable as $name => $info) {
+                $rpmname="php-pecl-".str_replace("_", "-", $name);
+
+                $nb += addUpstream(
+                    $db,
+                    "pecl",
+                    "pecl",
+                    $rpmname,
+                    "unstable",
+                    $info["version"],
+                    $info["state"]
+                );
+            }
+            echo date("r : ") . "Write $nb packages\n";
+            //echo date("r : ") . "saved " .
+            //   file_put_contents("cache/pecl-unstable", serialize($unstable)) .
+            //   " bytes\n";
+        }
+    } // if in options
+
+    // -------------------------------------------------------------------
+    if ($_SERVER['argc']==1 || in_array('pear', $_SERVER['argv'])) {
+        echo date("r : ") . "PEAR reading channels\n";
+        $channels=array(
+            "pear"	    => "pear.php.net"
+            ,"doctrine" => "pear.phpdoctrine.org"
+            ,"ezc"      => "components.ez.no"
+            ,"pdepend"  => "pear.pdepend.org"
+            ,"phing"    => "pear.phing.info"
+            ,"phpdb"    => "pear.phpdb.org"
+            ,"phpmd"    => "pear.phpmd.org"
+            ,"phpunit"  => "pear.phpunit.de"
+            ,"swift"    => "pear.swiftmailer.org"
+            ,"symphony" => "pear.symfony-project.com"
+        );
+        try {
+            $nbtot=0;
+
+            foreach ($channels as $channelname => $channelurl) {
+                $channel = @simplexml_load_file("http://$channelurl/channel.xml");
+                if (!$channel) {
+                    throw new Exception(
+                        "can't read PEAR site (channel of $channelname)"
+                    );
+                }
+
+                $rest = $channel->servers->primary->rest->baseurl[0];
+                echo date("r : ") . "PEAR reading channel=$channelname" .
+                    ", baseurl = $rest\n";
+
+                $categories = @simplexml_load_file($rest."c/categories.xml");
+                if (!$categories) {
+                    throw new Exception("can't read PEAR site (categories)");
+                }
+
+                $sql = "DELETE FROM upstream WHERE type='pear' AND channel='".
+                    $channelname."'";
+                $nb=$db->exec($sql);
+                if ($nb===false) {
+                    echo date("r : ") . "SQL ERROR = " . implode(
+                        " ",
+                        $db->errorInfo()
+                    ) . "\n";
+                } else {
+                    echo date("r : ") . "Delete $nb packages\n";
+                }
+
+                $nb=0;
+                if (!isset($categories->c[0])) {
+                    echo date("r : ") . "Reading ALL\n"; // ezc only
+                    $pitxt = @file_get_contents($rest."p/packages.xml");
+                    if (!$pitxt) {
+                        throw new Exception(
+                            "can't read PEAR site (".$rest."p/packagesinfo.xml)"
+                        );
+                    }
+                    $allpi = @simplexml_load_string($pitxt);
+                    foreach ($allpi->p as $name) {
+                        $pitxt = @file_get_contents(
+                            $rest."r/".strtolower($name)."/allreleases.xml"
+                        );
+                        if (!$pitxt) {
+                            throw new Exception(
+                                "can't read PEAR site (".$rest."r/".
+                                strtolower($name)."/allreleases.xml"
+                            );
+                        }
+                        $pi = @simplexml_load_string($pitxt);
+
+                        $rpmname1="php-".$channelname."-".
+                            str_replace("_", "-", $name);
+                        $rpmname2="php-".$channelname."-".$name;
+
+                        //echo $rpmname ."/".(string)$pi->r[0]->v."/".
+                        //  (string)$pi->r[0]->s."\n";
+                        addUpstream(
+                            $db,
+                            "pear",
+                            $channelname,
+                            $rpmname1,
+                            "unstable",
+                            (string)$pi->r[0]->v,
+                            (string)$pi->r[0]->s
+                        );
+                        addUpstream(
+                            $db,
+                            "pear",
+                            $channelname,
+                            $rpmname2,
+                            "unstable",
+                            (string)$pi->r[0]->v,
+                            (string)$pi->r[0]->s
+                        );
+                        foreach ($pi->r as $rev) {
+                            if ($rev->s=='stable') {
+                                //echo $rpmname ."/".(string)$rev->v."/".
+                                //    (string)$rev->s."\n";
+                                addUpstream(
+                                    $db,
+                                    "pear",
+                                    $channelname,
+                                    $rpmname1,
+                                    "stable",
+                                    (string)$rev->v
+                                );
+                                addUpstream(
+                                    $db,
+                                    "pear",
+                                    $channelname,
+                                    $rpmname2,
+                                    "stable",
+                                    (string)$rev->v
+                                );
+                                break;
+                            }
+                        }
+                        $nb++;
+                    }
+
+                } else {
+                    foreach ($categories->c as $cat) {
+                        echo date("r : ") . "Reading $cat\n";
+
+                        $pitxt = @file_get_contents(
+                            $rest."c/".urlencode($cat)."/packagesinfo.xml"
+                        );
+                        if (!$pitxt) {
+                            throw new Exception(
+                                "can't read PEAR site (".$rest."c/".
+                                urlencode($cat)."/packagesinfo.xml)"
+                            );
+                        }
+                        $pitxt = "/U",
+                            "",
+                            str_replace("\r\n", "\n", substr($pitxt, 2))
+                        );
+
+                        $pi = @simplexml_load_string($pitxt);
+                        if (!$pi) {
+                            throw new Exception("can't read response ($cat)");
+                        }
+                        foreach ($pi->pi as $ps) {
+                            if (isset($ps->p->n) && isset($ps->a->r)) {
+                                $name=(string)$ps->p->n;
+
+                                if ($channelname=='phing' && $name=='phing') {
+                                    $rpmname1="php-pear-phing";
+                                } else if ($channelname=='phpunit'
+                                    && $name=='PHPUnit'
+                                ) {
+                                    $rpmname1="php-pear-PHPUnit";
+                                } else {
+                                    $rpmname1="php-".$channelname."-".
+                                        str_replace("_", "-", $name);
+                                }
+                                $rpmname2="php-".$channelname."-".$name;
+
+                                addUpstream(
+                                    $db,
+                                    "pear",
+                                    $channelname,
+                                    $rpmname1,
+                                    "unstable",
+                                    (string)$ps->a->r[0]->v,
+                                    (string)$ps->a->r[0]->s
+                                );
+                                addUpstream(
+                                    $db,
+                                    "pear",
+                                    $channelname,
+                                    $rpmname2,
+                                    "unstable",
+                                    (string)$ps->a->r[0]->v,
+                                    (string)$ps->a->r[0]->s
+                                );
+                                foreach ($ps->a->r as $rev) {
+                                    if ($rev->s=='stable') {
+                                        addUpstream(
+                                            $db, "pear",
+                                            $channelname,
+                                            $rpmname1,
+                                            "stable",
+                                            (string)$rev->v
+                                        );
+                                        addUpstream(
+                                            $db,
+                                            "pear",
+                                            $channelname,
+                                            $rpmname2,
+                                            "stable",
+                                            (string)$rev->v
+                                        );
+                                        break;
+                                    }
+                                }
+                                $nb++;
+                                // echo $ps->p->n."\n";
+                            }
+                        }
+                    }
+                }
+                echo date("r : ") . "read $nb packages in $channelname\n";
+                $nbtot += $nb;
+            }
+            echo date("r : ") . "read $nbtot packages in all channels\n";
+
+        } catch (Exception $e) {
+            echo date("r : ") . 'ERROR ' .  $e->getMessage(), "\n";
+        }
+    } // if in options
+
+    // -------------------------------------------------------------------
+    if ($_SERVER['argc']==1 || in_array('R', $_SERVER['argv'])) {
+
+        $repos = array(
+            array(
+                "name"  => "R",
+                "state" => "stable",
+                "url"   => "http://cran.at.r-project.org/src/contrib/PACKAGES"
+            ),
+            //array("name"=>"R-forge","state"=>"unstable", "url" => "http://r-forge.r-project.org/src/contrib/PACKAGES"),
+            array(
+                "name"  => "biocp",
+                "state" => "stable",
+                "url"   => "http://www.bioconductor.org/packages/release/bioc/src/contrib/PACKAGES"
+            ),
+            array(
+                "name"  => "biocp",
+                "state" => "unstable",
+                "url"   => "http://www.bioconductor.org/packages/devel/bioc/src/contrib/PACKAGES"
+            ),
+            array(
+                "name"  => "bioca",
+                "state" => "stable",
+                "url"   => "http://www.bioconductor.org/packages/release/data/annotation/src/contrib/PACKAGES"
+            ),
+            array(
+                "name"  => "bioca",
+                "state" => "unstable",
+                "url"   => "http://www.bioconductor.org/packages/devel/data/annotation/src/contrib/PACKAGES"
+            ),
+            array(
+                "name"  => "bioce",
+                "state" => "stable",
+                "url"   => "http://www.bioconductor.org/packages/release/data/experiment/src/contrib/PACKAGES"
+            ),
+            array(
+                "name"  => "bioce",
+                "state" => "unstable",
+                "url"   => "http://www.bioconductor.org/packages/devel/data/experiment/src/contrib/PACKAGES"
+            )
+        );
+        $tottot=0;
+        foreach ($repos as $repo) {
+            echo date("r : ") . "Reading " . $repo["name"] . " (" .
+                $repo["state"] . ")\n";
+            $index = @file_get_contents($repo["url"]);
+            if (!$index) {
+                echo date("r : ") . "Can't read [" . $repo["url"] .
+                    "], skip this channel\n";
+                continue;
+            }
+            if ($repo["state"]=="stable") {
+                $sql = sprintf(
+                    "DELETE FROM upstream WHERE type='R' AND channel='%s'",
+                    $repo["name"]
+                );
+                $nb=$db->exec($sql);
+                if ($nb===false) {
+                    echo date("r : ") . "SQL ERROR = " .
+                        implode(" ", $db->errorInfo()) . "\n";
+                } else {
+                    echo date("r : ") . "Delete $nb packages\n";
+                }
+            }
+            $results=array();
+            if (preg_match_all('/Package: *(.*)\nVersion: *(.*)\n/i', $index, $results, PREG_SET_ORDER)) {
+                $tot=0;
+                foreach ($results as $result) {
+                    //echo $result[1]." = ".$result[2]."\n";
+                    $rpmname = "R-".$result[1];
+                    $ver = str_replace('-', '.', $result[2]);
+                    $add_upstream = addUpstream(
+                        $db,
+                        "R",
+                        $repo["name"],
+                        $rpmname,
+                        $repo["state"],
+                        $ver,
+                        ($repo["state"]=="stable"?"":"devel")
+                    );
+
+                    if ($add_upstream) {
+                        $tot++;
+                    }
+                }
+                echo date("r : ") . "Write $tot packages in this channel\n";
+                $tottot += $tot;
+            } else {
+                echo date("r : ") . "No package in this channel\n";
+            }
+        }
+        echo date("r : ") . "Write $tottot packages in all channels\n";
+
+    } // If R in options
+
+    // -------------------------------------------------------------------
+    //	Package Owners from pkgdb (thanks Smootherfrog)
+    // -------------------------------------------------------------------
+    if ($_SERVER['argc']==1 || in_array('owner', $_SERVER['argv'])) {
+
+        $sql="CREATE TABLE IF NOT EXISTS `acls` (
+            `ID` int(11) NOT NULL AUTO_INCREMENT,
+            `collection` varchar(100) NOT NULL,
+            `name` varchar(100) NOT NULL,
+            `summary` varchar(200) NOT NULL,
+            `owner` varchar(50) DEFAULT NULL,
+            `qa` varchar(50) DEFAULT NULL,
+            `cc` varchar(100) DEFAULT NULL,
+            PRIMARY KEY (`ID`),
+            KEY `name` (`name`),
+            KEY `collection` (`collection`),
+            KEY `owner` (`owner`)) ENGINE=MyISAM";
+
+        if ($db->exec($sql)!==false) {
+            echo date("r : ") . "Check table 'acls' ok\n";
+        } else {
+            echo date("r : ") . "SQL ERROR = " .
+                implode(" ", $db->errorInfo()) . "\n";
+        }
+
+        $fic=fopen(
+            "https://admin.fedoraproject.org/pkgdb/lists/bugzilla?tg_format=plain",
+            "r"
+        );
+        if (!$fic) {
+            echo date("r : ") . "ERROR reading pkgdb\n";
+        } else {
+            $sql="TRUNCATE `acls`";
+            $nb=$db->exec($sql);
+            if ($nb===false) {
+                echo date("r : ") . "SQL ERROR = " .
+                    implode(" ", $db->errorInfo()) . "\n";
+            } else {
+                echo date("r : ") . "Delete $nb packages\n";
+            }
+
+            for ($tot=0 ; $line=fgetcsv($fic, 1024, '|'); ) {
+                if (count($line)>5 && substr($line[0], 0, 1)!='#') {
+                    for ($i=0; $i<6; $i++) {
+                        $line[$i]=trim($line[$i]);
+                    }
+                    $sql=sprintf(
+                        "INSERT INTO `acls` SET collection='%s', name='%s', summary='%s'",
+                        $line[0],
+                        $line[1],
+                        addslashes($line[2])
+                    );
+                    if (!empty($line[3])) {
+                        $sql .= sprintf(", owner='%s'", $line[3]);
+                    }
+                    if (!empty($line[4])) {
+                        $sql .= sprintf(", qa='%s'", $line[4]);
+                    }
+                    if (!empty($line[5])) {
+                        $sql .= sprintf(", cc='%s'", $line[5]);
+                    }
+                    $nb=$db->exec($sql);
+                    if ($nb) {
+                        $tot+=$nb;
+                    } else {
+                        echo date("r : ") . "SQL ERROR = " .
+                            implode(" ", $db->errorInfo()) . "\n";
+                    }
+                }
+            }
+            fclose($fic);
+            echo date("r : ") . "wrote $tot package's owner\n";
+        }
+    } // If in options
+
+} catch(PDOException $e) {
+    printf("%s ERREUR : %s\n", date("r"), $e->getMessage());
 }
 
-if (isset($_SERVER["SERVER_NAME"])) echo "
"; +if (isset($_SERVER["SERVER_NAME"])) { + echo "
"; +} ?> -- cgit