]> git.saurik.com Git - apt.git/commitdiff
[apt-pkg] allow also codenames for specifying a release
authorDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 7 May 2009 10:04:21 +0000 (12:04 +0200)
committerDavid Kalnischkies <kalnischkies@gmail.com>
Thu, 7 May 2009 10:04:21 +0000 (12:04 +0200)
* 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

apt-pkg/cacheiterators.h
apt-pkg/deb/deblistparser.cc
apt-pkg/pkgcache.cc
apt-pkg/pkgcache.h
apt-pkg/versionmatch.cc
apt-pkg/versionmatch.h
doc/apt-get.8.xml
doc/apt.conf.5.xml
doc/apt_preferences.5.xml

index 08eafca0f44db8e722299e68307b9f887e0b6dd9..63f9de8fc557e2d5bd0a15480b90f4ca0fb93e65 100644 (file)
@@ -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 *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;};
    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;};
index 896d4d6d8590c3ef697d3171ea5f0bf994593e5c..d8be66cba8c822aa8285eaff83528e59d3e35302 100644 (file)
@@ -637,6 +637,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);
       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)
    if (Section.Find("Label",Start,Stop) == true)
       FileI->Label = WriteUniqString(Start,Stop - Start);
    if (Section.Find("Architecture",Start,Stop) == true)
index 4fbf42c4bb6c4f82dd919ad8fbe2647eb58df06d..f5303682c974c8406ae22a749c0f47a5edbf6934 100644 (file)
@@ -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();
       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)
    if (Label() != 0)
       Res = Res + (Res.empty() == true?"l=":",l=")  + Label();
    if (Component() != 0)
index 759e9a2251fdf8d706c91ee9adf67123c545b201..af63443a6e3f098ee66b554bdf7b4123b8863312 100644 (file)
@@ -223,6 +223,7 @@ struct pkgCache::PackageFile
    // Names
    map_ptrloc FileName;        // Stringtable
    map_ptrloc Archive;         // Stringtable
    // 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
    map_ptrloc Component;       // Stringtable
    map_ptrloc Version;         // Stringtable
    map_ptrloc Origin;          // Stringtable
index 5c25c2f7b98cf92e1f12c53961aa51dc46110935..b4d1d4696ed58b983256efff47f910c2d20b70d1 100644 (file)
@@ -63,8 +63,8 @@ pkgVersionMatch::pkgVersionMatch(string Data,MatchType Type) : Type(Type)
         if (isdigit(Data[0]))
            RelVerStr = Data;
         else
         if (isdigit(Data[0]))
            RelVerStr = Data;
         else
-           RelArchive = Data;
-        
+           RelRelease = Data;
+
         if (RelVerStr.length() > 0 && RelVerStr.end()[-1] == '*')
         {
            RelVerPrefixMatch = true;
         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 (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;
         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;
       }
         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;
       if (RelVerStr.end()[-1] == '*')
       {
         RelVerPrefixMatch = true;
@@ -169,15 +171,16 @@ bool pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator File)
    {
       if (MatchAll == true)
         return true;
    {
       if (MatchAll == true)
         return true;
-      
+
 /*      cout << RelVerStr << ',' << RelOrigin << ',' << RelArchive << ',' << RelLabel << endl;
       cout << File.Version() << ',' << File.Origin() << ',' << File.Archive() << ',' << File.Label() << endl;*/
 /*      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 &&
       if (RelVerStr.empty() == true && RelOrigin.empty() == true &&
          RelArchive.empty() == true && RelLabel.empty() == true &&
+         RelRelease.empty() == true && RelCodename.empty() == true &&
          RelComponent.empty() == true)
         return false;
          RelComponent.empty() == true)
         return false;
-      
+
       if (RelVerStr.empty() == false)
         if (File->Version == 0 ||
             MatchVer(File.Version(),RelVerStr,RelVerPrefixMatch) == 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)
             stringcasecmp(RelOrigin,File.Origin()) != 0)
            return 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 (File->Label == 0 ||
             stringcasecmp(RelLabel,File.Label()) != 0)
       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;
    }
            return false;
       return true;
    }
-   
+
    if (Type == Origin)
    {
       if (OrSite.empty() == false) {
    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;
       return (OrSite == File.Site());          /* both strings match */
    }
-   
+
    return false;
 }
                                                                        /*}}}*/
    return false;
 }
                                                                        /*}}}*/
