*/ // Looks like PEAR is being developed without E_NOTICE (1.7.0RC1) error_reporting(E_ALL & ~E_NOTICE); // just a shortcut if (!defined('DS')) { define('DS', DIRECTORY_SEPARATOR); } // add PEAR lib in include_path if needed $_includePath = get_include_path(); $_pearDir = dirname(dirname(dirname(__FILE__))) . DS . 'downloader' . DS . 'pearlib'; if (!getenv('PHP_PEAR_INSTALL_DIR')) { putenv('PHP_PEAR_INSTALL_DIR=' . $_pearDir); } $_pearPhpDir = $_pearDir . DS . 'php'; if (strpos($_includePath, $_pearPhpDir) === false) { if (substr($_includePath, 0, 2) === '.' . PATH_SEPARATOR) { $_includePath = '.' . PATH_SEPARATOR . $_pearPhpDir . PATH_SEPARATOR . substr($_includePath, 2); } else { $_includePath = $_pearPhpDir . PATH_SEPARATOR . $_includePath; } set_include_path($_includePath); } // include necessary PEAR libs require_once $_pearPhpDir."/PEAR.php"; require_once $_pearPhpDir."/PEAR/Frontend.php"; require_once $_pearPhpDir."/PEAR/Registry.php"; require_once $_pearPhpDir."/PEAR/Config.php"; require_once $_pearPhpDir."/PEAR/Command.php"; require_once $_pearPhpDir."/PEAR/Exception.php"; require_once dirname(__FILE__)."/Pear/Frontend.php"; require_once dirname(__FILE__)."/Pear/Package.php"; class Varien_Pear { protected $_config; protected $_registry; protected $_frontend; protected $_cmdCache = array(); static protected $_instance; static public $reloadOnRegistryUpdate = true; public function __construct() { $this->getConfig(); } public function getInstance() { if (!self::$_instance) { self::$_instance = new self; } return self::$_instance; } public function isSystemPackage($pkg) { return in_array($pkg, array('Archive_Tar', 'Console_Getopt', 'PEAR', 'Structures_Graph')); } public function getBaseDir() { return dirname(dirname(dirname(__FILE__))); } public function getPearDir() { return $this->getBaseDir().DS.'downloader'.DS.'pearlib'; } public function getConfig() { if (!$this->_config) { $pear_dir = $this->getPearDir(); $config = PEAR_Config::singleton($pear_dir.DS.'pear.ini', '-'); $config->set('auto_discover', 1); $config->set('cache_ttl', 60); #$config->set('preferred_state', 'beta'); $config->set('bin_dir', $pear_dir); $config->set('php_dir', $pear_dir.DS.'php'); $config->set('download_dir', $pear_dir.DS.'download'); $config->set('temp_dir', $pear_dir.DS.'temp'); $config->set('data_dir', $pear_dir.DS.'data'); $config->set('cache_dir', $pear_dir.DS.'cache'); $config->set('test_dir', $pear_dir.DS.'tests'); $config->set('doc_dir', $pear_dir.DS.'docs'); $mageDir = $config->get('mage_dir'); foreach ($config->getKeys() as $key) { if (!(substr($key, 0, 5)==='mage_' && substr($key, -4)==='_dir')) { continue; } $config->set($key, preg_replace('#^'.preg_quote($mageDir).'#', $this->getBaseDir(), $config->get($key))); #echo $key.' : '.$config->get($key).'
'; } $reg = $this->getRegistry(); $config->setRegistry($reg); PEAR_DependencyDB::singleton($config, $pear_dir.DS.'php'.DS.'.depdb'); PEAR_Frontend::setFrontendObject($this->getFrontend()); PEAR_Command::registerCommands(false, $pear_dir.DS.'php'.DS.'PEAR'.DS.'Command'.DS); $this->_config = $config; } return $this->_config; } public function getMagentoChannels() { return array('connect.magentocommerce.com/core', 'connect.magentocommerce.com/community'); } public function getRegistry($redirectOnChange=true) { if (!$this->_registry) { $this->_registry = new Varien_Pear_Registry($this->getPearDir().DS.'php'); $changed = false; foreach ($this->getMagentoChannels() as $channel) { if (!$this->getRegistry()->channelExists($channel)) { $this->run('channel-discover', array(), array($channel)); $changed = true; } } if ($changed) { $this->_registry = new Varien_Pear_Registry($this->getPearDir().DS.'php'); } // if ($changed && self::$reloadOnRegistryUpdate && empty($_GET['pear_registry'])) { // echo "TEST:"; // echo self::$reloadOnRegistryUpdate; // //TODO:refresh registry in memory to reflect discovered channels without redirect // #header("Location: ".$_SERVER['SCRIPT_NAME'].'?'.$_SERVER['QUERY_STRING'].'&pear_registry=1'); // exit; // } } return $this->_registry; } public function getFrontend() { if (!$this->_frontend) { $this->_frontend = new Varien_Pear_Frontend; } return $this->_frontend; } public function getLog() { return $this->getFrontend()->getLog(); } public function getOutput() { return $this->getFrontend()->getOutput(); } public function run($command, $options=array(), $params=array()) { @set_time_limit(0); @ini_set('memory_limit', '256M'); if (empty($this->_cmdCache[$command])) { $cmd = PEAR_Command::factory($command, $this->getConfig()); if ($cmd instanceof PEAR_Error) { return $cmd; } $this->_cmdCache[$command] = $cmd; } else { $cmd = $this->_cmdCache[$command]; } #$cmd = PEAR_Command::factory($command, $this->getConfig()); $result = $cmd->run($command, $options, $params); return $result; } public function setRemoteConfig($uri) #$host, $user, $password, $path='', $port=null) { #$uri = 'ftp://' . $user . ':' . $password . '@' . $host . (is_numeric($port) ? ':' . $port : '') . '/' . trim($path, '/') . '/'; $this->run('config-set', array(), array('remote_config', $uri)); return $this; } /** * Run PEAR command with html output console style * * @param array|Varien_Object $runParams command, options, params, * comment, success_callback, failure_callback */ public function runHtmlConsole($runParams) { ob_implicit_flush(); $fe = $this->getFrontend(); $oldLogStream = $fe->getLogStream(); $fe->setLogStream('stdout'); if ($runParams instanceof Varien_Object) { $run = $runParams; } elseif (is_array($runParams)) { $run = new Varien_Object($runParams); } elseif (is_string($runParams)) { $run = new Varien_Object(array('title'=>$runParams)); } else { throw Varien_Exception("Invalid run parameters"); } ?> ".$run->getComment(); if ($command = $run->getCommand()) { $result = $this->run($command, $run->getOptions(), $run->getParams()); if ($result instanceof PEAR_Error) { echo "\r\n\r\nPEAR ERROR: ".$result->getMessage(); } echo ''; } else { $result = false; echo ''; } ?> setLogStream($oldLogStream); return $result; } }