function analyzeDependencies(&$params, $force = false)
{
if (isset($this->_options['downloadonly'])) {
return;
}
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$redo = true;
$reset = $hasfailed = $failed = false;
while ($redo) {
$redo = false;
foreach ($params as $i => $param) {
$deps = $param->getDeps();
if (!$deps) {
$depchecker =& $this->getDependency2Object($this->config, $this->getOptions(), $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING);
$send = $param->getPackageFile();
$installcheck = $depchecker->validatePackage($send, $this, $params);
if (PEAR::isError($installcheck)) {
if (!isset($this->_options['soft'])) {
$this->log(0, $installcheck->getMessage());
}
$hasfailed = true;
$params[$i] = false;
$reset = true;
$redo = true;
$failed = false;
PEAR_Downloader_Package::removeDuplicates($params);
continue 2;
}
continue;
}
if (!$reset && $param->alreadyValidated() && !$force) {
continue;
}
if (count($deps)) {
$depchecker =& $this->getDependency2Object($this->config, $this->getOptions(), $param->getParsedPackage(), PEAR_VALIDATE_DOWNLOADING);
$send = $param->getPackageFile();
if ($send === null) {
$send = $param->getDownloadURL();
}
$installcheck = $depchecker->validatePackage($send, $this, $params);
if (PEAR::isError($installcheck)) {
if (!isset($this->_options['soft'])) {
$this->log(0, $installcheck->getMessage());
}
$hasfailed = true;
$params[$i] = false;
$reset = true;
$redo = true;
$failed = false;
PEAR_Downloader_Package::removeDuplicates($params);
continue 2;
}
$failed = false;
if (isset($deps['required'])) {
foreach ($deps['required'] as $type => $dep) {
// note: Dependency2 will never return a PEAR_Error if ignore-errors
// is specified, so soft is needed to turn off logging
if (!isset($dep[0])) {
if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($dep, true, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
} else {
foreach ($dep as $d) {
if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($d, true, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
}
}
}
if (isset($deps['optional'])) {
foreach ($deps['optional'] as $type => $dep) {
if (!isset($dep[0])) {
if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($dep, false, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
} else {
foreach ($dep as $d) {
if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($d, false, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
}
}
}
}
$groupname = $param->getGroup();
if (isset($deps['group']) && $groupname) {
if (!isset($deps['group'][0])) {
$deps['group'] = array($deps['group']);
}
$found = false;
foreach ($deps['group'] as $group) {
if ($group['attribs']['name'] == $groupname) {
$found = true;
break;
}
}
if ($found) {
unset($group['attribs']);
foreach ($group as $type => $dep) {
if (!isset($dep[0])) {
if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($dep, false, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
} else {
foreach ($dep as $d) {
if (PEAR::isError($e = $depchecker->{"validate{$type}Dependency"}($d, false, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
}
}
}
}
}
} else {
foreach ($deps as $dep) {
if (PEAR::isError($e = $depchecker->validateDependency1($dep, $params))) {
$failed = true;
if (!isset($this->_options['soft'])) {
$this->log(0, $e->getMessage());
}
} elseif (is_array($e) && !$param->alreadyValidated()) {
if (!isset($this->_options['soft'])) {
$this->log(0, $e[0]);
}
}
}
}
$params[$i]->setValidated();
}
if ($failed) {
$hasfailed = true;
$params[$i] = false;
$reset = true;
$redo = true;
$failed = false;
PEAR_Downloader_Package::removeDuplicates($params);
continue 2;
}
}
}
PEAR::staticPopErrorHandling();
if ($hasfailed && (isset($this->_options['ignore-errors']) || isset($this->_options['nodeps']))) {
// this is probably not needed, but just in case
if (!isset($this->_options['soft'])) {
$this->log(0, 'WARNING: dependencies failed');
}
}
}