On Thu, 20 Jan 2011 00:25:15 +1000, Allan McRae <allan@archlinux.org> wrote:
The problem is that the transitive closure can not be assumed to be correct.
e.g. At the time A is built:
A -> B,C,D,E B -> C,D,E C -> D,E
Then B is updated and
B -> C,D,E,F.
Now the assuming a transitive closure for the dependency list for A is incorrect. Installing the listed dependencies of A with the equivalent of -Sd would result in F not being installed which would break A through broken B.
So either: 1) we require a largely unnecessary rebuild of A 2) we always check the dependencies of uninstalled dependencies.
Note #2 is less burden on packagers and is more efficient in the examples given above if both B and D are installed (two checks vs four), and that will be the case for most system updates. When none of A - E are installed, they are probably equally efficient.
Yes, I agree with that: dependencies will always have to be checked at package install time. That means that any approach based on a "transitive closure" at packaging time is useless. What could also happen is that C is updated and no longer needs E. Then, with a "transitive closure", A would still install E, which would be useless for the user. So the only way to be safe is not to be clever and to specify real dependencies, eg: Real deps --------- A -> B,D B -> C C -> D,E Transitive closure ------------------ A -> B,C,D,E B -> C,D,E C -> D,E Current Arch way ---------------- A -> B B -> C C -> D,E What should be done ------------------- A -> B,D B -> C C -> D,E -- Pierre 'catwell' Chapuis