Преглед на файлове

[apt-pkg] allow also codenames for specifying a release
* MatchType::Release checks first for archive than for codename equality
* new n= option in apt_preference to be able to pin based on a codeName

David Kalnischkies преди 17 години
родител
ревизия
efc487fbd4
променени са 9 файла, в които са добавени 138 реда и са изтрити 27 реда
  1. 1 0
      apt-pkg/cacheiterators.h
  2. 2 0
      apt-pkg/deb/deblistparser.cc
  3. 2 0
      apt-pkg/pkgcache.cc
  4. 1 0
      apt-pkg/pkgcache.h
  5. 24 13
      apt-pkg/versionmatch.cc
  6. 13 8
      apt-pkg/versionmatch.h
  7. 8 1
      doc/apt-get.8.xml
  8. 1 1
      doc/apt.conf.5.xml
  9. 86 4
      doc/apt_preferences.5.xml

+ 1 - 0
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 *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 *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 *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 *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 *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;};
    inline const char *Architecture() const {return File->Architecture == 0?0:Owner->StrP + File->Architecture;};

+ 2 - 0
apt-pkg/deb/deblistparser.cc

@@ -637,6 +637,8 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
       FileI->Version = WriteUniqString(Start,Stop - Start);
       FileI->Version = WriteUniqString(Start,Stop - Start);
    if (Section.Find("Origin",Start,Stop) == true)
    if (Section.Find("Origin",Start,Stop) == true)
       FileI->Origin = WriteUniqString(Start,Stop - Start);
       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)
    if (Section.Find("Label",Start,Stop) == true)
       FileI->Label = WriteUniqString(Start,Stop - Start);
       FileI->Label = WriteUniqString(Start,Stop - Start);
    if (Section.Find("Architecture",Start,Stop) == true)
    if (Section.Find("Architecture",Start,Stop) == true)

+ 2 - 0
apt-pkg/pkgcache.cc

@@ -607,6 +607,8 @@ string pkgCache::PkgFileIterator::RelStr()
       Res = Res + (Res.empty() == true?"o=":",o=")  + Origin();
       Res = Res + (Res.empty() == true?"o=":",o=")  + Origin();
    if (Archive() != 0)
    if (Archive() != 0)
       Res = Res + (Res.empty() == true?"a=":",a=")  + Archive();
       Res = Res + (Res.empty() == true?"a=":",a=")  + Archive();
+   if (Codename() != 0)
+      Res = Res + (Res.empty() == true?"n=":",n=")  + Codename();
    if (Label() != 0)
    if (Label() != 0)
       Res = Res + (Res.empty() == true?"l=":",l=")  + Label();
       Res = Res + (Res.empty() == true?"l=":",l=")  + Label();
    if (Component() != 0)
    if (Component() != 0)

+ 1 - 0
apt-pkg/pkgcache.h

@@ -223,6 +223,7 @@ struct pkgCache::PackageFile
    // Names
    // Names
    map_ptrloc FileName;        // Stringtable
    map_ptrloc FileName;        // Stringtable
    map_ptrloc Archive;         // Stringtable
    map_ptrloc Archive;         // Stringtable
+   map_ptrloc Codename;        // Stringtable
    map_ptrloc Component;       // Stringtable
    map_ptrloc Component;       // Stringtable
    map_ptrloc Version;         // Stringtable
    map_ptrloc Version;         // Stringtable
    map_ptrloc Origin;          // Stringtable
    map_ptrloc Origin;          // Stringtable

+ 24 - 13
apt-pkg/versionmatch.cc

@@ -63,8 +63,8 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type)
 	 if (isdigit(Data[0]))
 	 if (isdigit(Data[0]))
 	    RelVerStr = Data;
 	    RelVerStr = Data;
 	 else
 	 else
-	    RelArchive = Data;
-	 
+	    RelRelease = Data;
+
 	 if (RelVerStr.length() > 0 && RelVerStr.end()[-1] == '*')
 	 if (RelVerStr.length() > 0 && RelVerStr.end()[-1] == '*')
 	 {
 	 {
 	    RelVerPrefixMatch = true;
 	    RelVerPrefixMatch = true;
@@ -87,19 +87,21 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type)
       {
       {
 	 if (strlen(Fragments[J]) < 3)
 	 if (strlen(Fragments[J]) < 3)
 	    continue;
 	    continue;
-	    
+
 	 if (stringcasecmp(Fragments[J],Fragments[J]+2,"v=") == 0)
 	 if (stringcasecmp(Fragments[J],Fragments[J]+2,"v=") == 0)
 	    RelVerStr = Fragments[J]+2;
 	    RelVerStr = Fragments[J]+2;
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"o=") == 0)
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"o=") == 0)
 	    RelOrigin = Fragments[J]+2;
 	    RelOrigin = Fragments[J]+2;
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"a=") == 0)
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"a=") == 0)
 	    RelArchive = Fragments[J]+2;
 	    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)
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"l=") == 0)
 	    RelLabel = Fragments[J]+2;
 	    RelLabel = Fragments[J]+2;
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"c=") == 0)
 	 else if (stringcasecmp(Fragments[J],Fragments[J]+2,"c=") == 0)
 	    RelComponent = Fragments[J]+2;
 	    RelComponent = Fragments[J]+2;
       }
       }
-      
+
       if (RelVerStr.end()[-1] == '*')
       if (RelVerStr.end()[-1] == '*')
       {
       {
 	 RelVerPrefixMatch = true;
 	 RelVerPrefixMatch = true;
@@ -169,15 +171,16 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File)
    {
    {
       if (MatchAll == true)
       if (MatchAll == true)
 	 return true;
 	 return true;
-      
+
 /*      cout << RelVerStr << ',' << RelOrigin << ',' << RelArchive << ',' << RelLabel << endl;
 /*      cout << RelVerStr << ',' << RelOrigin << ',' << RelArchive << ',' << RelLabel << endl;
       cout << File.Version() << ',' << File.Origin() << ',' << File.Archive() << ',' << File.Label() << endl;*/
       cout << File.Version() << ',' << File.Origin() << ',' << File.Archive() << ',' << File.Label() << endl;*/
-      
+
       if (RelVerStr.empty() == true && RelOrigin.empty() == true &&
       if (RelVerStr.empty() == true && RelOrigin.empty() == true &&
 	  RelArchive.empty() == true && RelLabel.empty() == true &&
 	  RelArchive.empty() == true && RelLabel.empty() == true &&
+	  RelRelease.empty() == true && RelCodename.empty() == true &&
 	  RelComponent.empty() == true)
 	  RelComponent.empty() == true)
 	 return false;
 	 return false;
-      
+
       if (RelVerStr.empty() == false)
       if (RelVerStr.empty() == false)
 	 if (File->Version == 0 ||
 	 if (File->Version == 0 ||
 	     MatchVer(File.Version(),RelVerStr,RelVerPrefixMatch) == false)
 	     MatchVer(File.Version(),RelVerStr,RelVerPrefixMatch) == false)
@@ -187,11 +190,19 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File)
 	     stringcasecmp(RelOrigin,File.Origin()) != 0)
 	     stringcasecmp(RelOrigin,File.Origin()) != 0)
 	    return false;
 	    return false;
       if (RelArchive.empty() == false)
       if (RelArchive.empty() == false)
-      {
-	 if (File->Archive == 0 || 
+	 if (File->Archive == 0 ||
 	     stringcasecmp(RelArchive,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 (RelLabel.empty() == false)
 	 if (File->Label == 0 ||
 	 if (File->Label == 0 ||
 	     stringcasecmp(RelLabel,File.Label()) != 0)
 	     stringcasecmp(RelLabel,File.Label()) != 0)
@@ -202,7 +213,7 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File)
 	    return false;
 	    return false;
       return true;
       return true;
    }
    }
-   
+
    if (Type == Origin)
    if (Type == Origin)
    {
    {
       if (OrSite.empty() == false) {
       if (OrSite.empty() == false) {
@@ -213,7 +224,7 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File)
 	    return false;
 	    return false;
       return (OrSite == File.Site());		/* both strings match */
       return (OrSite == File.Site());		/* both strings match */
    }
    }
-   
+
    return false;
    return false;
 }
 }
 									/*}}}*/
 									/*}}}*/

+ 13 - 8
apt-pkg/versionmatch.h

@@ -3,29 +3,32 @@
 // $Id: versionmatch.h,v 1.4 2001/05/29 03:07:12 jgg Exp $
 // $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
    This module takes a matching string and a type and locates the version
    record that satisfies the constraint described by the matching string.
    record that satisfies the constraint described by the matching string.
 
 
      Version: 1.2*
      Version: 1.2*
      Release: o=Debian,v=2.1*,c=main
      Release: o=Debian,v=2.1*,c=main
      Release: v=2.1*
      Release: v=2.1*
+     Release: a=testing
+     Release: n=squeeze
      Release: *
      Release: *
      Origin: ftp.debian.org
      Origin: ftp.debian.org
-   
+
    Release may be a complex type that can specify matches for any of:
    Release may be a complex type that can specify matches for any of:
       Version (v= with prefix)
       Version (v= with prefix)
       Origin (o=)
       Origin (o=)
-      Archive (a=)
+      Archive (a=) eg, unstable, testing, stable
+      Codename (n=) e.g. etch, lenny, squeeze, sid
       Label (l=)
       Label (l=)
       Component (c=)
       Component (c=)
    If there are no equals signs in the string then it is scanned in short
    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.
    Release may be a '*' to match all releases.
