#!@prefix@/bin/php -Cq | // | Tomas V.V.Cox | // +----------------------------------------------------------------------+ // require_once 'PEAR.php'; require_once "PEAR/Config.php"; require_once "PEAR/Command.php"; require_once "Console/Getopt.php"; PEAR_Command::setUIType('CLI'); $all_commands = PEAR_Command::getCommands(); $cmd_options = PEAR_Command::getOptions(); $progname = basename($argv[0]); PEAR::setErrorHandling(PEAR_ERROR_DIE, "$progname: %s\n"); $argv = Console_Getopt::readPHPArgv(); // XXX change Getopt to use raiseError() ? $options = Console_Getopt::getopt($argv, "c:C:d:D:h?sSqu:v" . $cmd_options); if (PEAR::isError($options)) { usage($options); } $opts = $options[0]; $pear_user_config = ''; $pear_system_config = ''; $store_user_config = false; $store_system_config = false; $verbose = 1; foreach ($opts as $opt) { switch ($opt[0]) { case 'c': $pear_user_config = $opt[1]; break; case 'C': $pear_system_config = $opt[1]; break; } } $config = &PEAR_Config::singleton($pear_user_config, $pear_system_config); $verbose = $config->get("verbose"); $cmdopts = array(); foreach ($opts as $opt) { $param = !empty($opt[1]) ? $opt[1] : null; switch ($opt[0]) { case 'd': list($key, $value) = explode('=', $param); $config->set($key, $value, 'user'); break; case 'D': list($key, $value) = explode('=', $param); $config->set($key, $value, 'system'); break; case 's': $store_user_config = true; break; case 'S': $store_system_config = true; break; case 'u': $config->remove($param, 'user'); break; case 'v': $config->set('verbose', $verbose + 1); break; case 'q': $config->set('verbose', $verbose - 1); break; default: // all non pear params goes to the command $cmdopts[$opt[0]] = $param; break; } } if ($store_system_config) { $config->store('system'); } if ($store_user_config) { $config->store('user'); } $command = (isset($options[1][1])) ? $options[1][1] : null; if (empty($command) && ($store_user_config || $store_system_config)) { exit; } if (empty($all_commands[$command]) || $command == 'help') { usage(null, @$options[1][2]); } $cmd = PEAR_Command::factory($command, $config); if (PEAR::isError($cmd)) { die($cmd->getMessage()); } $cmdargs = array_slice($options[1], 2); $ok = $cmd->run($command, $cmdopts, $cmdargs); if ($ok === false) { PEAR::raiseError("unknown command `$command'"); } exit; // {{{ usage() function usage($error = null, $helpsubject = null) { global $progname, $all_commands; $stderr = fopen('php://stderr', 'w'); if (PEAR::isError($error)) { fputs($stderr, $error->getMessage()); } elseif ($error !== null) { fputs($stderr, $error); } fputs($stderr, "Usage: $progname [options] command [command-options] \n"); if ($helpsubject == "options") { fputs($stderr, "Options:\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". " -u foo unset `foo' in the user configuration\n". " -h, -? display help/usage (this message)\n"); } else { fputs($stderr, "Type \"$progname help options\" to list all options.\n"); } fputs($stderr, "Commands:\n " . implode("\n ", array_keys($all_commands)) . "\n"); fclose($stderr); exit; } // }}} // {{{ present_array() function present_array(&$arr, $keys = null) { if ($keys === null) { $keys = array_keys($arr); } $longest_key = max(array_map("strlen", array_keys($arr))) + 2; $format_string = "%{$longest_key}s : %s\n"; foreach ($keys as $k) { if (is_array($arr[$k])) { foreach ($arr[$k] as $i => $value) { $x = "$k #$i"; $cont = array(); foreach(array_keys($value) as $val) { $cont[] = "$val=" . $value[$val]; } $v = implode(", ", $cont); printf($format_string, $x, $v); } continue; } else { $v = $arr[$k]; printf($format_string, $k, $v); } } } // }}} // {{{ heading() function heading($text) { $l = strlen(trim($text)); print rtrim($text) . "\n" . str_repeat("=", $l) . "\n"; } // }}} /* * Local variables: * tab-width: 4 * c-basic-offset: 4 * indent-tabs-mode: nil * End: */ ?>