Browse Source

merged mvo/feature/deb822

debian/1.8.y
Michael Vogt 9 years ago
parent
commit
2f0ae309be
  1. 78
      apt-pkg/sourcelist.cc
  2. 5
      apt-pkg/sourcelist.h
  3. 51
      doc/sources.list.5.xml
  4. 31
      test/integration/test-apt-sources-deb822
  5. 8
      test/libapt/sourcelist_test.cc

78
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
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;

51
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

31
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

8
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"
;

Loading…
Cancel
Save