mirror of
https://github.com/php/php-src.git
synced 2024-09-22 18:37:25 +00:00
Moved dependecy db code to its own file
This commit is contained in:
parent
6d563b3bdc
commit
01795e2ae1
@ -522,181 +522,6 @@ class PEAR_Registry extends PEAR
|
||||
|
||||
// }}}
|
||||
|
||||
// {{{ rebuildDepsFile()
|
||||
|
||||
/**
|
||||
Experimental dependencies database handling functions (not yet in production)
|
||||
|
||||
TODO:
|
||||
- test it
|
||||
- Think on the "not" dep relation. It's supposed that a package can't
|
||||
be installed if conflicts with another. The problem comes when the
|
||||
user forces the installation and later upgrades it
|
||||
**/
|
||||
|
||||
// XXX Terrible slow, a lot of read, lock, write, unlock
|
||||
function rebuildDepsFile()
|
||||
{
|
||||
// Init the file with empty data
|
||||
$error = $this->_depWriteDepDB(array());
|
||||
if (PEAR::isError($error)) {
|
||||
return $error;
|
||||
}
|
||||
$packages = $this->listPackages();
|
||||
foreach ($packages as $package) {
|
||||
$deps = $this->packageInfo($package, 'release_deps');
|
||||
$error = $this->setPackageDep($package, $deps);
|
||||
if (PEAR::isError($error)) {
|
||||
return $error;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function &_depGetDepDB()
|
||||
{
|
||||
if (!$fp = fopen($this->depfile, 'r')) {
|
||||
return $this->raiseError("Could not open dependencies file `".$this->depfile."'");
|
||||
}
|
||||
$data = fread($fp, filesize($this->depfile));
|
||||
fclose($fp);
|
||||
return unserialize($data);
|
||||
}
|
||||
|
||||
function _depWriteDepDB(&$deps)
|
||||
{
|
||||
if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
|
||||
return $e;
|
||||
}
|
||||
if (!$fp = fopen($this->depfile, 'wb')) {
|
||||
$this->_unlock();
|
||||
return $this->raiseError("Could not open dependencies file `".$this->depfile."' for writting");
|
||||
}
|
||||
fwrite($fp, serialize($deps));
|
||||
fclose($fp);
|
||||
$this->_unlock();
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
The data structure is as follows:
|
||||
$dep_db = array(
|
||||
// Other packages depends in some manner on this packages
|
||||
'deps' => array(
|
||||
'Package Name' => array(
|
||||
0 => array(
|
||||
// This package depends on 'Package Name'
|
||||
'depend' => 'Package',
|
||||
// Which version 'Package' needs of 'Package Name'
|
||||
'version' => '1.0',
|
||||
// The requirement (version_compare() operator)
|
||||
'rel' => 'ge'
|
||||
),
|
||||
),
|
||||
)
|
||||
// This packages are dependant on other packages
|
||||
'pkgs' => array(
|
||||
'Package Dependant' => array(
|
||||
// This is a index list with paths over the 'deps' array for quick
|
||||
// searching things like "what dependecies has this package?"
|
||||
// $dep_db['deps']['Package Name'][3]
|
||||
'Package Name' => 3 // key in array ['deps']['Package Name']
|
||||
),
|
||||
)
|
||||
)
|
||||
|
||||
Note: It only supports package dependencies no other type
|
||||
*/
|
||||
|
||||
function removePackageDep($package)
|
||||
{
|
||||
$data = &$this->_depGetDepDB();
|
||||
if (PEAR::isError($data)) {
|
||||
return $data;
|
||||
}
|
||||
// Other packages depends on this package, can't be removed
|
||||
if (isset($data['deps'][$package])) {
|
||||
return $data['deps'][$package];
|
||||
}
|
||||
// The package depends on others, remove those dependencies
|
||||
if (isset($data['pkgs'][$package])) {
|
||||
foreach ($data['pkgs'][$package] as $pkg => $key) {
|
||||
// remove the dependency
|
||||
unset($data['deps'][$pkg][$key]);
|
||||
// if no more dependencies, remove the subject too
|
||||
if (!count($data['deps'][$pkg])) {
|
||||
unset($data['deps'][$pkg]);
|
||||
}
|
||||
}
|
||||
// remove the package from the index list
|
||||
unset($data['pkgs'][$package]);
|
||||
}
|
||||
return $this->_depWriteDepDB();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update or insert a the dependencies of a package, prechecking
|
||||
* that the package won't break any dependency in the process
|
||||
*/
|
||||
function setPackageDep($package, $new_version, $rel_deps = array())
|
||||
{
|
||||
$data = &$this->_depGetDepDB();
|
||||
if (PEAR::isError($deps)) {
|
||||
return $deps;
|
||||
}
|
||||
// Other packages depend on this package, check deps. Mostly for
|
||||
// handling uncommon cases like:
|
||||
// <dep type='pkg' rel='lt' version='1.0'>Foo</dep> and we are trying to
|
||||
// update Foo to version 2.0
|
||||
if (isset($data['deps'][$package])) {
|
||||
foreach ($data['deps'][$package] as $dep) {
|
||||
$require = $dep['version'];
|
||||
$relation = $dep['rel'];
|
||||
// XXX (cox) Possible problem with changes in the way
|
||||
// PEAR_Dependency::checkPackage() works
|
||||
if ($relation != 'has') {
|
||||
if (!version_compare("$new_version", "$require", $relation)) {
|
||||
$fails[] = $dep;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (isset($fails)) {
|
||||
return $fails;
|
||||
}
|
||||
}
|
||||
|
||||
// This package has no dependencies
|
||||
if (!is_array($rel_deps) || !count($rel_deps)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// The package depends on others, register that
|
||||
foreach ($rel_deps as $dep) {
|
||||
// We only support deps of type 'pkg's
|
||||
if ($dep && $dep['type'] == 'pkg' && isset($dep['name'])) {
|
||||
$write = array('depend' => $package,
|
||||
'version' => $dep['version'],
|
||||
'rel' => $dep['rel']);
|
||||
settype($data['deps'][$dep['name']], 'array');
|
||||
|
||||
// The dependency already exists, update it
|
||||
if (isset($data['pkgs'][$package][$dep['name']])) {
|
||||
$key = $data['pkgs'][$package][$dep['name']];
|
||||
$data['deps'][$dep['name']][$key] = $write;
|
||||
|
||||
// New dependency, insert it
|
||||
} else {
|
||||
$data['deps'][$dep['name']][] = $write;
|
||||
$key = key($data['deps'][$dep['name']]);
|
||||
settype($data['pkgs'][$package], 'array');
|
||||
$data['pkgs'][$package][$dep['name']] = $key;
|
||||
}
|
||||
}
|
||||
}
|
||||
return $this->_depWriteDepDB($data);
|
||||
}
|
||||
|
||||
// }}}
|
||||
}
|
||||
|
||||
?>
|
||||
|
Loading…
Reference in New Issue
Block a user