134 $this->_downloader = &$downloader;
135 $this->_config = &$this->_downloader->config;
136 $this->_registry = &$this->_config->getRegistry();
137 $options = $downloader->getOptions();
138 if (isset(
$options[
'packagingroot'])) {
139 $this->_config->setInstallRoot(
$options[
'packagingroot']);
140 $this->_installRegistry = &$this->_config->getRegistry();
141 $this->_config->setInstallRoot(
false);
145 $this->_valid = $this->_analyzed =
false;
164 $options = $this->_downloader->getOptions();
166 if (PEAR::isError($origErr) && !isset(
$options[
'soft'])) {
167 foreach ($origErr->getUserInfo() as $userInfo) {
168 if (isset($userInfo[
'message'])) {
169 $this->_downloader->log(0, $userInfo[
'message']);
173 $this->_downloader->log(0, $origErr->getMessage());
176 return PEAR::raiseError(
'Cannot download non-local package "' . $param .
'"');
180 if (PEAR::isError($err) || !$this->_valid) {
181 if ($this->_type ==
'url') {
182 if (PEAR::isError($err) && !isset(
$options[
'soft'])) {
183 $this->_downloader->log(0, $err->getMessage());
186 return PEAR::raiseError(
"Invalid or missing remote package file");
190 if (PEAR::isError($err) || !$this->_valid) {
195 if (isset($this->_type) && $this->_type ==
'local' && PEAR::isError($origErr)) {
196 if (is_array($origErr->getUserInfo())) {
197 foreach ($origErr->getUserInfo() as $err) {
198 if (is_array($err)) {
199 $err = $err[
'message'];
203 $this->_downloader->log(0, $err);
209 $this->_downloader->log(0, $origErr->getMessage());
212 if (is_array($param)) {
213 $param = $this->_registry->parsedPackageNameToString($param,
true);
217 $this->_downloader->log(2,
"Cannot initialize '$param', invalid or missing package file");
221 return PEAR::raiseError();
224 if (PEAR::isError($err) && !isset(
$options[
'soft'])) {
225 $this->_downloader->log(0, $err->getMessage());
228 if (is_array($param)) {
229 $param = $this->_registry->parsedPackageNameToString($param,
true);
233 $this->_downloader->log(2,
"Cannot initialize '$param', invalid or missing package file");
237 return PEAR::raiseError();
250 if (isset($this->_packagefile)) {
254 if (isset($this->_downloadURL[
'url'])) {
255 $this->_isvalid =
false;
257 foreach ($info as $i => $p) {
258 $info[$i] = strtolower($p);
261 $err = $this->
_fromUrl($this->_downloadURL[
'url'],
262 $this->_registry->parsedPackageNameToString($this->_parsedname,
true));
264 foreach ($newinfo as $i => $p) {
265 $newinfo[$i] = strtolower($p);
268 if ($info != $newinfo) {
270 if ($info[
'channel'] ==
'pecl.php.net' && $newinfo[
'channel'] ==
'pear.php.net') {
271 $info[
'channel'] =
'pear.php.net';
272 if ($info == $newinfo) {
277 if ($info[
'channel'] ==
'pear.php.net' && $newinfo[
'channel'] ==
'pecl.php.net') {
278 $info[
'channel'] =
'pecl.php.net';
279 if ($info == $newinfo) {
285 return PEAR::raiseError(
'CRITICAL ERROR: We are ' .
286 $this->_registry->parsedPackageNameToString($info) .
', but the file ' .
287 'downloaded claims to be ' .
288 $this->_registry->parsedPackageNameToString($this->getParsedPackage()));
292 if (PEAR::isError($err) || !$this->_valid) {
297 $this->_type =
'local';
402 if (!isset($params[0])) {
406 $options = $params[0]->_downloader->getOptions();
407 if (!isset(
$options[
'downloadonly'])) {
408 foreach ($params as $i => $param) {
409 $package = $param->getPackage();
410 $channel = $param->getChannel();
413 if ($param->_installRegistry->packageExists($package, $channel)) {
414 $packageVersion = $param->_installRegistry->packageInfo($package,
'version', $channel);
415 if (version_compare($packageVersion, $param->getVersion(),
'==')) {
417 $info = $param->getParsedPackage();
418 unset($info[
'version']);
419 unset($info[
'state']);
421 $param->_downloader->log(1,
'Skipping package "' .
422 $param->getShortName() .
423 '", already installed as version ' . $packageVersion);
429 $info = $param->getParsedPackage();
430 $param->_downloader->log(1,
'Skipping package "' .
431 $param->getShortName() .
432 '", already installed as version ' . $packageVersion);
444 $this->_downloadDeps = array();
445 $groupnotfound =
false;
446 foreach (array(
'package',
'subpackage') as $packagetype) {
448 if (isset($deps[
'required'][$packagetype])) {
449 if (isset($deps[
'required'][$packagetype][0])) {
450 foreach ($deps[
'required'][$packagetype] as $dep) {
451 if (isset($dep[
'conflicts'])) {
455 $ret = $this->
_detect2Dep($dep, $pname,
'required', $params);
456 if (is_array($ret)) {
457 $this->_downloadDeps[] = $ret;
458 } elseif (PEAR::isError($ret) && !isset(
$options[
'soft'])) {
459 $this->_downloader->log(0, $ret->getMessage());
463 $dep = $deps[
'required'][$packagetype];
464 if (!isset($dep[
'conflicts'])) {
466 $ret = $this->
_detect2Dep($dep, $pname,
'required', $params);
467 if (is_array($ret)) {
468 $this->_downloadDeps[] = $ret;
469 } elseif (PEAR::isError($ret) && !isset(
$options[
'soft'])) {
470 $this->_downloader->log(0, $ret->getMessage());
477 if (isset($deps[
'optional'][$packagetype])) {
478 $skipnames = array();
479 if (!isset($deps[
'optional'][$packagetype][0])) {
480 $deps[
'optional'][$packagetype] = array($deps[
'optional'][$packagetype]);
483 foreach ($deps[
'optional'][$packagetype] as $dep) {
486 $dep[
'package'] = $dep[
'name'];
488 $this->_downloader->log(3,
'Notice: package "' .
489 $this->_registry->parsedPackageNameToString($this->getParsedPackage(),
490 true) .
'" optional dependency "' .
491 $this->_registry->parsedPackageNameToString(array(
'package' =>
492 $dep[
'name'],
'channel' =>
'pear.php.net'),
true) .
493 '" will not be automatically downloaded');
495 $skipnames[] = $this->_registry->parsedPackageNameToString($dep,
true);
497 unset($dep[
'package']);
500 $ret = $this->
_detect2Dep($dep, $pname,
'optional', $params);
501 if (PEAR::isError($ret) && !isset(
$options[
'soft'])) {
502 $this->_downloader->log(0, $ret->getMessage());
506 $dep[
'package'] = $dep[
'name'];
507 $skip = count($skipnames) ?
508 $skipnames[count($skipnames) - 1] :
'';
510 $this->_registry->parsedPackageNameToString($dep,
true)) {
511 array_pop($skipnames);
515 if (!$skip && is_array($ret)) {
516 $this->_downloadDeps[] = $ret;
520 if (count($skipnames)) {
522 $this->_downloader->log(1,
'Did not download optional dependencies: ' .
523 implode(
', ', $skipnames) .
524 ', use --alldeps to download automatically');
537 $groupname =
'default';
540 if ($groupnotfound) {
544 if (isset($deps[
'group'])) {
545 if (isset($deps[
'group'][
'attribs'])) {
546 if (strtolower($deps[
'group'][
'attribs'][
'name']) == strtolower($groupname)) {
547 $group = $deps[
'group'];
548 } elseif ($explicit) {
550 $this->_downloader->log(0,
'Warning: package "' .
551 $this->_registry->parsedPackageNameToString($pname,
true) .
552 '" has no dependency ' .
'group named "' . $groupname .
'"');
555 $groupnotfound =
true;
560 foreach ($deps[
'group'] as $group) {
561 if (strtolower($group[
'attribs'][
'name']) == strtolower($groupname)) {
570 $this->_downloader->log(0,
'Warning: package "' .
571 $this->_registry->parsedPackageNameToString($pname,
true) .
572 '" has no dependency ' .
'group named "' . $groupname .
'"');
576 $groupnotfound =
true;
582 if (isset($group) && isset($group[$packagetype])) {
583 if (isset($group[$packagetype][0])) {
584 foreach ($group[$packagetype] as $dep) {
585 $ret = $this->
_detect2Dep($dep, $pname,
'dependency group "' .
586 $group[
'attribs'][
'name'] .
'"', $params);
587 if (is_array($ret)) {
588 $this->_downloadDeps[] = $ret;
589 } elseif (PEAR::isError($ret) && !isset(
$options[
'soft'])) {
590 $this->_downloader->log(0, $ret->getMessage());
594 $ret = $this->
_detect2Dep($group[$packagetype], $pname,
595 'dependency group "' .
596 $group[
'attribs'][
'name'] .
'"', $params);
597 if (is_array($ret)) {
598 $this->_downloadDeps[] = $ret;
599 } elseif (PEAR::isError($ret) && !isset(
$options[
'soft'])) {
600 $this->_downloader->log(0, $ret->getMessage());
609 if (isset($dep[
'conflicts'])) {
613 $options = $this->_downloader->getOptions();
614 if (isset($dep[
'uri'])) {
615 return array(
'uri' => $dep[
'uri'],
'dep' => $dep);;
619 $testdep[
'package'] = $dep[
'name'];
621 $dep[
'package'] = $dep[
'name'];
623 $this->_downloader->log(2, $this->
getShortName() .
': Skipping ' . $group .
625 $this->_registry->parsedPackageNameToString($dep,
true) .
626 '", will be installed');
631 $options = $this->_downloader->getOptions();
633 if ($this->_explicitState) {
637 $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname);
638 if (PEAR::isError($url)) {
639 PEAR::popErrorHandling();
643 $dep[
'package'] = $dep[
'name'];
644 $ret = $this->
_analyzeDownloadURL($url,
'dependency', $dep, $params, $group ==
'optional' &&
646 PEAR::popErrorHandling();
647 if (PEAR::isError($ret)) {
649 $this->_downloader->log(0, $ret->getMessage());
656 if (!isset($dep[
'min']) && !isset($dep[
'max']) && !isset($dep[
'recommended'])) {
666 $version = $this->_installRegistry->packageInfo($dep[
'name'],
'version', $dep[
'channel']);
667 $dep[
'package'] = $dep[
'name'];
669 $this->_downloader->log(3, $this->
getShortName() .
': Skipping ' . $group .
671 $this->_registry->parsedPackageNameToString($dep,
true) .
672 '" version ' . $url[
'version'] .
', already installed as version ' .
679 if (isset($dep[
'nodefault'])) {
680 $ret[
'nodefault'] =
true;
688 $this->_downloadDeps = array();
689 $skipnames = array();
690 foreach ($deps as $dep) {
692 if (isset ($dep[
'type']) && $dep[
'type'] ===
'pkg') {
693 $dep[
'channel'] =
'pear.php.net';
694 $dep[
'package'] = $dep[
'name'];
695 switch ($dep[
'rel']) {
702 $group = (!isset($dep[
'optional']) || $dep[
'optional'] ==
'no') ?
706 $this->_downloader->log(2, $this->
getShortName() .
': Skipping ' . $group
708 $this->_registry->parsedPackageNameToString($dep,
true) .
709 '", will be installed');
716 $fakedp, $dep[
'rel'])) {
717 $this->_downloader->log(2, $this->
getShortName() .
': Skipping ' . $group
719 $this->_registry->parsedPackageNameToString($dep,
true) .
720 '", is already installed');
726 if ($this->_explicitState) {
730 $url = $this->_downloader->_getDepPackageDownloadUrl($dep, $pname);
731 $chan =
'pear.php.net';
732 if (PEAR::isError($url)) {
735 if (!class_exists(
'PEAR_Dependency2')) {
736 require_once
'PEAR/Dependency2.php';
740 $newdep = $newdep[0];
741 $newdep[
'channel'] =
'pecl.php.net';
742 $chan =
'pecl.php.net';
743 $url = $this->_downloader->_getDepPackageDownloadUrl($newdep, $pname);
744 $obj = &$this->_installRegistry->getPackage($dep[
'name']);
745 if (PEAR::isError($url)) {
746 PEAR::popErrorHandling();
747 if ($obj !==
null && $this->
isInstalled($obj, $dep[
'rel'])) {
748 $group = (!isset($dep[
'optional']) || $dep[
'optional'] ==
'no') ?
751 $dep[
'package'] = $dep[
'name'];
754 ': Skipping ' . $group .
' dependency "' .
755 $this->_registry->parsedPackageNameToString($dep,
true) .
756 '", already installed as version ' . $obj->getVersion());
758 $skip = count($skipnames) ?
759 $skipnames[count($skipnames) - 1] :
'';
761 $this->_registry->parsedPackageNameToString($dep,
true)) {
762 array_pop($skipnames);
766 if (isset($dep[
'optional']) && $dep[
'optional'] ==
'yes') {
768 ': Skipping optional dependency "' .
769 $this->_registry->parsedPackageNameToString($dep,
true) .
770 '", no releases exist');
779 PEAR::popErrorHandling();
781 if (isset($dep[
'optional']) && $dep[
'optional'] ==
'yes') {
783 $this->_downloader->log(3,
'Notice: package "' .
785 '" optional dependency "' .
786 $this->_registry->parsedPackageNameToString(
787 array(
'channel' => $chan,
'package' =>
788 $dep[
'name']),
true) .
789 '" will not be automatically downloaded');
791 $skipnames[] = $this->_registry->parsedPackageNameToString(
792 array(
'channel' => $chan,
'package' =>
793 $dep[
'name']),
true);
799 if (!isset($dep[
'optional']) || $dep[
'optional'] ==
'no') {
801 $this->_downloader->log(3,
'Notice: package "' .
803 '" required dependency "' .
804 $this->_registry->parsedPackageNameToString(
805 array(
'channel' => $chan,
'package' =>
806 $dep[
'name']),
true) .
807 '" will not be automatically downloaded');
809 $skipnames[] = $this->_registry->parsedPackageNameToString(
810 array(
'channel' => $chan,
'package' =>
811 $dep[
'name']),
true);
821 $url, $dep[
'rel'])) {
822 $group = (!isset($dep[
'optional']) || $dep[
'optional'] ==
'no') ?
825 $dep[
'package'] = $dep[
'name'];
826 if (isset($newdep)) {
827 $version = $this->_installRegistry->packageInfo($newdep[
'name'],
'version', $newdep[
'channel']);
829 $version = $this->_installRegistry->packageInfo($dep[
'name'],
'version');
832 $dep[
'version'] = $url[
'version'];
834 $this->_downloader->log(3, $this->
getShortName() .
': Skipping ' . $group .
836 $this->_registry->parsedPackageNameToString($dep,
true) .
837 '", already installed as version ' . $version);
840 $skip = count($skipnames) ?
841 $skipnames[count($skipnames) - 1] :
'';
843 $this->_registry->parsedPackageNameToString($dep,
true)) {
844 array_pop($skipnames);
855 if (isset($newdep)) {
859 $dep[
'package'] = $dep[
'name'];
861 isset($dep[
'optional']) && $dep[
'optional'] ==
'yes' &&
863 PEAR::popErrorHandling();
864 if (PEAR::isError($ret)) {
866 $this->_downloader->log(0, $ret->getMessage());
871 $this->_downloadDeps[] = $ret;
875 if (count($skipnames)) {
877 $this->_downloader->log(1,
'Did not download dependencies: ' .
878 implode(
', ', $skipnames) .
879 ', use --alldeps or --onlyreqdeps to download automatically');
1061 if (isset($this->_packagefile)) {
1062 $ver = $this->_packagefile->getPackagexmlVersion();
1063 if (version_compare($ver,
'2.0',
'>=')) {
1064 return $this->_packagefile->getDeps(
true);
1067 return $this->_packagefile->getDeps();
1068 } elseif (isset($this->_downloadURL[
'info'])) {
1069 $ver = $this->_downloadURL[
'info']->getPackagexmlVersion();
1070 if (version_compare($ver,
'2.0',
'>=')) {
1071 return $this->_downloadURL[
'info']->getDeps(
true);
1074 return $this->_downloadURL[
'info']->getDeps();
1086 if (is_object($param)) {
1087 $channel = $param->getChannel();
1088 $package = $param->getPackage();
1089 if ($param->getURI()) {
1091 'channel' => $param->getChannel(),
1092 'package' => $param->getPackage(),
1093 'version' => $param->getVersion(),
1094 'uri' => $param->getURI(),
1098 'channel' => $param->getChannel(),
1099 'package' => $param->getPackage(),
1100 'version' => $param->getVersion(),
1104 if (isset($param[
'uri'])) {
1108 return $param[
'uri'] == $this->
getURI();
1111 $package = isset($param[
'package']) ? $param[
'package'] : $param[
'info']->getPackage();
1112 $channel = isset($param[
'channel']) ? $param[
'channel'] : $param[
'info']->getChannel();
1113 if (isset($param[
'rel'])) {
1114 if (!class_exists(
'PEAR_Dependency2')) {
1115 require_once
'PEAR/Dependency2.php';
1119 $newdep = $newdep[0];
1120 } elseif (isset($param[
'min'])) {
1125 if (isset($newdep)) {
1126 if (!isset($newdep[
'min'])) {
1127 $newdep[
'min'] =
'0';
1130 if (!isset($newdep[
'max'])) {
1131 $newdep[
'max'] =
'100000000000000000000';
1136 if ($channel ==
'pear.php.net' && $this->
getChannel() ==
'pecl.php.net') {
1138 $channel =
'pecl.php.net';
1141 if ($channel ==
'pecl.php.net' && $this->
getChannel() ==
'pear.php.net') {
1143 $channel =
'pear.php.net';
1147 return (strtolower($package) == strtolower($this->
getPackage()) &&
1149 version_compare($newdep[
'min'], $this->
getVersion(),
'<=') &&
1150 version_compare($newdep[
'max'], $this->
getVersion(),
'>='));
1154 if ($channel ==
'pecl.php.net' && $this->
getChannel() ==
'pear.php.net') {
1155 if (strtolower($package) == strtolower($this->
getPackage())) {
1156 $channel =
'pear.php.net';
1160 if (isset($param[
'version'])) {
1161 return (strtolower($package) == strtolower($this->
getPackage()) &&
1166 return strtolower($package) == strtolower($this->
getPackage()) &&
1176 if ($oper !=
'ge' && $oper !=
'gt' && $oper !=
'has' && $oper !=
'==') {
1180 if (is_object($dep)) {
1181 $package = $dep->getPackage();
1182 $channel = $dep->getChannel();
1183 if ($dep->getURI()) {
1185 'uri' => $dep->getURI(),
1186 'version' => $dep->getVersion(),
1190 'version' => $dep->getVersion(),
1194 if (isset($dep[
'uri'])) {
1196 $package = $dep[
'dep'][
'name'];
1198 $channel = $dep[
'info']->getChannel();
1199 $package = $dep[
'info']->getPackage();
1203 $options = $this->_downloader->getOptions();
1204 $test = $this->_installRegistry->packageExists($package, $channel);
1205 if (!$test && $channel ==
'pecl.php.net') {
1207 $test = $this->_installRegistry->packageExists($package,
'pear.php.net');
1208 $channel =
'pear.php.net';
1212 if (isset($dep[
'uri'])) {
1213 if ($this->_installRegistry->packageInfo($package,
'uri',
'__uri') == $dep[
'uri']) {
1219 $packageVersion = $this->_installRegistry->packageInfo($package,
'version', $channel);
1220 if (version_compare($packageVersion, $dep[
'version'],
'>=')) {
1246 $existing = array();
1247 foreach ($params as $i => $param) {
1248 $package = $param->getPackage();
1249 $channel = $param->getChannel();
1250 $group = $param->getGroup();
1251 if (!isset($existing[$channel .
'/' . $package])) {
1252 $existing[$channel .
'/' . $package] = array();
1255 if (!isset($existing[$channel .
'/' . $package][$group])) {
1256 $existing[$channel .
'/' . $package][$group] = array();
1259 $existing[$channel .
'/' . $package][$group][] = $i;
1263 foreach ($existing as $package => $groups) {
1264 foreach ($groups as $group => $dupes) {
1265 if (count($dupes) > 1) {
1266 $indices = $indices + $dupes;
1271 $indices = array_unique($indices);
1272 foreach ($indices as $index) {
1273 $errorparams[] = $params[$index];
1276 return count($errorparams);
1286 foreach ($params as $i => $param) {
1291 if ($param->getPackage()) {
1292 $group = $ignoreGroups ?
'' : $param->getGroup();
1293 $pnames[$i] = $param->getChannel() .
'/' .
1294 $param->getPackage() .
'-' . $param->getVersion() .
'#' . $group;
1298 $pnames = array_unique($pnames);
1299 $unset = array_diff(array_keys($params), array_keys($pnames));
1300 $testp = array_flip($pnames);
1301 foreach ($params as $i => $param) {
1307 if (!is_a($param,
'PEAR_Downloader_Package')) {
1312 $group = $ignoreGroups ?
'' : $param->getGroup();
1313 if (!isset($testp[$param->getChannel() .
'/' . $param->getPackage() .
'-' .
1314 $param->getVersion() .
'#' . $group])) {
1319 foreach ($unset as $i) {
1324 foreach ($params as $i => $param) {
1325 $ret[] = &$params[$i];
1329 foreach ($ret as $i => $param) {
1330 $params[] = &$ret[$i];
1348 $bundles = $newparams = array();
1349 foreach ($params as $i => $param) {
1350 if (!$param->isBundle()) {
1355 $pf = &$param->getPackageFile();
1357 $contents = $pf->getBundledPackages();
1358 if (!is_array($contents)) {
1359 $contents = array($contents);
1362 foreach ($contents as $file) {
1363 $filecontents = $pf->getFileContents($file);
1364 $dl = &$param->getDownloader();
1366 if (PEAR::isError($dir = $dl->getDownloadDir())) {
1370 $fp = @fopen($dir . DIRECTORY_SEPARATOR . $file,
'wb');
1377 fwrite($fp, $filecontents, strlen($filecontents));
1380 $obj->setExplicitState($s);
1385 if (PEAR::isError($dir = $dl->getDownloadDir())) {
1386 PEAR::popErrorHandling();
1389 $a = $dir . DIRECTORY_SEPARATOR . $file;
1390 $e = $obj->_fromFile($a);
1391 PEAR::popErrorHandling();
1392 if (PEAR::isError($e)) {
1394 $dl->log(0, $e->getMessage());
1400 array_merge($params, $newparams)) && !$param->isInstalled($obj)) {
1401 $newparams[] = $obj;
1406 foreach ($bundles as $i) {
1411 if (count($newparams)) {
1412 foreach ($newparams as $i => $unused) {
1413 $params[] = &$newparams[$i];
1415 $newparams = array();
1418 foreach ($params as $i => $param) {
1420 foreach ($param->_downloadDeps as $dep) {
1421 $merge = array_merge($params, $newparams);
1423 && !$param->isInstalled($dep)
1433 $params[$i]->_downloadDeps = array();
1434 foreach ($newdeps as $dep) {
1437 $obj->setExplicitState($s);
1441 $e = $obj->fromDepURL($dep);
1442 PEAR::popErrorHandling();
1443 if (PEAR::isError($e)) {
1445 $obj->_downloader->log(0, $e->getMessage());
1450 $e = $obj->detectDependencies($params);
1451 if (PEAR::isError($e)) {
1453 $obj->_downloader->log(0, $e->getMessage());
1457 $newparams[] = $obj;
1461 if (count($newparams)) {
1462 foreach ($newparams as $i => $unused) {
1463 $params[] = &$newparams[$i];
1509 $saveparam = $param;
1510 if (is_string($param) && substr($param, 0, 10) !==
'channel://') {
1511 if (!@file_exists($param)) {
1512 $test = explode(
'#', $param);
1513 $group = array_pop($test);
1514 if (@file_exists(implode(
'#', $test))) {
1516 $param = implode(
'#', $test);
1517 $this->_explicitGroup =
true;
1521 if (@is_file($param)) {
1522 $this->_type =
'local';
1523 $options = $this->_downloader->getOptions();
1527 PEAR::popErrorHandling();
1528 if (PEAR::isError($pf)) {
1529 $this->_valid =
false;
1530 $param = $saveparam;
1533 $this->_packagefile = &$pf;
1537 return $this->_valid =
true;
1540 $param = $saveparam;
1541 return $this->_valid =
false;
1546 if (!is_array($param) && (preg_match(
'#^(http|https|ftp)://#', $param))) {
1547 $options = $this->_downloader->getOptions();
1548 $this->_type =
'url';
1549 $callback = $this->_downloader->ui ?
1550 array(&$this->_downloader,
'_downloadCallback') :
null;
1552 if (PEAR::isError($dir = $this->_downloader->getDownloadDir())) {
1553 $this->_downloader->popErrorHandling();
1557 $this->_downloader->log(3,
'Downloading "' . $param .
'"');
1558 $file = $this->_downloader->downloadHttp($param, $this->_downloader->ui,
1559 $dir, $callback,
null,
false, $this->getChannel());
1560 $this->_downloader->popErrorHandling();
1561 if (PEAR::isError($file)) {
1562 if (!empty($saveparam)) {
1563 $saveparam =
", cannot download \"$saveparam\"";
1565 $err = PEAR::raiseError(
'Could not download from "' . $param .
1566 '"' . $saveparam .
' (' . $file->getMessage() .
')');
1570 if ($this->_rawpackagefile) {
1571 require_once
'Archive/Tar.php';
1573 $packagexml = $tar->extractInString(
'package2.xml');
1575 $packagexml = $tar->extractInString(
'package.xml');
1578 if (str_replace(array(
"\n",
"\r"), array(
'',
''), $packagexml) !=
1579 str_replace(array(
"\n",
"\r"), array(
'',
''), $this->_rawpackagefile)) {
1581 return PEAR::raiseError(
'CRITICAL ERROR: package.xml downloaded does ' .
1582 'not match value returned from xml-rpc');
1587 $this->_downloader->log(0,
'CRITICAL WARNING: The "' .
1588 $this->
getPackage() .
'" package has invalid characters in its ' .
1589 'package.xml. The next version of PEAR may not be able to install ' .
1590 'this package for security reasons. Please open a bug report at ' .
1591 'http://pear.php.net/package/' . $this->
getPackage() .
'/bugs');
1600 PEAR::popErrorHandling();
1601 if (PEAR::isError($pf)) {
1602 if (is_array($pf->getUserInfo())) {
1603 foreach ($pf->getUserInfo() as $err) {
1604 if (is_array($err)) {
1605 $err = $err[
'message'];
1609 $this->_downloader->log(0,
"Validation Error: $err");
1615 $this->_downloader->log(0, $pf->getMessage());
1620 $out = $saveparam ? $saveparam : $param;
1621 $err = PEAR::raiseError(
'Download of "' . $out .
'" succeeded, but it is not a valid package archive');
1622 $this->_valid =
false;
1626 $this->_packagefile = &$pf;
1628 return $this->_valid =
true;
1631 return $this->_valid =
false;
1646 $options = $this->_downloader->getOptions();
1647 $channel = $this->_config->get(
'default_channel');
1649 $pname = $this->_registry->parsePackageName($param, $channel);
1650 PEAR::popErrorHandling();
1651 if (PEAR::isError($pname)) {
1652 if ($pname->getCode() ==
'invalid') {
1653 $this->_valid =
false;
1657 if ($pname->getCode() ==
'channel') {
1658 $parsed = $pname->getUserInfo();
1659 if ($this->_downloader->discover($parsed[
'channel'])) {
1660 if ($this->_config->get(
'auto_discover')) {
1662 $pname = $this->_registry->parsePackageName($param, $channel);
1663 PEAR::popErrorHandling();
1666 $this->_downloader->log(0,
'Channel "' . $parsed[
'channel'] .
1667 '" is not initialized, use ' .
1668 '"pear channel-discover ' . $parsed[
'channel'] .
'" to initialize' .
1669 'or pear config-set auto_discover 1');
1674 if (PEAR::isError($pname)) {
1676 $this->_downloader->log(0, $pname->getMessage());
1679 if (is_array($param)) {
1680 $param = $this->_registry->parsedPackageNameToString($param);
1683 $err = PEAR::raiseError(
'invalid package name/package file "' . $param .
'"');
1684 $this->_valid =
false;
1689 $this->_downloader->log(0, $pname->getMessage());
1692 $err = PEAR::raiseError(
'invalid package name/package file "' . $param .
'"');
1693 $this->_valid =
false;
1698 if (!isset($this->_type)) {
1699 $this->_type =
'rest';
1702 $this->_parsedname = $pname;
1703 $this->_explicitState = isset($pname[
'state']) ? $pname[
'state'] :
false;
1704 $this->_explicitGroup = isset($pname[
'group']) ? true :
false;
1706 $info = $this->_downloader->_getPackageDownloadUrl($pname);
1707 if (PEAR::isError($info)) {
1708 if ($info->getCode() != -976 && $pname[
'channel'] ==
'pear.php.net') {
1710 $pname[
'channel'] =
'pecl.php.net';
1711 if ($test = $this->_downloader->_getPackageDownloadUrl($pname)) {
1712 if (!PEAR::isError($test)) {
1713 $info = PEAR::raiseError($info->getMessage() .
' - package ' .
1714 $this->_registry->parsedPackageNameToString($pname,
true) .
1715 ' can be installed with "pecl install ' . $pname[
'package'] .
1718 $pname[
'channel'] =
'pear.php.net';
1721 $pname[
'channel'] =
'pear.php.net';
1728 $this->_rawpackagefile = $info[
'raw'];
1730 if (PEAR::isError($ret)) {
1735 $this->_downloadURL = $ret;
1736 return $this->_valid = (bool) $ret;
1751 $isdependency =
false)
1757 if ($info ===
false) {
1758 $saveparam = !is_string($param) ?
", cannot download \"$param\"" :
'';
1761 return PEAR::raiseError(
'No releases for package "' .
1762 $this->_registry->parsedPackageNameToString($pname,
true) .
'" exist' . $saveparam);
1765 if (strtolower($info[
'info']->
getChannel()) != strtolower($pname[
'channel'])) {
1767 if ($pname[
'channel'] ==
'pecl.php.net') {
1768 if ($info[
'info']->
getChannel() !=
'pear.php.net') {
1771 } elseif ($info[
'info']->
getChannel() ==
'pecl.php.net') {
1772 if ($pname[
'channel'] !=
'pear.php.net') {
1780 return PEAR::raiseError(
'SECURITY ERROR: package in channel "' . $pname[
'channel'] .
1781 '" retrieved another channel\'s name for download! ("' .
1786 $preferred_state = $this->_config->get(
'preferred_state');
1787 if (!isset($info[
'url'])) {
1788 $package_version = $this->_registry->packageInfo($info[
'info']->
getPackage(),
1791 if ($isdependency && version_compare($info[
'version'], $package_version,
'<=')) {
1799 if ($info[
'version'] === $package_version) {
1801 $this->_downloader->log(1,
'WARNING: failed to download ' . $pname[
'channel'] .
1802 '/' . $pname[
'package'] .
'-' . $package_version.
', additionally the suggested version' .
1803 ' (' . $package_version .
') is the same as the locally installed one.');
1809 if (version_compare($info[
'version'], $package_version,
'<=')) {
1811 $this->_downloader->log(1,
'WARNING: failed to download ' . $pname[
'channel'] .
1812 '/' . $pname[
'package'] .
'-' . $package_version .
', additionally the suggested version' .
1813 ' (' . $info[
'version'] .
') is a lower version than the locally installed one (' . $package_version .
').');
1819 $instead =
', will instead download version ' . $info[
'version'] .
1820 ', stability "' . $info[
'info']->getState() .
'"';
1822 if (isset($this->_downloader->_options[
'force'])) {
1823 if (isset($pname[
'version'])) {
1824 $vs =
', version "' . $pname[
'version'] .
'"';
1825 } elseif (isset($pname[
'state'])) {
1826 $vs =
', stability "' . $pname[
'state'] .
'"';
1827 } elseif ($param ==
'dependency') {
1828 if (!class_exists(
'PEAR_Common')) {
1829 require_once
'PEAR/Common.php';
1832 if (!in_array($info[
'info']->getState(),
1836 return $this->_downloader->_getPackageDownloadUrl(
1837 array(
'package' => $pname[
'package'],
1838 'channel' => $pname[
'channel'],
1839 'version' => $info[
'version']));
1841 $vs =
' within preferred state "' . $preferred_state .
1844 if (!class_exists(
'PEAR_Dependency2')) {
1845 require_once
'PEAR/Dependency2.php';
1850 return $this->_downloader->_getPackageDownloadUrl(
1851 array(
'package' => $pname[
'package'],
1852 'channel' => $pname[
'channel'],
1853 'version' => $info[
'version']));
1859 $vs =
' within preferred state "' . $preferred_state .
'"';
1863 $this->_downloader->log(1,
'WARNING: failed to download ' . $pname[
'channel'] .
1864 '/' . $pname[
'package'] . $vs . $instead);
1868 return $this->_downloader->_getPackageDownloadUrl(
1869 array(
'package' => $pname[
'package'],
1870 'channel' => $pname[
'channel'],
1871 'version' => $info[
'version']));
1873 if (isset($info[
'php']) && $info[
'php']) {
1874 $err = PEAR::raiseError(
'Failed to download ' .
1875 $this->_registry->parsedPackageNameToString(
1876 array(
'channel' => $pname[
'channel'],
1877 'package' => $pname[
'package']),
1879 ', latest release is version ' . $info[
'php'][
'v'] .
1880 ', but it requires PHP version "' .
1881 $info[
'php'][
'm'] .
'", use "' .
1882 $this->_registry->parsedPackageNameToString(
1883 array(
'channel' => $pname[
'channel'],
'package' => $pname[
'package'],
1884 'version' => $info[
'php'][
'v'])) .
'" to install',
1890 if (isset($pname[
'version'])) {
1891 $vs =
', version "' . $pname[
'version'] .
'"';
1892 } elseif (isset($pname[
'state'])) {
1893 $vs =
', stability "' . $pname[
'state'] .
'"';
1894 } elseif ($param ==
'dependency') {
1895 if (!class_exists(
'PEAR_Common')) {
1896 require_once
'PEAR/Common.php';
1899 if (!in_array($info[
'info']->getState(),
1904 return $this->_downloader->_getPackageDownloadUrl(
1905 array(
'package' => $pname[
'package'],
1906 'channel' => $pname[
'channel'],
1907 'version' => $info[
'version']));
1909 $vs =
' within preferred state "' . $preferred_state .
'"';
1911 if (!class_exists(
'PEAR_Dependency2')) {
1912 require_once
'PEAR/Dependency2.php';
1918 return $this->_downloader->_getPackageDownloadUrl(
1919 array(
'package' => $pname[
'package'],
1920 'channel' => $pname[
'channel'],
1921 'version' => $info[
'version']));
1926 $vs =
' within preferred state "' . $this->_downloader->config->get(
'preferred_state') .
'"';
1929 $options = $this->_downloader->getOptions();
1931 if (isset(
$options[
'ignorepreferred_state'])) {
1932 $err = PEAR::raiseError(
1933 'Failed to download ' . $this->_registry->parsedPackageNameToString(
1934 array(
'channel' => $pname[
'channel'],
'package' => $pname[
'package']),
1937 ', latest release is version ' . $info[
'version'] .
1938 ', stability "' . $info[
'info']->getState() .
'", use "' .
1939 $this->_registry->parsedPackageNameToString(
1940 array(
'channel' => $pname[
'channel'],
'package' => $pname[
'package'],
1941 'version' => $info[
'version'])) .
'" to install',
1949 $stability = $this->_registry->packageInfo($pname[
'package'],
'stability', $pname[
'channel']);
1953 $err = PEAR::raiseError(
1954 'Failed to download ' . $this->_registry->parsedPackageNameToString(
1955 array(
'channel' => $pname[
'channel'],
'package' => $pname[
'package']),
1958 ', latest release is version ' . $info[
'version'] .
1959 ', stability "' . $info[
'info']->getState() .
'", use "' .
1960 $this->_registry->parsedPackageNameToString(
1961 array(
'channel' => $pname[
'channel'],
'package' => $pname[
'package'],
1962 'version' => $info[
'version'])) .
'" to install');
1968 if (isset($info[
'deprecated']) && $info[
'deprecated']) {
1969 $this->_downloader->log(0,
1971 $this->_registry->parsedPackageNameToString(
1972 array(
'channel' => $info[
'info']->
getChannel(),
1973 'package' => $info[
'info']->
getPackage()),
true) .
1974 '" is deprecated in favor of "' .
1975 $this->_registry->parsedPackageNameToString($info[
'deprecated'],
true) .