273 lines
8.0 KiB
PHP
273 lines
8.0 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* PEAR_Command_Common base class
|
||
|
*
|
||
|
* PHP versions 4 and 5
|
||
|
*
|
||
|
* @category pear
|
||
|
* @package PEAR
|
||
|
* @author Stig Bakken <ssb@php.net>
|
||
|
* @author Greg Beaver <cellog@php.net>
|
||
|
* @copyright 1997-2009 The Authors
|
||
|
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||
|
* @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-2009 The Authors
|
||
|
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||
|
* @version Release: 1.10.13
|
||
|
* @link http://pear.php.net/package/PEAR
|
||
|
* @since Class available since Release 0.1
|
||
|
*/
|
||
|
class PEAR_Command_Common extends PEAR
|
||
|
{
|
||
|
/**
|
||
|
* 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'
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
* PEAR_Command_Common constructor.
|
||
|
*
|
||
|
* @access public
|
||
|
*/
|
||
|
function __construct(&$ui, &$config)
|
||
|
{
|
||
|
parent::__construct();
|
||
|
$this->config = &$config;
|
||
|
$this->ui = &$ui;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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;
|
||
|
}
|
||
|
|
||
|
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'];
|
||
|
}
|
||
|
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
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']);
|
||
|
foreach ($this->commands[$command]['options'] as $option => $info) {
|
||
|
$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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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+([^\}]+)}/', $help, $matches)) {
|
||
|
foreach($matches[0] as $k => $v) {
|
||
|
$help = preg_replace("/$v/", $config->get($matches[1][$k]), $help);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return array($help, $this->getHelpArgs($command));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* 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;
|
||
|
}
|
||
|
|
||
|
function run($command, $options, $params)
|
||
|
{
|
||
|
if (empty($this->commands[$command]['function'])) {
|
||
|
// look for shortcuts
|
||
|
foreach (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;
|
||
|
|
||
|
//$command = $this->commands[$cmd]['function'];
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
$func = $this->commands[$command]['function'];
|
||
|
}
|
||
|
|
||
|
return $this->$func($command, $options, $params);
|
||
|
}
|
||
|
}
|