- <RefSect1><Title>Versioning</>
- <para>
- One purpose of the preferences file is to let the user select which version
- of a package will be installed. This selection can be made in a number of
- ways that fall into three categories, version, release and origin.
- <para>
- Selection by version can be done by exact match or prefix match. The format
- is <literal/2.1.2/ or <literal/2.2*/ for a prefix match. Matching by prefix
- can be used to ignore the <literal/r/ in the Debian release versioning, like
- <literal/2.1r*/ or to ignore Debian specific revisions, <literal/1.1-*/.
- When matching versions with a prefix the highest matching version will
- always be picked.
- <para>
- Selection by release is more complicated and has three forms. The primary
- purpose of release selections is to identify a set of packages that match
- a specific vendor, or release (ie Debian 2.1). The first two forms are
- shortcuts intended for quick command line use. If the first character of the
- specification is a digit then it is considered to be a release version match,
- otherwise a release label match. Specifications which contain equals are
- full release data matches and are a comma seperated list of one letter keys
- followed by an equals then by the string. Examples:
-<informalexample><programlisting>
-v=2.1*,o=Debian,c=main
-l=Debian
-a=stable
-</programlisting></informalexample>
- <para>
- The data for these matches are taken from the <filename/Release/ files
- that APT downloads during an <literal/update/. The available keys are:
- <VariableList>
- <VarListEntry><term>a= Archive</term>
- <ListItem><Para>
- This is the common name we give our archives, such as <literal/stable/ or
- <literal/unstable/. The special name <literal/now/ is used to designate
- the set of packages that are currently installed.
- </VarListEntry>
-
- <VarListEntry><term>c= Component</term>
- <ListItem><Para>
- Referes to the sub-component of the archive, <literal/main/,
- <literal/contrib/ etc. Component may be omitted if there are no
- components for this archive.
- </VarListEntry>
-
- <VarListEntry><term>v= Version</term>
- <ListItem><Para>
- This is a version string with the same properties as in the Packages file.
- It represents the release level of the archive. Typical Debian release
- numbers look like <literal/2.1r2/ with the r designating the release of
- 2.1. New releases are limited to security updates and other important
- changes.
- </VarListEntry>
-
- <VarListEntry><term>o= Origin</term>
- <ListItem><Para>
- This specifies who is providing this archive. In the case of Debian the
- string will read <literal/Debian/. Other providers may use their own
- string.
- </VarListEntry>
-
- <VarListEntry><term><term>l= Label</term>
- <ListItem><Para>
- This carries the encompassing name of the distribution. For Debian proper
- this field reads <literal/Debian/. For derived distributions it should
- contain their proper name.
- </VarListEntry>
- </VariableList>
- <para>
- The final selection method is by origin. This is simply the site name
- of the originating package files. The empty string is used for file URIs.
- <para>
- Version selection, particularly the latter two methods, are used in many
- different parts of APT, not just the preferences file.
- </RefSect1>
-
- <RefSect1><Title>Candidate Version Policy</>
- <para>
- Internally APT maintains a list of all available versions for all packages.
- If you place multiple releases or vendors in your &sources-list; file then
- these features are available. By default APT selects the highest version
- from all automatic sources. Some sources, such as
- <filename>project/experimental</> are marked Not Automatic - these fall
- to the bottom of the selection pile.
- <para>
- When deciding what version to use APT assigns a priority to each available
- version of the package. It then does two things, first it selects
- the highest priorty version that is newer than the installed version of the
- package, then it selects the highest priority version that is older than
- the installed version. Next, if the older versions have a priority greater
- than 1000 they are compared with the priority of the upgrade set, the larger
- becomes the selected result. Otherwise the downgrade versions are ignored
- and the highest priority of the ugprade set is selected.
- <para>
- It is possible to think of the priorities in strata:
- <VariableList>
- <VarListEntry><term>above 1000</term>
- <ListItem><Para>
- Downgradable priorities
- </VarListEntry>
-
- <VarListEntry><term>1000</term>
- <ListItem><Para>
- The downgrade prevention barrier
- </VarListEntry>
-
- <VarListEntry><term>101 to 999</term>
- <ListItem><Para>
- Standard priorities. 990 is the priority set by the
- <option/--target-release / &apt-get; option. 989 is the start for auto
- priorities and 500 are all the default package files.
- </VarListEntry>
-
- <VarListEntry><term>100</term>
- <ListItem><Para>
- The currently installed version
- </VarListEntry>
-
- <VarListEntry><term>0 to 99</term>
- <ListItem><Para>
- Non automatic priorities. These are only used if the package
- is not installed and there is no other version available.
- </VarListEntry>
-
- <VarListEntry><term>less than 0</term>
- <ListItem><Para>
- The version is never selected.
- </VarListEntry>
- </VariableList>
- <para>
- Giving a pin a priority greater than 1000 will allow APT to downgrade
- in order to get to that version.
- <para>
- Each package may be pinned to a specific version and each Packages file
- has a priority for every package inside. The highest priority assigned
- to a package is the one that is used.
- <para>
- A package pin looks like this:
-<informalexample><programlisting>
-Package: apt
-Pin: version 0.4.0
+<RefSect1><Title>Description</>
+<para>
+The APT preferences file <filename>/etc/apt/preferences</>
+can be used to control which version of a package will be selected
+for installation.
+</para>
+
+<para>Several versions of a package may be available for installation when
+the &sources-list; file contains references to more than one distribution
+(for example, <literal>stable</literal> and <literal>testing</literal>);
+furthermore, several instances of the same version of a package may be
+available when the file contains references to more than one download site
+for a particular distribution. APT assigns a "priority" to each instance
+that is available. (In what follows, an "instance" will be an instance of
+a package that is available according to &sources-list;.)
+Subject to dependency constraints, <command>apt-get</command> installs the
+instance with the highest priority. If two instances have the same
+priority then it installs the more recent one, that is, the one with the
+higher version number.
+</para>
+
+<para>The APT preferences file overrides the priorities that APT assigns
+to package instances by default, thus giving the user control over which
+one is selected for installation.
+</para>
+
+<RefSect2><Title>APT's Default Priority Assignments</>
+
+<para>If there is no preferences file, or if there is no entry in the file
+that applies to a particular instance, then the priority assigned to that
+instance is the priority of the distribution to which that instance
+belongs. It is possible to single out a distribution, called the
+"target release", which receives a higher priority than other distributions.
+The target release can be set on the <command>apt-get</command> command
+line or in the APT configuration file <filename>/etc/apt/apt.conf</filename>.
+For example,
+
+<programlisting>
+# Command to install the <literal/testing/ version of <replaceable>some-package</replaceable>
+<command>apt-get install -t testing <replaceable>some-package</replaceable></command>
+</programlisting>
+
+<programlisting>
+# Configuration setting to make <literal/stable/ the target release
+APT::Default-Release "stable";
+</programlisting>
+</para>
+
+<para>If a target release has been specified then APT uses the following
+algorithm to set the priorities of the instances of a package. Assign:
+
+<variablelist>
+<varlistentry>
+<term>priority 100</term>
+<listitem><simpara>to the instance that is already installed (if any).
+</simpara></listitem>
+</varlistentry>
+<varlistentry>
+<term>priority 500</term>
+<listitem><simpara>to the instances that are not installed
+and do not belong to the target release.
+</simpara></listitem>
+</varlistentry>
+<varlistentry>
+<term>priority 990</term>
+<listitem><simpara>to the instances that are not installed
+and belong to the target release.
+</simpara></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>If no target release has been specified then APT simply assigns
+priority 100 to all installed package instances and priority 500 to all
+uninstalled package instances.
+</para>
+
+<para>APT then applies the following rules, listed in order of precedence,
+to determine which instance of a package to install.
+
+<itemizedlist>
+<listitem><simpara>Never downgrade unless the priority of an available instance
+exceeds 1000. ("Downgrading" is installing a less recent version of a package
+in place of a more recent version. Note that none of APT's default priorities
+exceeds 1000; such high priorities can only be set in the preferences file.)
+</simpara></listitem>
+<listitem><simpara>Install the highest priority instance.
+</simpara></listitem>
+<listitem><simpara>If two or more instances have the same priority,
+install the most recent one.
+</simpara></listitem>
+<listitem><simpara>If two or more instances have the same version number,
+install the one whose source is listed earliest in &sources-list;.
+(The installed instance, if there is one, is always preferred in such a
+comparison unless <command>apt-get --reinstall</command> is used.)
+</simpara></listitem>
+</itemizedlist>
+</para>
+
+<para>In a typical situation, the installed instance of a package (priority 100)
+is not as recent as one of the instances available from the sources listed in
+the &sources-list; file (priority 500 or 990). Then the package will be
+upgraded with the command:
+<command>apt-get install</command> or <command>apt-get dist-upgrade</command>.
+</para>
+
+<para>Rarely, the installed instance of a package is <emphasis/more/ recent
+than any of the other available instances. The package will not be downgraded.
+</para>
+
+<para>Sometimes the installed instance of a package is more recent than the
+version belonging to the target release, but not as recent as a version
+belonging to some other distribution. Such a package will indeed be upgraded,
+because at least <emphasis/one/ of the available instances has a higher
+priority than the installed instance.
+</para>
+
+</RefSect2>
+
+<RefSect2><Title>The Effect of APT Preferences</>
+
+<para>The APT preferences file allows the system administrator to customize
+priorities. The file consists of one or more multi-line records separated
+by blank lines. Records can have one of two forms, a specific form and a
+general form.
+<itemizedlist>
+<listitem>
+<simpara>The "specific" form pins a priority (a "Pin-Priority") to a
+specified package and specified version or version range. For
+example, the following record pins a high priority to all versions of
+the <filename/perl/ package whose version number begins with
+"<literal/5.8/".
+</simpara>
+
+<programlisting>
+Package: perl
+Pin: version 5.8*
+Pin-Priority: 1001
+</programlisting>
+</listitem>
+
+<listitem><simpara>
+The "general" form pins a priority to all of the package versions in a
+given distribution (that is, to all the versions of packages that are
+listed in a certain <filename/Release/ file), or to all of the package
+instances coming from a particular Internet site, as identified by its
+fully qualified domain name.
+</simpara>
+
+<simpara>This general-form entry in the APT preferences file applies only
+to groups of packages. For example, the following record causes APT to
+assign a high priority to all package instances available from the local
+site.
+</simpara>
+
+<programlisting>
+Package: *
+Pin: origin ""
+Pin-Priority: 999
+</programlisting>
+
+<simpara>A note of caution: the keyword used here is "<literal/origin/".
+This should not be confused with the "Origin:" of a distribution as
+specified in a <filename/Release/ file. What follows the "Origin:" tag
+in a <filename/Release/ file is usually not an Internet site address
+but an author or vendor name, such as "Debian" or "Ximian".
+</simpara>
+
+<simpara>The following record causes APT to assign a low priority to all
+package versions belonging to any distribution whose "Archive"
+(<literal/a/) name is "<literal/unstable/".
+</simpara>
+
+<programlisting>
+Package: *
+Pin: release a=unstable
+Pin-Priority: 50
+</programlisting>
+
+<simpara>The following record causes APT to assign a high priority to all
+package versions belonging to any release whose "Archive" (<literal/a/)
+name is "<literal/stable/" and whose release "Version" (<literal/v/)
+number is "<literal/3.0/".
+</simpara>
+
+<programlisting>
+Package: *
+Pin: release a=unstable, v=3.0
+Pin-Priority: 50
+</programlisting>
+</listitem>
+</itemizedlist>
+</para>
+
+</RefSect2>
+
+<RefSect2><Title>How APT Interprets Priorities</Title>
+
+<para>Priorities (P) assigned in the APT preferences file must be positive
+or negative integers. They are interpreted as follows (roughly speaking):
+
+<variablelist>
+<varlistentry><term>P > 1000</term>
+<listitem><simpara>causes an instance to be installed
+even if this constitutes a downgrade of the package
+</simpara></listitem>
+</varlistentry>
+<varlistentry><term>990 < P <=1000</term>
+<listitem><simpara>causes an instance to be installed
+even if it does not come from the target release,
+unless the installed instance is more recent
+</simpara></listitem>
+</varlistentry>
+<varlistentry><term>500 < P <=990</term>
+<listitem><simpara>causes an instance to be installed
+unless there is an instance available belonging to the target release
+or the installed version is more recent
+</simpara></listitem>
+</varlistentry>
+<varlistentry><term>100 < P <=500</term>
+<listitem><simpara>causes an instance to be installed
+unless there is an instance available belonging to some other
+distribution or the installed version is more recent
+</simpara></listitem>
+<varlistentry><term>0 <= P <=100</term>
+<listitem><simpara>causes an instance to be installed
+only if there is no installed instance of the package
+</simpara></listitem>
+</varlistentry>
+<varlistentry><term>P < 0</term>
+<listitem><simpara>prevents the instance from being installed
+</simpara></listitem>
+</varlistentry>
+</variablelist>
+</para>
+
+<para>If one of the specific-form records described above matches an
+available package instance, then that record determines the priority of
+the instance. If two specific-form records match an available instance,
+then the first record encountered determines the priority. If two
+general-form records match an available instance, then the first record
+encountered determines the priority.
+</para>
+
+<para>For example, suppose the APT preferences file contains the three
+records presented earlier:
+
+<programlisting>
+Package: perl
+Pin: version 5.8*