diff options
author | Michael Vogt <michael.vogt@ubuntu.com> | 2009-06-29 16:44:46 +0200 |
---|---|---|
committer | Michael Vogt <michael.vogt@ubuntu.com> | 2009-06-29 16:44:46 +0200 |
commit | afe4d2a556535dbc9475ac1665c380a235dd28de (patch) | |
tree | 09309acf8e9b9e461d675a1d1377ba0b0b19aa6f | |
parent | f8ae7e8b3c5585888cbc0516b35131acec14ff05 (diff) | |
parent | efc487fbd46905f5f3efc4f31d7df15625bcbecf (diff) | |
download | apt-afe4d2a556535dbc9475ac1665c380a235dd28de.tar.gz |
[ABI break] Allow pinning by codename (closes: #97564)
-rw-r--r-- | apt-pkg/cacheiterators.h | 1 | ||||
-rw-r--r-- | apt-pkg/deb/deblistparser.cc | 2 | ||||
-rw-r--r-- | apt-pkg/pkgcache.cc | 2 | ||||
-rw-r--r-- | apt-pkg/pkgcache.h | 1 | ||||
-rw-r--r-- | apt-pkg/versionmatch.cc | 37 | ||||
-rw-r--r-- | apt-pkg/versionmatch.h | 21 | ||||
-rw-r--r-- | debian/changelog | 1 | ||||
-rw-r--r-- | doc/apt-get.8.xml | 9 | ||||
-rw-r--r-- | doc/apt.conf.5.xml | 2 | ||||
-rw-r--r-- | doc/apt_preferences.5.xml | 90 |
10 files changed, 139 insertions, 27 deletions
diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h index 08eafca0f..63f9de8fc 100644 --- a/apt-pkg/cacheiterators.h +++ b/apt-pkg/cacheiterators.h @@ -333,6 +333,7 @@ class pkgCache::PkgFileIterator inline const char *Component() const {return File->Component == 0?0:Owner->StrP + File->Component;}; inline const char *Version() const {return File->Version == 0?0:Owner->StrP + File->Version;}; inline const char *Origin() const {return File->Origin == 0?0:Owner->StrP + File->Origin;}; + inline const char *Codename() const {return File->Codename ==0?0:Owner->StrP + File->Codename;}; inline const char *Label() const {return File->Label == 0?0:Owner->StrP + File->Label;}; inline const char *Site() const {return File->Site == 0?0:Owner->StrP + File->Site;}; inline const char *Architecture() const {return File->Architecture == 0?0:Owner->StrP + File->Architecture;}; diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc index 74fa6fab4..b2b8b8fb6 100644 --- a/apt-pkg/deb/deblistparser.cc +++ b/apt-pkg/deb/deblistparser.cc @@ -639,6 +639,8 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI, FileI->Version = WriteUniqString(Start,Stop - Start); if (Section.Find("Origin",Start,Stop) == true) FileI->Origin = WriteUniqString(Start,Stop - Start); + if (Section.Find("Codename",Start,Stop) == true) + FileI->Codename = WriteUniqString(Start,Stop - Start); if (Section.Find("Label",Start,Stop) == true) FileI->Label = WriteUniqString(Start,Stop - Start); if (Section.Find("Architecture",Start,Stop) == true) diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc index 7a0d7376d..81a254483 100644 --- a/apt-pkg/pkgcache.cc +++ b/apt-pkg/pkgcache.cc @@ -607,6 +607,8 @@ string pkgCache::PkgFileIterator::RelStr() Res = Res + (Res.empty() == true?"o=":",o=") + Origin(); if (Archive() != 0) Res = Res + (Res.empty() == true?"a=":",a=") + Archive(); + if (Codename() != 0) + Res = Res + (Res.empty() == true?"n=":",n=") + Codename(); if (Label() != 0) Res = Res + (Res.empty() == true?"l=":",l=") + Label(); if (Component() != 0) diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h index f2c032eb4..e58515fb1 100644 --- a/apt-pkg/pkgcache.h +++ b/apt-pkg/pkgcache.h @@ -223,6 +223,7 @@ struct pkgCache::PackageFile // Names map_ptrloc FileName; // Stringtable map_ptrloc Archive; // Stringtable + map_ptrloc Codename; // Stringtable map_ptrloc Component; // Stringtable map_ptrloc Version; // Stringtable map_ptrloc Origin; // Stringtable diff --git a/apt-pkg/versionmatch.cc b/apt-pkg/versionmatch.cc index 5c25c2f7b..b4d1d4696 100644 --- a/apt-pkg/versionmatch.cc +++ b/apt-pkg/versionmatch.cc @@ -63,8 +63,8 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type) if (isdigit(Data[0])) RelVerStr = Data; else - RelArchive = Data; - + RelRelease = Data; + if (RelVerStr.length() > 0 && RelVerStr.end()[-1] == '*') { RelVerPrefixMatch = true; @@ -87,19 +87,21 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type) { if (strlen(Fragments[J]) < 3) continue; - + if (stringcasecmp(Fragments[J],Fragments[J]+2,"v=") == 0) RelVerStr = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"o=") == 0) RelOrigin = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"a=") == 0) RelArchive = Fragments[J]+2; + else if (stringcasecmp(Fragments[J],Fragments[J]+2,"n=") == 0) + RelCodename = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"l=") == 0) RelLabel = Fragments[J]+2; else if (stringcasecmp(Fragments[J],Fragments[J]+2,"c=") == 0) RelComponent = Fragments[J]+2; } - + if (RelVerStr.end()[-1] == '*') { RelVerPrefixMatch = true; @@ -169,15 +171,16 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) { if (MatchAll == true) return true; - + /* cout << RelVerStr << ',' << RelOrigin << ',' << RelArchive << ',' << RelLabel << endl; cout << File.Version() << ',' << File.Origin() << ',' << File.Archive() << ',' << File.Label() << endl;*/ - + if (RelVerStr.empty() == true && RelOrigin.empty() == true && RelArchive.empty() == true && RelLabel.empty() == true && + RelRelease.empty() == true && RelCodename.empty() == true && RelComponent.empty() == true) return false; - + if (RelVerStr.empty() == false) if (File->Version == 0 || MatchVer(File.Version(),RelVerStr,RelVerPrefixMatch) == false) @@ -187,11 +190,19 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) stringcasecmp(RelOrigin,File.Origin()) != 0) return false; if (RelArchive.empty() == false) - { - if (File->Archive == 0 || + if (File->Archive == 0 || stringcasecmp(RelArchive,File.Archive()) != 0) - return false; - } + return false; + if (RelCodename.empty() == false) + if (File->Codename == 0 || + stringcasecmp(RelCodename,File.Codename()) != 0) + return false; + if (RelRelease.empty() == false) + if ((File->Archive == 0 || + stringcasecmp(RelRelease,File.Archive()) != 0) && + (File->Codename == 0 || + stringcasecmp(RelRelease,File.Codename()) != 0)) + return false; if (RelLabel.empty() == false) if (File->Label == 0 || stringcasecmp(RelLabel,File.Label()) != 0) @@ -202,7 +213,7 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) return false; return true; } - + if (Type == Origin) { if (OrSite.empty() == false) { @@ -213,7 +224,7 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File) return false; return (OrSite == File.Site()); /* both strings match */ } - + return false; } /*}}}*/ diff --git a/apt-pkg/versionmatch.h b/apt-pkg/versionmatch.h index fe264aa46..a8f3c84ac 100644 --- a/apt-pkg/versionmatch.h +++ b/apt-pkg/versionmatch.h @@ -3,29 +3,32 @@ // $Id: versionmatch.h,v 1.4 2001/05/29 03:07:12 jgg Exp $ /* ###################################################################### - Version Matching - + Version Matching + This module takes a matching string and a type and locates the version record that satisfies the constraint described by the matching string. Version: 1.2* Release: o=Debian,v=2.1*,c=main Release: v=2.1* + Release: a=testing + Release: n=squeeze Release: * Origin: ftp.debian.org - + Release may be a complex type that can specify matches for any of: Version (v= with prefix) Origin (o=) - Archive (a=) + Archive (a=) eg, unstable, testing, stable + Codename (n=) e.g. etch, lenny, squeeze, sid Label (l=) Component (c=) If there are no equals signs in the string then it is scanned in short - form - if it starts with a number it is Version otherwise it is an - Archive. - + form - if it starts with a number it is Version otherwise it is an + Archive or a Codename. + Release may be a '*' to match all releases. - + ##################################################################### */ /*}}}*/ #ifndef PKGLIB_VERSIONMATCH_H @@ -47,6 +50,8 @@ class pkgVersionMatch string RelVerStr; bool RelVerPrefixMatch; string RelOrigin; + string RelRelease; + string RelCodename; string RelArchive; string RelLabel; string RelComponent; diff --git a/debian/changelog b/debian/changelog index ecba3f215..28bc54108 100644 --- a/debian/changelog +++ b/debian/changelog @@ -20,6 +20,7 @@ apt (0.7.22) UNRELEASED; urgency=low [ David Kalnischkies ] * [ABI break] support '#' in apt.conf and /etc/apt/preferences (closes: #189866) + * [ABI break] Allow pinning by codename (closes: #97564) [ Julian Andres Klode ] * apt-pkg/contrib/configuration.cc: Fix a small memory leak in diff --git a/doc/apt-get.8.xml b/doc/apt-get.8.xml index c1b3470ef..c63b2a6c6 100644 --- a/doc/apt-get.8.xml +++ b/doc/apt-get.8.xml @@ -53,6 +53,9 @@ <arg choice='plain'> <replaceable>target_release_number_expression</replaceable> </arg> + <arg choice='plain'> + <replaceable>target_release_codename</replaceable> + </arg> </group> </arg> @@ -71,6 +74,9 @@ <arg choice='plain'> /<replaceable>target_release_name</replaceable> </arg> + <arg choice='plain'> + /<replaceable>target_release_codename</replaceable> + </arg> </group> </arg> </arg> @@ -455,7 +461,8 @@ of this option. In short, this option lets you have simple control over which distribution packages will be retrieved from. Some common examples might be - <option>-t '2.1*'</option> or <option>-t unstable</option>. + <option>-t '2.1*'</option>, <option>-t unstable</option> + or <option>-t sid</option>. Configuration Item: <literal>APT::Default-Release</literal>; see also the &apt-preferences; manual page.</para></listitem> </varlistentry> diff --git a/doc/apt.conf.5.xml b/doc/apt.conf.5.xml index 74966c5b3..fb2be9a28 100644 --- a/doc/apt.conf.5.xml +++ b/doc/apt.conf.5.xml @@ -110,7 +110,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";}; <varlistentry><term>Default-Release</term> <listitem><para>Default release to install packages from if more than one - version available. Contains release name or release version. Examples: 'stable', 'testing', 'unstable', '4.0', '5.0*'. Release codenames ('etch', 'lenny' etc.) are not allowed now. See also &apt-preferences;.</para></listitem> + version available. Contains release name, codename or release version. Examples: 'stable', 'testing', 'unstable', 'lenny', 'squeeze', '4.0', '5.0*'. See also &apt-preferences;.</para></listitem> </varlistentry> <varlistentry><term>Ignore-Hold</term> diff --git a/doc/apt_preferences.5.xml b/doc/apt_preferences.5.xml index 162c2f00e..ff63f1dd3 100644 --- a/doc/apt_preferences.5.xml +++ b/doc/apt_preferences.5.xml @@ -14,7 +14,7 @@ &apt-email; &apt-product; <!-- The last update date --> - <date>29 February 2004</date> + <date>04 May 2009</date> </refentryinfo> <refmeta> @@ -191,6 +191,15 @@ Pin-Priority: 50 </programlisting> <simpara>The following record assigns a high priority to all package versions +belonging to any distribution whose Codename is "<literal>squeeze</literal>".</simpara> + +<programlisting> +Package: * +Pin: release n=squeeze +Pin-Priority: 900 +</programlisting> + +<simpara>The following record assigns a high priority to all package versions belonging to any release whose Archive name is "<literal>stable</literal>" and whose release Version number is "<literal>3.0</literal>".</simpara> @@ -327,10 +336,11 @@ file are relevant for setting APT priorities: <variablelist> <varlistentry> -<term>the <literal>Archive:</literal> line</term> +<term>the <literal>Archive:</literal> or <literal>Suite:</literal> line</term> <listitem><simpara>names the archive to which all the packages in the directory tree belong. For example, the line -"Archive: stable" +"Archive: stable" or +"Suite: stable" specifies that all of the packages in the directory tree below the parent of the <filename>Release</filename> file are in a <literal>stable</literal> archive. Specifying this value in the APT preferences file @@ -343,6 +353,22 @@ Pin: release a=stable </varlistentry> <varlistentry> +<term>the <literal>Codename:</literal> line</term> +<listitem><simpara>names the codename to which all the packages +in the directory tree belong. For example, the line +"Codename: squeeze" +specifies that all of the packages in the directory +tree below the parent of the <filename>Release</filename> file belong to a version named +<literal>squeeze</literal>. Specifying this value in the APT preferences file +would require the line: +</simpara> +<programlisting> +Pin: release n=squeeze +</programlisting> +</listitem> +</varlistentry> + +<varlistentry> <term>the <literal>Version:</literal> line</term> <listitem><simpara>names the release version. For example, the packages in the tree might belong to Debian GNU/Linux release @@ -522,7 +548,64 @@ version. apt-get install <replaceable>package</replaceable>/unstable </programlisting> </para> +</refsect2> + + +<refsect2> +<title>Tracking the evolution of a codename release</title> + +<para>The following APT preferences file will cause APT to assign a +priority higher than the default (500) to all package versions belonging +to a specified codename of a distribution and a prohibitively low priority to +package versions belonging to other <literal>Debian</literal> distributions, +codenames and archives. +Note that with this APT preference APT will follow the migration of a release +from the archive <literal>testing</literal> to <literal>stable</literal> and +later <literal>oldstable</literal>. If you want to follow for example the progress +in <literal>testing</literal> notwithstanding the codename changes you should use +the example configurations above. + +<programlisting> +Explanation: Uninstall or do not install any Debian-originated package versions +Explanation: other than those in the distribution codenamed with squeeze or sid +Package: * +Pin: release n=squeeze +Pin-Priority: 900 + +Explanation: Debian unstable is always codenamed with sid +Package: * +Pin: release a=sid +Pin-Priority: 800 + +Package: * +Pin: release o=Debian +Pin-Priority: -10 +</programlisting> +</para> + +<para>With a suitable &sources-list; file and the above preferences file, +any of the following commands will cause APT to upgrade to the +latest version(s) in the release codenamed with <literal>squeeze</literal>. + +<programlisting> +apt-get install <replaceable>package-name</replaceable> +apt-get upgrade +apt-get dist-upgrade +</programlisting> +</para> + +<para>The following command will cause APT to upgrade the specified +package to the latest version from the <literal>sid</literal> distribution. +Thereafter, <command>apt-get upgrade</command> will upgrade +the package to the most recent <literal>squeeze</literal> version if that is +more recent than the installed version, otherwise, to the most recent +<literal>sid</literal> version if that is more recent than the installed +version. +<programlisting> +apt-get install <replaceable>package</replaceable>/sid +</programlisting> +</para> </refsect2> </refsect1> @@ -535,4 +618,3 @@ apt-get install <replaceable>package</replaceable>/unstable &manbugs; </refentry> - |