Index: PEAR/Common.php =================================================================== RCS file: /repository/pear-core/PEAR/Common.php,v retrieving revision 1.156 diff -u -r1.156 Common.php --- PEAR/Common.php 25 Mar 2006 21:09:08 -0000 1.156 +++ PEAR/Common.php 10 May 2006 03:11:20 -0000 @@ -453,7 +453,9 @@ unset($arr['dependencies']); unset($arr['phprelease']); unset($arr['extsrcrelease']); + unset($arr['zendextsrcrelease']); unset($arr['extbinrelease']); + unset($arr['zendextbinrelease']); unset($arr['bundle']); unset($arr['lead']); unset($arr['developer']); Index: PEAR/Config.php =================================================================== RCS file: /repository/pear-core/PEAR/Config.php,v retrieving revision 1.128 diff -u -r1.128 Config.php --- PEAR/Config.php 9 Apr 2006 18:42:59 -0000 1.128 +++ PEAR/Config.php 9 May 2006 02:32:12 -0000 @@ -420,6 +420,13 @@ 'prompt' => 'PHP CLI/CGI binary', 'group' => 'File Locations (Advanced)', ), + 'php_ini' => array( + 'type' => 'file', + 'default' => '', + 'doc' => 'location of php.ini in which to enable PECL extensions on install', + 'prompt' => 'php.ini location', + 'group' => 'File Locations (Advanced)', + ), // Maintainers 'username' => array( 'type' => 'string', Index: PEAR/Command/Install.php =================================================================== RCS file: /repository/pear-core/PEAR/Command/Install.php,v retrieving revision 1.118 diff -u -r1.118 Install.php --- PEAR/Command/Install.php 13 Apr 2006 00:50:40 -0000 1.118 +++ PEAR/Command/Install.php 10 May 2006 04:17:37 -0000 @@ -343,6 +343,124 @@ return $a; } + function enableExtension($binaries, $type) + { + if (!($phpini = $this->config->get('php_ini', null, 'pear.php.net'))) { + return PEAR::raiseError('configuration option "php_ini" is not set to php.ini location'); + } + $ini = $this->_parseIni($phpini); + if (PEAR::isError($ini)) { + return $ini; + } + $fp = @fopen($phpini, 'wb'); + if (!$fp) { + return PEAR::raiseError('cannot open php.ini "' . $phpini . '" for writing'); + } + $line = 0; + if ($type == 'extsrc' || $type == 'extbin') { + $search = 'extensions'; + $enable = 'extension'; + } else { + $search = 'zend_extensions'; + ob_start(); + phpinfo(INFO_GENERAL); + $info = ob_get_contents(); + ob_end_clean(); + $debug = preg_match('Debug Build.+yes', $info) ? '_debug' : ''; + $ts = preg_match('Thread Safety.+enabled', $info) ? '_ts' : ''; + $enable = 'zend_extension' . $debug . $ts; + } + foreach ($ini[$search] as $line => $extension) { + if (in_array($extension, $binaries, true) || in_array( + $ini['extension_dir'] . DIRECTORY_SEPARATOR . $extension, $binaries, true)) { + // already enabled - assume if one is, all are + return true; + } + } + if ($line) { + $newini = array_slice($ini['all'], 0, $line); + } else { + $newini = array(); + } + foreach ($binaries as $binary) { + $newini[] = $enable . '="' . $binary . '"' . (OS_UNIX ? "\n" : "\r\n"); + } + $newini = array_merge($newini, array_slice($ini['all'], $line)); + foreach ($newini as $line) { + fwrite($fp, $line); + } + fclose($fp); + return true; + } + + function _parseIni($filename) + { + if (file_exists($filename)) { + if (filesize($filename) > 300000) { + return PEAR::raiseError('php.ini "' . $filename . '" is too large, aborting'); + } + ob_start(); + phpinfo(INFO_GENERAL); + $info = ob_get_contents(); + ob_end_clean(); + $debug = preg_match('/Debug Build.+yes/', $info) ? '_debug' : ''; + $ts = preg_match('/Thread Safety.+enabled/', $info) ? '_ts' : ''; + $zend_extension_line = 'zend_extension' . $debug . $ts; + $all = @file($filename); + if (!$all) { + return PEAR::raiseError('php.ini "' . $filename .'" could not be read'); + } + $zend_extensions = $extensions = array(); + // assume this is right, but pull from the php.ini if it is found + $extension_dir = ini_get('extension_dir'); + foreach ($all as $linenum => $line) { + $line = trim($line); + if (!$line) { + continue; + } + if ($line[0] == ';') { + continue; + } + if (strtolower(substr($line, 0, 13)) == 'extension_dir') { + $line = trim(substr($line, 13)); + if ($line[0] == '=') { + $x = trim(substr($line, 1)); + $x = explode(';', $x); + $extension_dir = array_shift($x); + continue; + } + } + if (strtolower(substr($line, 0, 9)) == 'extension') { + $line = trim(substr($line, 9)); + if ($line[0] == '=') { + $x = trim(substr($line, 1)); + $x = explode(';', $x); + $extensions[$linenum] = array_shift($x); + continue; + } + } + if (strtolower(substr($line, 0, strlen($zend_extension_line))) == + $zend_extension_line) { + $line = trim(substr($line, strlen($zend_extension_line))); + if ($line[0] == '=') { + $x = trim(substr($line, 1)); + $x = explode(';', $x); + $zend_extensions[$linenum] = array_shift($x); + continue; + } + } + } + return array( + 'extensions' => $extensions, + 'zend_extensions' => $zend_extensions, + 'extension_dir' => $extension_dir, + 'all' => $all, + ); + } else { + return PEAR::raiseError('php.ini "' . $filename . '" does not exist'); + } + } + // {{{ doInstall() function doInstall($command, $options, $params) @@ -480,7 +598,9 @@ } if (is_array($info)) { if ($param->getPackageType() == 'extsrc' || - $param->getPackageType() == 'extbin') { + $param->getPackageType() == 'extbin' || + $param->getPackageType() == 'zendextsrc' || + $param->getPackageType() == 'zendextbin') { $pkg = &$param->getPackageFile(); if ($instbin = $pkg->getInstalledBinary()) { $instpkg = &$instreg->getPackage($instbin, $pkg->getChannel()); @@ -499,11 +619,35 @@ $pinfo['extension'] == 'so' || // hp-ux $pinfo['extension'] == 'sl') { - $extrainfo[] = 'You should add "extension=' . $pinfo['basename'] - . '" to php.ini'; + $binaries[] = array($atts['installed_as'], $pinfo); break; } } + foreach ($binaries as $pinfo) { + PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN); + $ret = $this->enableExtension(array($pinfo[0]), $param->getPackageType()); + PEAR::staticPopErrorHandling(); + if (PEAR::isError($ret)) { + $extrainfo[] = $ret->getMessage(); + if ($param->getPackageType() == 'extsrc' || + $param->getPackageType() == 'extbin') { + $exttype = 'extension'; + } else { + ob_start(); + phpinfo(INFO_GENERAL); + $info = ob_get_contents(); + ob_end_clean(); + $debug = preg_match('Debug Build.+yes', $info) ? '_debug' : ''; + $ts = preg_match('Thread Safety.+enabled', $info) ? '_ts' : ''; + $exttype = 'zend_extension' . $debug . $ts; + } + $extrainfo[] = 'You should add "' . $exttype . '=' . + $pinfo[1]['basename'] . '" to php.ini'; + } else { + $extrainfo[] = 'Extension ' . $instpkg->getProvidesExtension() . + ' enabled in php.ini'; + } + } } if ($this->config->get('verbose') > 0) { $channel = $param->getChannel(); Index: PEAR/Command/Pickle.php =================================================================== RCS file: /repository/pear-core/PEAR/Command/Pickle.php,v retrieving revision 1.5 diff -u -r1.5 Pickle.php --- PEAR/Command/Pickle.php 6 Jan 2006 04:47:36 -0000 1.5 +++ PEAR/Command/Pickle.php 10 May 2006 03:27:19 -0000 @@ -63,8 +63,8 @@ only simple package.xml 2.0 will be converted. package.xml 2.0 with: - dependency types other than required/optional PECL package/ext/php/pearinstaller - - more than one extsrcrelease - - extbinrelease, phprelease, or bundle release type + - more than one extsrcrelease or zendextsrcrelease + - zendextbinrelease, extbinrelease, phprelease, or bundle release type - dependency groups - ignore tags in release filelist - tasks other than replace @@ -156,7 +156,7 @@ require_once 'PEAR/PackageFile/v1.php'; $pf = new PEAR_PackageFile_v1; $pf->setConfig($this->config); - if (is_array($pf2->getPackageType() != 'extsrc')) { + if ($pf2->getPackageType() != 'extsrc' && $pf2->getPackageType() != 'zendextsrc') { return $this->raiseError('Cannot safely convert "' . $packagexml . '", is not an extension source package. Using a PEAR_PackageFileManager-based ' . 'script is an option'); @@ -307,7 +307,7 @@ $release = $pf2->getReleases(); if (isset($releases[0])) { return $this->raiseError('Cannot safely process "' . $packagexml . '" contains ' - . 'multiple extsrcrelease tags. Using a PEAR_PackageFileManager-based script ' . + . 'multiple extsrcrelease/zendextsrcrelease tags. Using a PEAR_PackageFileManager-based script ' . 'or the convert command is an option'); } if ($configoptions = $pf2->getConfigureOptions()) { Index: PEAR/Command/Pickle.xml =================================================================== RCS file: /repository/pear-core/PEAR/Command/Pickle.xml,v retrieving revision 1.1 diff -u -r1.1 Pickle.xml --- PEAR/Command/Pickle.xml 1 Nov 2005 05:39:31 -0000 1.1 +++ PEAR/Command/Pickle.xml 10 May 2006 03:27:28 -0000 @@ -26,8 +26,8 @@ only simple package.xml 2.0 will be converted. package.xml 2.0 with: - dependency types other than required/optional PECL package/ext/php/pearinstaller - - more than one extsrcrelease - - extbinrelease, phprelease, or bundle release type + - more than one extsrcrelease/zendextsrcrelease + - zendextbinrelease, extbinrelease, phprelease, or bundle release type - dependency groups - ignore tags in release filelist - tasks other than replace Index: PEAR/Command/Registry.php =================================================================== RCS file: /repository/pear-core/PEAR/Command/Registry.php,v retrieving revision 1.71 diff -u -r1.71 Registry.php --- PEAR/Command/Registry.php 27 Mar 2006 05:00:12 -0000 1.71 +++ PEAR/Command/Registry.php 10 May 2006 03:11:00 -0000 @@ -571,9 +571,15 @@ case 'extsrc' : $release = 'PECL-style PHP extension (source code)'; break; + case 'zendextsrc' : + $release = 'PECL-style Zend extension (source code)'; + break; case 'extbin' : $release = 'PECL-style PHP extension (binary)'; break; + case 'zendextbin' : + $release = 'PECL-style Zend extension (binary)'; + break; case 'bundle' : $release = 'Package bundle (collection of packages)'; break; Index: PEAR/Installer/Role.php =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role.php,v retrieving revision 1.14 diff -u -r1.14 Role.php --- PEAR/Installer/Role.php 27 Mar 2006 05:15:36 -0000 1.14 +++ PEAR/Installer/Role.php 10 May 2006 03:12:52 -0000 @@ -86,8 +86,7 @@ /** * Get a list of file roles that are valid for the particular release type. * - * For instance, src files serve no purpose in regular php releases. php files - * serve no purpose in extsrc or extbin releases + * For instance, src files serve no purpose in regular php releases. * @param string * @param bool clear cache * @return array Index: PEAR/Installer/Role/Data.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Data.xml,v retrieving revision 1.1 diff -u -r1.1 Data.xml --- PEAR/Installer/Role/Data.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Data.xml 10 May 2006 03:11:36 -0000 @@ -2,6 +2,8 @@ php extsrc extbin + zendextsrc + zendextbin 1 data_dir Index: PEAR/Installer/Role/Doc.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Doc.xml,v retrieving revision 1.1 diff -u -r1.1 Doc.xml --- PEAR/Installer/Role/Doc.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Doc.xml 10 May 2006 03:11:50 -0000 @@ -2,6 +2,8 @@ php extsrc extbin + zendextsrc + zendextbin 1 doc_dir Index: PEAR/Installer/Role/Ext.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Ext.xml,v retrieving revision 1.1 diff -u -r1.1 Ext.xml --- PEAR/Installer/Role/Ext.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Ext.xml 10 May 2006 03:11:58 -0000 @@ -1,5 +1,6 @@ extbin + zendextbin 1 ext_dir 1 Index: PEAR/Installer/Role/Php.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Php.xml,v retrieving revision 1.1 diff -u -r1.1 Php.xml --- PEAR/Installer/Role/Php.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Php.xml 10 May 2006 03:12:04 -0000 @@ -2,6 +2,8 @@ php extsrc extbin + zendextsrc + zendextbin 1 php_dir 1 Index: PEAR/Installer/Role/Script.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Script.xml,v retrieving revision 1.1 diff -u -r1.1 Script.xml --- PEAR/Installer/Role/Script.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Script.xml 10 May 2006 03:12:25 -0000 @@ -2,6 +2,8 @@ php extsrc extbin + zendextsrc + zendextbin 1 bin_dir 1 Index: PEAR/Installer/Role/Src.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Src.xml,v retrieving revision 1.1 diff -u -r1.1 Src.xml --- PEAR/Installer/Role/Src.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Src.xml 10 May 2006 03:12:30 -0000 @@ -1,5 +1,6 @@ extsrc + zendextsrc Index: PEAR/Installer/Role/Test.xml =================================================================== RCS file: /repository/pear-core/PEAR/Installer/Role/Test.xml,v retrieving revision 1.1 diff -u -r1.1 Test.xml --- PEAR/Installer/Role/Test.xml 1 Nov 2005 05:39:32 -0000 1.1 +++ PEAR/Installer/Role/Test.xml 10 May 2006 03:12:34 -0000 @@ -2,6 +2,8 @@ php extsrc extbin + zendextsrc + zendextbin 1 test_dir Index: PEAR/PackageFile/v2.php =================================================================== RCS file: /repository/pear-core/PEAR/PackageFile/v2.php,v retrieving revision 1.131 diff -u -r1.131 v2.php --- PEAR/PackageFile/v2.php 25 Apr 2006 02:54:49 -0000 1.131 +++ PEAR/PackageFile/v2.php 10 May 2006 03:33:43 -0000 @@ -191,23 +191,24 @@ $a = false; return $a; } - if ($this->getPackageType() == 'extsrc') { + if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { + $releasetype = $this->getPackageType() . 'release'; if (!is_array($installer->getInstallPackages())) { $a = false; return $a; } foreach ($installer->getInstallPackages() as $p) { if ($p->isExtension($this->_packageInfo['providesextension'])) { - if ($p->getPackageType() != 'extsrc') { + if ($p->getPackageType() != 'extsrc' && $p->getPackageType() != 'zendextsrc') { $a = false; return $a; // the user probably downloaded it separately } } } - if (isset($this->_packageInfo['extsrcrelease']['binarypackage'])) { + if (isset($this->_packageInfo[$releasetype]['binarypackage'])) { $installer->log(0, 'Attempting to download binary version of extension "' . $this->_packageInfo['providesextension'] . '"'); - $params = $this->_packageInfo['extsrcrelease']['binarypackage']; + $params = $this->_packageInfo[$releasetype]['binarypackage']; if (!is_array($params) || !isset($params[0])) { $params = array($params); } @@ -264,7 +265,8 @@ */ function getProvidesExtension() { - if (in_array($this->getPackageType(), array('extsrc', 'extbin'))) { + if (in_array($this->getPackageType(), + array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) { if (isset($this->_packageInfo['providesextension'])) { return $this->_packageInfo['providesextension']; } @@ -278,7 +280,8 @@ */ function isExtension($extension) { - if (in_array($this->getPackageType(), array('extsrc', 'extbin'))) { + if (in_array($this->getPackageType(), + array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) { return $this->_packageInfo['providesextension'] == $extension; } return false; @@ -1027,8 +1030,8 @@ array('time', 'version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', - 'extbinrelease', 'bundle', 'changelog'), array(), 'date'); + 'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', + 'zendextbinrelease', 'bundle', 'changelog'), array(), 'date'); } $this->_packageInfo['date'] = $date; $this->_isValid = 0; @@ -1043,8 +1046,8 @@ array('version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', - 'extbinrelease', 'bundle', 'changelog'), $time, 'time'); + 'phprelease', 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', + 'zendextbinrelease', 'bundle', 'changelog'), $time, 'time'); } $this->_packageInfo['time'] = $time; } @@ -1183,7 +1186,7 @@ */ function getConfigureOptions() { - if ($this->getPackageType() != 'extsrc') { + if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') { return false; } $releases = $this->getReleases(); @@ -1718,7 +1721,7 @@ } /** - * @return php|extsrc|extbin|bundle|false + * @return php|extsrc|extbin|zendextsrc|zendextbin|bundle|false */ function getPackageType() { @@ -1731,6 +1734,12 @@ if (isset($this->_packageInfo['extbinrelease'])) { return 'extbin'; } + if (isset($this->_packageInfo['zendextsrcrelease'])) { + return 'zendextsrc'; + } + if (isset($this->_packageInfo['zendextbinrelease'])) { + return 'zendextbin'; + } if (isset($this->_packageInfo['bundle'])) { return 'bundle'; } @@ -1778,7 +1787,8 @@ */ function getSourcePackage() { - if (isset($this->_packageInfo['extbinrelease'])) { + if (isset($this->_packageInfo['extbinrelease']) || + isset($this->_packageInfo['zendextbinrelease'])) { return array('channel' => $this->_packageInfo['srcchannel'], 'package' => $this->_packageInfo['srcpackage']); } Index: PEAR/PackageFile/v2/Validator.php =================================================================== RCS file: /repository/pear-core/PEAR/PackageFile/v2/Validator.php,v retrieving revision 1.89 diff -u -r1.89 Validator.php --- PEAR/PackageFile/v2/Validator.php 27 Mar 2006 05:45:22 -0000 1.89 +++ PEAR/PackageFile/v2/Validator.php 10 May 2006 03:32:00 -0000 @@ -99,10 +99,20 @@ // needs a certain package installed in order to implement a role or task '*providesextension', '*srcpackage|*srcuri', - '+phprelease|+extsrcrelease|+extbinrelease|bundle', //special validation needed + '+phprelease|+extsrcrelease|+extbinrelease|' . + '+zendextsrcrelease|+zendextbinrelease|bundle', //special validation needed '*changelog', ); $test = $this->_packageInfo; + if (isset($test['dependencies']) && + isset($test['dependencies']['required']) && + isset($test['dependencies']['required']['pearinstaller']) && + isset($test['dependencies']['required']['pearinstaller']['min']) && + version_compare('@package_version@', + $test['dependencies']['required']['pearinstaller']['min'], '<')) { + $this->_pearVersionTooLow($test['dependencies']['required']['pearinstaller']['min']); + return false; + } // ignore post-installation array fields if (array_key_exists('filelist', $test)) { unset($test['filelist']); @@ -1174,64 +1184,68 @@ ), $rel, ''); } } - if (isset($this->_packageInfo['extsrcrelease'])) { - $release = 'extsrcrelease'; - if (!isset($this->_packageInfo['providesextension'])) { - $this->_mustProvideExtension($release); - } - if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) { - $this->_cannotHaveSrcpackage($release); - } - $releases = $this->_packageInfo['extsrcrelease']; - if (!is_array($releases)) { - return true; - } - if (!isset($releases[0])) { - $releases = array($releases); - } - foreach ($releases as $rel) { - $this->_stupidSchemaValidate(array( - '*installconditions', - '*configureoption->name->prompt->?default', - '*binarypackage', - '*filelist', - ), $rel, ''); - if (isset($rel['binarypackage'])) { - if (!is_array($rel['binarypackage']) || !isset($rel['binarypackage'][0])) { - $rel['binarypackage'] = array($rel['binarypackage']); - } - foreach ($rel['binarypackage'] as $bin) { - if (!is_string($bin)) { - $this->_binaryPackageMustBePackagename(); + foreach (array('', 'zend') as $prefix) { + $releasetype = $prefix . 'extsrcrelease'; + if (isset($this->_packageInfo[$releasetype])) { + $release = $releasetype; + if (!isset($this->_packageInfo['providesextension'])) { + $this->_mustProvideExtension($release); + } + if (isset($this->_packageInfo['srcpackage']) || isset($this->_packageInfo['srcuri'])) { + $this->_cannotHaveSrcpackage($release); + } + $releases = $this->_packageInfo[$releasetype]; + if (!is_array($releases)) { + return true; + } + if (!isset($releases[0])) { + $releases = array($releases); + } + foreach ($releases as $rel) { + $this->_stupidSchemaValidate(array( + '*installconditions', + '*configureoption->name->prompt->?default', + '*binarypackage', + '*filelist', + ), $rel, '<' . $releasetype . '>'); + if (isset($rel['binarypackage'])) { + if (!is_array($rel['binarypackage']) || !isset($rel['binarypackage'][0])) { + $rel['binarypackage'] = array($rel['binarypackage']); + } + foreach ($rel['binarypackage'] as $bin) { + if (!is_string($bin)) { + $this->_binaryPackageMustBePackagename(); + } } } } } - } - if (isset($this->_packageInfo['extbinrelease'])) { - $release = 'extbinrelease'; - if (!isset($this->_packageInfo['providesextension'])) { - $this->_mustProvideExtension($release); - } - if (isset($this->_packageInfo['channel']) && - !isset($this->_packageInfo['srcpackage'])) { - $this->_mustSrcPackage($release); - } - if (isset($this->_packageInfo['uri']) && !isset($this->_packageInfo['srcuri'])) { - $this->_mustSrcuri($release); - } - $releases = $this->_packageInfo['extbinrelease']; - if (!is_array($releases)) { - return true; - } - if (!isset($releases[0])) { - $releases = array($releases); - } - foreach ($releases as $rel) { - $this->_stupidSchemaValidate(array( - '*installconditions', - '*filelist', - ), $rel, ''); + $releasetype = 'extbinrelease'; + if (isset($this->_packageInfo[$releasetype])) { + $release = $releasetype; + if (!isset($this->_packageInfo['providesextension'])) { + $this->_mustProvideExtension($release); + } + if (isset($this->_packageInfo['channel']) && + !isset($this->_packageInfo['srcpackage'])) { + $this->_mustSrcPackage($release); + } + if (isset($this->_packageInfo['uri']) && !isset($this->_packageInfo['srcuri'])) { + $this->_mustSrcuri($release); + } + $releases = $this->_packageInfo[$releasetype]; + if (!is_array($releases)) { + return true; + } + if (!isset($releases[0])) { + $releases = array($releases); + } + foreach ($releases as $rel) { + $this->_stupidSchemaValidate(array( + '*installconditions', + '*filelist', + ), $rel, '<' . $releasetype . '>'); + } } } if (isset($this->_packageInfo['bundle'])) { @@ -1276,6 +1290,14 @@ return in_array($role, PEAR_Installer_Role::getValidRoles($this->_pf->getPackageType())); } + function _pearVersionTooLow($version) + { + $this->_stack->push(__FUNCTION__, 'error', + array('version' => $version), + 'This package.xml requires PEAR version %version% to parse properly, we are ' . + 'version @package_version@'); + } + function _invalidTagOrder($oktags, $actual, $root) { $this->_stack->push(__FUNCTION__, 'error', @@ -1287,7 +1309,7 @@ { $this->_stack->push(__FUNCTION__, 'error', array('type' => $type), '<%type%> is not allowed inside global , only inside ' . - '/, use and only'); + '//, use and only'); } function _fileNotAllowed($type) @@ -1491,7 +1513,7 @@ function _cannotProvideExtension($release) { $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - '<%release%> packages cannot use , only extbinrelease and extsrcrelease can provide a PHP extension'); + '<%release%> packages cannot use , only extbinrelease, extsrcrelease, zendextsrcrelease, and zendextbinrelease can provide a PHP extension'); } function _mustProvideExtension($release) @@ -1509,13 +1531,13 @@ function _mustSrcPackage($release) { $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - ' packages must specify a source code package with '); + '/ packages must specify a source code package with '); } function _mustSrcuri($release) { $this->_stack->push(__FUNCTION__, 'error', array('release' => $release), - ' packages must specify a source code package with '); + '/ packages must specify a source code package with '); } function _uriDepsCannotHaveVersioning($type) @@ -1549,7 +1571,7 @@ { $this->_stack->push(__FUNCTION__, 'error', array(), ' tags must contain the name of a package that is ' . - 'a compiled version of this extsrc package'); + 'a compiled version of this extsrc/zendextsrc package'); } function _fileNotFound($file) Index: PEAR/PackageFile/v2/rw.php =================================================================== RCS file: /repository/pear-core/PEAR/PackageFile/v2/rw.php,v retrieving revision 1.16 diff -u -r1.16 rw.php --- PEAR/PackageFile/v2/rw.php 25 Apr 2006 02:43:47 -0000 1.16 +++ PEAR/PackageFile/v2/rw.php 10 May 2006 03:31:47 -0000 @@ -41,12 +41,14 @@ */ function setProvidesExtension($extension) { - if (in_array($this->getPackageType(), array('extsrc', 'extbin'))) { + if (in_array($this->getPackageType(), + array('extsrc', 'extbin', 'zendextsrc', 'zendextbin'))) { if (!isset($this->_packageInfo['providesextension'])) { // ensure that the channel tag is set up in the right location $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', - 'extsrcrelease', 'extbinrelease', 'bundle', 'changelog'), + 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', + 'bundle', 'changelog'), $extension, 'providesextension'); } $this->_packageInfo['providesextension'] = $extension; @@ -88,7 +90,7 @@ 'developer', 'contributor', 'helper', 'date', 'time', 'version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), $uri, 'uri'); } $this->_packageInfo['uri'] = $uri; @@ -105,7 +107,7 @@ 'developer', 'contributor', 'helper', 'date', 'time', 'version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), $channel, 'channel'); } $this->_packageInfo['channel'] = $channel; @@ -121,7 +123,7 @@ 'developer', 'contributor', 'helper', 'date', 'time', 'version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), $extends, 'extends'); } $this->_packageInfo['extends'] = $extends; @@ -137,7 +139,7 @@ 'developer', 'contributor', 'helper', 'date', 'time', 'version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), $summary, 'summary'); } $this->_packageInfo['summary'] = $summary; @@ -153,7 +155,7 @@ 'developer', 'contributor', 'helper', 'date', 'time', 'version', 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), $desc, 'description'); } $this->_packageInfo['description'] = $desc; @@ -185,7 +187,7 @@ 'stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', - 'extbinrelease', 'bundle', 'changelog'); + 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'); foreach (array('lead', 'developer', 'contributor', 'helper') as $testrole) { array_shift($testarr); if ($role == $testrole) { @@ -292,7 +294,7 @@ $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array( 'version' => array('stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), 'release' => array('api'))); $this->_isValid = 0; @@ -307,7 +309,7 @@ $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $version, array( 'version' => array('stability', 'license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), 'api' => array())); $this->_isValid = 0; @@ -325,7 +327,7 @@ $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array( 'stability' => array('license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), 'release' => array('api'))); $this->_isValid = 0; @@ -343,7 +345,7 @@ $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $state, array( 'stability' => array('license', 'notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), 'api' => array())); $this->_isValid = 0; @@ -356,7 +358,7 @@ $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('notes', 'contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), 0, 'license'); } if ($uri || $filesource) { @@ -382,7 +384,7 @@ $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('contents', 'compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', + 'phprelease', 'extsrcrelease', 'zendextsrcrelease', 'zendextbinrelease', 'extbinrelease', 'bundle', 'changelog'), $notes, 'notes'); } $this->_packageInfo['notes'] = $notes; @@ -429,7 +431,8 @@ array('compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', - 'extbinrelease', 'bundle', 'changelog'), array(), 'contents'); + 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', + 'bundle', 'changelog'), array(), 'contents'); } if ($this->getPackageType() != 'bundle') { $this->_packageInfo['contents'] = @@ -453,7 +456,8 @@ $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $path, array( 'contents' => array('compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', - 'extsrcrelease', 'extbinrelease', 'bundle', 'changelog'), + 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', + 'bundle', 'changelog'), 'bundledpackage' => array())); } @@ -546,7 +550,8 @@ $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('compatible', 'dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', - 'extbinrelease', 'bundle', 'changelog'), array(), 'contents'); + 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', + 'bundle', 'changelog'), array(), 'contents'); } if (isset($this->_packageInfo['contents']['dir']['file'])) { if (!isset($this->_packageInfo['contents']['dir']['file'][0])) { @@ -584,7 +589,7 @@ $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array( 'compatible' => array('dependencies', 'providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog') + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog') )); } @@ -614,7 +619,8 @@ $this->_isValid = 0; $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array( 'usesrole' => array('usestask', 'srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'extbinrelease', 'bundle', 'changelog') + 'phprelease', 'extsrcrelease', 'extbinrelease', + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog') )); } @@ -645,7 +651,8 @@ $this->_isValid = 0; $this->_packageInfo = $this->_mergeTag($this->_packageInfo, $set, array( 'usestask' => array('srcpackage', 'srcuri', - 'phprelease', 'extsrcrelease', 'extbinrelease', 'bundle', 'changelog') + 'phprelease', 'extsrcrelease', 'extbinrelease', + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog') )); } @@ -667,7 +674,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'))); + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'))); } $this->_packageInfo['dependencies'] = array(); } @@ -703,7 +710,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'required' => array('optional', 'group'), 'php' => array('pearinstaller', 'package', 'subpackage', 'extension', 'os', 'arch') )); @@ -745,7 +752,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'required' => array('optional', 'group'), 'pearinstaller' => array('package', 'subpackage', 'extension', 'os', 'arch') )); @@ -773,7 +780,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'required' => array('optional', 'group'), 'package' => array('subpackage', 'extension', 'os', 'arch') )); @@ -801,7 +808,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'required' => array('optional', 'group'), 'package' => array('subpackage', 'extension', 'os', 'arch') )); @@ -815,7 +822,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'group' => array(), )); } @@ -1014,7 +1021,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), $type => $arr, 'package' => array('subpackage', 'extension', 'os', 'arch') )); @@ -1042,7 +1049,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), $type => $arr, 'package' => array('subpackage', 'extension', 'os', 'arch') )); @@ -1074,7 +1081,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), $type => $arr, 'subpackage' => array('extension', 'os', 'arch') )); @@ -1099,7 +1106,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), $type => $arr, 'subpackage' => array('extension', 'os', 'arch') )); @@ -1126,7 +1133,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), $type => $arr, 'extension' => array('os', 'arch') )); @@ -1147,7 +1154,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'required' => array('optional', 'group'), 'os' => array('arch') )); @@ -1168,7 +1175,7 @@ array( 'dependencies' => array('providesextension', 'usesrole', 'usestask', 'srcpackage', 'srcuri', 'phprelease', 'extsrcrelease', 'extbinrelease', - 'bundle', 'changelog'), + 'zendextsrcrelease', 'zendextbinrelease', 'bundle', 'changelog'), 'required' => array('optional', 'group'), 'arch' => array() )); @@ -1180,20 +1187,24 @@ * - a php package is a PEAR-style package * - an extbin package is a PECL-style extension binary * - an extsrc package is a PECL-style source for a binary + * - an zendextbin package is a PECL-style zend extension binary + * - an zendextsrc package is a PECL-style source for a zend extension binary * - a bundle package is a collection of other pre-packaged packages - * @param php|extbin|extsrc|bundle + * @param php|extbin|extsrc|zendextsrc|zendextbin|bundle * @return bool success */ function setPackageType($type) { $this->_isValid = 0; - if (!in_array($type, array('php', 'extbin', 'extsrc', 'bundle'))) { + if (!in_array($type, array('php', 'extbin', 'extsrc', 'zendextsrc', + 'zendextbin', 'bundle'))) { return false; } if ($type != 'bundle') { $type .= 'release'; } - foreach (array('phprelease', 'extbinrelease', 'extsrcrelease', 'bundle') as $test) { + foreach (array('phprelease', 'extbinrelease', 'extsrcrelease', + 'zendextsrcrelease', 'zendextbinrelease', 'bundle') as $test) { unset($this->_packageInfo[$test]); } if (!isset($this->_packageInfo[$type])) { @@ -1230,7 +1241,7 @@ { if ($p = $this->getPackageType()) { if ($strict) { - if ($p == 'extsrc') { + if ($p == 'extsrc' || $p == 'zendextsrc') { $a = null; return $a; } @@ -1295,7 +1306,7 @@ */ function addBinarypackage($package) { - if ($this->getPackageType() != 'extsrc') { + if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') { return false; } $r = &$this->_getCurrentRelease(false); @@ -1317,7 +1328,7 @@ */ function addConfigureOption($name, $prompt, $default = null) { - if ($this->getPackageType() != 'extsrc') { + if ($this->getPackageType() != 'extsrc' && $this->getPackageType() != 'zendextsrc') { return false; } $r = &$this->_getCurrentRelease(false); @@ -1358,7 +1369,7 @@ } $dep['exclude'] = $exclude; } - if ($this->getPackageType() == 'extsrc') { + if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { $r = $this->_mergeTag($r, $dep, array( 'installconditions' => array('configureoption', 'binarypackage', @@ -1391,7 +1402,7 @@ } $this->_isValid = 0; $dep = $this->_constructDep($name, false, false, $min, $max, $recommended, $exclude); - if ($this->getPackageType() == 'extsrc') { + if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { $r = $this->_mergeTag($r, $dep, array( 'installconditions' => array('configureoption', 'binarypackage', @@ -1426,7 +1437,7 @@ if ($conflicts) { $dep['conflicts'] = ''; } - if ($this->getPackageType() == 'extsrc') { + if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { $r = $this->_mergeTag($r, $dep, array( 'installconditions' => array('configureoption', 'binarypackage', @@ -1461,7 +1472,7 @@ if ($conflicts) { $dep['conflicts'] = ''; } - if ($this->getPackageType() == 'extsrc') { + if ($this->getPackageType() == 'extsrc' || $this->getPackageType() == 'zendextsrc') { $r = $this->_mergeTag($r, $dep, array( 'installconditions' => array('configureoption', 'binarypackage', @@ -1479,20 +1490,22 @@ /** * For extension binary releases, this is used to specify either the - * static URI to a source package, or the package name and channel of the extsrc + * static URI to a source package, or the package name and channel of the extsrc/zendextsrc * package it is based on. - * @param string Package name, or full URI to source package (extsrc type) + * @param string Package name, or full URI to source package (extsrc/zendextsrc type) */ function setSourcePackage($packageOrUri) { $this->_isValid = 0; if (isset($this->_packageInfo['channel'])) { $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease', - 'extsrcrelease', 'extbinrelease', 'bundle', 'changelog'), + 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', + 'bundle', 'changelog'), $packageOrUri, 'srcpackage'); } else { $this->_packageInfo = $this->_insertBefore($this->_packageInfo, array('phprelease', - 'extsrcrelease', 'extbinrelease', 'bundle', 'changelog'), $packageOrUri, 'srcuri'); + 'extsrcrelease', 'extbinrelease', 'zendextsrcrelease', 'zendextbinrelease', + 'bundle', 'changelog'), $packageOrUri, 'srcuri'); } } Index: PEAR/Validator/PECL.php =================================================================== RCS file: /repository/pear-core/PEAR/Validator/PECL.php,v retrieving revision 1.7 diff -u -r1.7 PECL.php --- PEAR/Validator/PECL.php 3 Feb 2006 02:02:22 -0000 1.7 +++ PEAR/Validator/PECL.php 10 May 2006 03:34:14 -0000 @@ -48,7 +48,8 @@ function validatePackageName() { $ret = parent::validatePackageName(); - if ($this->_packagexml->getPackageType() == 'extsrc') { + if ($this->_packagexml->getPackageType() == 'extsrc' || + $this->_packagexml->getPackageType() == 'zendextsrc') { if (strtolower($this->_packagexml->getPackage()) != strtolower($this->_packagexml->getProvidesExtension())) { $this->_addWarning('providesextension', 'package name "' .