diff options
-rw-r--r-- | apt-pkg/sourcelist.cc | 56 | ||||
-rw-r--r-- | doc/sources.list.5.xml | 17 | ||||
-rwxr-xr-x | test/integration/test-apt-sources-deb822 | 46 | ||||
-rw-r--r-- | test/libapt/sourcelist_test.cc | 16 |
4 files changed, 84 insertions, 51 deletions
diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc index 4e580ba04..bbc514f5b 100644 --- a/apt-pkg/sourcelist.cc +++ b/apt-pkg/sourcelist.cc @@ -78,12 +78,9 @@ bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List, { 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; - } + string Enabled = Tags.FindS("Enabled"); + if (Enabled.size() > 0 && StringToBool(Enabled) == false) + return true; // Define external/internal options const char* option_deb822[] = { @@ -100,20 +97,34 @@ bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List, string Suite = Tags.FindS("Suites"); Suite = SubstVar(Suite,"$(ARCH)",_config->Find("APT::Architecture")); string const Section = Tags.FindS("Sections"); + string URIS = Tags.FindS("URIs"); + std::vector<std::string> list_uris = StringSplit(URIS, " "); 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 U = list_uris.begin(); + U != list_uris.end(); U++) { - for (std::vector<std::string>::const_iterator J = list_section.begin(); - J != list_section.end(); J++) + std::string URI = (*U); + if (!FixupURI(URI)) + { + _error->Error(_("Malformed stanza %u in source list %s (URI parse)"),i,Fd.Name().c_str()); + return false; + } + + 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; } @@ -376,21 +387,26 @@ int pkgSourceList::ParseFileDeb822(string File) // read step by step while (Sources.Step(Tags) == true) { - if(!Tags.Exists("Type")) + if(!Tags.Exists("Types")) continue; - string const type = Tags.FindS("Type"); - Type *Parse = Type::GetType(type.c_str()); - if (Parse == 0) + string const types = Tags.FindS("Types"); + std::vector<std::string> list_types = StringSplit(types, " "); + for (std::vector<std::string>::const_iterator I = list_types.begin(); + I != list_types.end(); I++) { - _error->Error(_("Type '%s' is not known on stanza %u in source list %s"),type.c_str(),i,Fd.Name().c_str()); - return -1; - } + Type *Parse = Type::GetType((*I).c_str()); + if (Parse == 0) + { + _error->Error(_("Type '%s' is not known on stanza %u in source list %s"), (*I).c_str(),i,Fd.Name().c_str()); + return -1; + } - if (!Parse->ParseStanza(SrcList, Tags, i, Fd)) - return -1; + if (!Parse->ParseStanza(SrcList, Tags, i, Fd)) + return -1; - i++; + i++; + } } // we are done, return the number of stanzas read diff --git a/doc/sources.list.5.xml b/doc/sources.list.5.xml index 87f4d5fc5..4d0c4d502 100644 --- a/doc/sources.list.5.xml +++ b/doc/sources.list.5.xml @@ -83,16 +83,21 @@ <para>Alternatively a rfc822 style format is also supported: <literallayout> - Type: deb - URI: http://example.com - Suites: stable + Types: deb deb-src + URIs: http://example.com + Suites: stable testing Sections: component1 component2 + Description: short + long long long [option1]: [option1-value] - Type: deb-src - URI: http://example.com - Suites: stable + Types: deb + URIs: http://another.example.com + Suites: experimental Sections: component1 component2 + Enabled: no + Description: short + long long long [option1]: [option1-value] </literallayout> </para> diff --git a/test/integration/test-apt-sources-deb822 b/test/integration/test-apt-sources-deb822 index 6e9a02417..743543cd5 100755 --- a/test/integration/test-apt-sources-deb822 +++ b/test/integration/test-apt-sources-deb822 @@ -10,15 +10,14 @@ configarchitecture 'i386' SOURCES='rootdir/etc/apt/sources.list' BASE='# some comment # that contains a : as well -#Type: meep +#Types: meep -Type: deb -URI: http://ftp.debian.org/debian +Types: deb +URIs: http://ftp.debian.org/debian Suites: stable Sections: main -Comment: Some random string - that can be very long' - +Description: summay + and the long part' msgtest 'Test old-style sources.list' echo "deb http://ftp.debian.org/debian stable main" > $SOURCES @@ -33,15 +32,6 @@ 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 -msgtest 'Test deb822 with two sections' 'seperated by comma' -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 @@ -78,10 +68,32 @@ echo "deb http://ftp.debian.org" > $SOURCES testequal --nomsg "E: Malformed line 1 in source list $TMPWORKINGDIRECTORY/rootdir/etc/apt/sources.list (dist) 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 +echo "Types: deb Suites: 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 + +# with Enabled: false +echo "$BASE" > $SOURCES +echo "Enabled: no" >> $SOURCES +testempty aptget update --print-uris + +# multiple URIs +msgtest 'Test deb822 sources.list file which has' 'Multiple URIs work' +echo "$BASE" | sed -e 's#http://ftp.debian.org/debian#http://ftp.debian.org/debian http://ftp.de.debian.org/debian#' > $SOURCES +testequal --nomsg "'http://ftp.de.debian.org/debian/dists/stable/main/binary-i386/Packages.bz2' ftp.de.debian.org_debian_dists_stable_main_binary-i386_Packages 0 : +'http://ftp.de.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.de.debian.org_debian_dists_stable_main_i18n_Translation-en 0 : +'http://ftp.de.debian.org/debian/dists/stable/InRelease' ftp.de.debian.org_debian_dists_stable_InRelease 0 +'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 " aptget update --print-uris + +# multiple Type in one field +msgtest 'Test deb822 sources.list file which has' 'Multiple Types work' +echo "$BASE" | sed -e 's#Types: deb#Types: deb deb-src#' > $SOURCES +testequal --nomsg "'http://ftp.debian.org/debian/dists/stable/main/source/Sources.bz2' ftp.debian.org_debian_dists_stable_main_source_Sources 0 : +'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 " aptget update --print-uris diff --git a/test/libapt/sourcelist_test.cc b/test/libapt/sourcelist_test.cc index 701eeeaa7..6fc84fd93 100644 --- a/test/libapt/sourcelist_test.cc +++ b/test/libapt/sourcelist_test.cc @@ -22,17 +22,17 @@ void remove_tmpfile(void) int main(int argc, char *argv[]) { const char contents[] = "" - "Type: deb\n" - "URI: http://ftp.debian.org/debian\n" + "Types: deb\n" + "URIs: http://ftp.debian.org/debian\n" "Suites: stable\n" "Sections: main\n" - "Comment: Some random string\n" - " that can be very long\n" + "Description: short\n" + " long description that can be very long\n" "\n" - "Type: deb\n" - "URI: http://ftp.debian.org/debian\n" - "Suite: unstable\n" - "Section: main non-free\n" + "Types: deb\n" + "URIs: http://ftp.debian.org/debian\n" + "Suites: unstable\n" + "Sections: main non-free\n" ; FileFd fd; |