Michael Vogt лет назад: 12
Родитель
Сommit
2f0ae309be

+ 48 - 30
apt-pkg/sourcelist.cc

@@ -71,6 +71,53 @@ bool pkgSourceList::Type::FixupURI(string &URI) const
    return true;
 }
 									/*}}}*/
+bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List,
+                                      pkgTagSection &Tags,
+                                      int i,
+                                      FileFd &Fd)
+{
+   map<string, string> Options;
+
+   string URI = Tags.FindS("Uri");
+   if (!FixupURI(URI))
+   {
+      _error->Error(_("Malformed stanza %u in source list %s (URI parse)"),i,Fd.Name().c_str());
+      return false;
+   }
+   
+   // Define external/internal options
+   const char* option_deb822[] = { 
+      "Architectures", "Architectures-Add", "Architectures-Delete", "Trusted",
+   };
+   const char* option_internal[] = { 
+      "arch", "arch+", "arch-", "trusted",
+   };
+   for (unsigned int j=0; j < sizeof(option_deb822)/sizeof(char*); j++)
+      if (Tags.Exists(option_deb822[j]))
+         Options[option_internal[j]] = Tags.FindS(option_deb822[j]);
+   
+   // now create one item per suite/section
+   string Suite = Tags.FindS("Suite");
+   Suite = SubstVar(Suite,"$(ARCH)",_config->Find("APT::Architecture"));
+   string const Section = Tags.FindS("Section");
+
+   std::vector<std::string> list_dist = StringSplit(Suite, " ");
+   std::vector<std::string> list_section = StringSplit(Section, " ");
+   for (std::vector<std::string>::const_iterator I = list_dist.begin();
+        I != list_dist.end(); I++)
+   {
+      for (std::vector<std::string>::const_iterator J = list_section.begin();
+           J != list_section.end(); J++)
+         {
+            if (CreateItem(List, URI, (*I), (*J), Options) == false)
+            {
+               return false;
+            }
+         }
+   }
+   return true;
+}
+
 // Type::ParseLine - Parse a single line				/*{{{*/
 // ---------------------------------------------------------------------
 /* This is a generic one that is the 'usual' format for sources.list
@@ -313,7 +360,6 @@ bool pkgSourceList::ParseFileOldStyle(string File)
 int pkgSourceList::ParseFileDeb822(string File)
 {
    pkgTagSection Tags;
-   map<string, string> Options;
    unsigned int i=0;
 
    // see if we can read the file
@@ -338,39 +384,11 @@ int pkgSourceList::ParseFileDeb822(string File)
       if (Parse == 0)
       {
          _error->Error(_("Type '%s' is not known on stanza %u in source list %s"),type.c_str(),i,Fd.Name().c_str());
-         // true means we do not retry with old-style sources.list
          return -1;
       }
          
-      string URI = Tags.FindS("URL");
-      if (!Parse->FixupURI(URI))
-      {
-         _error->Error(_("Malformed stanza %u in source list %s (URI parse)"),i,Fd.Name().c_str());
-         // means we do not retry with old-style sources.list
+      if (!Parse->ParseStanza(SrcList, Tags, i, Fd))
          return -1;
-      }
-
-      string Dist = Tags.FindS("Dist");
-      Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
-
-      // check if there are any options we support
-      const char* option_str[] = { 
-         "arch", "arch+", "arch-", "trusted",
-      };
-      for (unsigned int j=0; j < sizeof(option_str)/sizeof(char*); j++)
-         if (Tags.Exists(option_str[j]))
-            Options[option_str[j]] = Tags.FindS(option_str[j]);
-
-      // now create one item per section
-      string const Section = Tags.FindS("Section");
-      std::vector<std::string> list;
-      if (Section.find(","))
-         list = StringSplit(Section, ",");
-      else
-         list = StringSplit(Section, " ");
-      for (std::vector<std::string>::const_iterator I = list.begin();
-           I != list.end(); I++)
-         Parse->CreateItem(SrcList, URI, Dist, (*I), Options);
 
       i++;
    }

+ 5 - 0
apt-pkg/sourcelist.h

@@ -31,6 +31,7 @@
 #include <vector>
 #include <map>
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/tagfile.h>
 
 #ifndef APT_8_CLEANER_HEADERS
 #include <apt-pkg/metaindex.h>
@@ -60,6 +61,10 @@ class pkgSourceList
       const char *Label;
 
       bool FixupURI(std::string &URI) const;
+      virtual bool ParseStanza(std::vector<metaIndex *> &List,
+                               pkgTagSection &Tags,
+                               int stanza_n,
+                               FileFd &Fd);
       virtual bool ParseLine(std::vector<metaIndex *> &List,
 			     const char *Buffer,
 			     unsigned long const &CurLine,std::string const &File) const;

+ 34 - 17
doc/sources.list.5.xml

@@ -76,22 +76,37 @@
    code in the same form as the <literal>deb</literal> type.
    A <literal>deb-src</literal> line is required to fetch source indexes.</para>
 
-
    <para>The format for a <filename>sources.list</filename> entry using the
    <literal>deb</literal> and <literal>deb-src</literal> types is:</para>
 
-   <literallayout>deb [ options ] uri distribution [component1] [component2] [...]</literallayout>
+   <literallayout>deb [ options ] uri suite [component1] [component2] [...]</literallayout>
+
+   <para>Alternatively a rfc822 style format is also supported:
+   <literallayout>
+     Type: deb
+     Uri: http://example.com
+     Suite: stable
+     Section: component1 component2
+     [option1]: [option1-value]
+
+     Type: deb-src
+     Uri: http://example.com
+     Suite: stable
+     Section: component1 component2
+     [option1]: [option1-value]
+   </literallayout>
+   </para>
 
    <para>The URI for the <literal>deb</literal> type must specify the base of the
    Debian distribution, from which APT will find the information it needs. 
-   <literal>distribution</literal> can specify an exact path, in which case the 
-   components must be omitted and <literal>distribution</literal> must end with
+   <literal>suite</literal> can specify an exact path, in which case the 
+   components must be omitted and <literal>suite</literal> must end with
    a slash (<literal>/</literal>). This is useful for the case when only a
    particular sub-section of the archive denoted by the URI is of interest.
-   If <literal>distribution</literal> does not specify an exact path, at least
+   If <literal>suite</literal> does not specify an exact path, at least
    one <literal>component</literal> must be present.</para>
 
-   <para><literal>distribution</literal> may also contain a variable, 
+   <para><literal>suite</literal> may also contain a variable, 
    <literal>$(ARCH)</literal>
    which expands to the Debian architecture (such as <literal>amd64</literal> or
    <literal>armel</literal>) used on the system. This permits architecture-independent
@@ -99,17 +114,19 @@
    of interest when specifying an exact path, <literal>APT</literal> will
    automatically generate a URI with the current architecture otherwise.</para>
 
-   <para>Since only one distribution can be specified per line it may be necessary
-   to have multiple lines for the same URI, if a subset of all available
-   distributions or components at that location is desired.
-   APT will sort the URI list after it has generated a complete set 
-   internally, and will collapse multiple references to the same Internet 
-   host, for instance, into a single connection, so that it does not 
-   inefficiently establish an FTP connection, close it, do something else, 
-   and then re-establish a connection to that same host. This feature is 
-   useful for accessing busy FTP sites with limits on the number of 
-   simultaneous anonymous users. APT also parallelizes connections to 
-   different hosts to more effectively deal with sites with low bandwidth.</para>
+   <para>In the traditional style sources.list format since only one
+   distribution can be specified per line it may be necessary to have
+   multiple lines for the same URI, if a subset of all available
+   distributions or components at that location is desired.  APT will
+   sort the URI list after it has generated a complete set internally,
+   and will collapse multiple references to the same Internet host,
+   for instance, into a single connection, so that it does not
+   inefficiently establish an FTP connection, close it, do something
+   else, and then re-establish a connection to that same host. This
+   feature is useful for accessing busy FTP sites with limits on the
+   number of simultaneous anonymous users. APT also parallelizes
+   connections to different hosts to more effectively deal with sites
+   with low bandwidth.</para>
 
    <para><literal>options</literal> is always optional and needs to be surrounded by
    square brackets. It can consist of multiple settings in the form

+ 15 - 16
test/integration/test-apt-sources-deb822

@@ -13,8 +13,8 @@ BASE='# some comment
 #Type: meep
 
 Type: deb
-URL: http://ftp.debian.org/debian
-Dist: stable
+Uri: http://ftp.debian.org/debian
+Suite: stable
 Section: main
 Comment: Some random string
  that can be very long'
@@ -26,7 +26,6 @@ testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/P
 'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 :
 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 "  aptget update --print-uris
 
-
 msgtest 'Test simple deb822 sources.list'
 echo "$BASE"  > $SOURCES
 testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 :
@@ -35,7 +34,7 @@ testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/P
 
 
 msgtest 'Test deb822 with two sections' 'seperated by comma'
-echo "$BASE" | sed 's/main/main,contrib/' > $SOURCES
+echo "$BASE" | sed 's/main/main contrib/' > $SOURCES
 testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 :
 'http://ftp.debian.org/debian/dists/stable/contrib/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_contrib_binary-i386_Packages 0 :
 'http://ftp.debian.org/debian/dists/stable/contrib/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_contrib_i18n_Translation-en 0 :
@@ -43,17 +42,8 @@ testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/P
 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 "  aptget update --print-uris
 
 
-# FIXME: Advertised, but not supported at the moment
-#msgtest 'Test deb822 with two sections' 'seperated by space'
-#echo "$BASE" | sed 's/main/main contrib/' > $SOURCES
-#testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 :
-#'http://ftp.debian.org/debian/dists/stable/contrib/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_contrib_binary-i386_Packages 0 :
-#'http://ftp.debian.org/debian/dists/stable/contrib/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_contrib_i18n_Translation-en 0 :
-#'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 :
-#'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 "  aptget update --print-uris
-
-
 msgtest 'Test deb822 with' 'two entries'
+# Two entries
 echo "$BASE" > $SOURCES
 echo "" >> $SOURCES
 echo "$BASE" | sed  s/stable/unstable/  >> $SOURCES
@@ -64,10 +54,19 @@ testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/P
 'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 :
 'http://ftp.debian.org/debian/dists/unstable/InRelease' ftp.debian.org_debian_dists_unstable_InRelease 0 "  aptget update --print-uris
 
+# two suite entries
+msgtest 'Test deb822 with' 'two Suite entries'
+echo "$BASE"  | sed -e "s/stable/stable unstable/" > $SOURCES
+testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-i386_Packages 0 :
+'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 :
+'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 
+'http://ftp.debian.org/debian/dists/unstable/main/binary-i386/Packages.bz2' ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages 0 :
+'http://ftp.debian.org/debian/dists/unstable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_unstable_main_i18n_Translation-en 0 :
+'http://ftp.debian.org/debian/dists/unstable/InRelease' ftp.debian.org_debian_dists_unstable_InRelease 0 "  aptget update --print-uris 
 
 msgtest 'Test deb822' 'architecture option'
 echo "$BASE" > $SOURCES
-echo "Arch: amd64,armel" >> $SOURCES
+echo "Architectures: amd64,armel" >> $SOURCES
 testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/binary-amd64/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-amd64_Packages 0 :
 'http://ftp.debian.org/debian/dists/stable/main/binary-armel/Packages.bz2' ftp.debian.org_debian_dists_stable_main_binary-armel_Packages 0 :
 'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 :
@@ -82,7 +81,7 @@ E: The list of sources could not be read."  aptget update --print-uris
 
 msgtest 'Test deb822 sources.list file which has' 'malformed URI'
 echo "Type: deb
-Dist: stable
+Suite: stable
 " > $SOURCES
 testequal --nomsg  "E: Malformed stanza 0 in source list $TMPWORKINGDIRECTORY/rootdir/etc/apt/sources.list (URI parse)
 E: The list of sources could not be read."  aptget update --print-uris

+ 4 - 4
test/libapt/sourcelist_test.cc

@@ -23,15 +23,15 @@ int main(int argc, char *argv[])
 {
    const char contents[] = ""
       "Type: deb\n"
-      "URL: http://ftp.debian.org/debian\n"
-      "Dist: stable\n"
+      "Uri: http://ftp.debian.org/debian\n"
+      "Suite: stable\n"
       "Section: main\n"
       "Comment: Some random string\n"
       " that can be very long\n"
       "\n"
       "Type: deb\n"
-      "URL: http://ftp.debian.org/debian\n"
-      "Dist: unstable\n"
+      "Uri: http://ftp.debian.org/debian\n"
+      "Suite: unstable\n"
       "Section: main non-free\n"
       ;