-   
+
    ##################################################################### */
    ##################################################################### */
 									/*}}}*/
 									/*}}}*/
 #ifndef PKGLIB_VERSIONMATCH_H
 #ifndef PKGLIB_VERSIONMATCH_H
@@ -47,6 +50,8 @@ class pkgVersionMatch
    string RelVerStr;
    string RelVerStr;
    bool RelVerPrefixMatch;
    bool RelVerPrefixMatch;
    string RelOrigin;
    string RelOrigin;
+   string RelRelease;
+   string RelCodename;
    string RelArchive;
    string RelArchive;
    string RelLabel;
    string RelLabel;
    string RelComponent;
    string RelComponent;

+ 8 - 1
doc/apt-get.8.xml

@@ -53,6 +53,9 @@
 			  <arg choice='plain'>
 			  <arg choice='plain'>
 				  <replaceable>target_release_number_expression</replaceable>
 				  <replaceable>target_release_number_expression</replaceable>
 			  </arg>
 			  </arg>
+			  <arg choice='plain'>
+				  <replaceable>target_release_codename</replaceable>
+			  </arg>
 		  </group>
 		  </group>
       </arg>
       </arg>
 
 
@@ -71,6 +74,9 @@
 						<arg choice='plain'>
 						<arg choice='plain'>
 							/<replaceable>target_release_name</replaceable>
 							/<replaceable>target_release_name</replaceable>
 						</arg>
 						</arg>
+						<arg choice='plain'>
+							/<replaceable>target_release_codename</replaceable>
+						</arg>
 					</group>
 					</group>
 				</arg>
 				</arg>
 			 </arg>
 			 </arg>
@@ -455,7 +461,8 @@
      of this option. In short, this option
      of this option. In short, this option
      lets you have simple control over which distribution packages will be
      lets you have simple control over which distribution packages will be
      retrieved from. Some common examples might 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>;
      Configuration Item: <literal>APT::Default-Release</literal>;
      see also the &apt-preferences; manual page.</para></listitem>
      see also the &apt-preferences; manual page.</para></listitem>
      </varlistentry>
      </varlistentry>

+ 1 - 1
doc/apt.conf.5.xml

@@ -110,7 +110,7 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
      
      
      <varlistentry><term>Default-Release</term>
      <varlistentry><term>Default-Release</term>
 	 <listitem><para>Default release to install packages from if more than one
 	 <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>
      
      
      <varlistentry><term>Ignore-Hold</term>
      <varlistentry><term>Ignore-Hold</term>

+ 86 - 4
doc/apt_preferences.5.xml

@@ -14,7 +14,7 @@
    &apt-email;
    &apt-email;
    &apt-product;
    &apt-product;
    <!-- The last update date -->
    <!-- The last update date -->
-   <date>29 February 2004</date>
+   <date>04 May 2009</date>
  </refentryinfo>
  </refentryinfo>
 
 
  <refmeta>
  <refmeta>
@@ -190,6 +190,15 @@ Pin: release a=unstable
 Pin-Priority: 50
 Pin-Priority: 50
 </programlisting>
 </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
 <simpara>The following record assigns a high priority to all package versions
 belonging to any release whose Archive name is "<literal>stable</literal>"
 belonging to any release whose Archive name is "<literal>stable</literal>"
 and whose release Version number is "<literal>3.0</literal>".</simpara>
 and whose release Version number is "<literal>3.0</literal>".</simpara>
@@ -327,10 +336,11 @@ file are relevant for setting APT priorities:
 
 
 <variablelist>
 <variablelist>
 <varlistentry>
 <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
 <listitem><simpara>names the archive to which all the packages
 in the directory tree belong.  For example, the line
 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
 specifies that all of the packages in the directory
 tree below the parent of the <filename>Release</filename> file are in a
 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
 <literal>stable</literal> archive.  Specifying this value in the APT preferences file
@@ -342,6 +352,22 @@ Pin: release a=stable
 </listitem>
 </listitem>
 </varlistentry>
 </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>
 <varlistentry>
 <term>the <literal>Version:</literal> line</term>
 <term>the <literal>Version:</literal> line</term>
 <listitem><simpara>names the release version.  For example, the
 <listitem><simpara>names the release version.  For example, the
@@ -522,7 +548,64 @@ version.
 apt-get install <replaceable>package</replaceable>/unstable
 apt-get install <replaceable>package</replaceable>/unstable
 </programlisting>
 </programlisting>
 </para>
 </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>
 </refsect2>
 </refsect1>
 </refsect1>
 
 
@@ -535,4 +618,3 @@ apt-get install <replaceable>package</replaceable>/unstable
  &manbugs;
  &manbugs;
 
 
 </refentry>
 </refentry>
-