*/
// 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");
}
?>