Author: Stig Bakken (ssb@php.net)
Author: Greg Beaver (cellog@php.net)
Inheritance: extends PEAR_Command_Common
 /**
  * (non-PHPdoc)
  * @see lib/Faett/Core/Interfaces/Faett_Core_Interfaces_Service#packageInfo($packageName, $channel)
  */
 public function packageInfo($packageName, $channel)
 {
     // store the default channel
     $savechannel = $this->_config->get('default_channel');
     // check if the cannel already exists
     if ($this->_registry->channelExists($channel)) {
         $this->_config->set('default_channel', $channel);
     } else {
         // throw a new exception
         throw Faett_Core_Exceptions_UnknownChannelException::create('Channel ' . $channel . ' does not exist');
     }
     // load the channel from the registry
     $chan = $this->_registry->getChannel($channel);
     // initialize a REST command for checking the channel's state
     $cmd = new PEAR_Command_Remote($this->_ui, $this->_config);
     if (PEAR::isError($e = $cmd->_checkChannelForStatus($channel, $chan))) {
         // reset the default channel
         $this->_config->set('default_channel', $savechannel);
         // throw a new exception
         throw Faett_Core_Exceptions_UnknownChannelStateException::create($e->getMessage());
     }
     // get the channel's base URL
     $base = $chan->getBaseURL('REST1.0', $this->_config->get('preferred_mirror'));
     // check if the channel's server is REST enabled
     $restSupport = $chan->supportsREST($this->_config->get('preferred_mirror'));
     // check if the channel is REST enabled
     if ($restSupport && $base) {
         // load the channel data and the package information
         $rest = $this->_config->getREST('1.0', array());
         $info = $rest->packageInfo($base, $packageName);
     } else {
         $r = $this->_config->getRemote();
         $info = $r->call('package.info', $packageName);
     }
     // check if the package information was loaded successfully
     if (PEAR::isError($info)) {
         // reset the default channel
         $this->_config->set('default_channel', $savechannel);
         // throw a new exception
         throw Faett_Core_Exceptions_PackageInfoException::create($info->getMessage());
     }
     // if no packge name was found log an error message
     if (!isset($info['name'])) {
         // reset the default channel
         $this->_config->set('default_channel', $savechannel);
         // throw a new exception
         throw Faett_Core_Exceptions_PackageInfoException::create('Can\'t find a package name');
     }
     // check if the package is installed
     $installed = $this->_registry->packageInfo($info['name'], null, $channel);
     // if yes, set the information
     $info['installed'] = $installed['version'] ? $installed['version'] : '';
     if (is_array($info['installed'])) {
         $info['installed'] = $info['installed']['release'];
     }
     // return the package information
     return $info;
 }
    function doListCategory($command, $options, $params)
    {
        if (count($params) < 1) {
            return PEAR::raiseError('Not enough parameters, use: '.$command.' <category> [<category>...]');
        }
        if (count($params) > 1) {
            $errors = array();
            foreach($params as $pkg) {
                $ret = $this->doListCategory($command, $options, array($pkg));
                if ($ret !== true) {
                    $errors[] = $ret;
                    return $ret;
                }
            }
            if (count($errors) !== 0) {
                // for now, only give first error
                return $errors[0];
            }
            return true;
        }
        $category = $params[0];
            
        $savechannel = $channel = $this->config->get('default_channel');
        $reg = &$this->config->getRegistry();
        if (isset($options['channel'])) {
            $channel = $options['channel'];
            if ($reg->channelExists($channel)) {
                $this->config->set('default_channel', $channel);
            } else {
                return $this->raiseError("Channel \"$channel\" does not exist");
            }
        }
        $chan = $reg->getChannel($channel);
        // we need Remote::_checkChannelForStatus()
        require_once 'PEAR/Command/Remote.php';
        //$cmd = new PEAR_Command_Remote($this->ui, $this->config);
        //if (PEAR::isError($e = $cmd->_checkChannelForStatus($channel, $chan))) {
        if (PEAR::isError($e = PEAR_Command_Remote::_checkChannelForStatus($channel, $chan))) {
            return $e;
        }
        if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.1', array());
        } elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
              $base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
            $rest = &$this->config->getREST('1.0', array());
        } else {
            return PEAR::raiseError($command.' only works for REST servers');
        }
        $packages = $rest->listCategory($base, $category, true);
        if (PEAR::isError($packages)) {
            $this->config->set('default_channel', $savechannel);
            return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "' . $packages->getMessage() . '")');
        }

        $data = array(
            'caption' => 'Channel '.$channel.' Category '.$category.' All packages:',
            'border' => true,
            'headline' => array('Channel', 'Package', 'Local', 'Remote', 'Summary'),
            'channel' => $channel,
            );
        if (count($packages) === 0) {
            unset($data['headline']);
            $data['data'] = 'No packages registered';
        } else {
            $data['data'] = array();
            foreach ($packages as $package_data) {
                $package = $package_data['_content'];
                $info = $package_data['info'];
                if (!isset($info['v'])) {
                    $remote = '-';
                } else {
                    $remote = $info['v'].' ('.$info['st'].')';
                }
                $summary = $info['s'];
                if ($reg->packageExists($package, $channel)) {
                    $local = sprintf('%s (%s)',
                        $reg->packageInfo($package, 'version', $channel),
                        $reg->packageInfo($package, 'release_state', $channel));
                } else {
                    $local = '-';
                }
                $data['data'][] = array($channel, $package, $local, $remote, $summary);
            }
        }

        $this->config->set('default_channel', $savechannel);
        $this->ui->outputData($data, $command);
        return true;
    }
 function doSearch($command, $options, $params)
 {
     if ((!isset($params[0]) || empty($params[0])) && (!isset($params[1]) || empty($params[1]))) {
         return $this->raiseError('no valid search string supplied');
     }
     $reg =& $this->config->getRegistry();
     if ($options['allchannels'] == true) {
         // search all channels
         unset($options['allchannels']);
         $channels = $reg->getChannels();
         foreach ($channels as $channel) {
             if ($channel->getName() != '__uri') {
                 $options['channel'] = $channel->getName();
                 $ret = $this->doSearch($command, $options, $params);
                 if ($ret !== true) {
                     return $ret;
                 }
             }
         }
         return true;
     }
     require_once 'PEAR/Command/Remote.php';
     $cmd = new PEAR_Command_Remote(&$this->ui, &$this->config);
     $savechannel = $channel = $this->config->get('default_channel');
     $package = $params[0];
     $summary = isset($params[1]) ? $params[1] : false;
     if (isset($options['channel'])) {
         $reg =& $this->config->getRegistry();
         $channel = $options['channel'];
         if ($reg->channelExists($channel)) {
             $this->config->set('default_channel', $channel);
         } else {
             return $this->raiseError('Channel "' . $channel . '" does not exist');
         }
     }
     $chan = $reg->getChannel($channel);
     if (PEAR::isError($e = $cmd->_checkChannelForStatus($channel, $chan))) {
         return $e;
     }
     if ($chan->supportsREST($this->config->get('preferred_mirror')) && ($base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror')))) {
         $rest =& $this->config->getREST('1.0', array());
         $available = $this->REST_listAll(&$rest, $base, false, false, $package, $summary);
     } else {
         $r =& $this->config->getRemote();
         $available = $r->call('package.search', $package, $summary, true, $this->config->get('preferred_state') == 'stable', true);
     }
     if (PEAR::isError($available)) {
         $this->config->set('default_channel', $savechannel);
         return $this->raiseError($available);
     }
     $data = array('caption' => 'Matched packages, channel ' . $channel . ':', 'border' => true, 'headline' => array('Channel', 'Package', 'Stable/(Latest)', 'Local'));
     // clean exit, no error !
     if (!$available) {
         unset($data['headline']);
         $data['data'] = 'No packages found that match pattern "' . $package . '".';
     } else {
         foreach ($available as $name => $info) {
             $installed = $reg->packageInfo($name, null, $channel);
             $desc = $info['summary'];
             if (isset($params[$name])) {
                 $desc .= "\n\n" . $info['description'];
             }
             if (!isset($info['stable']) || !$info['stable']) {
                 $version_remote = 'none';
             } else {
                 if ($info['unstable']) {
                     $version_remote = $info['unstable'];
                 } else {
                     $version_remote = $info['stable'];
                 }
                 $version_remote .= ' (' . $info['state'] . ')';
             }
             $version = is_array($installed['version']) ? $installed['version']['release'] : $installed['version'];
             $data['data'][$info['category']][] = array($channel, $name, $version_remote, $version, $desc);
         }
     }
     $this->ui->outputData($data, $command);
     $this->config->set('default_channel', $channel);
     return true;
 }