From 7ab89b02c4330a2d38a25cea515f930fae4b5ffc Mon Sep 17 00:00:00 2001 From: Stig Bakken Date: Mon, 29 Oct 2001 14:15:43 +0000 Subject: [PATCH] * started working on "pear list" command --- pear/PEAR/Installer.php | 20 +++++------ pear/PEAR/Registry.php | 5 ++- pear/scripts/pear.in | 77 ++++++++++++++++++++++++++++++++++++----- 3 files changed, 82 insertions(+), 20 deletions(-) diff --git a/pear/PEAR/Installer.php b/pear/PEAR/Installer.php index 1bd0eabc1b0..0caf515f365 100644 --- a/pear/PEAR/Installer.php +++ b/pear/PEAR/Installer.php @@ -75,15 +75,6 @@ class PEAR_Installer extends PEAR_Common $this->statedir = "/var/lib/php"; // XXX FIXME Windows } - // }}} - // {{{ destructor - - function _PEAR_Installer() - { - chdir($this->pwd); - $this->_PEAR_Common(); - } - // }}} // {{{ install() @@ -99,7 +90,7 @@ class PEAR_Installer extends PEAR_Common { // XXX FIXME Add here code to manage packages database //$this->loadPackageList("$this->statedir/packages.lst"); - $this->pwd = getcwd(); + $oldcwd = getcwd(); $need_download = false; if (preg_match('#^(http|ftp)://#', $pkgfile)) { $need_download = true; @@ -144,34 +135,40 @@ class PEAR_Installer extends PEAR_Common $pkgfile = getcwd() . DIRECTORY_SEPARATOR . basename($pkgfile); if (PEAR::isError($tmpdir = $this->mkTempDir())) { + chdir($oldcwd); return $tmpdir; } $this->log(2, '+ tmp dir created at ' . $tmpdir); $tar = new Archive_Tar($pkgfile, true); if (!$tar->extract($tmpdir)) { + chdir($oldcwd); return $this->raiseError("Unable to unpack $pkgfile"); } $file = basename($pkgfile); // Assume the decompressed dir name if (($pos = strrpos($file, '.')) === false) { + chdir($oldcwd); return $this->raiseError('package doesn\'t follow the package name convention'); } $pkgdir = substr($file, 0, $pos); $descfile = $tmpdir . DIRECTORY_SEPARATOR . $pkgdir . DIRECTORY_SEPARATOR . 'package.xml'; if (!is_file($descfile)) { + chdir($oldcwd); return $this->raiseError("No package.xml file after extracting the archive."); } // Parse xml file ----------------------------------------------- $pkginfo = $this->infoFromDescriptionFile($descfile); if (PEAR::isError($pkginfo)) { + chdir($oldcwd); return $pkginfo; } // Copy files to dest dir --------------------------------------- if (!is_dir($this->phpdir)) { + chdir($oldcwd); return $this->raiseError("No script destination directory found\n", null, PEAR_ERROR_DIE); } @@ -187,6 +184,7 @@ class PEAR_Installer extends PEAR_Common $fname = $tmp_path . DIRECTORY_SEPARATOR . $fname; $this->_installFile($fname, $dest_dir, $atts); } + chdir($oldcwd); return true; } @@ -228,6 +226,8 @@ class PEAR_Installer extends PEAR_Common $this->log(1, "installed file $dest_file"); return true; } + // }}} } + ?> \ No newline at end of file diff --git a/pear/PEAR/Registry.php b/pear/PEAR/Registry.php index 7055951654e..d5319a45de4 100644 --- a/pear/PEAR/Registry.php +++ b/pear/PEAR/Registry.php @@ -156,8 +156,11 @@ class PEAR_Registry function listPackages() { - $dp = opendir($this->statedir); $pkglist = array(); + $dp = @opendir($this->statedir); + if (!$dp) { + return $pkglist; + } while ($ent = readdir($dp)) { if ($ent{0} == "." || substr($ent, -4) != ".inf") { continue; diff --git a/pear/scripts/pear.in b/pear/scripts/pear.in index 6b0e5bbc9a2..bba3c62adc1 100644 --- a/pear/scripts/pear.in +++ b/pear/scripts/pear.in @@ -21,6 +21,7 @@ require_once 'PEAR.php'; require_once 'PEAR/Config.php'; require_once 'PEAR/Remote.php'; +require_once 'PEAR/Registry.php'; require_once 'Console/Getopt.php'; error_reporting(E_ALL ^ E_NOTICE); @@ -29,7 +30,7 @@ PEAR::setErrorHandling(PEAR_ERROR_PRINT, "pear: %s\n"); // {{{ config file and option parsing -$options = Console_Getopt::getopt($argv, "c:C:d:D:h?sS"); +$options = Console_Getopt::getopt($argv, "c:C:d:D:h?sSqv"); if (PEAR::isError($options)) { usage($options); } @@ -58,6 +59,7 @@ foreach ($opts as $opt) { $config = new PEAR_Config($pear_user_config, $pear_default_config); $store_user_config = false; $store_default_config = false; +$verbose = 0; foreach ($opts as $opt) { $param = $opt[1]; @@ -76,6 +78,12 @@ foreach ($opts as $opt) { case 'S': $store_default_config = true; break; + case 'v': + $verbose++; + break; + case 'q': + $verbose--; + break; } } @@ -109,9 +117,28 @@ $script_dir = $config->get("php_dir"); $ext_dir = $config->get("ext_dir"); $doc_dir = $config->get("doc_dir"); +$command = $options[1][1]; +$rest = array_slice($options[1], 2); + +$command_options = array( + "list" => "v", +); + +if (isset($command_options[$command])) { + $tmp = Console_Getopt::getopt($rest, $command_options[$command]); + if (PEAR::isError($tmp)) { + usage($tmp); + } + $cmdopt = $tmp[0]; + $cmdargs = $tmp[1]; +} else { + $cmdopt = array(); + $cmdargs = $rest; +} + + // }}} -$command = $options[1][1]; switch ($command) { // {{{ install @@ -145,12 +172,38 @@ switch ($command) { } // }}} - // {{{ list-packages + // {{{ list - case 'list-packages': { + case 'list': { + $reg = new PEAR_Registry; + $installed = $reg->packageInfo(); + $i = $j = 0; + print "Installed packages:\n===================\n"; + foreach ($installed as $package) { + if ($i++ % 20 == 0) { + if ($j++ > 0) { + print "\n"; + } + printf("%-20s %-10s %-15s %s\n", + "Package", "Stable", "Lead", "Category"); + print str_repeat("=", 75)."\n"; + } + $stable = $package['stable']; + printf("%-20s %-10s %-15s %s\n", $package['name'], + $stable ? $stable : "???", + $package['lead'], $package['category']); + } + break; + } + + // }}} + // {{{ list-remote + + case 'list-remote': { $remote = new PEAR_Remote($config); $result = $remote->call('package.listAll'); $i = $j = 0; + print "Available packages:\n===================\n"; foreach ($result as $package) { if ($i++ % 20 == 0) { if ($j++ > 0) { @@ -190,14 +243,20 @@ function usage($error = null) fputs($stderr, "Usage: pear [options] command \n". "Options:\n". - " -v set verbosity level to (0-2, default 1)\n". - " -p set script install dir (absolute path)\n". - " -e set extension install dir (absolute path)\n". - " -d set documentation dest dir (absolute path)\n". - " -h, -? display help/usage (this message)\n". + " -v increase verbosity level (default 1)\n". + " -q be quiet, decrease verbosity level\n". + " -c file find user configuration in `file'\n". + " -C file find system configuration in `file'\n". + " -d foo=bar set user config variable `foo' to `bar'\n". + " -D foo=bar set system config variable `foo' to `bar'\n". + " -s store user configuration\n". + " -s store system configuration\n". + " -h, -? display help/usage (this message)\n". "Commands:\n". " install \n". " package [package info file]\n". + " list\n". + " list-remote\n". "\n"); fclose($stderr); exit;