Add dependency package links
The links appear, but the dependency resolution doesn't seem to work correctly yet.
This commit is contained in:
parent
a39e95cd73
commit
dd9554ae69
|
@ -37,6 +37,9 @@ PackageLinkDirectory::~PackageLinkDirectory()
|
||||||
{
|
{
|
||||||
if (fSelfLink != NULL)
|
if (fSelfLink != NULL)
|
||||||
fSelfLink->ReleaseReference();
|
fSelfLink->ReleaseReference();
|
||||||
|
|
||||||
|
while (DependencyLink* link = fDependencyLinks.RemoveHead())
|
||||||
|
link->ReleaseReference();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -186,13 +189,32 @@ void
|
||||||
PackageLinkDirectory::UpdatePackageDependencies(Package* package,
|
PackageLinkDirectory::UpdatePackageDependencies(Package* package,
|
||||||
PackageLinksListener* listener)
|
PackageLinksListener* listener)
|
||||||
{
|
{
|
||||||
// TODO:...
|
ASSERT(package->LinkDirectory() == this);
|
||||||
|
|
||||||
|
NodeWriteLocker writeLocker(this);
|
||||||
|
|
||||||
|
// We only need to update, if that head package is affected.
|
||||||
|
if (package != fPackages.Head())
|
||||||
|
return;
|
||||||
|
|
||||||
|
_UpdateDependencies(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
||||||
{
|
{
|
||||||
|
// Always remove all dependency links -- if there's still a package, they
|
||||||
|
// will be re-created below.
|
||||||
|
while (DependencyLink* link = fDependencyLinks.RemoveHead()) {
|
||||||
|
NodeWriteLocker selfLinkLocker(link);
|
||||||
|
if (listener != NULL)
|
||||||
|
listener->PackageLinkNodeRemoved(link);
|
||||||
|
|
||||||
|
RemoveChild(link);
|
||||||
|
link->ReleaseReference();
|
||||||
|
}
|
||||||
|
|
||||||
// check, if empty
|
// check, if empty
|
||||||
Package* package = fPackages.Head();
|
Package* package = fPackages.Head();
|
||||||
if (package == NULL) {
|
if (package == NULL) {
|
||||||
|
@ -232,5 +254,55 @@ PackageLinkDirectory::_Update(PackageLinksListener* listener)
|
||||||
fSelfLink->Update(package, listener);
|
fSelfLink->Update(package, listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// update the dependency links
|
||||||
|
return _UpdateDependencies(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
PackageLinkDirectory::_UpdateDependencies(PackageLinksListener* listener)
|
||||||
|
{
|
||||||
|
Package* package = fPackages.Head();
|
||||||
|
if (package == NULL)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
|
// Iterate through the package's dependencies
|
||||||
|
for (DependencyList::ConstIterator it
|
||||||
|
= package->Dependencies().GetIterator();
|
||||||
|
Dependency* dependency = it.Next();) {
|
||||||
|
Resolvable* resolvable = dependency->Resolvable();
|
||||||
|
Package* resolvablePackage = resolvable != NULL
|
||||||
|
? resolvable->Package() : NULL;
|
||||||
|
|
||||||
|
Node* node = FindChild(dependency->Name());
|
||||||
|
if (node != NULL) {
|
||||||
|
// link already exists -- update
|
||||||
|
DependencyLink* link = static_cast<DependencyLink*>(node);
|
||||||
|
|
||||||
|
NodeWriteLocker linkLocker(link);
|
||||||
|
link->Update(resolvablePackage, listener);
|
||||||
|
} else {
|
||||||
|
// no link for the dependency yet -- create one
|
||||||
|
DependencyLink* link = new(std::nothrow) DependencyLink(
|
||||||
|
resolvablePackage);
|
||||||
|
if (link == NULL)
|
||||||
|
return B_NO_MEMORY;
|
||||||
|
|
||||||
|
status_t error = link->Init(this, dependency->Name(), 0);
|
||||||
|
if (error != B_OK) {
|
||||||
|
delete link;
|
||||||
|
RETURN_ERROR(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
AddChild(link);
|
||||||
|
fDependencyLinks.Add(link);
|
||||||
|
|
||||||
|
if (listener != NULL) {
|
||||||
|
NodeWriteLocker linkLocker(link);
|
||||||
|
listener->PackageLinkNodeAdded(link);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,13 +47,31 @@ public:
|
||||||
private:
|
private:
|
||||||
typedef PackageLinkSymlink Link;
|
typedef PackageLinkSymlink Link;
|
||||||
|
|
||||||
|
struct DependencyLink : public PackageLinkSymlink {
|
||||||
|
DependencyLink(Package* package)
|
||||||
|
:
|
||||||
|
PackageLinkSymlink(package)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DoublyLinkedListLink<DependencyLink> fPackageLinkDirectoryLink;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef DoublyLinkedList<DependencyLink,
|
||||||
|
DoublyLinkedListMemberGetLink<DependencyLink,
|
||||||
|
&DependencyLink::fPackageLinkDirectoryLink> >
|
||||||
|
FamilyDependencyList;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
status_t _Update(PackageLinksListener* listener);
|
status_t _Update(PackageLinksListener* listener);
|
||||||
|
status_t _UpdateDependencies(
|
||||||
|
PackageLinksListener* listener);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
timespec fModifiedTime;
|
timespec fModifiedTime;
|
||||||
PackageList fPackages;
|
PackageList fPackages;
|
||||||
Link* fSelfLink;
|
Link* fSelfLink;
|
||||||
|
FamilyDependencyList fDependencyLinks;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue