Resolve dependencies to resolvables
This commit is contained in:
parent
4081d37dec
commit
bd66b7e670
|
@ -268,7 +268,13 @@ PackageFSRoot::_AddPackage(Package* package)
|
||||||
dependenciesToUpdate.Add(dependency);
|
dependenciesToUpdate.Add(dependency);
|
||||||
}
|
}
|
||||||
|
|
||||||
return fPackageLinksDirectory->AddPackage(package);
|
status_t error = fPackageLinksDirectory->AddPackage(package);
|
||||||
|
if (error != B_OK)
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
_ResolveDependencies(dependenciesToUpdate);
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -317,7 +323,35 @@ PackageFSRoot::_ResolveDependencies(ResolvableDependencyList& dependencies)
|
||||||
if (dependencies.IsEmpty())
|
if (dependencies.IsEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// TODO:...
|
while (Dependency* dependency = dependencies.RemoveHead()) {
|
||||||
|
Package* package = dependency->Package();
|
||||||
|
_ResolveDependency(dependency);
|
||||||
|
|
||||||
|
// also resolve all other dependencies for that package
|
||||||
|
for (ResolvableDependencyList::Iterator it = dependencies.GetIterator();
|
||||||
|
(dependency = it.Next()) != NULL;) {
|
||||||
|
if (dependency->Package() == package) {
|
||||||
|
it.Remove();
|
||||||
|
_ResolveDependency(dependency);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fPackageLinksDirectory->UpdatePackageDependencies(package);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PackageFSRoot::_ResolveDependency(Dependency* dependency)
|
||||||
|
{
|
||||||
|
// get the resolvable family for the dependency
|
||||||
|
ResolvableFamily* resolvableFamily
|
||||||
|
= fResolvables.Lookup(dependency->Name());
|
||||||
|
if (resolvableFamily == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// let the family resolve the dependency
|
||||||
|
resolvableFamily->ResolveDependency(dependency);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -65,6 +65,7 @@ private:
|
||||||
|
|
||||||
void _ResolveDependencies(
|
void _ResolveDependencies(
|
||||||
ResolvableDependencyList& dependencies);
|
ResolvableDependencyList& dependencies);
|
||||||
|
void _ResolveDependency(Dependency* dependency);
|
||||||
|
|
||||||
static status_t _GetOrCreateRoot(dev_t deviceID, ino_t nodeID,
|
static status_t _GetOrCreateRoot(dev_t deviceID, ino_t nodeID,
|
||||||
PackageFSRoot*& _root);
|
PackageFSRoot*& _root);
|
||||||
|
|
|
@ -297,6 +297,14 @@ PackageLinkDirectory::RemovePackage(Package* package,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PackageLinkDirectory::UpdatePackageDependencies(Package* package,
|
||||||
|
PackageLinksListener* listener)
|
||||||
|
{
|
||||||
|
// TODO:...
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
||||||
{
|
{
|
||||||
|
|
|
@ -37,6 +37,8 @@ public:
|
||||||
PackageLinksListener* listener);
|
PackageLinksListener* listener);
|
||||||
void RemovePackage(Package* package,
|
void RemovePackage(Package* package,
|
||||||
PackageLinksListener* listener);
|
PackageLinksListener* listener);
|
||||||
|
void UpdatePackageDependencies(Package* package,
|
||||||
|
PackageLinksListener* listener);
|
||||||
|
|
||||||
bool IsEmpty() const
|
bool IsEmpty() const
|
||||||
{ return fPackages.IsEmpty(); }
|
{ return fPackages.IsEmpty(); }
|
||||||
|
|
|
@ -134,6 +134,8 @@ PackageLinksDirectory::AddPackage(Package* package)
|
||||||
void
|
void
|
||||||
PackageLinksDirectory::RemovePackage(Package* package)
|
PackageLinksDirectory::RemovePackage(Package* package)
|
||||||
{
|
{
|
||||||
|
NodeWriteLocker writeLocker(this);
|
||||||
|
|
||||||
// get the package's link directory and remove the package from it
|
// get the package's link directory and remove the package from it
|
||||||
PackageLinkDirectory* linkDirectory = package->LinkDirectory();
|
PackageLinkDirectory* linkDirectory = package->LinkDirectory();
|
||||||
if (linkDirectory == NULL)
|
if (linkDirectory == NULL)
|
||||||
|
@ -141,8 +143,6 @@ PackageLinksDirectory::RemovePackage(Package* package)
|
||||||
|
|
||||||
BReference<PackageLinkDirectory> linkDirectoryReference(linkDirectory);
|
BReference<PackageLinkDirectory> linkDirectoryReference(linkDirectory);
|
||||||
|
|
||||||
NodeWriteLocker writeLocker(this);
|
|
||||||
|
|
||||||
linkDirectory->RemovePackage(package, fListener);
|
linkDirectory->RemovePackage(package, fListener);
|
||||||
|
|
||||||
// if empty, remove the link directory itself
|
// if empty, remove the link directory itself
|
||||||
|
@ -150,3 +150,16 @@ PackageLinksDirectory::RemovePackage(Package* package)
|
||||||
RemoveChild(linkDirectory);
|
RemoveChild(linkDirectory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
PackageLinksDirectory::UpdatePackageDependencies(Package* package)
|
||||||
|
{
|
||||||
|
NodeWriteLocker writeLocker(this);
|
||||||
|
|
||||||
|
PackageLinkDirectory* linkDirectory = package->LinkDirectory();
|
||||||
|
if (linkDirectory == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
linkDirectory->UpdatePackageDependencies(package, fListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,7 @@ public:
|
||||||
|
|
||||||
status_t AddPackage(Package* package);
|
status_t AddPackage(Package* package);
|
||||||
void RemovePackage(Package* package);
|
void RemovePackage(Package* package);
|
||||||
|
void UpdatePackageDependencies(Package* package);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
timespec fModifiedTime;
|
timespec fModifiedTime;
|
||||||
|
|
Loading…
Reference in New Issue