On 20/01/11 00:07, Pierre Chapuis wrote:
On Wed, 19 Jan 2011 23:59:55 +1000, Allan McRae <al...@archlinux.org>
wrote:
Huh? How is no dependency checks (-Sd) equivalent to complete
dependency checking (-S with a transitive closure of dependencies)?
They are polar opposites.
What I mean is that if a transitive closure of dependencies is
performed at packaging time, then there is no need to check for
dependencies when installing the original package.
Here is an example:
A depends on B and D
B depends on C
C depends on D and E
Currently the deps will be:
A -> B,D
B -> C
C -> D,E
When installing A, Pacman will:
1) check deps for A, start installing B and D
2) check deps for B and D, start installing C
3) check deps for C, start installing E
With a transitive closure scheme at packaging time, the
deps would be:
A -> B,C,D,E
B -> C,D,E
C -> D,E
When installing A, Pacman could simply install B, C, D and E
*without* checking their deps (-Sd) because these deps are
necessarily already included in those for A.
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.
Allan