index fe264aa463688ff9cfa47f79225bf8345eb988cc..a8f3c84ac9a8ab92fcb3fdb289510a3ea208c035 100644 (file)
@@ -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
    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*
    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: *
      Origin: ftp.debian.org
-   
+
    Release may be a complex type that can specify matches for any of:
       Version (v= with prefix)
       Origin (o=)
    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
       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.
    Release may be a '*' to match all releases.
-   
+
    ##################################################################### */
                                                                        /*}}}*/
 #ifndef PKGLIB_VERSIONMATCH_H
    ##################################################################### */
                                                                        /*}}}*/
 #ifndef PKGLIB_VERSIONMATCH_H
@@ -47,6 +50,8 @@ class pkgVersionMatch
    string RelVerStr;
    bool RelVerPrefixMatch;
    string RelOrigin;
    string RelVerStr;
    bool RelVerPrefixMatch;
    string RelOrigin;
+   string RelRelease;
+   string RelCodename;
    string RelArchive;
    string RelLabel;
    string RelComponent;
    string RelArchive;
    string RelLabel;
    string RelComponent;
index c1b3470ef83c290a11b838a1502da79b904cbd6f..c63b2a6c6364dc65a25e7d867a1ded13984efbf2 100644 (file)
@@ -53,6 +53,9 @@
                          <arg choice='plain'>
                                  <replaceable>target_release_number_expression</replaceable>
                          </arg>
                          <arg choice='plain'>
                                  <replaceable>target_release_number_expression</replaceable>
                          </arg>
+                         <arg choice='plain'>
+                                 <replaceable>target_release_codename</replaceable>
+                         </arg>
                  </group>
       </arg>
 
                  </group>
       </arg>
 
@@ -71,6 +74,9 @@
                                                <arg choice='plain'>
                                                        /<replaceable>target_release_name</replaceable>
                                                </arg>
                                                <arg choice='plain'>
                                                        /<replaceable>target_release_name</replaceable>
                                                </arg>
+                                               <arg choice='plain'>
+                                                       /<replaceable>target_release_codename</replaceable>
+                                               </arg>
                                        </group>
                                </arg>
                         </arg>
                                        </group>
                                </arg>
                         </arg>
      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 
      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>
      Configuration Item: <literal>APT::Default-Release</literal>;
      see also the &apt-preferences; manual page.</para></listitem>
      </varlistentry>
index 74966c5b3738594d0da2b69c4e4c73bdea13a398..fb2be9a28939056b66e9d48efaf74967ad7d3875 100644 (file)
@@ -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
      
      <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>
      </varlistentry>
      
      <varlistentry><term>Ignore-Hold</term>
index 162c2f00e1525e94e6cf0dfc3c7de70156aadcd7..ff63f1dd34f19ad7f5991c20a993e891bed49ddd 100644 (file)
@@ -14,7 +14,7 @@
    &apt-email;
    &apt-product;
    <!-- The last update date -->
    &apt-email;
    &apt-product;
    <!-- The last update date -->
-   <date>29 February 2004</date>
+   <date>04 May 2009</date>
  </refentryinfo>
 
  <refmeta>
  </refentryinfo>
 
  <refmeta>
@@ -190,6 +190,15 @@ Pin: release a=unstable
 Pin-Priority: 50
 </programlisting>
 
 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>
 <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>
 
 <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
 <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
 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
@@ -342,6 +352,22 @@ Pin: release a=stable
 </listitem>
 </varlistentry>
 
 </listitem>
 </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
 <varlistentry>
 <term>the <literal>Version:</literal> line</term>
 <listitem><simpara>names the release version.  For example, the
@@ -522,7 +548,64 @@ version.
 apt-get install <replaceable>package</replaceable>/unstable
 </programlisting>
 </para>
 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>
 
 </refsect2>
 </refsect1>
 
@@ -535,4 +618,3 @@ apt-get install <replaceable>package</replaceable>/unstable
  &manbugs;
 
 </refentry>
  &manbugs;
 
 </refentry>
-