Rev 94 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php/*** PEAR_Command_Common base class** PHP versions 4 and 5** LICENSE: This source file is subject to version 3.0 of the PHP license* that is available through the world-wide-web at the following URI:* http://www.php.net/license/3_0.txt. If you did not receive a copy of* the PHP License and are unable to obtain it through the web, please* send a note to license@php.net so we can mail you a copy immediately.** @category pear* @package PEAR* @author Stig Bakken <ssb@php.net>* @author Greg Beaver <cellog@php.net>* @copyright 1997-2006 The PHP Group* @license http://www.php.net/license/3_0.txt PHP License 3.0* @version CVS: $Id: Common.php,v 1.35 2006/06/08 22:25:18 pajoye Exp $* @link http://pear.php.net/package/PEAR* @since File available since Release 0.1*//*** base class*/require_once 'PEAR.php';/*** PEAR commands base class** @category pear* @package PEAR* @author Stig Bakken <ssb@php.net>* @author Greg Beaver <cellog@php.net>* @copyright 1997-2006 The PHP Group* @license http://www.php.net/license/3_0.txt PHP License 3.0* @version Release: 1.5.1* @link http://pear.php.net/package/PEAR* @since Class available since Release 0.1*/class PEAR_Command_Common extends PEAR{// {{{ properties/*** PEAR_Config object used to pass user system and configuration* on when executing commands** @var PEAR_Config*/var $config;/*** @var PEAR_Registry* @access protected*/var $_registry;/*** User Interface object, for all interaction with the user.* @var object*/var $ui;var $_deps_rel_trans = array('lt' => '<','le' => '<=','eq' => '=','ne' => '!=','gt' => '>','ge' => '>=','has' => '==');var $_deps_type_trans = array('pkg' => 'package','ext' => 'extension','php' => 'PHP','prog' => 'external program','ldlib' => 'external library for linking','rtlib' => 'external runtime library','os' => 'operating system','websrv' => 'web server','sapi' => 'SAPI backend');// }}}// {{{ constructor/*** PEAR_Command_Common constructor.** @access public*/function PEAR_Command_Common(&$ui, &$config){parent::PEAR();$this->config = &$config;$this->ui = &$ui;}// }}}// {{{ getCommands()/*** Return a list of all the commands defined by this class.* @return array list of commands* @access public*/function getCommands(){$ret = array();foreach (array_keys($this->commands) as $command) {$ret[$command] = $this->commands[$command]['summary'];}return $ret;}// }}}// {{{ getShortcuts()/*** Return a list of all the command shortcuts defined by this class.* @return array shortcut => command* @access public*/function getShortcuts(){$ret = array();foreach (array_keys($this->commands) as $command) {if (isset($this->commands[$command]['shortcut'])) {$ret[$this->commands[$command]['shortcut']] = $command;}}return $ret;}// }}}// {{{ getOptions()function getOptions($command){$shortcuts = $this->getShortcuts();if (isset($shortcuts[$command])) {$command = $shortcuts[$command];}if (isset($this->commands[$command]) &&isset($this->commands[$command]['options'])) {return $this->commands[$command]['options'];} else {return null;}}// }}}// {{{ getGetoptArgs()function getGetoptArgs($command, &$short_args, &$long_args){$short_args = "";$long_args = array();if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) {return;}reset($this->commands[$command]['options']);while (list($option, $info) = each($this->commands[$command]['options'])) {$larg = $sarg = '';if (isset($info['arg'])) {if ($info['arg']{0} == '(') {$larg = '==';$sarg = '::';$arg = substr($info['arg'], 1, -1);} else {$larg = '=';$sarg = ':';$arg = $info['arg'];}}if (isset($info['shortopt'])) {$short_args .= $info['shortopt'] . $sarg;}$long_args[] = $option . $larg;}}// }}}// {{{ getHelp()/*** Returns the help message for the given command** @param string $command The command* @return mixed A fail string if the command does not have help or* a two elements array containing [0]=>help string,* [1]=> help string for the accepted cmd args*/function getHelp($command){$config = &PEAR_Config::singleton();if (!isset($this->commands[$command])) {return "No such command \"$command\"";}$help = null;if (isset($this->commands[$command]['doc'])) {$help = $this->commands[$command]['doc'];}if (empty($help)) {// XXX (cox) Fallback to summary if there is no doc (show both?)if (!isset($this->commands[$command]['summary'])) {return "No help for command \"$command\"";}$help = $this->commands[$command]['summary'];}if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) {foreach($matches[0] as $k => $v) {$help = preg_replace("/$v/", $config->get($matches[1][$k]), $help);}}return array($help, $this->getHelpArgs($command));}// }}}// {{{ getHelpArgs()/*** Returns the help for the accepted arguments of a command** @param string $command* @return string The help string*/function getHelpArgs($command){if (isset($this->commands[$command]['options']) &&count($this->commands[$command]['options'])){$help = "Options:\n";foreach ($this->commands[$command]['options'] as $k => $v) {if (isset($v['arg'])) {if ($v['arg'][0] == '(') {$arg = substr($v['arg'], 1, -1);$sapp = " [$arg]";$lapp = "[=$arg]";} else {$sapp = " $v[arg]";$lapp = "=$v[arg]";}} else {$sapp = $lapp = "";}if (isset($v['shortopt'])) {$s = $v['shortopt'];$help .= " -$s$sapp, --$k$lapp\n";} else {$help .= " --$k$lapp\n";}$p = " ";$doc = rtrim(str_replace("\n", "\n$p", $v['doc']));$help .= " $doc\n";}return $help;}return null;}// }}}// {{{ run()function run($command, $options, $params){if (empty($this->commands[$command]['function'])) {// look for shortcutsforeach (array_keys($this->commands) as $cmd) {if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) {if (empty($this->commands[$cmd]['function'])) {return $this->raiseError("unknown command `$command'");} else {$func = $this->commands[$cmd]['function'];}$command = $cmd;break;}}} else {$func = $this->commands[$command]['function'];}return $this->$func($command, $options, $params);}// }}}}?>