On Thu, 20 Jan 2011 00:25:15 +1000, Allan McRae <al...@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

Reply via email to