---------------------------------------------------------
Summary:
* create an /etc/apt/preferences files
* add the repos to /etc/apt/sources.list
* put a hold on packages if downgraded
---------------------------------------------------------
I'm not an expert at this. However, I managed to get apt-pinning to work using this approach. I wish I had a better grasp of how .d directories work, but I don't, which is why a monolithic /etc/apt/preferences files is used
Anyway, apt-pinning is an interesting approach to having a system in which some packages are pulled from stable, some from testing and some from unstable. For example, if the Evolution version in stable is missing what you consider critical functionality, and a better version is present in the testing repos, you can install the testing version of Evolution, while still running a mainly stable version of debian. In other words, apt-pinning allows you to pull single packages from other debian releases.
You need to add the repos to your /etc/apt/sources.list
e.g.
deb ftp://ftp.au.debian.org/debian/ testing main contrib non-free
deb ftp://ftp.au.debian.org/debian/ stable main contrib non-free
deb ftp://ftp.au.debian.org/debian/ unstable main contrib non-free
You also need to create a file called /etc/apt/preferences
e.g.
Package: *
Pin: release a=testing
Pin-Priority: 990
Package: *
Pin: release a=unstable
Pin-Priority: -10
Package: *
Pin: release a=stable
Pin-Priority: -10
The example preferences file prioritises testing over unstable and stable. Default apt behaviour is to use the highest version and revision of each package is there are several alternatives i.e. without /etc/apt/preferences you will end up with the unstable/sid release. The Pin-Priority values are a science onto themselves.
Here's what
man apt_preferences
says:
P > 1000
causes a version to be installed even if this constitutes a downgrade of the package
990 < P <=1000
causes a version to be installed even if it does not come from the target release, unless the installed version is more recent
500 < P <=990
causes a version to be installed unless there is a version available belonging to the target release or the installed version is more recent
100 < P <=500
causes a version to be installed unless there is a version available belonging to some other distribution or the installed version is more recent
0 < P <=100
causes a version to be installed only if there is no installed version of the package
P < 0
prevents the version from being installed
I think negative values for the unwanted releases is a good place to start, or you may start automatically pulling over packages that depend on the one package which you want.
A way to see if it's working is to (for the package Evolution)
apt-cache showpkg evolution
Package: evolution
Versions:
3.0.3-3+b1 (/var/lib/apt/lists/ftp.au.debian.org_debian_dists_unstable_main_binary-amd64_Packages)
..
3.0.3-3 (/var/lib/apt/lists/ftp.au.debian.org_debian_dists_testing_main_binary-amd64_Packages)
..
2.30.3-5 (/var/lib/apt/lists/ftp.au.debian.org_debian_dists_stable_main_binary-amd64_Packages)
..
..
Provides:
3.0.3-3+b1 - mail-reader imap-client
3.0.3-3 - mail-reader imap-client
2.30.3-5 - mail-reader imap-client
Basically, it returns the different versions in the different release repos.
I've already described how to put a hold on a package so that it won't be upgraded, but here it is again (using the mpich2 package as an example):
sudo su
echo "mpich2 hold" | dpkg --set-selections
ConversionConversion EmoticonEmoticon