From: David Kalnischkies Date: Sat, 2 Jan 2016 12:27:02 +0000 (+0100) Subject: properly parse comments in apt_preferences and deb822-style sources X-Git-Tag: 1.2_exp1~53 X-Git-Url: https://git.saurik.com/apt.git/commitdiff_plain/f6459e646f6fa45c34d1f13f37173ea4b92ffd5f properly parse comments in apt_preferences and deb822-style sources apt_preferences and deb822-style sources used the specialized class pkgUserTagSection to deal with comments before/after a given stanza, but it couldn't deal with comments in the stanza at all. codesearch suggests that nobody else does and a vastely superior way of working with potentially commented files is implemented now, so we can officially discourage the use of the old incomplete hack class. --- diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index d442e5c90..b36f4d4b7 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -438,11 +438,11 @@ bool ReadPinFile(pkgPolicy &Plcy,string File) return true; FileFd Fd(File,FileFd::ReadOnly); - pkgTagFile TF(&Fd); + pkgTagFile TF(&Fd, pkgTagFile::SUPPORT_COMMENTS); if (Fd.IsOpen() == false || Fd.Failed()) return false; - pkgUserTagSection Tags; + pkgTagSection Tags; while (TF.Step(Tags) == true) { // can happen when there are only comments in a record diff --git a/apt-pkg/sourcelist.cc b/apt-pkg/sourcelist.cc index 6773b069f..82d2ed3c6 100644 --- a/apt-pkg/sourcelist.cc +++ b/apt-pkg/sourcelist.cc @@ -418,16 +418,16 @@ bool pkgSourceList::ParseFileOldStyle(std::string const &File) /* Returns: the number of stanzas parsed*/ bool pkgSourceList::ParseFileDeb822(string const &File) { - pkgUserTagSection Tags; unsigned int i = 1; // see if we can read the file FileFd Fd(File, FileFd::ReadOnly); - pkgTagFile Sources(&Fd); + pkgTagFile Sources(&Fd, pkgTagFile::SUPPORT_COMMENTS); if (Fd.IsOpen() == false || Fd.Failed()) return _error->Error(_("Malformed stanza %u in source list %s (type)"),i,File.c_str()); // read step by step + pkgTagSection Tags; while (Sources.Step(Tags) == true) { if(Tags.Exists("Types") == false) diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h index 2f26846ef..460cf2cd6 100644 --- a/apt-pkg/tagfile.h +++ b/apt-pkg/tagfile.h @@ -140,9 +140,7 @@ class pkgTagSection }; -/* For user generated file the parser should be a bit more relaxed in exchange - for being a bit slower to allow comments and new lines all over the place */ -class pkgUserTagSection : public pkgTagSection +class APT_DEPRECATED_MSG("Use pkgTagFile with the SUPPORT_COMMENTS flag instead") pkgUserTagSection : public pkgTagSection { virtual void TrimRecord(bool BeforeRecord, const char* &End) APT_OVERRIDE; }; diff --git a/test/integration/test-apt-sources-deb822 b/test/integration/test-apt-sources-deb822 index 5b22eaa80..fd275f978 100755 --- a/test/integration/test-apt-sources-deb822 +++ b/test/integration/test-apt-sources-deb822 @@ -15,10 +15,12 @@ BASE='# some comment #Types: meep Types: deb +#Types: deb-src URIs: http://ftp.debian.org/debian Suites: stable Components: main Description: summay +# comments are ignored and the long part' msgcleantest() { diff --git a/test/integration/test-policy-pinning b/test/integration/test-policy-pinning index 635dcb874..8f4850c4d 100755 --- a/test/integration/test-policy-pinning +++ b/test/integration/test-policy-pinning @@ -315,3 +315,28 @@ Pin-Priority: 0 testfailureequal "Reading package lists... E: No priority (or zero) specified for pin" \ aptget install -s coolstuff -o PinPriority=0 + +# Check with comments +echo "#Package: coolstuff +#Pin: release n=backports +#Pin-Priority: 0 + +# Test + +Package: coolstuff +Pin: release n=backports +#Pin: release n=unstable +#Pin-Priority: 999 +Pin-Priority: 999 +#Pin-Priority: 999" > rootdir/etc/apt/preferences + +testsuccessequal "coolstuff: + Installed: 2.0~bpo1 + Candidate: 2.0~bpo2 + Version table: + 2.0~bpo2 999 + 100 file:${tmppath}/aptarchive backports/main all Packages + *** 2.0~bpo1 100 + 100 ${tmppath}/rootdir/var/lib/dpkg/status + 1.0 500 + 500 file:${tmppath}/aptarchive stable/main all Packages" aptcache policy coolstuff