diff options
author | Julian Andres Klode <jak@debian.org> | 2011-04-15 12:52:45 +0200 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2011-04-15 12:52:45 +0200 |
commit | 1a4c9766e0b31795b5d9869c6a98c1bba8380faa (patch) | |
tree | b4413151fc9f7e3464f5a9626e79e5c0f86659a3 | |
parent | 90cf90b254e5dbe8194dc93fa8f57f891b3ea518 (diff) |
* apt-pkg/policy.cc:
- Allow pinning by glob() expressions, and regular expressions
surrounded by slashes (the "/" character).
-rw-r--r-- | apt-pkg/policy.cc | 15 | ||||
-rw-r--r-- | debian/changelog | 5 | ||||
-rw-r--r-- | doc/apt_preferences.5.xml | 43 |
3 files changed, 62 insertions, 1 deletions
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index 94c7fd4af..3d6ec1cdc 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -216,6 +216,21 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, P->Data = Data; return; } + + // Allow pinning by wildcards + // TODO: Maybe we should always prefer specific pins over non- + // specific ones. + if (Name.find("*") != string::npos || Name.find("[") != string::npos + || Name.find("?") != string::npos || Name[0] == '/') { + pkgVersionMatch match(Data, Type); + for (pkgCache::PkgIterator P = Cache->PkgBegin(); + P != Cache->PkgEnd(); P++) { + if (match.ExpressionMatches(Name, P.Name())) { + CreatePin(Type, P.Name(), Data, Priority); + } + } + return; + } // Get a spot to put the pin pkgCache::GrpIterator Grp = Cache->FindGrp(Name); diff --git a/debian/changelog b/debian/changelog index 15dd0c648..79bc4dea5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -apt (0.8.13.3) UNRELEASED; urgency=low +apt (0.8.14) UNRELEASED; urgency=low [ Julian Andres Klode ] * apt-pkg/indexcopy.cc: @@ -10,6 +10,9 @@ apt (0.8.13.3) UNRELEASED; urgency=low - Do not install recommends for build-dep (Closes: #454479) (LP: #245273) * apt-pkg/deb/deblistparser.cc: - Handle no space before "[" in build-dependencies (LP: #72344) + * apt-pkg/policy.cc: + - Allow pinning by glob() expressions, and regular expressions + surrounded by slashes (the "/" character). [ Michael Vogt ] * mirror method: diff --git a/doc/apt_preferences.5.xml b/doc/apt_preferences.5.xml index 219da7cd1..55504f3e5 100644 --- a/doc/apt_preferences.5.xml +++ b/doc/apt_preferences.5.xml @@ -259,6 +259,49 @@ Pin-Priority: 500 </refsect2> +<refsect2><title>Regular expressions and glob() syntax</title> +<para> +APT also supports pinning by glob() expressions and regular +expressions surrounded by /. For example, the following +example assigns the priority 500 to all packages from +experimental where the name starts with gnome (as a glob()-like +expression or contains the word kde (as a POSIX extended regular +expression surrounded by slashes). +</para> + +<programlisting> +Package: gnome* /kde/ +Pin: release n=experimental +Pin-Priority: 500 +</programlisting> + +<para> +The rule for those expressions is that they can occur anywhere +where a string can occur. Those, the following pin assigns the +priority 990 to all packages from a release starting with karmic. +</para> + +<programlisting> +Package: * +Pin: release n=karmic* +Pin-Priority: 990 +</programlisting> + +If a regular expression occurs in a <literal>Package</literal> field, +the behavior is the same as if this regular expression were replaced +with a list of all package names it matches. It is undecided whether +this will change in the future, thus you should always list wild-card +pins first, so later specific pins override it. + +The pattern "<literal>*</literal>" in a Package field is not considered +a glob() expression in itself. + +</refsect2> + + + + + <refsect2> <title>How APT Interprets Priorities</title> |