459 if (!file_exists($filename)) {
460 return PEAR::raiseError(
'php.ini "' . $filename .
'" does not exist');
463 if (filesize($filename) > 300000) {
464 return PEAR::raiseError(
'php.ini "' . $filename .
'" is too large, aborting');
468 phpinfo(INFO_GENERAL);
469 $info = ob_get_contents();
471 $debug = function_exists(
'leak') ?
'_debug' :
'';
472 $ts = preg_match(
'/Thread Safety.+enabled/', $info) ?
'_ts' :
'';
473 $zend_extension_line =
'zend_extension' . $debug . $ts;
474 $all = @file($filename);
475 if ($all ===
false) {
476 return PEAR::raiseError(
'php.ini "' . $filename .
'" could not be read');
478 $zend_extensions = $extensions = array();
480 $extension_dir = ini_get(
'extension_dir');
481 foreach ($all as $linenum => $line) {
486 if ($line[0] ==
';') {
489 if (strtolower(substr($line, 0, 13)) ==
'extension_dir') {
490 $line = trim(substr($line, 13));
491 if ($line[0] ==
'=') {
492 $x = trim(substr($line, 1));
493 $x = explode(
';', $x);
494 $extension_dir = str_replace(
'"',
'', array_shift($x));
498 if (strtolower(substr($line, 0, 9)) ==
'extension') {
499 $line = trim(substr($line, 9));
500 if ($line[0] ==
'=') {
501 $x = trim(substr($line, 1));
502 $x = explode(
';', $x);
503 $extensions[$linenum] = str_replace(
'"',
'', array_shift($x));
507 if (strtolower(substr($line, 0, strlen($zend_extension_line))) ==
508 $zend_extension_line) {
509 $line = trim(substr($line, strlen($zend_extension_line)));
510 if ($line[0] ==
'=') {
511 $x = trim(substr($line, 1));
512 $x = explode(
';', $x);
513 $zend_extensions[$linenum] = str_replace(
'"',
'', array_shift($x));
519 'extensions' => $extensions,
520 'zend_extensions' => $zend_extensions,
521 'extension_dir' => $extension_dir,
530 if (!class_exists(
'PEAR_PackageFile')) {
531 require_once
'PEAR/PackageFile.php';
535 return $this->raiseError(
'ERROR: cannot use both --installroot and --packagingroot');
538 $reg = &$this->config->getRegistry();
539 $channel = isset(
$options[
'channel']) ?
$options[
'channel'] : $this->config->get(
'default_channel');
540 if (!$reg->channelExists($channel)) {
541 return $this->raiseError(
'Channel "' . $channel .
'" does not exist');
544 if (empty($this->installer)) {
550 if (
$command ==
'upgrade' && empty($params)) {
560 $packrootphp_dir = $this->installer->_prependPath(
561 $this->config->get(
'php_dir',
null,
'pear.php.net'),
563 $metadata_dir = $this->config->get(
'metadata_dir',
null,
'pear.php.net');
565 $metadata_dir = $this->installer->_prependPath(
569 $instreg =
new PEAR_Registry($packrootphp_dir,
false,
false, $metadata_dir);
571 if ($this->config->get(
'verbose') > 2) {
572 $this->ui->outputData(
'using package root: ' .
$options[
'packagingroot']);
576 $abstractpackages = $otherpackages = array();
580 foreach ($params as $param) {
581 if (strpos($param,
'http://') === 0) {
582 $otherpackages[] = $param;
586 if (strpos($param,
'channel://') ===
false && @file_exists($param)) {
588 $otherpackages[] = $param;
595 $otherpackages[] = $param;
599 $exists = $reg->packageExists($pf->getPackage(), $pf->getChannel());
600 $pversion = $reg->packageInfo($pf->getPackage(),
'version', $pf->getChannel());
601 $version_compare = version_compare($pf->getVersion(), $pversion,
'<=');
602 if ($exists && $version_compare) {
603 if ($this->config->get(
'verbose')) {
604 $this->ui->outputData(
'Ignoring installed package ' .
605 $reg->parsedPackageNameToString(
606 array(
'package' => $pf->getPackage(),
607 'channel' => $pf->getChannel()),
true));
611 $otherpackages[] = $param;
615 $e = $reg->parsePackageName($param, $channel);
617 $otherpackages[] = $param;
619 $abstractpackages[] = $e;
626 if (count($abstractpackages) && !isset(
$options[
'force'])) {
631 $count = count($abstractpackages);
632 foreach ($abstractpackages as $i => $package) {
633 if (isset($package[
'group'])) {
638 if ($instreg->packageExists($package[
'package'], $package[
'channel'])) {
640 if ($this->config->get(
'verbose')) {
641 $this->ui->outputData(
'Ignoring installed package ' .
642 $reg->parsedPackageNameToString($package,
true));
644 unset($abstractpackages[$i]);
645 } elseif ($count === 1) {
653 array_map(array($reg,
'parsedPackageNameToString'), $abstractpackages);
654 } elseif (count($abstractpackages)) {
656 array_map(array($reg,
'parsedPackageNameToString'), $abstractpackages);
659 $packages = array_merge($abstractpackages, $otherpackages);
660 if (!count($packages)) {
663 $c .=
' in channel "' .
$options[
'channel'] .
'"';
665 $this->ui->outputData(
'Nothing to ' .
$command . $c);
670 $errors = $downloaded = $binaries = array();
671 $downloaded = &$this->downloader->download($packages);
673 return $this->raiseError($downloaded);
676 $errors = $this->downloader->getErrorMsgs();
677 if (count($errors)) {
679 $err[
'data'] = array();
680 foreach ($errors as $error) {
681 if ($error !==
null) {
682 $err[
'data'][] = array($error);
686 if (!empty($err[
'data'])) {
687 $err[
'headline'] =
'Install Errors';
688 $this->ui->outputData($err);
691 if (!count($downloaded)) {
692 return $this->raiseError(
"$command failed");
697 'headline' =>
'Packages that would be Installed'
701 foreach ($downloaded as $package) {
702 $data[
'data'][] = array($reg->parsedPackageNameToString($package->getParsedPackage()));
704 $this->ui->outputData($data,
'pretend');
708 $this->installer->setOptions(
$options);
709 $this->installer->sortPackagesForInstall($downloaded);
710 if (
PEAR::isError($err = $this->installer->setDownloadedPackages($downloaded))) {
711 $this->raiseError($err->getMessage());
715 $binaries = $extrainfo = array();
716 foreach ($downloaded as $param) {
718 $info = $this->installer->install($param,
$options);
722 $pkg = &$param->getPackageFile();
724 if (!($info = $pkg->installBinary($this->installer))) {
725 return $this->raiseError(
'ERROR: ' .$oldinfo->getMessage());
735 if (!is_array($info)) {
736 return $this->raiseError(
"$command failed");
739 if ($param->getPackageType() ==
'extsrc' ||
740 $param->getPackageType() ==
'extbin' ||
741 $param->getPackageType() ==
'zendextsrc' ||
742 $param->getPackageType() ==
'zendextbin'
744 $pkg = &$param->getPackageFile();
745 if ($instbin = $pkg->getInstalledBinary()) {
746 $instpkg = &$instreg->getPackage($instbin, $pkg->getChannel());
748 $instpkg = &$instreg->getPackage($pkg->getPackage(), $pkg->getChannel());
751 foreach ($instpkg->getFilelist() as $name => $atts) {
752 $pinfo = pathinfo($atts[
'installed_as']);
753 if (!isset($pinfo[
'extension']) ||
754 in_array($pinfo[
'extension'], array(
'c',
'h'))
759 if ((strpos($pinfo[
'basename'],
'php_') === 0 &&
760 $pinfo[
'extension'] ==
'dll') ||
762 $pinfo[
'extension'] ==
'so' ||
764 $pinfo[
'extension'] ==
'sl') {
765 $binaries[] = array($atts[
'installed_as'], $pinfo);
770 if (count($binaries)) {
771 foreach ($binaries as $pinfo) {
773 $ret = $this->
enableExtension(array($pinfo[0]), $param->getPackageType());
776 $extrainfo[] = $ret->getMessage();
777 if ($param->getPackageType() ==
'extsrc' ||
778 $param->getPackageType() ==
'extbin') {
779 $exttype =
'extension';
780 $extpath = $pinfo[1][
'basename'];
782 $exttype =
'zend_extension';
783 $extpath = $atts[
'installed_as'];
785 $extrainfo[] =
'You should add "' . $exttype .
'=' .
786 $extpath .
'" to php.ini';
788 $extrainfo[] =
'Extension ' . $instpkg->getProvidesExtension() .
789 ' enabled in php.ini';
795 if ($this->config->get(
'verbose') > 0) {
796 $chan = $param->getChannel();
797 $label = $reg->parsedPackageNameToString(
800 'package' => $param->getPackage(),
801 'version' => $param->getVersion(),
803 $out = array(
'data' =>
"$command ok: $label");
804 if (isset($info[
'release_warnings'])) {
805 $out[
'release_warnings'] = $info[
'release_warnings'];
807 $this->ui->outputData($out,
$command);
810 if ($this->config->isDefinedLayer(
'ftp')) {
812 $info = $this->installer->ftpInstall($param);
815 $this->ui->outputData($info->getMessage());
816 $this->ui->outputData(
"remote install failed: $label");
818 $this->ui->outputData(
"remote install ok: $label");
824 $deps = $param->getDeps();
826 if (isset($deps[
'group'])) {
827 $groups = $deps[
'group'];
828 if (!isset($groups[0])) {
829 $groups = array($groups);
832 foreach ($groups as $group) {
833 if ($group[
'attribs'][
'name'] ==
'default') {
838 $extrainfo[] = $param->getPackage() .
': Optional feature ' .
839 $group[
'attribs'][
'name'] .
' available (' .
840 $group[
'attribs'][
'hint'] .
')';
843 $extrainfo[] = $param->getPackage() .
844 ': To install optional features use "pear install ' .
845 $reg->parsedPackageNameToString(
846 array(
'package' => $param->getPackage(),
847 'channel' => $param->getChannel()),
true) .
852 $pkg = &$instreg->getPackage($param->getPackage(), $param->getChannel());
854 if (is_object($pkg)) {
855 $pkg->setConfig($this->config);
856 if ($list = $pkg->listPostinstallScripts()) {
857 $pn = $reg->parsedPackageNameToString(array(
'channel' =>
858 $param->getChannel(),
'package' => $param->getPackage()),
true);
859 $extrainfo[] = $pn .
' has post-install scripts:';
860 foreach ($list as $file) {
861 $extrainfo[] = $file;
863 $extrainfo[] = $param->getPackage() .
864 ': Use "pear run-scripts ' . $pn .
'" to finish setup.';
865 $extrainfo[] =
'DO NOT RUN SCRIPTS FROM UNTRUSTED SOURCES';
870 if (count($extrainfo)) {
871 foreach ($extrainfo as $info) {
872 $this->ui->outputData($info);
918 if (count($params) < 1) {
919 return $this->raiseError(
"Please supply the package(s) you want to uninstall");
922 if (empty($this->installer)) {
926 if (isset(
$options[
'remoteconfig'])) {
927 $e = $this->config->readFTPConfigFile(
$options[
'remoteconfig']);
929 $this->installer->setConfig($this->config);
933 $reg = &$this->config->getRegistry();
934 $newparams = array();
936 $badparams = array();
937 foreach ($params as $pkg) {
938 $channel = $this->config->get(
'default_channel');
940 $parsed = $reg->parsePackageName($pkg, $channel);
946 $package = $parsed[
'package'];
947 $channel = $parsed[
'channel'];
948 $info = &$reg->getPackage($package, $channel);
949 if ($info ===
null &&
950 ($channel ==
'pear.php.net' || $channel ==
'pecl.php.net')) {
953 $testc = ($channel ==
'pear.php.net') ?
'pecl.php.net' :
'pear.php.net';
954 $info = &$reg->getPackage($package, $testc);
955 if ($info !==
null) {
959 if ($info ===
null) {
962 $newparams[] = &$info;
964 if ($installedbinary = $info->getInstalledBinary()) {
965 $this->ui->log(
'adding binary package ' .
966 $reg->parsedPackageNameToString(array(
'channel' => $channel,
967 'package' => $installedbinary),
true));
968 $newparams[] = &$reg->getPackage($installedbinary, $channel);
971 if (isset($parsed[
'group'])) {
972 $group = $info->getDependencyGroup($parsed[
'group']);
974 $installed = $reg->getInstalledGroup($group);
976 foreach ($installed as $i => $p) {
977 $newparams[] = &$installed[$i];
984 $err = $this->installer->sortPackagesForUninstall($newparams);
986 $this->ui->outputData($err->getMessage(),
$command);
989 $params = $newparams;
992 $this->installer->setUninstallPackages($newparams);
993 $params = array_merge($params, $badparams);
995 foreach ($params as $pkg) {
997 if ($err = $this->installer->uninstall($pkg,
$options)) {
998 $this->installer->popErrorHandling();
1000 $this->ui->outputData($err->getMessage(),
$command);
1003 if ($pkg->getPackageType() ==
'extsrc' ||
1004 $pkg->getPackageType() ==
'extbin' ||
1005 $pkg->getPackageType() ==
'zendextsrc' ||
1006 $pkg->getPackageType() ==
'zendextbin') {
1007 if ($instbin = $pkg->getInstalledBinary()) {
1011 foreach ($pkg->getFilelist() as $name => $atts) {
1012 $pinfo = pathinfo($atts[
'installed_as']);
1013 if (!isset($pinfo[
'extension']) ||
1014 in_array($pinfo[
'extension'], array(
'c',
'h'))) {
1017 if ((strpos($pinfo[
'basename'],
'php_') === 0 &&
1018 $pinfo[
'extension'] ==
'dll') ||
1020 $pinfo[
'extension'] ==
'so' ||
1022 $pinfo[
'extension'] ==
'sl') {
1023 $binaries[] = array($atts[
'installed_as'], $pinfo);
1027 if (count($binaries)) {
1028 foreach ($binaries as $pinfo) {
1033 $extrainfo[] = $ret->getMessage();
1034 if ($pkg->getPackageType() ==
'extsrc' ||
1035 $pkg->getPackageType() ==
'extbin') {
1036 $exttype =
'extension';
1039 phpinfo(INFO_GENERAL);
1040 $info = ob_get_contents();
1042 $debug = function_exists(
'leak') ?
'_debug' :
'';
1043 $ts = preg_match(
'/Thread Safety.+enabled/', $info) ?
'_ts' :
'';
1044 $exttype =
'zend_extension' . $debug . $ts;
1046 $this->ui->outputData(
'Unable to remove "' . $exttype .
'=' .
1047 $pinfo[1][
'basename'] .
'" from php.ini',
$command);
1049 $this->ui->outputData(
'Extension ' . $pkg->getProvidesExtension() .
1056 if ($this->config->get(
'verbose') > 0) {
1057 if (is_object($pkg)) {
1058 $pkg = $reg->parsedPackageNameToString($pkg);
1060 $this->ui->outputData(
"uninstall ok: $pkg",
$command);
1062 if (!isset(
$options[
'offline']) && is_object($savepkg) &&
1063 defined(
'PEAR_REMOTEINSTALL_OK')) {
1064 if ($this->config->isDefinedLayer(
'ftp')) {
1066 $info = $this->installer->ftpUninstall($savepkg);
1067 $this->installer->popErrorHandling();
1069 $this->ui->outputData($info->getMessage());
1070 $this->ui->outputData(
"remote uninstall failed: $pkg");
1072 $this->ui->outputData(
"remote uninstall ok: $pkg");
1077 $this->installer->popErrorHandling();
1078 if (!is_object($pkg)) {
1079 return $this->raiseError(
"uninstall failed: $pkg");
1081 $pkg = $reg->parsedPackageNameToString($pkg);
1187 $reg = &$this->config->getRegistry();
1188 $latestReleases = array();
1191 foreach ($packages as $package) {
1192 if (isset($package[
'group'])) {
1197 $channel = $package[
'channel'];
1198 $name = $package[
'package'];
1199 if (!$reg->packageExists($name, $channel)) {
1204 if (!isset($latestReleases[$channel])) {
1206 $chan = $reg->getChannel($channel);
1208 return $this->raiseError($chan);
1212 $preferred_mirror = $this->config->get(
'preferred_mirror',
null, $channel);
1213 if ($chan->supportsREST($preferred_mirror) &&
1216 ($base = $chan->getBaseURL(
'REST1.0', $preferred_mirror))
1223 if (!isset($package[
'state'])) {
1224 $state = $this->config->get(
'preferred_state',
null, $channel);
1226 $state = $package[
'state'];
1231 $rest = &$this->config->getREST(
'1.4', array());
1234 $rest = &$this->config->getREST(
'1.0', array());
1237 $installed = array_flip($reg->listPackages($channel));
1238 $latest = $rest->listLatestUpgrades($base, $state, $installed, $channel, $reg);
1243 $this->ui->outputData(
'Error getting channel info from ' . $channel .
1244 ': ' . $latest->getMessage());
1248 $latestReleases[$channel] = array_change_key_case($latest);
1252 $name_lower = strtolower($name);
1253 if (isset($latestReleases[$channel][$name_lower])) {
1255 $inst_version = $reg->packageInfo($name,
'version', $channel);
1256 $channel_version = $latestReleases[$channel][$name_lower][
'version'];
1257 if (version_compare($channel_version, $inst_version,
'le')) {
1264 $this->ui->outputData(array(
'data' =>
'Will upgrade ' .
1265 $reg->parsedPackageNameToString($package)),
$command);