dependency2.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 1,299 行 · 第 1/4 页

PHP
1,299
字号
                }                if ($fail) {                    // start over, we removed some children                    continue 2;                }            }        } while ($fail);        // next, construct the list of packages that can't be uninstalled        $badpackages = array();        $save = $this->_currentPackage;        foreach ($perpackagelist as $package => $packagedeps) {            foreach ($packagedeps as $parent) {                if (!isset($remove[$parent[0]])) {                    continue;                }                $packagename = $this->_registry->parsePackageName($parent[0]);                $packagename['channel'] = $this->_registry->channelAlias($packagename['channel']);                $pa = $this->_registry->getPackage($packagename['package'], $packagename['channel']);                $packagename['package'] = $pa->getPackage();                $this->_currentPackage = $packagename;                // parent is not present in uninstall list, make sure we can actually                // uninstall it (parent dep is optional)                $parentname['channel'] = $this->_registry->channelAlias($parent[1]['dep']['channel']);                $pa = $this->_registry->getPackage($parent[1]['dep']['name'], $parent[1]['dep']['channel']);                $parentname['package'] = $pa->getPackage();                $parent[1]['dep']['package'] = $parentname['package'];                $parent[1]['dep']['channel'] = $parentname['channel'];                if ($parent[1]['type'] == 'optional') {                    $test = $this->_validatePackageUninstall($parent[1]['dep'], false, $dl);                    if ($test !== true) {                        $badpackages[$package]['warnings'][] = $test;                    }                } else {                    $test = $this->_validatePackageUninstall($parent[1]['dep'], true, $dl);                    if ($test !== true) {                        $badpackages[$package]['errors'][] = $test;                    }                }            }        }        $this->_currentPackage = $save;        $dl->___uninstall_package_cache = $badpackages;        if (isset($badpackages[$memyselfandI])) {            if (isset($badpackages[$memyselfandI]['warnings'])) {                foreach ($badpackages[$memyselfandI]['warnings'] as $warning) {                    $dl->log(0, $warning[0]);                }            }            if (isset($badpackages[$memyselfandI]['errors'])) {                foreach ($badpackages[$memyselfandI]['errors'] as $error) {                    if (is_array($error)) {                        $dl->log(0, $error[0]);                    } else {                        $dl->log(0, $error->getMessage());                    }                }                if (isset($this->_options['nodeps']) || isset($this->_options['force'])) {                    return $this->warning(                        'warning: %s should not be uninstalled, other installed packages depend ' .                        'on this package');                } else {                    return $this->raiseError(                        '%s cannot be uninstalled, other installed packages depend on this package');                }            }        }        return true;    }    function _validatePackageUninstall($dep, $required, $dl)    {        $depname = $this->_registry->parsedPackageNameToString($dep, true);        $version = $this->_registry->packageinfo($dep['package'], 'version',            $dep['channel']);        if (!$version) {            return true;        }        $extra = $this->_getExtraString($dep);        if (isset($dep['exclude'])) {            if (!is_array($dep['exclude'])) {                $dep['exclude'] = array($dep['exclude']);            }        }        if (isset($dep['conflicts'])) {            return true; // uninstall OK - these packages conflict (probably installed with --force)        }        if (!isset($dep['min']) && !isset($dep['max'])) {            if ($required) {                if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {                    return $this->raiseError('"' . $depname . '" is required by ' .                        'installed package %s' . $extra);                } else {                    return $this->warning('warning: "' . $depname . '" is required by ' .                        'installed package %s' . $extra);                }            } else {                return $this->warning('"' . $depname . '" can be optionally used by ' .                        'installed package %s' . $extra);            }        }        $fail = false;        if (isset($dep['min'])) {            if (version_compare($version, $dep['min'], '>=')) {                $fail = true;            }        }        if (isset($dep['max'])) {            if (version_compare($version, $dep['max'], '<=')) {                $fail = true;            }        }        // we re-use this variable, preserve the original value        $saverequired = $required;        if ($required) {            if (!isset($this->_options['nodeps']) && !isset($this->_options['force'])) {                return $this->raiseError($depname . $extra . ' is required by installed package' .                    ' "%s"');            } else {                return $this->raiseError('warning: ' . $depname . $extra .                    ' is required by installed package "%s"');            }        } else {            return $this->warning($depname . $extra . ' can be optionally used by installed package' .                    ' "%s"');        }        return true;    }    /**     * validate a downloaded package against installed packages     *      * As of PEAR 1.4.3, this will only validate     *     * @param array|PEAR_Downloader_Package|PEAR_PackageFile_v1|PEAR_PackageFile_v2     *              $pkg package identifier (either     *                   array('package' => blah, 'channel' => blah) or an array with     *                   index 'info' referencing an object)     * @param PEAR_Downloader $dl     * @param array $params full list of packages to install     * @return true|PEAR_Error     */    function validatePackage($pkg, &$dl, $params = array())    {        if (is_array($pkg) && isset($pkg['info'])) {            $deps = $this->_dependencydb->getDependentPackageDependencies($pkg['info']);        } else {            $deps = $this->_dependencydb->getDependentPackageDependencies($pkg);        }        $fail = false;        if ($deps) {            if (!class_exists('PEAR_Downloader_Package')) {                require_once 'PEAR/Downloader/Package.php';            }            $dp = &new PEAR_Downloader_Package($dl);            if (is_object($pkg)) {                $dp->setPackageFile($pkg);            } else {                $dp->setDownloadURL($pkg);            }            PEAR::pushErrorHandling(PEAR_ERROR_RETURN);            foreach ($deps as $channel => $info) {                foreach ($info as $package => $ds) {                    foreach ($params as $packd) {                        if (strtolower($packd->getPackage()) == strtolower($package) &&                              $packd->getChannel() == $channel) {                            $dl->log(3, 'skipping installed package check of "' .                                        $this->_registry->parsedPackageNameToString(                                            array('channel' => $channel, 'package' => $package),                                            true) .                                        '", version "' . $packd->getVersion() . '" will be ' .                                        'downloaded and installed');                            continue 2; // jump to next package                        }                    }                    foreach ($ds as $d) {                        $checker = &new PEAR_Dependency2($this->_config, $this->_options,                            array('channel' => $channel, 'package' => $package), $this->_state);                        $dep = $d['dep'];                        $required = $d['type'] == 'required';                        $ret = $checker->_validatePackageDownload($dep, $required, array(&$dp));                        if (is_array($ret)) {                            $dl->log(0, $ret[0]);                        } elseif (PEAR::isError($ret)) {                            $dl->log(0, $ret->getMessage());                            $fail = true;                        }                    }                }            }            PEAR::popErrorHandling();        }        if ($fail) {            return $this->raiseError(                '%s cannot be installed, conflicts with installed packages');        }        return true;    }    /**     * validate a package.xml 1.0 dependency     */    function validateDependency1($dep, $params = array())    {        if (!isset($dep['optional'])) {            $dep['optional'] = 'no';        }        list($newdep, $type) = $this->normalizeDep($dep);        if (!$newdep) {            return $this->raiseError("Invalid Dependency");        }        if (method_exists($this, "validate{$type}Dependency")) {            return $this->{"validate{$type}Dependency"}($newdep, $dep['optional'] == 'no',                $params, true);        }    }    /**     * Convert a 1.0 dep into a 2.0 dep     */    function normalizeDep($dep)    {        $types = array(            'pkg' => 'Package',            'ext' => 'Extension',            'os' => 'Os',            'php' => 'Php'        );        if (isset($types[$dep['type']])) {            $type = $types[$dep['type']];        } else {            return array(false, false);        }        $newdep = array();        switch ($type) {            case 'Package' :                $newdep['channel'] = 'pear.php.net';            case 'Extension' :            case 'Os' :                $newdep['name'] = $dep['name'];            break;        }        $dep['rel'] = PEAR_Dependency2::signOperator($dep['rel']);        switch ($dep['rel']) {            case 'has' :                return array($newdep, $type);            break;            case 'not' :                $newdep['conflicts'] = true;            break;            case '>=' :            case '>' :                $newdep['min'] = $dep['version'];                if ($dep['rel'] == '>') {                    $newdep['exclude'] = $dep['version'];                }            break;            case '<=' :            case '<' :                $newdep['max'] = $dep['version'];                if ($dep['rel'] == '<') {                    $newdep['exclude'] = $dep['version'];                }            break;            case 'ne' :            case '!=' :                $newdep['min'] = '0';                $newdep['max'] = '100000';                $newdep['exclude'] = $dep['version'];            break;            case '==' :                $newdep['min'] = $dep['version'];                $newdep['max'] = $dep['version'];            break;        }        if ($type == 'Php') {            if (!isset($newdep['min'])) {                $newdep['min'] = '4.2.0';            }            if (!isset($newdep['max'])) {                $newdep['max'] = '6.0.0';            }        }        return array($newdep, $type);    }    /**     * Converts text comparing operators to them sign equivalents     *     * Example: 'ge' to '>='     *     * @access public     * @param  string Operator     * @return string Sign equivalent     */    function signOperator($operator)    {        switch($operator) {            case 'lt': return '<';            case 'le': return '<=';            case 'gt': return '>';            case 'ge': return '>=';            case 'eq': return '==';            case 'ne': return '!=';            default:                return $operator;        }    }    function raiseError($msg)    {        if (isset($this->_options['ignore-errors'])) {            return $this->warning($msg);        }        return PEAR::raiseError(sprintf($msg, $this->_registry->parsedPackageNameToString(            $this->_currentPackage, true)));    }    function warning($msg)    {        return array(sprintf($msg, $this->_registry->parsedPackageNameToString(            $this->_currentPackage, true)));    }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?