📄 channels.php
字号:
<?php// /* vim: set expandtab tabstop=4 shiftwidth=4: *//** * PEAR_Command_Channels (list-channels, update-channels, channel-delete, channel-add, * channel-update, channel-info, channel-alias, channel-discover commands) * * 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: Channels.php,v 1.56 2007/06/10 04:34:19 cellog Exp $ * @link http://pear.php.net/package/PEAR * @since File available since Release 1.4.0a1 *//** * base class */require_once 'PEAR/Command/Common.php';/** * PEAR commands for managing channels. * * @category pear * @package PEAR * @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.6.1 * @link http://pear.php.net/package/PEAR * @since Class available since Release 1.4.0a1 */class PEAR_Command_Channels extends PEAR_Command_Common{ // {{{ properties var $commands = array( 'list-channels' => array( 'summary' => 'List Available Channels', 'function' => 'doList', 'shortcut' => 'lc', 'options' => array(), 'doc' => 'List all available channels for installation.', ), 'update-channels' => array( 'summary' => 'Update the Channel List', 'function' => 'doUpdateAll', 'shortcut' => 'uc', 'options' => array(), 'doc' => 'List all installed packages in all channels.' ), 'channel-delete' => array( 'summary' => 'Remove a Channel From the List', 'function' => 'doDelete', 'shortcut' => 'cde', 'options' => array(), 'doc' => '<channel name>Delete a channel from the registry. You may notremove any channel that has installed packages.' ), 'channel-add' => array( 'summary' => 'Add a Channel', 'function' => 'doAdd', 'shortcut' => 'ca', 'options' => array(), 'doc' => '<channel.xml>Add a private channel to the channel list. Note that allpublic channels should be synced using "update-channels".Parameter may be either a local file or remote URL to achannel.xml.' ), 'channel-update' => array( 'summary' => 'Update an Existing Channel', 'function' => 'doUpdate', 'shortcut' => 'cu', 'options' => array( 'force' => array( 'shortopt' => 'f', 'doc' => 'will force download of new channel.xml if an existing channel name is used', ), 'channel' => array( 'shortopt' => 'c', 'arg' => 'CHANNEL', 'doc' => 'will force download of new channel.xml if an existing channel name is used', ),), 'doc' => '[<channel.xml>|<channel name>]Update a channel in the channel list directly. Note that allpublic channels can be synced using "update-channels".Parameter may be a local or remote channel.xml, or the name ofan existing channel.' ), 'channel-info' => array( 'summary' => 'Retrieve Information on a Channel', 'function' => 'doInfo', 'shortcut' => 'ci', 'options' => array(), 'doc' => '<package>List the files in an installed package.' ), 'channel-alias' => array( 'summary' => 'Specify an alias to a channel name', 'function' => 'doAlias', 'shortcut' => 'cha', 'options' => array(), 'doc' => '<channel> <alias>Specify a specific alias to use for a channel name.The alias may not be an existing channel name oralias.' ), 'channel-discover' => array( 'summary' => 'Initialize a Channel from its server', 'function' => 'doDiscover', 'shortcut' => 'di', 'options' => array(), 'doc' => '[<channel.xml>|<channel name>]Initialize a channel from its server and create a local channel.xml.If <channel name> is in the format "<username>:<password>@<channel>" then<username> and <password> will be set as the login username/password for<channel>. Use caution when passing the username/password in this way, asit may allow other users on your computer to briefly view your username/password via the system\'s process list.' ), ); // }}} // {{{ constructor /** * PEAR_Command_Registry constructor. * * @access public */ function PEAR_Command_Channels(&$ui, &$config) { parent::PEAR_Command_Common($ui, $config); } // }}} // {{{ doList() function _sortChannels($a, $b) { return strnatcasecmp($a->getName(), $b->getName()); } function doList($command, $options, $params) { $reg = &$this->config->getRegistry(); $registered = $reg->getChannels(); usort($registered, array(&$this, '_sortchannels')); $i = $j = 0; $data = array( 'caption' => 'Registered Channels:', 'border' => true, 'headline' => array('Channel', 'Summary') ); foreach ($registered as $channel) { $data['data'][] = array($channel->getName(), $channel->getSummary()); } if (count($registered)==0) { $data = '(no registered channels)'; } $this->ui->outputData($data, $command); return true; } function doUpdateAll($command, $options, $params) { $reg = &$this->config->getRegistry(); $channels = $reg->getChannels(); $success = true; foreach ($channels as $channel) { if ($channel->getName() != '__uri') { PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $err = $this->doUpdate('channel-update', $options, array($channel->getName())); if (PEAR::isError($err)) { $this->ui->outputData($err->getMessage(), $command); $success = false; } else { $success &= $err; } } } return $success; } function doInfo($command, $options, $params) { if (sizeof($params) != 1) { return $this->raiseError("No channel specified"); } $reg = &$this->config->getRegistry(); $channel = strtolower($params[0]); if ($reg->channelExists($channel)) { $chan = $reg->getChannel($channel); if (PEAR::isError($chan)) { return $this->raiseError($chan); } } else { if (strpos($channel, '://')) { $downloader = &$this->getDownloader(); $tmpdir = $this->config->get('temp_dir'); PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); $loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir); PEAR::staticPopErrorHandling(); if (PEAR::isError($loc)) { return $this->raiseError('Cannot open "' . $channel . '" (' . $loc->getMessage() . ')'); } else { $contents = implode('', file($loc)); } } else { if (file_exists($params[0])) { $fp = fopen($params[0], 'r'); if (!$fp) { return $this->raiseError('Cannot open "' . $params[0] . '"'); } } else { return $this->raiseError('Unknown channel "' . $channel . '"'); } $contents = ''; while (!feof($fp)) { $contents .= fread($fp, 1024); } fclose($fp); } if (!class_exists('PEAR_ChannelFile')) { require_once 'PEAR/ChannelFile.php'; } $chan = new PEAR_ChannelFile; $chan->fromXmlString($contents); $chan->validate(); if ($errs = $chan->getErrors(true)) { foreach ($errs as $err) { $this->ui->outputData($err['level'] . ': ' . $err['message']); } return $this->raiseError('Channel file "' . $params[0] . '" is not valid'); } } if ($chan) { $channel = $chan->getName(); $caption = 'Channel ' . $channel . ' Information:'; $data1 = array( 'caption' => $caption, 'border' => true); $data1['data']['server'] = array('Name and Server', $chan->getName()); if ($chan->getAlias() != $chan->getName()) { $data1['data']['alias'] = array('Alias', $chan->getAlias()); } $data1['data']['summary'] = array('Summary', $chan->getSummary()); $validate = $chan->getValidationPackage(); $data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']); $data1['data']['vpackageversion'] = array('Validation Package Version', $validate['attribs']['version']); $d = array(); $d['main'] = $data1; $data['data'] = array(); $data['caption'] = 'Server Capabilities'; $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base'); $capabilities = $chan->getFunctions('xmlrpc'); $soaps = $chan->getFunctions('soap'); if ($capabilities || $soaps || $chan->supportsREST()) { if ($capabilities) { if (!isset($capabilities[0])) { $capabilities = array($capabilities); } foreach ($capabilities as $protocol) { $data['data'][] = array('xmlrpc', $protocol['attribs']['version'], $protocol['_content']); } } if ($soaps) { if (!isset($soaps[0])) { $soaps = array($soaps); } foreach ($soaps as $protocol) { $data['data'][] = array('soap', $protocol['attribs']['version'], $protocol['_content']); } } if ($chan->supportsREST()) { $funcs = $chan->getFunctions('rest'); if (!isset($funcs[0])) { $funcs = array($funcs); } foreach ($funcs as $protocol) { $data['data'][] = array('rest', $protocol['attribs']['type'], $protocol['_content']); } } } else { $data['data'][] = array('No supported protocols'); } $d['protocols'] = $data; $data['data'] = array(); $mirrors = $chan->getMirrors(); if ($mirrors) { $data['caption'] = 'Channel ' . $channel . ' Mirrors:'; unset($data['headline']); foreach ($mirrors as $mirror) { $data['data'][] = array($mirror['attribs']['host']); $d['mirrors'] = $data; } foreach ($mirrors as $i => $mirror) { $data['data'] = array(); $data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities'; $data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base'); $capabilities = $chan->getFunctions('xmlrpc', $mirror['attribs']['host']); $soaps = $chan->getFunctions('soap', $mirror['attribs']['host']); if ($capabilities || $soaps || $chan->supportsREST($mirror['attribs']['host'])) { if ($capabilities) { if (!isset($capabilities[0])) { $capabilities = array($capabilities); } foreach ($capabilities as $protocol) { $data['data'][] = array('xmlrpc', $protocol['attribs']['version'], $protocol['_content']); } } if ($soaps) { if (!isset($soaps[0])) { $soaps = array($soaps); } foreach ($soaps as $protocol) { $data['data'][] = array('soap', $protocol['attribs']['version'], $protocol['_content']); } } if ($chan->supportsREST($mirror['attribs']['host'])) { $funcs = $chan->getFunctions('rest', $mirror['attribs']['host']); if (!isset($funcs[0])) { $funcs = array($funcs); } foreach ($funcs as $protocol) { $data['data'][] = array('rest', $protocol['attribs']['type'], $protocol['_content']); } } } else { $data['data'][] = array('No supported protocols'); } $d['mirrorprotocols' . $i] = $data;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -