blob: f879980cdf3da5dbccbb26709794b2e57b807075 [file] [log] [blame]
<chapter id='dependency-resolution-task-scheduling'>
<title>Task Scheduling</title>
<sect1 id='dependency-resolution-task-scheduling-dependencies'>
<title>Task Dependencies</title>
<para>
All tasks are executed in an order such
that a task's dependencies are satisfied
when it is executed. Dependency relationships between tasks
form a directed graph.
</para>
</sect1>
<sect1 id='dependency-resolution-task-scheduling-conflict-avoidance'>
<title>Conflict Avoidance</title>
<para>
Sometimes a package installation order exists such that it is
possible to avoid having two conflicting packages installed
simultaneously. If a currently installed package conflicts with a
new package that is planned to be installed, it may be possible to
solve the conflict by replacing the installed package with a
different package that occupies the same slot.
</para>
<para>
In order to avoid a conflict, a package may need to be uninstalled
in advance, rather than through replacement. The following constraints
protect inappropriate packages from being chosen for automatic
uninstallation:
<itemizedlist>
<listitem>
Installed packages that have been pulled into the current dependency
graph will not be uninstalled. Due to
<link linkend='dependency-resolution-package-modeling-dependency-neglection'>
dependency neglection</link> and special properties of packages
in the "system" set, other checks may be necessary in order
to protect inappropriate packages from being uninstalled.
</listitem>
<listitem>
An installed package that is matched by a dependency atom from the
"system" set will not be uninstalled in advance since it might not
be safe. Such a package will only be uninstalled through replacement.
</listitem>
<listitem>
An installed package that is matched by a dependency atom from the
"world" set will not be uninstalled if the dependency graph does not
contain a replacement package that is matched by the same dependency
atom.
</listitem>
</itemizedlist>
</para>
</sect1>
<sect1 id='dependency-resolution-task-scheduling-circular-dependencies'>
<title>Circular Dependencies</title>
<para>
TODO: Automatically solve circular dependencies by temporarily disabling
conditional dependencies and then rebuilding packages with the conditional
dependencies enabled.
</para>
</sect1>
<sect1 id='dependency-resolution-task-scheduling-parallel'>
<title>Parallel Scheduling</title>
<para>
TODO: Spawn an appropriate number of tasks in parallel when desired.
</para>
</sect1>
</chapter>