743 lines
26 KiB
PHP
743 lines
26 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* PEAR_Frontend_CLI
|
||
|
*
|
||
|
* 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: CLI.php,v 1.59 2006/03/02 13:16:19 pajoye Exp $
|
||
|
* @link http://pear.php.net/package/PEAR
|
||
|
* @since File available since Release 0.1
|
||
|
*/
|
||
|
/**
|
||
|
* base class
|
||
|
*/
|
||
|
require_once 'PEAR/Frontend.php';
|
||
|
|
||
|
/**
|
||
|
* Command-line Frontend for the PEAR Installer
|
||
|
* @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.4.11
|
||
|
* @link http://pear.php.net/package/PEAR
|
||
|
* @since Class available since Release 0.1
|
||
|
*/
|
||
|
class PEAR_Frontend_CLI extends PEAR_Frontend
|
||
|
{
|
||
|
// {{{ properties
|
||
|
|
||
|
/**
|
||
|
* What type of user interface this frontend is for.
|
||
|
* @var string
|
||
|
* @access public
|
||
|
*/
|
||
|
var $type = 'CLI';
|
||
|
var $lp = ''; // line prefix
|
||
|
|
||
|
var $params = array();
|
||
|
var $term = array(
|
||
|
'bold' => '',
|
||
|
'normal' => '',
|
||
|
);
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
// {{{ constructor
|
||
|
|
||
|
function PEAR_Frontend_CLI()
|
||
|
{
|
||
|
parent::PEAR();
|
||
|
$term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1
|
||
|
if (function_exists('posix_isatty') && !posix_isatty(1)) {
|
||
|
// output is being redirected to a file or through a pipe
|
||
|
} elseif ($term) {
|
||
|
// XXX can use ncurses extension here, if available
|
||
|
if (preg_match('/^(xterm|vt220|linux)/', $term)) {
|
||
|
$this->term['bold'] = sprintf("%c%c%c%c", 27, 91, 49, 109);
|
||
|
$this->term['normal']=sprintf("%c%c%c", 27, 91, 109);
|
||
|
} elseif (preg_match('/^vt100/', $term)) {
|
||
|
$this->term['bold'] = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0);
|
||
|
$this->term['normal']=sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0);
|
||
|
}
|
||
|
} elseif (OS_WINDOWS) {
|
||
|
// XXX add ANSI codes here
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
// {{{ displayLine(text)
|
||
|
|
||
|
function displayLine($text)
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::displayLine deprecated", E_USER_ERROR);
|
||
|
}
|
||
|
|
||
|
function _displayLine($text)
|
||
|
{
|
||
|
print "$this->lp$text\n";
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ display(text)
|
||
|
|
||
|
function display($text)
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::display deprecated", E_USER_ERROR);
|
||
|
}
|
||
|
|
||
|
function _display($text)
|
||
|
{
|
||
|
print $text;
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ displayError(eobj)
|
||
|
|
||
|
/**
|
||
|
* @param object PEAR_Error object
|
||
|
*/
|
||
|
function displayError($eobj)
|
||
|
{
|
||
|
return $this->_displayLine($eobj->getMessage());
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ displayFatalError(eobj)
|
||
|
|
||
|
/**
|
||
|
* @param object PEAR_Error object
|
||
|
*/
|
||
|
function displayFatalError($eobj)
|
||
|
{
|
||
|
$this->displayError($eobj);
|
||
|
if (class_exists('PEAR_Config')) {
|
||
|
$config = &PEAR_Config::singleton();
|
||
|
if ($config->get('verbose') > 5) {
|
||
|
if (function_exists('debug_print_backtrace')) {
|
||
|
debug_print_backtrace();
|
||
|
} elseif (function_exists('debug_backtrace')) {
|
||
|
$trace = debug_backtrace();
|
||
|
$raised = false;
|
||
|
foreach ($trace as $i => $frame) {
|
||
|
if (!$raised) {
|
||
|
if (isset($frame['class']) && strtolower($frame['class']) ==
|
||
|
'pear' && strtolower($frame['function']) == 'raiseerror') {
|
||
|
$raised = true;
|
||
|
} else {
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
@$this->_displayLine("#$i: $frame[class]$frame[type]$frame[function] $frame[line]");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
exit(1);
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ displayHeading(title)
|
||
|
|
||
|
function displayHeading($title)
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::displayHeading deprecated", E_USER_ERROR);
|
||
|
}
|
||
|
|
||
|
function _displayHeading($title)
|
||
|
{
|
||
|
print $this->lp.$this->bold($title)."\n";
|
||
|
print $this->lp.str_repeat("=", strlen($title))."\n";
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
|
||
|
/**
|
||
|
* Instruct the runInstallScript method to skip a paramgroup that matches the
|
||
|
* id value passed in.
|
||
|
*
|
||
|
* This method is useful for dynamically configuring which sections of a post-install script
|
||
|
* will be run based on the user's setup, which is very useful for making flexible
|
||
|
* post-install scripts without losing the cross-Frontend ability to retrieve user input
|
||
|
* @param string
|
||
|
*/
|
||
|
function skipParamgroup($id)
|
||
|
{
|
||
|
$this->_skipSections[$id] = true;
|
||
|
}
|
||
|
|
||
|
function runPostinstallScripts(&$scripts)
|
||
|
{
|
||
|
foreach ($scripts as $i => $script) {
|
||
|
$this->runInstallScript($scripts[$i]->_params, $scripts[$i]->_obj);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array $xml contents of postinstallscript tag
|
||
|
* @param object $script post-installation script
|
||
|
* @param string install|upgrade
|
||
|
*/
|
||
|
function runInstallScript($xml, &$script)
|
||
|
{
|
||
|
$this->_skipSections = array();
|
||
|
if (!is_array($xml) || !isset($xml['paramgroup'])) {
|
||
|
$script->run(array(), '_default');
|
||
|
} else {
|
||
|
$completedPhases = array();
|
||
|
if (!isset($xml['paramgroup'][0])) {
|
||
|
$xml['paramgroup'] = array($xml['paramgroup']);
|
||
|
}
|
||
|
foreach ($xml['paramgroup'] as $group) {
|
||
|
if (isset($this->_skipSections[$group['id']])) {
|
||
|
// the post-install script chose to skip this section dynamically
|
||
|
continue;
|
||
|
}
|
||
|
if (isset($group['name'])) {
|
||
|
$paramname = explode('::', $group['name']);
|
||
|
if ($lastgroup['id'] != $paramname[0]) {
|
||
|
continue;
|
||
|
}
|
||
|
$group['name'] = $paramname[1];
|
||
|
if (isset($answers)) {
|
||
|
if (isset($answers[$group['name']])) {
|
||
|
switch ($group['conditiontype']) {
|
||
|
case '=' :
|
||
|
if ($answers[$group['name']] != $group['value']) {
|
||
|
continue 2;
|
||
|
}
|
||
|
break;
|
||
|
case '!=' :
|
||
|
if ($answers[$group['name']] == $group['value']) {
|
||
|
continue 2;
|
||
|
}
|
||
|
break;
|
||
|
case 'preg_match' :
|
||
|
if (!@preg_match('/' . $group['value'] . '/',
|
||
|
$answers[$group['name']])) {
|
||
|
continue 2;
|
||
|
}
|
||
|
break;
|
||
|
default :
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
$lastgroup = $group;
|
||
|
if (isset($group['instructions'])) {
|
||
|
$this->_display($group['instructions']);
|
||
|
}
|
||
|
if (!isset($group['param'][0])) {
|
||
|
$group['param'] = array($group['param']);
|
||
|
}
|
||
|
if (isset($group['param'])) {
|
||
|
if (method_exists($script, 'postProcessPrompts')) {
|
||
|
$prompts = $script->postProcessPrompts($group['param'], $group['id']);
|
||
|
if (!is_array($prompts) || count($prompts) != count($group['param'])) {
|
||
|
$this->outputData('postinstall', 'Error: post-install script did not ' .
|
||
|
'return proper post-processed prompts');
|
||
|
$prompts = $group['param'];
|
||
|
} else {
|
||
|
foreach ($prompts as $i => $var) {
|
||
|
if (!is_array($var) || !isset($var['prompt']) ||
|
||
|
!isset($var['name']) ||
|
||
|
($var['name'] != $group['param'][$i]['name']) ||
|
||
|
($var['type'] != $group['param'][$i]['type'])) {
|
||
|
$this->outputData('postinstall', 'Error: post-install script ' .
|
||
|
'modified the variables or prompts, severe security risk. ' .
|
||
|
'Will instead use the defaults from the package.xml');
|
||
|
$prompts = $group['param'];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
$answers = $this->confirmDialog($prompts);
|
||
|
} else {
|
||
|
$answers = $this->confirmDialog($group['param']);
|
||
|
}
|
||
|
}
|
||
|
if ((isset($answers) && $answers) || !isset($group['param'])) {
|
||
|
if (!isset($answers)) {
|
||
|
$answers = array();
|
||
|
}
|
||
|
array_unshift($completedPhases, $group['id']);
|
||
|
if (!$script->run($answers, $group['id'])) {
|
||
|
$script->run($completedPhases, '_undoOnError');
|
||
|
return;
|
||
|
}
|
||
|
} else {
|
||
|
$script->run($completedPhases, '_undoOnError');
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Ask for user input, confirm the answers and continue until the user is satisfied
|
||
|
* @param array an array of arrays, format array('name' => 'paramname', 'prompt' =>
|
||
|
* 'text to display', 'type' => 'string'[, default => 'default value'])
|
||
|
* @return array
|
||
|
*/
|
||
|
function confirmDialog($params)
|
||
|
{
|
||
|
$answers = array();
|
||
|
$prompts = $types = array();
|
||
|
foreach ($params as $param) {
|
||
|
$prompts[$param['name']] = $param['prompt'];
|
||
|
$types[$param['name']] = $param['type'];
|
||
|
if (isset($param['default'])) {
|
||
|
$answers[$param['name']] = $param['default'];
|
||
|
} else {
|
||
|
$answers[$param['name']] = '';
|
||
|
}
|
||
|
}
|
||
|
do {
|
||
|
$ok = array('yesno' => 'no');
|
||
|
do {
|
||
|
$answers = $this->userDialog('', $prompts, $types, $answers);
|
||
|
} while (count(array_filter($answers)) != count($prompts));
|
||
|
$this->outputData('Your choices:');
|
||
|
foreach ($prompts as $name => $prompt) {
|
||
|
$this->outputData($prompt . ': ' . $answers[$name]);
|
||
|
}
|
||
|
$ok = $this->userDialog('',
|
||
|
array(
|
||
|
'yesno' => 'These Choices OK? (use "abort" to halt)'
|
||
|
),
|
||
|
array(
|
||
|
'yesno' => 'string',
|
||
|
),
|
||
|
array(
|
||
|
'yesno' => 'yes'
|
||
|
)
|
||
|
);
|
||
|
if ($ok['yesno'] == 'abort') {
|
||
|
return false;
|
||
|
}
|
||
|
} while ($ok['yesno'] != 'yes');
|
||
|
return $answers;
|
||
|
}
|
||
|
// {{{ userDialog(prompt, [type], [default])
|
||
|
|
||
|
function userDialog($command, $prompts, $types = array(), $defaults = array())
|
||
|
{
|
||
|
$result = array();
|
||
|
if (is_array($prompts)) {
|
||
|
// php 5.0.0 inexplicably breaks BC with this behavior
|
||
|
// now reading from STDIN is the intended syntax
|
||
|
if (version_compare(phpversion(), '5.0.0', '<')) {
|
||
|
$fp = fopen("php://stdin", "r");
|
||
|
}
|
||
|
foreach ($prompts as $key => $prompt) {
|
||
|
$type = $types[$key];
|
||
|
$default = @$defaults[$key];
|
||
|
if ($type == 'password') {
|
||
|
system('stty -echo');
|
||
|
}
|
||
|
print "$this->lp$prompt ";
|
||
|
if ($default) {
|
||
|
print "[$default] ";
|
||
|
}
|
||
|
print ": ";
|
||
|
if (version_compare(phpversion(), '5.0.0', '<')) {
|
||
|
$line = fgets($fp, 2048);
|
||
|
} else {
|
||
|
if (!defined('STDIN')) {
|
||
|
define('STDIN', fopen('php://stdin', 'r'));
|
||
|
}
|
||
|
$line = fgets(STDIN, 2048);
|
||
|
}
|
||
|
if ($type == 'password') {
|
||
|
system('stty echo');
|
||
|
print "\n";
|
||
|
}
|
||
|
if ($default && trim($line) == "") {
|
||
|
$result[$key] = $default;
|
||
|
} else {
|
||
|
$result[$key] = trim($line);
|
||
|
}
|
||
|
}
|
||
|
if (version_compare(phpversion(), '5.0.0', '<')) {
|
||
|
fclose($fp);
|
||
|
}
|
||
|
}
|
||
|
return $result;
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ userConfirm(prompt, [default])
|
||
|
|
||
|
function userConfirm($prompt, $default = 'yes')
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR);
|
||
|
static $positives = array('y', 'yes', 'on', '1');
|
||
|
static $negatives = array('n', 'no', 'off', '0');
|
||
|
print "$this->lp$prompt [$default] : ";
|
||
|
$fp = fopen("php://stdin", "r");
|
||
|
$line = fgets($fp, 2048);
|
||
|
fclose($fp);
|
||
|
$answer = strtolower(trim($line));
|
||
|
if (empty($answer)) {
|
||
|
$answer = $default;
|
||
|
}
|
||
|
if (in_array($answer, $positives)) {
|
||
|
return true;
|
||
|
}
|
||
|
if (in_array($answer, $negatives)) {
|
||
|
return false;
|
||
|
}
|
||
|
if (in_array($default, $positives)) {
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ startTable([params])
|
||
|
|
||
|
function startTable($params = array())
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::startTable deprecated", E_USER_ERROR);
|
||
|
}
|
||
|
|
||
|
function _startTable($params = array())
|
||
|
{
|
||
|
$params['table_data'] = array();
|
||
|
$params['widest'] = array(); // indexed by column
|
||
|
$params['highest'] = array(); // indexed by row
|
||
|
$params['ncols'] = 0;
|
||
|
$this->params = $params;
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ tableRow(columns, [rowparams], [colparams])
|
||
|
|
||
|
function tableRow($columns, $rowparams = array(), $colparams = array())
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::tableRow deprecated", E_USER_ERROR);
|
||
|
}
|
||
|
|
||
|
function _tableRow($columns, $rowparams = array(), $colparams = array())
|
||
|
{
|
||
|
$highest = 1;
|
||
|
for ($i = 0; $i < sizeof($columns); $i++) {
|
||
|
$col = &$columns[$i];
|
||
|
if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) {
|
||
|
$col = wordwrap($col, $colparams[$i]['wrap'], "\n", 0);
|
||
|
}
|
||
|
if (strpos($col, "\n") !== false) {
|
||
|
$multiline = explode("\n", $col);
|
||
|
$w = 0;
|
||
|
foreach ($multiline as $n => $line) {
|
||
|
if (strlen($line) > $w) {
|
||
|
$w = strlen($line);
|
||
|
}
|
||
|
}
|
||
|
$lines = sizeof($multiline);
|
||
|
} else {
|
||
|
$w = strlen($col);
|
||
|
}
|
||
|
|
||
|
if (isset($this->params['widest'][$i])) {
|
||
|
if ($w > $this->params['widest'][$i]) {
|
||
|
$this->params['widest'][$i] = $w;
|
||
|
}
|
||
|
} else {
|
||
|
$this->params['widest'][$i] = $w;
|
||
|
}
|
||
|
$tmp = count_chars($columns[$i], 1);
|
||
|
// handle unix, mac and windows formats
|
||
|
$lines = (isset($tmp[10]) ? $tmp[10] : (isset($tmp[13]) ? $tmp[13] : 0)) + 1;
|
||
|
if ($lines > $highest) {
|
||
|
$highest = $lines;
|
||
|
}
|
||
|
}
|
||
|
if (sizeof($columns) > $this->params['ncols']) {
|
||
|
$this->params['ncols'] = sizeof($columns);
|
||
|
}
|
||
|
$new_row = array(
|
||
|
'data' => $columns,
|
||
|
'height' => $highest,
|
||
|
'rowparams' => $rowparams,
|
||
|
'colparams' => $colparams,
|
||
|
);
|
||
|
$this->params['table_data'][] = $new_row;
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ endTable()
|
||
|
|
||
|
function endTable()
|
||
|
{
|
||
|
trigger_error("PEAR_Frontend_CLI::endTable deprecated", E_USER_ERROR);
|
||
|
}
|
||
|
|
||
|
function _endTable()
|
||
|
{
|
||
|
extract($this->params);
|
||
|
if (!empty($caption)) {
|
||
|
$this->_displayHeading($caption);
|
||
|
}
|
||
|
if (count($table_data) == 0) {
|
||
|
return;
|
||
|
}
|
||
|
if (!isset($width)) {
|
||
|
$width = $widest;
|
||
|
} else {
|
||
|
for ($i = 0; $i < $ncols; $i++) {
|
||
|
if (!isset($width[$i])) {
|
||
|
$width[$i] = $widest[$i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
$border = false;
|
||
|
if (empty($border)) {
|
||
|
$cellstart = '';
|
||
|
$cellend = ' ';
|
||
|
$rowend = '';
|
||
|
$padrowend = false;
|
||
|
$borderline = '';
|
||
|
} else {
|
||
|
$cellstart = '| ';
|
||
|
$cellend = ' ';
|
||
|
$rowend = '|';
|
||
|
$padrowend = true;
|
||
|
$borderline = '+';
|
||
|
foreach ($width as $w) {
|
||
|
$borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1);
|
||
|
$borderline .= '+';
|
||
|
}
|
||
|
}
|
||
|
if ($borderline) {
|
||
|
$this->_displayLine($borderline);
|
||
|
}
|
||
|
for ($i = 0; $i < sizeof($table_data); $i++) {
|
||
|
extract($table_data[$i]);
|
||
|
if (!is_array($rowparams)) {
|
||
|
$rowparams = array();
|
||
|
}
|
||
|
if (!is_array($colparams)) {
|
||
|
$colparams = array();
|
||
|
}
|
||
|
$rowlines = array();
|
||
|
if ($height > 1) {
|
||
|
for ($c = 0; $c < sizeof($data); $c++) {
|
||
|
$rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]);
|
||
|
if (sizeof($rowlines[$c]) < $height) {
|
||
|
$rowlines[$c] = array_pad($rowlines[$c], $height, '');
|
||
|
}
|
||
|
}
|
||
|
} else {
|
||
|
for ($c = 0; $c < sizeof($data); $c++) {
|
||
|
$rowlines[$c] = array($data[$c]);
|
||
|
}
|
||
|
}
|
||
|
for ($r = 0; $r < $height; $r++) {
|
||
|
$rowtext = '';
|
||
|
for ($c = 0; $c < sizeof($data); $c++) {
|
||
|
if (isset($colparams[$c])) {
|
||
|
$attribs = array_merge($rowparams, $colparams);
|
||
|
} else {
|
||
|
$attribs = $rowparams;
|
||
|
}
|
||
|
$w = isset($width[$c]) ? $width[$c] : 0;
|
||
|
//$cell = $data[$c];
|
||
|
$cell = $rowlines[$c][$r];
|
||
|
$l = strlen($cell);
|
||
|
if ($l > $w) {
|
||
|
$cell = substr($cell, 0, $w);
|
||
|
}
|
||
|
if (isset($attribs['bold'])) {
|
||
|
$cell = $this->bold($cell);
|
||
|
}
|
||
|
if ($l < $w) {
|
||
|
// not using str_pad here because we may
|
||
|
// add bold escape characters to $cell
|
||
|
$cell .= str_repeat(' ', $w - $l);
|
||
|
}
|
||
|
|
||
|
$rowtext .= $cellstart . $cell . $cellend;
|
||
|
}
|
||
|
if (!$border) {
|
||
|
$rowtext = rtrim($rowtext);
|
||
|
}
|
||
|
$rowtext .= $rowend;
|
||
|
$this->_displayLine($rowtext);
|
||
|
}
|
||
|
}
|
||
|
if ($borderline) {
|
||
|
$this->_displayLine($borderline);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ outputData()
|
||
|
|
||
|
function outputData($data, $command = '_default')
|
||
|
{
|
||
|
switch ($command) {
|
||
|
case 'channel-info':
|
||
|
foreach ($data as $type => $section) {
|
||
|
if ($type == 'main') {
|
||
|
$section['data'] = array_values($section['data']);
|
||
|
}
|
||
|
$this->outputData($section);
|
||
|
}
|
||
|
break;
|
||
|
case 'install':
|
||
|
case 'upgrade':
|
||
|
case 'upgrade-all':
|
||
|
if (isset($data['release_warnings'])) {
|
||
|
$this->_displayLine('');
|
||
|
$this->_startTable(array(
|
||
|
'border' => false,
|
||
|
'caption' => 'Release Warnings'
|
||
|
));
|
||
|
$this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55)));
|
||
|
$this->_endTable();
|
||
|
$this->_displayLine('');
|
||
|
}
|
||
|
$this->_displayLine($data['data']);
|
||
|
break;
|
||
|
case 'search':
|
||
|
$this->_startTable($data);
|
||
|
if (isset($data['headline']) && is_array($data['headline'])) {
|
||
|
$this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55)));
|
||
|
}
|
||
|
|
||
|
foreach($data['data'] as $category) {
|
||
|
foreach($category as $pkg) {
|
||
|
$this->_tableRow($pkg, null, array(1 => array('wrap' => 55)));
|
||
|
}
|
||
|
};
|
||
|
$this->_endTable();
|
||
|
break;
|
||
|
case 'list-all':
|
||
|
$this->_startTable($data);
|
||
|
if (isset($data['headline']) && is_array($data['headline'])) {
|
||
|
$this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55)));
|
||
|
}
|
||
|
|
||
|
foreach($data['data'] as $category) {
|
||
|
foreach($category as $pkg) {
|
||
|
unset($pkg[4]);
|
||
|
unset($pkg[5]);
|
||
|
$this->_tableRow($pkg, null, array(1 => array('wrap' => 55)));
|
||
|
}
|
||
|
};
|
||
|
$this->_endTable();
|
||
|
break;
|
||
|
case 'config-show':
|
||
|
$data['border'] = false;
|
||
|
$opts = array(0 => array('wrap' => 30),
|
||
|
1 => array('wrap' => 20),
|
||
|
2 => array('wrap' => 35));
|
||
|
$this->_startTable($data);
|
||
|
if (isset($data['headline']) && is_array($data['headline'])) {
|
||
|
$this->_tableRow($data['headline'],
|
||
|
array('bold' => true),
|
||
|
$opts);
|
||
|
}
|
||
|
foreach($data['data'] as $group) {
|
||
|
foreach($group as $value) {
|
||
|
if ($value[2] == '') {
|
||
|
$value[2] = "<not set>";
|
||
|
}
|
||
|
$this->_tableRow($value, null, $opts);
|
||
|
}
|
||
|
}
|
||
|
$this->_endTable();
|
||
|
break;
|
||
|
case 'remote-info':
|
||
|
$data = array(
|
||
|
'caption' => 'Package details:',
|
||
|
'border' => false,
|
||
|
'data' => array(
|
||
|
array("Latest", $data['stable']),
|
||
|
array("Installed", $data['installed']),
|
||
|
array("Package", $data['name']),
|
||
|
array("License", $data['license']),
|
||
|
array("Category", $data['category']),
|
||
|
array("Summary", $data['summary']),
|
||
|
array("Description", $data['description']),
|
||
|
),
|
||
|
);
|
||
|
default: {
|
||
|
if (is_array($data)) {
|
||
|
$this->_startTable($data);
|
||
|
$count = count($data['data'][0]);
|
||
|
if ($count == 2) {
|
||
|
$opts = array(0 => array('wrap' => 25),
|
||
|
1 => array('wrap' => 48)
|
||
|
);
|
||
|
} elseif ($count == 3) {
|
||
|
$opts = array(0 => array('wrap' => 30),
|
||
|
1 => array('wrap' => 20),
|
||
|
2 => array('wrap' => 35)
|
||
|
);
|
||
|
} else {
|
||
|
$opts = null;
|
||
|
}
|
||
|
if (isset($data['headline']) && is_array($data['headline'])) {
|
||
|
$this->_tableRow($data['headline'],
|
||
|
array('bold' => true),
|
||
|
$opts);
|
||
|
}
|
||
|
foreach($data['data'] as $row) {
|
||
|
$this->_tableRow($row, null, $opts);
|
||
|
}
|
||
|
$this->_endTable();
|
||
|
} else {
|
||
|
$this->_displayLine($data);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
// {{{ log(text)
|
||
|
|
||
|
|
||
|
function log($text, $append_crlf = true)
|
||
|
{
|
||
|
if ($append_crlf) {
|
||
|
return $this->_displayLine($text);
|
||
|
}
|
||
|
return $this->_display($text);
|
||
|
}
|
||
|
|
||
|
|
||
|
// }}}
|
||
|
// {{{ bold($text)
|
||
|
|
||
|
function bold($text)
|
||
|
{
|
||
|
if (empty($this->term['bold'])) {
|
||
|
return strtoupper($text);
|
||
|
}
|
||
|
return $this->term['bold'] . $text . $this->term['normal'];
|
||
|
}
|
||
|
|
||
|
// }}}
|
||
|
}
|
||
|
|
||
|
?>
|