From e523edb6f2be7c5e672b3537e295d5007d107af8 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Sun, 26 Jul 2015 08:22:52 +0200 Subject: [PATCH 1/5] add "metadata_dir" configuration option --- PEAR/Command/Install.php | 8 +++++++- PEAR/Config.php | 34 +++++++++++++++++++++++++++++----- PEAR/DependencyDB.php | 9 ++++++--- PEAR/Installer.php | 25 +++++++++++++++---------- PEAR/Registry.php | 23 +++++++++++++---------- 5 files changed, 70 insertions(+), 29 deletions(-) diff --git a/PEAR/Command/Install.php b/PEAR/Command/Install.php index 88c5284..87f8f17 100644 --- a/PEAR/Command/Install.php +++ b/PEAR/Command/Install.php @@ -555,7 +555,13 @@ function doInstall($command, $options, $params) $packrootphp_dir = $this->installer->_prependPath( $this->config->get('php_dir', null, 'pear.php.net'), $options['packagingroot']); - $instreg = new PEAR_Registry($packrootphp_dir); // other instreg! + $metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net'); + if ($metadata_dir) { + $metadata_dir = $this->installer->_prependPath( + $metadata_dir, + $options['packagingroot']); + } + $instreg = new PEAR_Registry($packrootphp_dir, false, false, $metadata_dir); // other instreg! if ($this->config->get('verbose') > 2) { $this->ui->outputData('using package root: ' . $options['packagingroot']); diff --git a/PEAR/Config.php b/PEAR/Config.php index cd2bb91..36ad988 100644 --- a/PEAR/Config.php +++ b/PEAR/Config.php @@ -86,6 +86,13 @@ } } +// Default for metadata_dir +if (getenv('PHP_PEAR_METADATA_DIR')) { + define('PEAR_CONFIG_DEFAULT_METADATA_DIR', getenv('PHP_PEAR_METADATA_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_METADATA_DIR', ''); +} + // Default for ext_dir if (getenv('PHP_PEAR_EXTENSION_DIR')) { define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR')); @@ -397,6 +404,13 @@ class PEAR_Config extends PEAR 'prompt' => 'PEAR directory', 'group' => 'File Locations', ), + 'metadata_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_METADATA_DIR, + 'doc' => 'directory where metadata files are installed (registry, filemap, channels, ...)', + 'prompt' => 'PEAR metadata directory', + 'group' => 'File Locations', + ), 'ext_dir' => array( 'type' => 'directory', 'default' => PEAR_CONFIG_DEFAULT_EXT_DIR, @@ -646,7 +660,9 @@ function __construct($user_file = '', $system_file = '', $ftp_file = false, $this->configuration['default'][$key] = $info['default']; } - $this->_registry['default'] = new PEAR_Registry($this->configuration['default']['php_dir']); + $this->_registry['default'] = new PEAR_Registry( + $this->configuration['default']['php_dir'], false, false, + $this->configuration['default']['metadata_dir']); $this->_registry['default']->setConfig($this, false); $this->_regInitialized['default'] = false; //$GLOBALS['_PEAR_Config_instance'] = &$this; @@ -750,7 +766,9 @@ function readConfigFile($file = null, $layer = 'user', $strict = true) $this->configuration[$layer] = $data; $this->_setupChannels(); if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) { - $this->_registry[$layer] = new PEAR_Registry($phpdir); + $this->_registry[$layer] = new PEAR_Registry( + $phpdir, false, false, + $this->get('metadata_dir', $layer, 'pear.php.net')); $this->_registry[$layer]->setConfig($this, false); $this->_regInitialized[$layer] = false; } else { @@ -907,7 +925,9 @@ function mergeConfigFile($file, $override = true, $layer = 'user', $strict = tru $this->_setupChannels(); if (!$this->_noRegistry && ($phpdir = $this->get('php_dir', $layer, 'pear.php.net'))) { - $this->_registry[$layer] = new PEAR_Registry($phpdir); + $this->_registry[$layer] = new PEAR_Registry( + $phpdir, false, false, + $this->get('metadata_dir', $layer, 'pear.php.net')); $this->_registry[$layer]->setConfig($this, false); $this->_regInitialized[$layer] = false; } else { @@ -1595,7 +1615,9 @@ function _lazyChannelSetup($uselayer = false) if (!is_object($this->_registry[$layer])) { if ($phpdir = $this->get('php_dir', $layer, 'pear.php.net')) { - $this->_registry[$layer] = new PEAR_Registry($phpdir); + $this->_registry[$layer] = new PEAR_Registry( + $phpdir, false, false, + $this->get('metadata_dir', $layer, 'pear.php.net')); $this->_registry[$layer]->setConfig($this, false); $this->_regInitialized[$layer] = false; } else { @@ -2079,7 +2101,9 @@ function setInstallRoot($root) continue; } $this->_registry[$layer] = - new PEAR_Registry($this->get('php_dir', $layer, 'pear.php.net')); + new PEAR_Registry( + $this->get('php_dir', $layer, 'pear.php.net'), false, false, + $this->get('metadata_dir', $layer, 'pear.php.net')); $this->_registry[$layer]->setConfig($this, false); $this->_regInitialized[$layer] = false; } diff --git a/PEAR/DependencyDB.php b/PEAR/DependencyDB.php index 90731e3..4f633ff 100644 --- a/PEAR/DependencyDB.php +++ b/PEAR/DependencyDB.php @@ -120,8 +120,11 @@ function setConfig(&$config, $depdb = false) $this->_registry = &$this->_config->getRegistry(); if (!$depdb) { - $this->_depdb = $this->_config->get('php_dir', null, 'pear.php.net') . - DIRECTORY_SEPARATOR . '.depdb'; + $dir = $this->_config->get('metadata_dir', null, 'pear.php.net'); + if (!$dir) { + $dir = $this->_config->get('php_dir', null, 'pear.php.net'); + } + $this->_depdb = $dir . DIRECTORY_SEPARATOR . '.depdb'; } else { $this->_depdb = $depdb; } @@ -758,4 +761,4 @@ function _registerDep(&$data, &$pkg, $dep, $type, $group = false) ); } } -} \ No newline at end of file +} diff --git a/PEAR/Installer.php b/PEAR/Installer.php index 5bd7b58..c28167b 100644 --- a/PEAR/Installer.php +++ b/PEAR/Installer.php @@ -1128,15 +1128,6 @@ function install($pkgfile, $options = array()) $pkgname = $pkg->getName(); $channel = $pkg->getChannel(); - if (isset($this->_options['packagingroot'])) { - $regdir = $this->_prependPath( - $this->config->get('php_dir', null, 'pear.php.net'), - $this->_options['packagingroot']); - - $packrootphp_dir = $this->_prependPath( - $this->config->get('php_dir', null, $channel), - $this->_options['packagingroot']); - } if (isset($options['installroot'])) { $this->config->setInstallRoot($options['installroot']); @@ -1148,7 +1139,21 @@ function install($pkgfile, $options = array()) $this->config->setInstallRoot(false); $this->_registry = &$this->config->getRegistry(); if (isset($this->_options['packagingroot'])) { - $installregistry = new PEAR_Registry($regdir); + $regdir = $this->_prependPath( + $this->config->get('php_dir', null, 'pear.php.net'), + $this->_options['packagingroot']); + + $metadata_dir = $this->config->get('metadata_dir', null, 'pear.php.net'); + if ($metadata_dir) { + $metadata_dir = $this->_prependPath( + $metadata_dir, + $this->_options['packagingroot']); + } + $packrootphp_dir = $this->_prependPath( + $this->config->get('php_dir', null, $channel), + $this->_options['packagingroot']); + + $installregistry = new PEAR_Registry($regdir, false, false, $metadata_dir); if (!$installregistry->channelExists($channel, true)) { // we need to fake a channel-discover of this channel $chanobj = $this->_registry->getChannel($channel, true); diff --git a/PEAR/Registry.php b/PEAR/Registry.php index 8bad666..6103907 100644 --- a/PEAR/Registry.php +++ b/PEAR/Registry.php @@ -131,23 +131,26 @@ class PEAR_Registry extends PEAR * @access public */ function __construct($pear_install_dir = PEAR_INSTALL_DIR, $pear_channel = false, - $pecl_channel = false) + $pecl_channel = false, $pear_metadata_dir = '') { parent::__construct(); - $this->setInstallDir($pear_install_dir); + $this->setInstallDir($pear_install_dir, $pear_metadata_dir); $this->_pearChannel = $pear_channel; $this->_peclChannel = $pecl_channel; $this->_config = false; } - function setInstallDir($pear_install_dir = PEAR_INSTALL_DIR) + function setInstallDir($pear_install_dir = PEAR_INSTALL_DIR, $pear_metadata_dir = '') { $ds = DIRECTORY_SEPARATOR; $this->install_dir = $pear_install_dir; - $this->channelsdir = $pear_install_dir.$ds.'.channels'; - $this->statedir = $pear_install_dir.$ds.'.registry'; - $this->filemap = $pear_install_dir.$ds.'.filemap'; - $this->lockfile = $pear_install_dir.$ds.'.lock'; + if (!$pear_metadata_dir) { + $pear_metadata_dir = $pear_install_dir; + } + $this->channelsdir = $pear_metadata_dir.$ds.'.channels'; + $this->statedir = $pear_metadata_dir.$ds.'.registry'; + $this->filemap = $pear_metadata_dir.$ds.'.filemap'; + $this->lockfile = $pear_metadata_dir.$ds.'.lock'; } function hasWriteAccess() @@ -180,7 +183,7 @@ function setConfig(&$config, $resetInstallDir = true) { $this->_config = &$config; if ($resetInstallDir) { - $this->setInstallDir($config->get('php_dir')); + $this->setInstallDir($config->get('php_dir'), $config->get('metadata_dir')); } } @@ -327,9 +330,9 @@ function _initializeDepDB() $this->_dependencyDB = &PEAR_DependencyDB::singleton($this->_config); if (PEAR::isError($this->_dependencyDB)) { // attempt to recover by removing the dep db - if (file_exists($this->_config->get('php_dir', null, 'pear.php.net') . + if (file_exists($this->_config->get('metadata_dir', null, 'pear.php.net') . DIRECTORY_SEPARATOR . '.depdb')) { - @unlink($this->_config->get('php_dir', null, 'pear.php.net') . + @unlink($this->_config->get('metadata_dir', null, 'pear.php.net') . DIRECTORY_SEPARATOR . '.depdb'); } From 75856858b1a66f4e1c3c3f6cff9c6698d2967601 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Sun, 26 Jul 2015 09:04:20 +0200 Subject: [PATCH 3/5] move metadata_dir to "File Locations (Advanced)" --- PEAR/Config.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/PEAR/Config.php b/PEAR/Config.php index 36ad988..edb594f 100644 --- a/PEAR/Config.php +++ b/PEAR/Config.php @@ -404,13 +404,6 @@ class PEAR_Config extends PEAR 'prompt' => 'PEAR directory', 'group' => 'File Locations', ), - 'metadata_dir' => array( - 'type' => 'directory', - 'default' => PEAR_CONFIG_DEFAULT_METADATA_DIR, - 'doc' => 'directory where metadata files are installed (registry, filemap, channels, ...)', - 'prompt' => 'PEAR metadata directory', - 'group' => 'File Locations', - ), 'ext_dir' => array( 'type' => 'directory', 'default' => PEAR_CONFIG_DEFAULT_EXT_DIR, @@ -509,6 +502,14 @@ class PEAR_Config extends PEAR 'prompt' => 'php.ini location', 'group' => 'File Locations (Advanced)', ), + 'metadata_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_METADATA_DIR, + 'doc' => 'directory where metadata files are installed (registry, filemap, channels, ...)', + 'prompt' => 'PEAR metadata directory', + 'group' => 'File Locations', + 'group' => 'File Locations (Advanced)', + ), // Maintainers 'username' => array( 'type' => 'string', From b81ca684ac60f62173a2958e7db06f26002fff2d Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Sun, 26 Jul 2015 09:05:04 +0200 Subject: [PATCH 4/5] cleanup --- PEAR/Config.php | 1 - 1 file changed, 1 deletion(-) diff --git a/PEAR/Config.php b/PEAR/Config.php index edb594f..0c4c8e4 100644 --- a/PEAR/Config.php +++ b/PEAR/Config.php @@ -507,7 +507,6 @@ class PEAR_Config extends PEAR 'default' => PEAR_CONFIG_DEFAULT_METADATA_DIR, 'doc' => 'directory where metadata files are installed (registry, filemap, channels, ...)', 'prompt' => 'PEAR metadata directory', - 'group' => 'File Locations', 'group' => 'File Locations (Advanced)', ), // Maintainers From d862eea2fd1f8895f51e00b4eaea0bace0899fc5 Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Sun, 26 Jul 2015 10:20:00 +0200 Subject: [PATCH 5/5] ignore already installed (in base system) when packaging root --- PEAR/Downloader/Package.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PEAR/Downloader/Package.php b/PEAR/Downloader/Package.php index 5b2ce14..29592dc 100644 --- a/PEAR/Downloader/Package.php +++ b/PEAR/Downloader/Package.php @@ -413,7 +413,7 @@ public static function removeInstalled(&$params) if ($param->_installRegistry->packageExists($package, $channel)) { $packageVersion = $param->_installRegistry->packageInfo($package, 'version', $channel); if (version_compare($packageVersion, $param->getVersion(), '==')) { - if (!isset($options['force'])) { + if (!isset($options['force']) && !isset($options['packagingroot'])) { $info = $param->getParsedPackage(); unset($info['version']); unset($info['state']);