]> git.saurik.com Git - apt.git/commitdiff
merge debian/sid into debian/experimental
authorDavid Kalnischkies <david@kalnischkies.de>
Mon, 9 Mar 2015 00:34:10 +0000 (01:34 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Mon, 16 Mar 2015 16:59:31 +0000 (17:59 +0100)
328 files changed:
apt-inst/contrib/arfile.h
apt-inst/contrib/extracttar.cc
apt-inst/contrib/extracttar.h
apt-inst/deb/debfile.cc
apt-inst/deb/debfile.h
apt-inst/dirstream.cc
apt-inst/dirstream.h
apt-inst/extract.cc
apt-inst/makefile
apt-pkg/acquire-item.cc
apt-pkg/acquire-item.h
apt-pkg/acquire-method.cc
apt-pkg/acquire-method.h
apt-pkg/acquire-worker.cc
apt-pkg/acquire-worker.h
apt-pkg/acquire.cc
apt-pkg/acquire.h
apt-pkg/algorithms.cc
apt-pkg/algorithms.h
apt-pkg/aptconfiguration.cc
apt-pkg/aptconfiguration.h
apt-pkg/cachefilter.cc
apt-pkg/cachefilter.h
apt-pkg/cacheiterators.h
apt-pkg/cacheset.cc
apt-pkg/cacheset.h
apt-pkg/cdrom.cc
apt-pkg/clean.cc
apt-pkg/clean.h
apt-pkg/contrib/cmndline.cc
apt-pkg/contrib/cmndline.h
apt-pkg/contrib/configuration.cc
apt-pkg/contrib/configuration.h
apt-pkg/contrib/fileutl.cc
apt-pkg/contrib/fileutl.h
apt-pkg/contrib/gpgv.cc
apt-pkg/contrib/hashes.cc
apt-pkg/contrib/hashes.h
apt-pkg/contrib/macros.h
apt-pkg/contrib/netrc.cc
apt-pkg/contrib/netrc.h
apt-pkg/contrib/strutl.cc
apt-pkg/contrib/strutl.h
apt-pkg/deb/debindexfile.cc
apt-pkg/deb/debindexfile.h
apt-pkg/deb/deblistparser.cc
apt-pkg/deb/deblistparser.h
apt-pkg/deb/debmetaindex.cc
apt-pkg/deb/debmetaindex.h
apt-pkg/deb/debrecords.cc
apt-pkg/deb/debrecords.h
apt-pkg/deb/debsrcrecords.cc
apt-pkg/deb/debsrcrecords.h
apt-pkg/deb/debsystem.cc
apt-pkg/deb/debsystem.h
apt-pkg/deb/dpkgpm.cc
apt-pkg/deb/dpkgpm.h
apt-pkg/depcache.cc
apt-pkg/depcache.h
apt-pkg/edsp.cc
apt-pkg/edsp/edspindexfile.cc
apt-pkg/edsp/edspindexfile.h
apt-pkg/edsp/edsplistparser.h
apt-pkg/edsp/edspsystem.cc
apt-pkg/edsp/edspsystem.h
apt-pkg/indexcopy.cc
apt-pkg/indexcopy.h
apt-pkg/indexfile.h
apt-pkg/indexrecords.cc
apt-pkg/indexrecords.h
apt-pkg/init.cc
apt-pkg/install-progress.cc
apt-pkg/install-progress.h
apt-pkg/metaindex.cc [new file with mode: 0644]
apt-pkg/metaindex.h
apt-pkg/packagemanager.cc
apt-pkg/packagemanager.h
apt-pkg/pkgcache.cc
apt-pkg/pkgcache.h
apt-pkg/pkgcachegen.cc
apt-pkg/pkgcachegen.h
apt-pkg/pkgrecords.cc
apt-pkg/pkgrecords.h
apt-pkg/pkgsystem.h
apt-pkg/sourcelist.cc
apt-pkg/sourcelist.h
apt-pkg/srcrecords.h
apt-pkg/tagfile.cc
apt-pkg/tagfile.h
apt-pkg/update.cc
apt-pkg/update.h
apt-pkg/upgrade.cc
apt-pkg/upgrade.h
apt-pkg/vendorlist.cc
apt-private/acqprogress.cc
apt-private/private-cachefile.cc
apt-private/private-cachefile.h
apt-private/private-cacheset.cc
apt-private/private-cacheset.h
apt-private/private-cmndline.cc
apt-private/private-cmndline.h
apt-private/private-download.cc
apt-private/private-download.h
apt-private/private-install.cc
apt-private/private-install.h
apt-private/private-list.cc
apt-private/private-output.cc
apt-private/private-output.h
apt-private/private-show.cc
apt-private/private-update.cc
apt-private/private-upgrade.cc
buildlib/config.h.in
cmdline/apt-cache.cc
cmdline/apt-cdrom.cc
cmdline/apt-config.cc
cmdline/apt-dump-solver.cc
cmdline/apt-extracttemplates.cc
cmdline/apt-extracttemplates.h
cmdline/apt-get.cc
cmdline/apt-helper.cc
cmdline/apt-internal-solver.cc
cmdline/apt-key.in
cmdline/apt-mark.cc
cmdline/apt-sortpkgs.cc
cmdline/apt.cc
cmdline/makefile
configure.ac
debian/apt.postinst [changed mode: 0644->0755]
debian/apt.postrm [new file with mode: 0755]
debian/changelog
debian/control
debian/gbp.conf
debian/libapt-inst1.5.install.in [deleted file]
debian/libapt-inst1.5.symbols [deleted file]
debian/libapt-inst1.6.install.in [new file with mode: 0644]
debian/libapt-inst1.6.symbols [new file with mode: 0644]
debian/libapt-pkg4.12.install.in [deleted file]
debian/libapt-pkg4.12.symbols [deleted file]
debian/libapt-pkg4.15.install.in [new file with mode: 0644]
debian/libapt-pkg4.15.symbols [new file with mode: 0644]
debian/postinst [deleted file]
debian/postrm [deleted file]
debian/tests/control
debian/tests/run-tests
doc/apt-get.8.xml
doc/apt-verbatim.ent
doc/apt.conf.5.xml
doc/examples/configure-index
doc/po/apt-doc.pot
doc/po/de.po
doc/po/es.po
doc/po/it.po
doc/po/ja.po
doc/po/pl.po
doc/po/pt.po
doc/po/pt_BR.po
ftparchive/apt-ftparchive.cc
ftparchive/cachedb.cc
ftparchive/cachedb.h
ftparchive/contents.cc
ftparchive/makefile
ftparchive/writer.cc
ftparchive/writer.h
methods/copy.cc
methods/ftp.cc
methods/ftp.h
methods/gpgv.cc
methods/gzip.cc
methods/http.cc
methods/http.h
methods/http_main.cc
methods/https.cc
methods/https.h
methods/rred.cc
methods/server.cc
methods/server.h
po/ChangeLog [deleted file]
po/apt-all.pot
po/ar.po
po/ast.po
po/bg.po
po/bs.po
po/ca.po
po/cs.po
po/cy.po
po/da.po
po/de.po
po/dz.po
po/el.po
po/es.po
po/eu.po
po/fi.po
po/fr.po
po/gl.po
po/he.po
po/hu.po
po/it.po
po/ja.po
po/km.po
po/ko.po
po/ku.po
po/lt.po
po/mr.po
po/nb.po
po/ne.po
po/nl.po
po/nn.po
po/pl.po
po/pt.po
po/pt_BR.po
po/ro.po
po/ru.po
po/sk.po
po/sl.po
po/sv.po
po/th.po
po/tl.po
po/tr.po
po/uk.po
po/vi.po
po/zh_CN.po
po/zh_TW.po
prepare-release
test/integration/framework
test/integration/run-tests
test/integration/skip-aptwebserver [new file with mode: 0755]
test/integration/test-00-commands-have-help [new file with mode: 0755]
test/integration/test-allow-scores-for-all-dependency-types
test/integration/test-apt-by-hash-update [new file with mode: 0755]
test/integration/test-apt-cache [new file with mode: 0755]
test/integration/test-apt-cdrom
test/integration/test-apt-cli-search
test/integration/test-apt-cli-show
test/integration/test-apt-cli-update
test/integration/test-apt-config [new file with mode: 0755]
test/integration/test-apt-download-progress
test/integration/test-apt-extracttemplates
test/integration/test-apt-ftparchive-cachedb
test/integration/test-apt-ftparchive-src-cachedb
test/integration/test-apt-get-build-dep [new file with mode: 0755]
test/integration/test-apt-get-changelog
test/integration/test-apt-get-clean [new file with mode: 0755]
test/integration/test-apt-get-download
test/integration/test-apt-get-install-deb [new file with mode: 0755]
test/integration/test-apt-get-source-authenticated
test/integration/test-apt-get-update-unauth-warning [new file with mode: 0755]
test/integration/test-apt-get-upgrade
test/integration/test-apt-helper
test/integration/test-apt-key
test/integration/test-apt-key-net-update
test/integration/test-apt-mark [new file with mode: 0755]
test/integration/test-apt-progress-fd
test/integration/test-apt-sources-deb822
test/integration/test-apt-update-expected-size [new file with mode: 0755]
test/integration/test-apt-update-file
test/integration/test-apt-update-filesize-mismatch [new file with mode: 0755]
test/integration/test-apt-update-hashsum-mismatch [new file with mode: 0755]
test/integration/test-apt-update-ims [new file with mode: 0755]
test/integration/test-apt-update-nofallback [new file with mode: 0755]
test/integration/test-apt-update-rollback [new file with mode: 0755]
test/integration/test-apt-update-stale
test/integration/test-apt-update-transactions [new file with mode: 0755]
test/integration/test-apt-update-unauth
test/integration/test-authentication-basic [new file with mode: 0755]
test/integration/test-bug-254770-segfault-if-cache-not-buildable
test/integration/test-bug-507998-dist-upgrade-recommends
test/integration/test-bug-591882-conkeror
test/integration/test-bug-595691-empty-and-broken-archive-files
test/integration/test-bug-596498-trusted-unsigned-repo
test/integration/test-bug-604401-files-are-directories
test/integration/test-bug-605394-versioned-or-groups
test/integration/test-bug-612099-multiarch-conflicts
test/integration/test-bug-617690-allow-unauthenticated-makes-all-untrusted
test/integration/test-bug-624218-Translation-file-handling
test/integration/test-bug-64141-install-dependencies-for-on-hold
test/integration/test-bug-657695-resolver-breaks-on-virtuals
test/integration/test-bug-673536-pre-depends-breaks-loop
test/integration/test-bug-675449-essential-are-protected
test/integration/test-bug-680041-apt-mark-holds-correctly
test/integration/test-bug-683786-build-dep-on-virtual-packages
test/integration/test-bug-686346-package-missing-architecture
test/integration/test-bug-712435-missing-descriptions
test/integration/test-bug-717891-abolute-uris-for-proxies
test/integration/test-bug-722207-print-uris-even-if-very-quiet
test/integration/test-bug-728500-tempdir
test/integration/test-bug-733028-gpg-resource-limit [new file with mode: 0755]
test/integration/test-bug-735967-lib32-to-i386-unavailable
test/integration/test-bug-738785-switch-protocol
test/integration/test-bug-740843-versioned-up-down-breaks
test/integration/test-bug-745036-new-foreign-invalidates-cache [new file with mode: 0755]
test/integration/test-bug-753297-upgradable
test/integration/test-bug-758153-versioned-provides-support
test/integration/test-bug-770291-reinstall [new file with mode: 0755]
test/integration/test-compressed-indexes
test/integration/test-conflicts-loop
test/integration/test-cve-2013-1051-InRelease-parsing
test/integration/test-essential-force-loopbreak
test/integration/test-external-dependency-solver-protocol
test/integration/test-hashsum-verification
test/integration/test-http-pipeline-messup [new file with mode: 0755]
test/integration/test-kernel-helper-autoremove
test/integration/test-partial-file-support
test/integration/test-pdiff-usage
test/integration/test-pin-non-existent-package
test/integration/test-policy-pinning
test/integration/test-prevent-markinstall-multiarch-same-versionscrew
test/integration/test-provides-gone-with-upgrade
test/integration/test-releasefile-valid-until
test/integration/test-releasefile-verification
test/integration/test-resolve-by-keep-new-recommends
test/integration/test-sourceslist-trusted-options [new file with mode: 0755]
test/integration/test-suggest-installed-multiarch-silbing
test/integration/test-ubuntu-bug-1098738-apt-get-source-md5sum
test/integration/test-ubuntu-bug-1304403-obsolete-priority-standard
test/integration/test-ubuntu-bug-346386-apt-get-update-paywall
test/integration/test-ubuntu-bug-761175-remove-purge
test/integration/test-ubuntu-bug-784473-InRelease-one-message-only
test/integration/test-ubuntu-bug-985852-pre-depends-or-group-ordering
test/integration/test-very-tight-loop-configure-with-unpacking-new-packages
test/integration/test-xorg-break-providers
test/interactive-helper/aptwebserver.cc
test/interactive-helper/makefile
test/libapt/cdrom_test.cc
test/libapt/fileutl_test.cc
test/libapt/hashsums_test.cc
test/libapt/sourcelist_test.cc
test/libapt/strutil_test.cc
test/libapt/tagfile_test.cc

index 0f62a34a06bd41025bb88c9c1013c7fcccc3fa3e..f53356847f80156c055c9628602135e9ac5d27aa 100644 (file)
@@ -17,6 +17,7 @@
 
 
 #include <string>
+#include <apt-pkg/macros.h>
 #ifndef APT_8_CLEANER_HEADERS
 #include <apt-pkg/fileutl.h>
 #endif
@@ -61,7 +62,11 @@ struct ARArchive::Member
    unsigned long long Size;
    
    // Location of the data.
+#if APT_PKG_ABI >= 413
+   unsigned long long Start;
+#else
    unsigned long Start;
+#endif
    Member *Next;
    
    Member() : Start(0), Next(0) {};
index 0ba3f05215d0190ebced2195a15269ced5939f26..be0b69d96e66bfc0a1acad0668bfdcbd9cdc01f3 100644 (file)
@@ -60,9 +60,13 @@ struct ExtractTar::TarHeader
 // ExtractTar::ExtractTar - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-ExtractTar::ExtractTar(FileFd &Fd,unsigned long Max,string DecompressionProgram) : File(Fd), 
-                         MaxInSize(Max), DecompressProg(DecompressionProgram)
-
+#if APT_PKG_ABI >= 413
+ExtractTar::ExtractTar(FileFd &Fd,unsigned long long Max,string DecompressionProgram)
+       : File(Fd), MaxInSize(Max), DecompressProg(DecompressionProgram)
+#else
+ExtractTar::ExtractTar(FileFd &Fd,unsigned long Max,string DecompressionProgram)
+       : File(Fd), MaxInSize(Max), DecompressProg(DecompressionProgram)
+#endif
 {
    GZPid = -1;
    Eof = false;
@@ -267,7 +271,7 @@ bool ExtractTar::Go(pkgDirStream &Stream)
 
         case GNU_LongLink:
         {
-           unsigned long Length = Itm.Size;
+           unsigned long long Length = Itm.Size;
            unsigned char Block[512];
            while (Length > 0)
            {
@@ -286,7 +290,7 @@ bool ExtractTar::Go(pkgDirStream &Stream)
         
         case GNU_LongName:
         {
-           unsigned long Length = Itm.Size;
+           unsigned long long Length = Itm.Size;
            unsigned char Block[512];
            while (Length > 0)
            {
@@ -315,11 +319,11 @@ bool ExtractTar::Go(pkgDirStream &Stream)
            return false;
       
       // Copy the file over the FD
-      unsigned long Size = Itm.Size;
+      unsigned long long Size = Itm.Size;
       while (Size != 0)
       {
         unsigned char Junk[32*1024];
-        unsigned long Read = min(Size,(unsigned long)sizeof(Junk));
+        unsigned long Read = min(Size, (unsigned long long)sizeof(Junk));
         if (InFd.Read(Junk,((Read+511)/512)*512) == false)
            return false;
         
index 4b29df3141ae71dfbd54c08fae1b5f381f17a899..57be956bd0649fe6b0b54292374dbd65fe9570e5 100644 (file)
@@ -15,6 +15,7 @@
 #define PKGLIB_EXTRACTTAR_H
 
 #include <apt-pkg/fileutl.h>
+#include <apt-pkg/macros.h>
 
 #include <string>
 
@@ -39,7 +40,11 @@ class ExtractTar
                   GNU_LongLink = 'K',GNU_LongName = 'L'};
 
    FileFd &File;
+#if APT_PKG_ABI >= 413
+   unsigned long long MaxInSize;
+#else
    unsigned long MaxInSize;
+#endif
    int GZPid;
    FileFd InFd;
    bool Eof;
@@ -52,8 +57,12 @@ class ExtractTar
    public:
 
    bool Go(pkgDirStream &Stream);
-   
+
+#if APT_PKG_ABI >= 413
+   ExtractTar(FileFd &Fd,unsigned long long Max,std::string DecompressionProgram);
+#else
    ExtractTar(FileFd &Fd,unsigned long Max,std::string DecompressionProgram);
+#endif
    virtual ~ExtractTar();
 };
 
index a63cb6716264a2131a20d18953b3796d3889ba9e..a8bf754e4e46fc0adea263ea14250b8658629281 100644 (file)
@@ -203,7 +203,11 @@ bool debDebFile::MemControlExtract::DoItem(Item &Itm,int &Fd)
 /* Just memcopy the block from the tar extractor and put it in the right
    place in the pre-allocated memory block. */
 bool debDebFile::MemControlExtract::Process(Item &/*Itm*/,const unsigned char *Data,
+#if APT_PKG_ABI >= 413
+                            unsigned long long Size,unsigned long long Pos)
+#else
                             unsigned long Size,unsigned long Pos)
+#endif
 {
    memcpy(Control + Pos, Data,Size);
    return true;
@@ -232,7 +236,11 @@ bool debDebFile::MemControlExtract::Read(debDebFile &Deb)
 // ---------------------------------------------------------------------
 /* The given memory block is loaded into the parser and parsed as a control
    record. */
+#if APT_PKG_ABI >= 413
+bool debDebFile::MemControlExtract::TakeControl(const void *Data,unsigned long long Size)
+#else
 bool debDebFile::MemControlExtract::TakeControl(const void *Data,unsigned long Size)
+#endif
 {
    delete [] Control;
    Control = new char[Size+2];
index 880bcf6c59bb4b4a564d83cc95d6017ef6fcb883..9d286716a4ed74f49ae7ccf710bf314692553290 100644 (file)
@@ -27,6 +27,7 @@
 #include <apt-pkg/arfile.h>
 #include <apt-pkg/dirstream.h>
 #include <apt-pkg/tagfile.h>
+#include <apt-pkg/macros.h>
 
 #include <string>
 
@@ -81,13 +82,20 @@ class debDebFile::MemControlExtract : public pkgDirStream
    // Members from DirStream
    virtual bool DoItem(Item &Itm,int &Fd);
    virtual bool Process(Item &Itm,const unsigned char *Data,
+#if APT_PKG_ABI >= 413
+                       unsigned long long Size,unsigned long long Pos);
+#else
                        unsigned long Size,unsigned long Pos);
-   
+#endif
 
    // Helpers
    bool Read(debDebFile &Deb);
+#if APT_PKG_ABI >= 413
+   bool TakeControl(const void *Data,unsigned long long Size);
+#else
    bool TakeControl(const void *Data,unsigned long Size);
-      
+#endif
+
    MemControlExtract() : IsControl(false), Control(0), Length(0), Member("control") {};
    MemControlExtract(std::string Member) : IsControl(false), Control(0), Length(0), Member(Member) {};
    ~MemControlExtract() {delete [] Control;};   
index 39ebb3bb4433699f8e7ec6c6f25e4f004c0c7986..888020bfb983d671ba67f392f0a4681370ae9892 100644 (file)
@@ -76,7 +76,6 @@ bool pkgDirStream::DoItem(Item &Itm,int &Fd)
         if(mkdir(Itm.Name,Itm.Mode) < 0)
            return false;
         return true;
-        break;
       }
       case Item::FIFO:
       break;
index 1be2688a11e637d1e06c203d66030c3a2d2450bd..53ac24ba5c8c5d02b8220c85edf24d6d57115269 100644 (file)
@@ -25,6 +25,7 @@
 #ifndef PKGLIB_DIRSTREAM_H
 #define PKGLIB_DIRSTREAM_H
 
+#include <apt-pkg/macros.h>
 
 class pkgDirStream
 { 
@@ -37,10 +38,15 @@ class pkgDirStream
                   Directory, FIFO} Type;
       char *Name;
       char *LinkTarget;
+#if APT_PKG_ABI >= 413
+      unsigned long long Size;
+#endif
       unsigned long Mode;
       unsigned long UID;
       unsigned long GID;
+#if APT_PKG_ABI < 413
       unsigned long Size;
+#endif
       unsigned long MTime;
       unsigned long Major;
       unsigned long Minor;
@@ -49,9 +55,13 @@ class pkgDirStream
    virtual bool DoItem(Item &Itm,int &Fd);
    virtual bool Fail(Item &Itm,int Fd);
    virtual bool FinishedFile(Item &Itm,int Fd);
+#if APT_PKG_ABI >= 413
+   virtual bool Process(Item &/*Itm*/,const unsigned char * /*Data*/,
+                       unsigned long long /*Size*/,unsigned long long /*Pos*/) {return true;};
+#else
    virtual bool Process(Item &/*Itm*/,const unsigned char * /*Data*/,
                        unsigned long /*Size*/,unsigned long /*Pos*/) {return true;};
-      
+#endif
    virtual ~pkgDirStream() {};   
 };
 
index b60784450654e8b65b0cd5eab52e72e721bc9410..026182c186ab5181f8dee410a85f8685abbf2da4 100644 (file)
@@ -404,7 +404,7 @@ bool pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator Nde,
       // Now see if this package matches one in a replace depends
       pkgCache::DepIterator Dep = Ver.DependsList();
       bool Ok = false;
-      for (; Dep.end() == false; Dep++)
+      for (; Dep.end() == false; ++Dep)
       {
         if (Dep->Type != pkgCache::Dep::Replaces)
            continue;
index af887bba8dcf657e0f222d651d444c8174add61f..e4a3ae7029e640998b0ce8cdcfc41c4f49a186a9 100644 (file)
@@ -14,7 +14,7 @@ include ../buildlib/libversion.mak
 
 # The library name
 LIBRARY=apt-inst
-MAJOR=1.5
+MAJOR=1.6
 MINOR=0
 SLIBS=$(PTHREADLIB) -lapt-pkg
 APT_DOMAIN:=libapt-inst$(MAJOR)
index 253cbdaf72648620e1898f49fc6d21b3734d331c..dd85fda79e112df34a13458ed8a6cf0cbff8496a 100644 (file)
 
 using namespace std;
 
+static void printHashSumComparision(std::string const &URI, HashStringList const &Expected, HashStringList const &Actual) /*{{{*/
+{
+   if (_config->FindB("Debug::Acquire::HashSumMismatch", false) == false)
+      return;
+   std::cerr << std::endl << URI << ":" << std::endl << " Expected Hash: " << std::endl;
+   for (HashStringList::const_iterator hs = Expected.begin(); hs != Expected.end(); ++hs)
+      std::cerr <<  "\t- " << hs->toStr() << std::endl;
+   std::cerr << " Actual Hash: " << std::endl;
+   for (HashStringList::const_iterator hs = Actual.begin(); hs != Actual.end(); ++hs)
+      std::cerr <<  "\t- " << hs->toStr() << std::endl;
+}
+                                                                       /*}}}*/
+static std::string GetPartialFileName(std::string const &file)         /*{{{*/
+{
+   std::string DestFile = _config->FindDir("Dir::State::lists") + "partial/";
+   DestFile += file;
+   return DestFile;
+}
+                                                                       /*}}}*/
+static std::string GetPartialFileNameFromURI(std::string const &uri)   /*{{{*/
+{
+   return GetPartialFileName(URItoFileName(uri));
+}
+                                                                       /*}}}*/
+static std::string GetCompressedFileName(std::string const &URI, std::string const &Name, std::string const &Ext) /*{{{*/
+{
+   if (Ext.empty() || Ext == "uncompressed")
+      return Name;
+
+   // do not reverify cdrom sources as apt-cdrom may rewrite the Packages
+   // file when its doing the indexcopy
+   if (URI.substr(0,6) == "cdrom:")
+      return Name;
+
+   // adjust DestFile if its compressed on disk
+   if (_config->FindB("Acquire::GzipIndexes",false) == true)
+      return Name + '.' + Ext;
+   return Name;
+}
+                                                                       /*}}}*/
+static bool AllowInsecureRepositories(indexRecords const * const MetaIndexParser, pkgAcqMetaBase * const TransactionManager, pkgAcquire::Item * const I) /*{{{*/
+{
+   if(MetaIndexParser->IsAlwaysTrusted() || _config->FindB("Acquire::AllowInsecureRepositories") == true)
+      return true;
+
+   _error->Error(_("Use --allow-insecure-repositories to force the update"));
+   TransactionManager->AbortTransaction();
+   I->Status = pkgAcquire::Item::StatError;
+   return false;
+}
+                                                                       /*}}}*/
+
+
 // Acquire::Item::Item - Constructor                                   /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-pkgAcquire::Item::Item(pkgAcquire *Owner) : Owner(Owner), FileSize(0),
-                       PartialSize(0), Mode(0), ID(0), Complete(false), 
-                       Local(false), QueueCounter(0)
+APT_IGNORE_DEPRECATED_PUSH
+pkgAcquire::Item::Item(pkgAcquire *Owner,
+                       HashStringList const &ExpectedHashes,
+                       pkgAcqMetaBase *TransactionManager)
+   : Owner(Owner), FileSize(0), PartialSize(0), Mode(0), ID(0), Complete(false),
+     Local(false), QueueCounter(0), TransactionManager(TransactionManager),
+     ExpectedAdditionalItems(0), ExpectedHashes(ExpectedHashes)
 {
    Owner->Add(this);
    Status = StatIdle;
+   if(TransactionManager != NULL)
+      TransactionManager->Add(this);
 }
+APT_IGNORE_DEPRECATED_POP
                                                                        /*}}}*/
 // Acquire::Item::~Item - Destructor                                   /*{{{*/
 // ---------------------------------------------------------------------
@@ -75,15 +133,15 @@ pkgAcquire::Item::~Item()
    fetch this object */
 void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
-   Status = StatIdle;
-   ErrorText = LookupTag(Message,"Message");
+   if(ErrorText.empty())
+      ErrorText = LookupTag(Message,"Message");
    UsedMirror =  LookupTag(Message,"UsedMirror");
    if (QueueCounter <= 1)
    {
       /* This indicates that the file is not available right now but might
          be sometime later. If we do a retry cycle then this should be
         retried [CDROMs] */
-      if (Cnf->LocalOnly == true &&
+      if (Cnf != NULL && Cnf->LocalOnly == true &&
          StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
       {
         Status = StatIdle;
@@ -92,11 +150,18 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
       }
 
       Status = StatError;
+      Complete = false;
       Dequeue();
-   }   
+   }
+   else
+      Status = StatIdle;
+
+   // check fail reason
+   string const FailReason = LookupTag(Message, "FailReason");
+   if(FailReason == "MaximumSizeExceeded")
+      RenameOnError(MaximumSizeExceeded);
 
    // report mirror failure back to LP if we actually use a mirror
-   string FailReason = LookupTag(Message, "FailReason");
    if(FailReason.size() != 0)
       ReportMirrorFailure(FailReason);
    else
@@ -110,6 +175,7 @@ void pkgAcquire::Item::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 void pkgAcquire::Item::Start(string /*Message*/,unsigned long long Size)
 {
    Status = StatFetching;
+   ErrorText.clear();
    if (FileSize == 0 && Complete == false)
       FileSize = Size;
 }
@@ -117,12 +183,12 @@ void pkgAcquire::Item::Start(string /*Message*/,unsigned long long Size)
 // Acquire::Item::Done - Item downloaded OK                            /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-void pkgAcquire::Item::Done(string Message,unsigned long long Size,string /*Hash*/,
+void pkgAcquire::Item::Done(string Message,unsigned long long Size,HashStringList const &/*Hash*/,
                            pkgAcquire::MethodConfig * /*Cnf*/)
 {
    // We just downloaded something..
    string FileName = LookupTag(Message,"Filename");
-   UsedMirror =  LookupTag(Message,"UsedMirror");
+   UsedMirror = LookupTag(Message,"UsedMirror");
    if (Complete == false && !Local && FileName == DestFile)
    {
       if (Owner->Log != 0)
@@ -140,21 +206,32 @@ void pkgAcquire::Item::Done(string Message,unsigned long long Size,string /*Hash
 // ---------------------------------------------------------------------
 /* This helper function is used by a lot of item methods as their final
    step */
-void pkgAcquire::Item::Rename(string From,string To)
+bool pkgAcquire::Item::Rename(string From,string To)
 {
-   if (rename(From.c_str(),To.c_str()) != 0)
-   {
-      char S[300];
-      snprintf(S,sizeof(S),_("rename failed, %s (%s -> %s)."),strerror(errno),
-             From.c_str(),To.c_str());
-      Status = StatError;
-      ErrorText = S;
-   }   
+   if (rename(From.c_str(),To.c_str()) == 0)
+      return true;
+
+   std::string S;
+   strprintf(S, _("rename failed, %s (%s -> %s)."), strerror(errno),
+        From.c_str(),To.c_str());
+   Status = StatError;
+   ErrorText += S;
+   return false;
+}
+                                                                       /*}}}*/
+void pkgAcquire::Item::QueueURI(ItemDesc &Item)                                /*{{{*/
+{
+   Owner->Enqueue(Item);
+}
+                                                                       /*}}}*/
+void pkgAcquire::Item::Dequeue()                                       /*{{{*/
+{
+   Owner->Dequeue(this);
 }
                                                                        /*}}}*/
 bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const error)/*{{{*/
 {
-   if(FileExists(DestFile))
+   if (RealFileExists(DestFile))
       Rename(DestFile, DestFile + ".FAILED");
 
    switch (error)
@@ -174,10 +251,28 @@ bool pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState const
         Status = StatError;
         // do not report as usually its not the mirrors fault, but Portal/Proxy
         break;
+      case SignatureError:
+        ErrorText = _("Signature error");
+        Status = StatError;
+        break;
+      case NotClearsigned:
+        ErrorText = _("Does not start with a cleartext signature");
+        Status = StatError;
+        break;
+      case MaximumSizeExceeded:
+        // the method is expected to report a good error for this
+        Status = StatError;
+        break;
    }
    return false;
 }
                                                                        /*}}}*/
+void pkgAcquire::Item::SetActiveSubprocess(const std::string &subprocess)/*{{{*/
+{
+      ActiveSubprocess = subprocess;
+      APT_IGNORE_DEPRECATED(Mode = ActiveSubprocess.c_str();)
+}
+                                                                       /*}}}*/
 // Acquire::Item::ReportMirrorFailure                                  /*{{{*/
 // ---------------------------------------------------------------------
 void pkgAcquire::Item::ReportMirrorFailure(string FailCode)
@@ -192,148 +287,37 @@ void pkgAcquire::Item::ReportMirrorFailure(string FailCode)
             << " FailCode: " 
             << FailCode << std::endl;
 #endif
-   const char *Args[40];
-   unsigned int i = 0;
    string report = _config->Find("Methods::Mirror::ProblemReporting", 
                                 "/usr/lib/apt/apt-report-mirror-failure");
    if(!FileExists(report))
       return;
-   Args[i++] = report.c_str();
-   Args[i++] = UsedMirror.c_str();
-   Args[i++] = DescURI().c_str();
-   Args[i++] = FailCode.c_str();
-   Args[i++] = NULL;
+
+   std::vector<char const*> Args;
+   Args.push_back(report.c_str());
+   Args.push_back(UsedMirror.c_str());
+   Args.push_back(DescURI().c_str());
+   Args.push_back(FailCode.c_str());
+   Args.push_back(NULL);
+
    pid_t pid = ExecFork();
-   if(pid < 0) 
+   if(pid < 0)
    {
       _error->Error("ReportMirrorFailure Fork failed");
       return;
    }
-   else if(pid == 0) 
+   else if(pid == 0)
    {
-      execvp(Args[0], (char**)Args);
+      execvp(Args[0], (char**)Args.data());
       std::cerr << "Could not exec " << Args[0] << std::endl;
       _exit(100);
    }
-   if(!ExecWait(pid, "report-mirror-failure")) 
+   if(!ExecWait(pid, "report-mirror-failure"))
    {
       _error->Warning("Couldn't report problem to '%s'",
                      _config->Find("Methods::Mirror::ProblemReporting").c_str());
    }
 }
                                                                        /*}}}*/
-// AcqSubIndex::AcqSubIndex - Constructor                              /*{{{*/
-// ---------------------------------------------------------------------
-/* Get a sub-index file based on checksums from a 'master' file and
-   possibly query additional files */
-pkgAcqSubIndex::pkgAcqSubIndex(pkgAcquire *Owner, string const &URI,
-                                string const &URIDesc, string const &ShortDesc,
-                                HashString const &ExpectedHash)
-   : Item(Owner), ExpectedHash(ExpectedHash)
-{
-   /* XXX: Beware: Currently this class does nothing (of value) anymore ! */
-   Debug = _config->FindB("Debug::pkgAcquire::SubIndex",false);
-
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(URI);
-
-   Desc.URI = URI;
-   Desc.Description = URIDesc;
-   Desc.Owner = this;
-   Desc.ShortDesc = ShortDesc;
-
-   QueueURI(Desc);
-
-   if(Debug)
-      std::clog << "pkgAcqSubIndex: " << Desc.URI << std::endl;
-}
-                                                                       /*}}}*/
-// AcqSubIndex::Custom600Headers - Insert custom request headers       /*{{{*/
-// ---------------------------------------------------------------------
-/* The only header we use is the last-modified header. */
-string pkgAcqSubIndex::Custom600Headers()
-{
-   string Final = _config->FindDir("Dir::State::lists");
-   Final += URItoFileName(Desc.URI);
-
-   struct stat Buf;
-   if (stat(Final.c_str(),&Buf) != 0)
-      return "\nIndex-File: true\nFail-Ignore: true\n";
-   return "\nIndex-File: true\nFail-Ignore: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
-}
-                                                                       /*}}}*/
-void pkgAcqSubIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/
-{
-   if(Debug)
-      std::clog << "pkgAcqSubIndex failed: " << Desc.URI << " with " << Message << std::endl;
-
-   Complete = false;
-   Status = StatDone;
-   Dequeue();
-
-   // No good Index is provided
-}
-                                                                       /*}}}*/
-void pkgAcqSubIndex::Done(string Message,unsigned long long Size,string Md5Hash,       /*{{{*/
-                          pkgAcquire::MethodConfig *Cnf)
-{
-   if(Debug)
-      std::clog << "pkgAcqSubIndex::Done(): " << Desc.URI << std::endl;
-
-   string FileName = LookupTag(Message,"Filename");
-   if (FileName.empty() == true)
-   {
-      Status = StatError;
-      ErrorText = "Method gave a blank filename";
-      return;
-   }
-
-   if (FileName != DestFile)
-   {
-      Local = true;
-      Desc.URI = "copy:" + FileName;
-      QueueURI(Desc);
-      return;
-   }
-
-   Item::Done(Message,Size,Md5Hash,Cnf);
-
-   string FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(Desc.URI);
-
-   /* Downloaded invalid transindex => Error (LP: #346386) (Closes: #627642) */
-   indexRecords SubIndexParser;
-   if (FileExists(DestFile) == true && !SubIndexParser.Load(DestFile)) {
-      Status = StatError;
-      ErrorText = SubIndexParser.ErrorText;
-      return;
-   }
-
-   // success in downloading the index
-   // rename the index
-   if(Debug)
-      std::clog << "Renaming: " << DestFile << " -> " << FinalFile << std::endl;
-   Rename(DestFile,FinalFile);
-   chmod(FinalFile.c_str(),0644);
-   DestFile = FinalFile;
-
-   if(ParseIndex(DestFile) == false)
-      return Failed("", NULL);
-
-   Complete = true;
-   Status = StatDone;
-   Dequeue();
-   return;
-}
-                                                                       /*}}}*/
-bool pkgAcqSubIndex::ParseIndex(string const &IndexFile)               /*{{{*/
-{
-   indexRecords SubIndexParser;
-   if (FileExists(IndexFile) == false || SubIndexParser.Load(IndexFile) == false)
-      return false;
-   // so something with the downloaded index
-   return true;
-}
-                                                                       /*}}}*/
 // AcqDiffIndex::AcqDiffIndex - Constructor                            /*{{{*/
 // ---------------------------------------------------------------------
 /* Get the DiffIndex file first and see if there are patches available
@@ -342,21 +326,23 @@ bool pkgAcqSubIndex::ParseIndex(string const &IndexFile)          /*{{{*/
  * the original packages file
  */
 pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
-                                string URI,string URIDesc,string ShortDesc,
-                                HashString ExpectedHash)
-   : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash),
-     Description(URIDesc)
+                                 pkgAcqMetaBase *TransactionManager,
+                                 IndexTarget const * const Target,
+                                HashStringList const &ExpectedHashes,
+                                 indexRecords *MetaIndexParser)
+   : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, 
+                     MetaIndexParser), PackagesFileReadyInPartial(false)
 {
    
    Debug = _config->FindB("Debug::pkgAcquire::Diffs",false);
 
-   Desc.Description = URIDesc + "/DiffIndex";
+   RealURI = Target->URI;
    Desc.Owner = this;
-   Desc.ShortDesc = ShortDesc;
-   Desc.URI = URI + ".diff/Index";
+   Desc.Description = Target->Description + ".diff/Index";
+   Desc.ShortDesc = Target->ShortDesc;
+   Desc.URI = Target->URI + ".diff/Index";
 
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(Desc.URI);
+   DestFile = GetPartialFileNameFromURI(Desc.URI);
 
    if(Debug)
       std::clog << "pkgAcqDiffIndex: " << Desc.URI << std::endl;
@@ -372,9 +358,7 @@ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
       Desc.URI.substr(0,strlen("file:/")) == "file:/")
    {
       // we don't have a pkg file or we don't want to queue
-      if(Debug)
-        std::clog << "No index file, local or canceld by user" << std::endl;
-      Failed("", NULL);
+      Failed("No index file, local or canceld by user", NULL);
       return;
    }
 
@@ -389,11 +373,15 @@ pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
 // AcqIndex::Custom600Headers - Insert custom request headers          /*{{{*/
 // ---------------------------------------------------------------------
 /* The only header we use is the last-modified header. */
+#if APT_PKG_ABI >= 413
+string pkgAcqDiffIndex::Custom600Headers() const
+#else
 string pkgAcqDiffIndex::Custom600Headers()
+#endif
 {
    string Final = _config->FindDir("Dir::State::lists");
    Final += URItoFileName(Desc.URI);
-   
+
    if(Debug)
       std::clog << "Custom600Header-IMS: " << Final << std::endl;
 
@@ -406,190 +394,333 @@ string pkgAcqDiffIndex::Custom600Headers()
                                                                        /*}}}*/
 bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile)             /*{{{*/
 {
+   // failing here is fine: our caller will take care of trying to
+   // get the complete file if patching fails
    if(Debug)
       std::clog << "pkgAcqDiffIndex::ParseIndexDiff() " << IndexDiffFile
         << std::endl;
 
-   pkgTagSection Tags;
-   string ServerSha1;
-   vector<DiffInfo> available_patches;
-   
    FileFd Fd(IndexDiffFile,FileFd::ReadOnly);
    pkgTagFile TF(&Fd);
    if (_error->PendingError() == true)
       return false;
 
-   if(TF.Step(Tags) == true)
+   pkgTagSection Tags;
+   if(unlikely(TF.Step(Tags) == false))
+      return false;
+
+   HashStringList ServerHashes;
+   unsigned long long ServerSize = 0;
+
+   for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type)
    {
-      bool found = false;
-      DiffInfo d;
-      string size;
+      std::string tagname = *type;
+      tagname.append("-Current");
+      std::string const tmp = Tags.FindS(tagname.c_str());
+      if (tmp.empty() == true)
+        continue;
 
-      string const tmp = Tags.FindS("SHA1-Current");
+      string hash;
+      unsigned long long size;
       std::stringstream ss(tmp);
-      ss >> ServerSha1 >> size;
-      unsigned long const ServerSize = atol(size.c_str());
+      ss >> hash >> size;
+      if (unlikely(hash.empty() == true))
+        continue;
+      if (unlikely(ServerSize != 0 && ServerSize != size))
+        continue;
+      ServerHashes.push_back(HashString(*type, hash));
+      ServerSize = size;
+   }
 
-      FileFd fd(CurrentPackagesFile, FileFd::ReadOnly);
-      SHA1Summation SHA1;
-      SHA1.AddFD(fd);
-      string const local_sha1 = SHA1.Result();
+   if (ServerHashes.usable() == false)
+   {
+      if (Debug == true)
+        std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": Did not find a good hashsum in the index" << std::endl;
+      return false;
+   }
 
-      if(local_sha1 == ServerSha1)
+   if (ServerHashes != HashSums())
+   {
+      if (Debug == true)
       {
-        // we have the same sha1 as the server so we are done here
-        if(Debug)
-           std::clog << "Package file is up-to-date" << std::endl;
-        // list cleanup needs to know that this file as well as the already
-        // present index is ours, so we create an empty diff to save it for us
-        new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
-              ExpectedHash, ServerSha1, available_patches);
-        return true;
+        std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": Index has different hashes than parser, probably older, so fail pdiffing" << std::endl;
+         printHashSumComparision(CurrentPackagesFile, ServerHashes, HashSums());
       }
-      else
+      return false;
+   }
+
+   if (ServerHashes.VerifyFile(CurrentPackagesFile) == true)
+   {
+      // we have the same sha1 as the server so we are done here
+      if(Debug)
+        std::clog << "pkgAcqDiffIndex: Package file " << CurrentPackagesFile << " is up-to-date" << std::endl;
+
+      // list cleanup needs to know that this file as well as the already
+      // present index is ours, so we create an empty diff to save it for us
+      new pkgAcqIndexDiffs(Owner, TransactionManager, Target,
+                           ExpectedHashes, MetaIndexParser);
+      return true;
+   }
+
+   FileFd fd(CurrentPackagesFile, FileFd::ReadOnly);
+   Hashes LocalHashesCalc;
+   LocalHashesCalc.AddFD(fd);
+   HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList();
+
+   if(Debug)
+      std::clog << "Server-Current: " << ServerHashes.find(NULL)->toStr() << " and we start at "
+        << fd.Name() << " " << fd.FileSize() << " " << LocalHashes.find(NULL)->toStr() << std::endl;
+
+   // parse all of (provided) history
+   vector<DiffInfo> available_patches;
+   bool firstAcceptedHashes = true;
+   for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type)
+   {
+      if (LocalHashes.find(*type) == NULL)
+        continue;
+
+      std::string tagname = *type;
+      tagname.append("-History");
+      std::string const tmp = Tags.FindS(tagname.c_str());
+      if (tmp.empty() == true)
+        continue;
+
+      string hash, filename;
+      unsigned long long size;
+      std::stringstream ss(tmp);
+
+      while (ss >> hash >> size >> filename)
       {
-        if(Debug)
-           std::clog << "SHA1-Current: " << ServerSha1 << " and we start at "<< fd.Name() << " " << fd.Size() << " " << local_sha1 << std::endl;
+        if (unlikely(hash.empty() == true || filename.empty() == true))
+           continue;
 
-        // check the historie and see what patches we need
-        string const history = Tags.FindS("SHA1-History");
-        std::stringstream hist(history);
-        while(hist >> d.sha1 >> size >> d.file)
+        // see if we have a record for this file already
+        std::vector<DiffInfo>::iterator cur = available_patches.begin();
+        for (; cur != available_patches.end(); ++cur)
         {
-           // read until the first match is found
-           // from that point on, we probably need all diffs
-           if(d.sha1 == local_sha1) 
-              found=true;
-           else if (found == false)
+           if (cur->file != filename || unlikely(cur->result_size != size))
               continue;
-
-           if(Debug)
-              std::clog << "Need to get diff: " << d.file << std::endl;
-           available_patches.push_back(d);
+           cur->result_hashes.push_back(HashString(*type, hash));
+           break;
         }
-
-        if (available_patches.empty() == false)
+        if (cur != available_patches.end())
+           continue;
+        if (firstAcceptedHashes == true)
         {
-           // patching with too many files is rather slow compared to a fast download
-           unsigned long const fileLimit = _config->FindI("Acquire::PDiffs::FileLimit", 0);
-           if (fileLimit != 0 && fileLimit < available_patches.size())
-           {
-              if (Debug)
-                 std::clog << "Need " << available_patches.size() << " diffs (Limit is " << fileLimit
-                       << ") so fallback to complete download" << std::endl;
-              return false;
-           }
-
-           // see if the patches are too big
-           found = false; // it was true and it will be true again at the end
-           d = *available_patches.begin();
-           string const firstPatch = d.file;
-           unsigned long patchesSize = 0;
-           std::stringstream patches(Tags.FindS("SHA1-Patches"));
-           while(patches >> d.sha1 >> size >> d.file)
-           {
-              if (firstPatch == d.file)
-                 found = true;
-              else if (found == false)
-                 continue;
-
-              patchesSize += atol(size.c_str());
-           }
-           unsigned long const sizeLimit = ServerSize * _config->FindI("Acquire::PDiffs::SizeLimit", 100);
-           if (sizeLimit > 0 && (sizeLimit/100) < patchesSize)
-           {
-              if (Debug)
-                 std::clog << "Need " << patchesSize << " bytes (Limit is " << sizeLimit/100
-                       << ") so fallback to complete download" << std::endl;
-              return false;
-           }
+           DiffInfo next;
+           next.file = filename;
+           next.result_hashes.push_back(HashString(*type, hash));
+           next.result_size = size;
+           next.patch_size = 0;
+           available_patches.push_back(next);
+        }
+        else
+        {
+           if (Debug == true)
+              std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": File " << filename
+                 << " wasn't in the list for the first parsed hash! (history)" << std::endl;
+           break;
         }
       }
+      firstAcceptedHashes = false;
+   }
+
+   if (unlikely(available_patches.empty() == true))
+   {
+      if (Debug)
+        std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": "
+           << "Couldn't find any patches for the patch series." << std::endl;
+      return false;
+   }
+
+   for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type)
+   {
+      if (LocalHashes.find(*type) == NULL)
+        continue;
+
+      std::string tagname = *type;
+      tagname.append("-Patches");
+      std::string const tmp = Tags.FindS(tagname.c_str());
+      if (tmp.empty() == true)
+        continue;
+
+      string hash, filename;
+      unsigned long long size;
+      std::stringstream ss(tmp);
 
-      // we have something, queue the next diff
-      if(found)
+      while (ss >> hash >> size >> filename)
       {
-        // queue the diffs
-        string::size_type const last_space = Description.rfind(" ");
-        if(last_space != string::npos)
-           Description.erase(last_space, Description.size()-last_space);
-
-        /* decide if we should download patches one by one or in one go:
-           The first is good if the server merges patches, but many don't so client
-           based merging can be attempt in which case the second is better.
-           "bad things" will happen if patches are merged on the server,
-           but client side merging is attempt as well */
-        bool pdiff_merge = _config->FindB("Acquire::PDiffs::Merge", true);
-        if (pdiff_merge == true)
-        {
-           // reprepro adds this flag if it has merged patches on the server
-           std::string const precedence = Tags.FindS("X-Patch-Precedence");
-           pdiff_merge = (precedence != "merged");
-        }
+        if (unlikely(hash.empty() == true || filename.empty() == true))
+           continue;
 
-        if (pdiff_merge == false)
-           new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
-                 ExpectedHash, ServerSha1, available_patches);
-        else
+        // see if we have a record for this file already
+        std::vector<DiffInfo>::iterator cur = available_patches.begin();
+        for (; cur != available_patches.end(); ++cur)
         {
-           std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size());
-           for(size_t i = 0; i < available_patches.size(); ++i)
-              (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner, RealURI, Description, Desc.ShortDesc, ExpectedHash,
-                    available_patches[i], diffs);
+           if (cur->file != filename)
+              continue;
+           if (unlikely(cur->patch_size != 0 && cur->patch_size != size))
+              continue;
+           cur->patch_hashes.push_back(HashString(*type, hash));
+           cur->patch_size = size;
+           break;
         }
-
-        Complete = false;
-        Status = StatDone;
-        Dequeue();
-        return true;
+        if (cur != available_patches.end())
+              continue;
+        if (Debug == true)
+           std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": File " << filename
+              << " wasn't in the list for the first parsed hash! (patches)" << std::endl;
+        break;
       }
    }
+
+   bool foundStart = false;
+   for (std::vector<DiffInfo>::iterator cur = available_patches.begin();
+        cur != available_patches.end(); ++cur)
+   {
+      if (LocalHashes != cur->result_hashes)
+        continue;
+
+      available_patches.erase(available_patches.begin(), cur);
+      foundStart = true;
+      break;
+   }
+
+   if (foundStart == false || unlikely(available_patches.empty() == true))
+   {
+      if (Debug)
+        std::clog << "pkgAcqDiffIndex: " << IndexDiffFile << ": "
+           << "Couldn't find the start of the patch series." << std::endl;
+      return false;
+   }
+
+   // patching with too many files is rather slow compared to a fast download
+   unsigned long const fileLimit = _config->FindI("Acquire::PDiffs::FileLimit", 0);
+   if (fileLimit != 0 && fileLimit < available_patches.size())
+   {
+      if (Debug)
+        std::clog << "Need " << available_patches.size() << " diffs (Limit is " << fileLimit
+           << ") so fallback to complete download" << std::endl;
+      return false;
+   }
+
+   // calculate the size of all patches we have to get
+   // note that all sizes are uncompressed, while we download compressed files
+   unsigned long long patchesSize = 0;
+   for (std::vector<DiffInfo>::const_iterator cur = available_patches.begin();
+        cur != available_patches.end(); ++cur)
+      patchesSize += cur->patch_size;
+   unsigned long long const sizeLimit = ServerSize * _config->FindI("Acquire::PDiffs::SizeLimit", 100);
+   if (sizeLimit > 0 && (sizeLimit/100) < patchesSize)
+   {
+      if (Debug)
+        std::clog << "Need " << patchesSize << " bytes (Limit is " << sizeLimit/100
+           << ") so fallback to complete download" << std::endl;
+      return false;
+   }
+
+   // FIXME: make this use the method
+   PackagesFileReadyInPartial = true;
+   std::string const Partial = GetPartialFileNameFromURI(RealURI);
+   
+   FileFd From(CurrentPackagesFile, FileFd::ReadOnly);
+   FileFd To(Partial, FileFd::WriteEmpty);
+   if(CopyFile(From, To) == false)
+      return _error->Errno("CopyFile", "failed to copy");
    
-   // Nothing found, report and return false
-   // Failing here is ok, if we return false later, the full
-   // IndexFile is queued
    if(Debug)
-      std::clog << "Can't find a patch in the index file" << std::endl;
-   return false;
+      std::cerr << "Done copying " << CurrentPackagesFile
+                << " -> " << Partial
+                << std::endl;
+
+   // we have something, queue the diffs
+   string::size_type const last_space = Description.rfind(" ");
+   if(last_space != string::npos)
+      Description.erase(last_space, Description.size()-last_space);
+
+   /* decide if we should download patches one by one or in one go:
+      The first is good if the server merges patches, but many don't so client
+      based merging can be attempt in which case the second is better.
+      "bad things" will happen if patches are merged on the server,
+      but client side merging is attempt as well */
+   bool pdiff_merge = _config->FindB("Acquire::PDiffs::Merge", true);
+   if (pdiff_merge == true)
+   {
+      // reprepro adds this flag if it has merged patches on the server
+      std::string const precedence = Tags.FindS("X-Patch-Precedence");
+      pdiff_merge = (precedence != "merged");
+   }
+
+   if (pdiff_merge == false)
+   {
+      new pkgAcqIndexDiffs(Owner, TransactionManager, Target, ExpectedHashes, 
+                           MetaIndexParser, available_patches);
+   }
+   else
+   {
+      std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size());
+      for(size_t i = 0; i < available_patches.size(); ++i)
+        (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner, TransactionManager,
+               Target,
+              ExpectedHashes,
+              MetaIndexParser,
+              available_patches[i],
+              diffs);
+   }
+
+   Complete = false;
+   Status = StatDone;
+   Dequeue();
+   return true;
 }
                                                                        /*}}}*/
-void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/
+void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig * Cnf)/*{{{*/
 {
+   Item::Failed(Message,Cnf);
+   Status = StatDone;
+
    if(Debug)
       std::clog << "pkgAcqDiffIndex failed: " << Desc.URI << " with " << Message << std::endl
                << "Falling back to normal index file acquire" << std::endl;
 
-   new pkgAcqIndex(Owner, RealURI, Description, Desc.ShortDesc, 
-                  ExpectedHash);
-
-   Complete = false;
-   Status = StatDone;
-   Dequeue();
+   new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser);
 }
                                                                        /*}}}*/
-void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash,      /*{{{*/
+void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,HashStringList const &Hashes,        /*{{{*/
                           pkgAcquire::MethodConfig *Cnf)
 {
    if(Debug)
       std::clog << "pkgAcqDiffIndex::Done(): " << Desc.URI << std::endl;
 
-   Item::Done(Message,Size,Md5Hash,Cnf);
+   Item::Done(Message, Size, Hashes, Cnf);
+
+   // verify the index target
+   if(Target && Target->MetaKey != "" && MetaIndexParser && Hashes.usable())
+   {
+      std::string IndexMetaKey  = Target->MetaKey + ".diff/Index";
+      indexRecords::checkSum *Record = MetaIndexParser->Lookup(IndexMetaKey);
+      if(Record && Record->Hashes.usable() && Hashes != Record->Hashes)
+      {
+         RenameOnError(HashSumMismatch);
+         printHashSumComparision(RealURI, Record->Hashes, Hashes);
+         Failed(Message, Cnf);
+         return;
+      }
+
+   }
 
    string FinalFile;
-   FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI);
+   FinalFile = _config->FindDir("Dir::State::lists");
+   FinalFile += URItoFileName(Desc.URI);
 
-   // success in downloading the index
-   // rename the index
-   FinalFile += string(".IndexDiff");
-   if(Debug)
-      std::clog << "Renaming: " << DestFile << " -> " << FinalFile 
-               << std::endl;
-   Rename(DestFile,FinalFile);
-   chmod(FinalFile.c_str(),0644);
-   DestFile = FinalFile;
+   if(StringToBool(LookupTag(Message,"IMS-Hit"),false))
+      DestFile = FinalFile;
 
    if(!ParseDiffIndex(DestFile))
-      return Failed("", NULL);
+      return Failed("Message: Couldn't parse pdiff index", Cnf);
+
+   // queue for final move
+   TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
 
    Complete = true;
    Status = StatDone;
@@ -603,26 +734,28 @@ void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,string Md5Hash
  * for each diff and the index
  */
 pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
-                                  string URI,string URIDesc,string ShortDesc,
-                                  HashString ExpectedHash, 
-                                  string ServerSha1,
+                                   pkgAcqMetaBase *TransactionManager,
+                                   struct IndexTarget const * const Target,
+                                   HashStringList const &ExpectedHashes,
+                                   indexRecords *MetaIndexParser,
                                   vector<DiffInfo> diffs)
-   : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash), 
-     available_patches(diffs), ServerSha1(ServerSha1)
+   : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser),
+     available_patches(diffs)
 {
-   
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(URI);
+   DestFile = GetPartialFileNameFromURI(Target->URI);
 
    Debug = _config->FindB("Debug::pkgAcquire::Diffs",false);
 
-   Description = URIDesc;
+   RealURI = Target->URI;
    Desc.Owner = this;
-   Desc.ShortDesc = ShortDesc;
+   Description = Target->Description;
+   Desc.ShortDesc = Target->ShortDesc;
 
    if(available_patches.empty() == true)
    {
-      // we are done (yeah!)
+      // we are done (yeah!), check hashes against the final file
+      DestFile = _config->FindDir("Dir::State::lists");
+      DestFile += URItoFileName(Target->URI);
       Finish(true);
    }
    else
@@ -633,33 +766,42 @@ pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
    }
 }
                                                                        /*}}}*/
-void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/
+void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig * Cnf)/*{{{*/
 {
+   Item::Failed(Message,Cnf);
+   Status = StatDone;
+
    if(Debug)
       std::clog << "pkgAcqIndexDiffs failed: " << Desc.URI << " with " << Message << std::endl
                << "Falling back to normal index file acquire" << std::endl;
-   new pkgAcqIndex(Owner, RealURI, Description,Desc.ShortDesc, 
-                  ExpectedHash);
+   new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser);
    Finish();
 }
                                                                        /*}}}*/
 // Finish - helper that cleans the item out of the fetcher queue       /*{{{*/
 void pkgAcqIndexDiffs::Finish(bool allDone)
 {
+   if(Debug)
+      std::clog << "pkgAcqIndexDiffs::Finish(): " 
+                << allDone << " "
+                << Desc.URI << std::endl;
+
    // we restore the original name, this is required, otherwise
    // the file will be cleaned
    if(allDone) 
    {
-      DestFile = _config->FindDir("Dir::State::lists");
-      DestFile += URItoFileName(RealURI);
-
-      if(!ExpectedHash.empty() && !ExpectedHash.VerifyFile(DestFile))
+      if(HashSums().usable() && !HashSums().VerifyFile(DestFile))
       {
         RenameOnError(HashSumMismatch);
         Dequeue();
         return;
       }
 
+      // queue for copy
+      std::string FinalFile = _config->FindDir("Dir::State::lists");
+      FinalFile += URItoFileName(RealURI);
+      TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
+
       // this is for the "real" finish
       Complete = true;
       Status = StatDone;
@@ -679,21 +821,32 @@ void pkgAcqIndexDiffs::Finish(bool allDone)
                                                                        /*}}}*/
 bool pkgAcqIndexDiffs::QueueNextDiff()                                 /*{{{*/
 {
-
    // calc sha1 of the just patched file
-   string FinalFile = _config->FindDir("Dir::State::lists");
-   FinalFile += URItoFileName(RealURI);
+   std::string const FinalFile = GetPartialFileNameFromURI(RealURI);
+
+   if(!FileExists(FinalFile))
+   {
+      Failed("Message: No FinalFile " + FinalFile + " available", NULL);
+      return false;
+   }
 
    FileFd fd(FinalFile, FileFd::ReadOnly);
-   SHA1Summation SHA1;
-   SHA1.AddFD(fd);
-   string local_sha1 = string(SHA1.Result());
+   Hashes LocalHashesCalc;
+   LocalHashesCalc.AddFD(fd);
+   HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList();
+
    if(Debug)
-      std::clog << "QueueNextDiff: " 
-               << FinalFile << " (" << local_sha1 << ")"<<std::endl;
+      std::clog << "QueueNextDiff: " << FinalFile << " (" << LocalHashes.find(NULL)->toStr() << ")" << std::endl;
+
+   if (unlikely(LocalHashes.usable() == false || ExpectedHashes.usable() == false))
+   {
+      Failed("Local/Expected hashes are not usable", NULL);
+      return false;
+   }
+
 
    // final file reached before all patches are applied
-   if(local_sha1 == ServerSha1)
+   if(LocalHashes == ExpectedHashes)
    {
       Finish(true);
       return true;
@@ -701,10 +854,10 @@ bool pkgAcqIndexDiffs::QueueNextDiff()                                    /*{{{*/
 
    // remove all patches until the next matching patch is found
    // this requires the Index file to be ordered
-   for(vector<DiffInfo>::iterator I=available_patches.begin();
+   for(vector<DiffInfo>::iterator I = available_patches.begin();
        available_patches.empty() == false &&
          I != available_patches.end() &&
-         I->sha1 != local_sha1;
+         I->result_hashes != LocalHashes;
        ++I)
    {
       available_patches.erase(I);
@@ -713,38 +866,48 @@ bool pkgAcqIndexDiffs::QueueNextDiff()                                    /*{{{*/
    // error checking and falling back if no patch was found
    if(available_patches.empty() == true)
    {
-      Failed("", NULL);
+      Failed("No patches left to reach target", NULL);
       return false;
    }
 
    // queue the right diff
    Desc.URI = RealURI + ".diff/" + available_patches[0].file + ".gz";
    Desc.Description = Description + " " + available_patches[0].file + string(".pdiff");
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(RealURI + ".diff/" + available_patches[0].file);
+   DestFile = GetPartialFileNameFromURI(RealURI + ".diff/" + available_patches[0].file);
 
    if(Debug)
       std::clog << "pkgAcqIndexDiffs::QueueNextDiff(): " << Desc.URI << std::endl;
-   
+
    QueueURI(Desc);
 
    return true;
 }
                                                                        /*}}}*/
-void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Hash,     /*{{{*/
+void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size, HashStringList const &Hashes,      /*{{{*/
                            pkgAcquire::MethodConfig *Cnf)
 {
    if(Debug)
       std::clog << "pkgAcqIndexDiffs::Done(): " << Desc.URI << std::endl;
 
-   Item::Done(Message,Size,Md5Hash,Cnf);
+   Item::Done(Message, Size, Hashes, Cnf);
 
-   string FinalFile;
-   FinalFile = _config->FindDir("Dir::State::lists")+URItoFileName(RealURI);
+   // FIXME: verify this download too before feeding it to rred
+   std::string const FinalFile = GetPartialFileNameFromURI(RealURI);
 
    // success in downloading a diff, enter ApplyDiff state
    if(State == StateFetchDiff)
    {
+      FileFd fd(DestFile, FileFd::ReadOnly, FileFd::Gzip);
+      class Hashes LocalHashesCalc;
+      LocalHashesCalc.AddFD(fd);
+      HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList();
+
+      if (fd.Size() != available_patches[0].patch_size ||
+           available_patches[0].patch_hashes != LocalHashes)
+      {
+        Failed("Patch has Size/Hashsum mismatch", NULL);
+        return;
+      }
 
       // rred excepts the patch as $FinalFile.ed
       Rename(DestFile,FinalFile+".ed");
@@ -756,7 +919,7 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has
       Local = true;
       Desc.URI = "rred:" + FinalFile;
       QueueURI(Desc);
-      Mode = "rred";
+      SetActiveSubprocess("rred");
       return;
    } 
 
@@ -779,37 +942,39 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size,string Md5Has
 
       // see if there is more to download
       if(available_patches.empty() == false) {
-        new pkgAcqIndexDiffs(Owner, RealURI, Description, Desc.ShortDesc,
-                             ExpectedHash, ServerSha1, available_patches);
+        new pkgAcqIndexDiffs(Owner, TransactionManager, Target,
+                             ExpectedHashes, MetaIndexParser,
+                             available_patches);
         return Finish();
       } else 
+         // update
+         DestFile = FinalFile;
         return Finish(true);
    }
 }
                                                                        /*}}}*/
 // AcqIndexMergeDiffs::AcqIndexMergeDiffs - Constructor                        /*{{{*/
 pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
-                                  string const &URI, string const &URIDesc,
-                                  string const &ShortDesc, HashString const &ExpectedHash,
-                                  DiffInfo const &patch,
-                                  std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches)
-   : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash),
-     patch(patch),allPatches(allPatches), State(StateFetchDiff)
+                                             pkgAcqMetaBase *TransactionManager,
+                                             struct IndexTarget const * const Target,
+                                             HashStringList const &ExpectedHashes,
+                                             indexRecords *MetaIndexParser,
+                                             DiffInfo const &patch,
+                                             std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches)
+  : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser),
+     patch(patch), allPatches(allPatches), State(StateFetchDiff)
 {
-
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(URI);
-
    Debug = _config->FindB("Debug::pkgAcquire::Diffs",false);
 
-   Description = URIDesc;
+   RealURI = Target->URI;
    Desc.Owner = this;
-   Desc.ShortDesc = ShortDesc;
+   Description = Target->Description;
+   Desc.ShortDesc = Target->ShortDesc;
 
    Desc.URI = RealURI + ".diff/" + patch.file + ".gz";
    Desc.Description = Description + " " + patch.file + string(".pdiff");
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(RealURI + ".diff/" + patch.file);
+
+   DestFile = GetPartialFileNameFromURI(RealURI + ".diff/" + patch.file);
 
    if(Debug)
       std::clog << "pkgAcqIndexMergeDiffs: " << Desc.URI << std::endl;
@@ -817,13 +982,13 @@ pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
    QueueURI(Desc);
 }
                                                                        /*}}}*/
-void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/*{{{*/
+void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * Cnf)/*{{{*/
 {
    if(Debug)
       std::clog << "pkgAcqIndexMergeDiffs failed: " << Desc.URI << " with " << Message << std::endl;
-   Complete = false;
+
+   Item::Failed(Message,Cnf);
    Status = StatDone;
-   Dequeue();
 
    // check if we are the first to fail, otherwise we are done here
    State = StateDoneDiff;
@@ -835,22 +1000,33 @@ void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*C
    // first failure means we should fallback
    State = StateErrorDiff;
    std::clog << "Falling back to normal index file acquire" << std::endl;
-   new pkgAcqIndex(Owner, RealURI, Description,Desc.ShortDesc,
-                  ExpectedHash);
+   new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser);
 }
                                                                        /*}}}*/
-void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string Md5Hash,        /*{{{*/
+void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,HashStringList const &Hashes,  /*{{{*/
                            pkgAcquire::MethodConfig *Cnf)
 {
    if(Debug)
       std::clog << "pkgAcqIndexMergeDiffs::Done(): " << Desc.URI << std::endl;
 
-   Item::Done(Message,Size,Md5Hash,Cnf);
+   Item::Done(Message,Size,Hashes,Cnf);
 
-   string const FinalFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+   // FIXME: verify download before feeding it to rred
+   string const FinalFile = GetPartialFileNameFromURI(RealURI);
 
    if (State == StateFetchDiff)
    {
+      FileFd fd(DestFile, FileFd::ReadOnly, FileFd::Gzip);
+      class Hashes LocalHashesCalc;
+      LocalHashesCalc.AddFD(fd);
+      HashStringList const LocalHashes = LocalHashesCalc.GetHashStringList();
+
+      if (fd.Size() != patch.patch_size || patch.patch_hashes != LocalHashes)
+      {
+        Failed("Patch has Size/Hashsum mismatch", NULL);
+        return;
+      }
+
       // rred expects the patch as $FinalFile.ed.$patchname.gz
       Rename(DestFile, FinalFile + ".ed." + patch.file + ".gz");
 
@@ -874,35 +1050,38 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M
       Local = true;
       Desc.URI = "rred:" + FinalFile;
       QueueURI(Desc);
-      Mode = "rred";
+      SetActiveSubprocess("rred");
       return;
    }
    // success in download/apply all diffs, clean up
    else if (State == StateApplyDiff)
    {
       // see if we really got the expected file
-      if(!ExpectedHash.empty() && !ExpectedHash.VerifyFile(DestFile))
+      if(ExpectedHashes.usable() && !ExpectedHashes.VerifyFile(DestFile))
       {
         RenameOnError(HashSumMismatch);
         return;
       }
 
+
+      std::string FinalFile = _config->FindDir("Dir::State::lists");
+      FinalFile += URItoFileName(RealURI);
+
       // move the result into place
       if(Debug)
-        std::clog << "Moving patched file in place: " << std::endl
+        std::clog << "Queue patched file in place: " << std::endl
                   << DestFile << " -> " << FinalFile << std::endl;
-      Rename(DestFile, FinalFile);
-      chmod(FinalFile.c_str(), 0644);
 
-      // otherwise lists cleanup will eat the file
-      DestFile = FinalFile;
+      // queue for copy by the transaction manager
+      TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
 
       // ensure the ed's are gone regardless of list-cleanup
       for (std::vector<pkgAcqIndexMergeDiffs *>::const_iterator I = allPatches->begin();
            I != allPatches->end(); ++I)
       {
-           std::string patch = FinalFile + ".ed." + (*I)->patch.file + ".gz";
-           unlink(patch.c_str());
+        std::string const PartialFile = GetPartialFileNameFromURI(RealURI);
+        std::string patch = PartialFile + ".ed." + (*I)->patch.file + ".gz";
+        unlink(patch.c_str());
       }
 
       // all set and done
@@ -912,66 +1091,116 @@ void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,string M
    }
 }
                                                                        /*}}}*/
+// AcqBaseIndex::VerifyHashByMetaKey - verify hash for the given metakey /*{{{*/
+bool pkgAcqBaseIndex::VerifyHashByMetaKey(HashStringList const &Hashes)
+{
+   if(MetaKey != "" && Hashes.usable())
+   {
+      indexRecords::checkSum *Record = MetaIndexParser->Lookup(MetaKey);
+      if(Record && Record->Hashes.usable() && Hashes != Record->Hashes)
+      {
+         printHashSumComparision(RealURI, Record->Hashes, Hashes);
+         return false;
+      }
+   }
+   return true;
+}
+                                                                       /*}}}*/
 // AcqIndex::AcqIndex - Constructor                                    /*{{{*/
 // ---------------------------------------------------------------------
-/* The package file is added to the queue and a second class is 
-   instantiated to fetch the revision file */   
+/* The package file is added to the queue and a second class is
+   instantiated to fetch the revision file */
 pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
                         string URI,string URIDesc,string ShortDesc,
-                        HashString ExpectedHash, string comprExt)
-   : Item(Owner), RealURI(URI), ExpectedHash(ExpectedHash)
+                        HashStringList const  &ExpectedHash)
+   : pkgAcqBaseIndex(Owner, 0, NULL, ExpectedHash, NULL)
 {
-   if(comprExt.empty() == true)
-   {
-      // autoselect the compression method
-      std::vector<std::string> types = APT::Configuration::getCompressionTypes();
-      for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
-        comprExt.append(*t).append(" ");
-      if (comprExt.empty() == false)
-        comprExt.erase(comprExt.end()-1);
-   }
-   CompressionExtension = comprExt;
+   RealURI = URI;
 
+   AutoSelectCompression();
    Init(URI, URIDesc, ShortDesc);
+
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "New pkgIndex with TransactionManager "
+                << TransactionManager << std::endl;
 }
-pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner, IndexTarget const *Target,
-                        HashString const &ExpectedHash, indexRecords const *MetaIndexParser)
-   : Item(Owner), RealURI(Target->URI), ExpectedHash(ExpectedHash)
+                                                                       /*}}}*/
+// AcqIndex::AcqIndex - Constructor                                    /*{{{*/
+pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
+                         pkgAcqMetaBase *TransactionManager,
+                         IndexTarget const *Target,
+                        HashStringList const &ExpectedHash,
+                         indexRecords *MetaIndexParser)
+   : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHash,
+                     MetaIndexParser)
 {
+   RealURI = Target->URI;
+
    // autoselect the compression method
+   AutoSelectCompression();
+   Init(Target->URI, Target->Description, Target->ShortDesc);
+
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "New pkgIndex with TransactionManager "
+                << TransactionManager << std::endl;
+}
+                                                                       /*}}}*/
+// AcqIndex::AutoSelectCompression - Select compression                        /*{{{*/
+void pkgAcqIndex::AutoSelectCompression()
+{
    std::vector<std::string> types = APT::Configuration::getCompressionTypes();
-   CompressionExtension = "";
-   if (ExpectedHash.empty() == false)
+   CompressionExtensions = "";
+   if (ExpectedHashes.usable())
    {
-      for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
-        if (*t == "uncompressed" || MetaIndexParser->Exists(string(Target->MetaKey).append(".").append(*t)) == true)
-           CompressionExtension.append(*t).append(" ");
+      for (std::vector<std::string>::const_iterator t = types.begin();
+           t != types.end(); ++t)
+      {
+         std::string CompressedMetaKey = string(Target->MetaKey).append(".").append(*t);
+         if (*t == "uncompressed" ||
+             MetaIndexParser->Exists(CompressedMetaKey) == true)
+            CompressionExtensions.append(*t).append(" ");
+      }
    }
    else
    {
       for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
-        CompressionExtension.append(*t).append(" ");
+        CompressionExtensions.append(*t).append(" ");
    }
-   if (CompressionExtension.empty() == false)
-      CompressionExtension.erase(CompressionExtension.end()-1);
-
-   Init(Target->URI, Target->Description, Target->ShortDesc);
+   if (CompressionExtensions.empty() == false)
+      CompressionExtensions.erase(CompressionExtensions.end()-1);
 }
                                                                        /*}}}*/
 // AcqIndex::Init - defered Constructor                                        /*{{{*/
-void pkgAcqIndex::Init(string const &URI, string const &URIDesc, string const &ShortDesc) {
-   Decompression = false;
-   Erase = false;
+void pkgAcqIndex::Init(string const &URI, string const &URIDesc,
+                       string const &ShortDesc)
+{
+   Stage = STAGE_DOWNLOAD;
 
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(URI);
+   DestFile = GetPartialFileNameFromURI(URI);
 
-   std::string const comprExt = CompressionExtension.substr(0, CompressionExtension.find(' '));
-   if (comprExt == "uncompressed")
+   CurrentCompressionExtension = CompressionExtensions.substr(0, CompressionExtensions.find(' '));
+   if (CurrentCompressionExtension == "uncompressed")
+   {
       Desc.URI = URI;
-   else {
-      Desc.URI = URI + '.' + comprExt;
-      DestFile = DestFile + '.' + comprExt;
+      if(Target)
+         MetaKey = string(Target->MetaKey);
+   }
+   else
+   {
+      Desc.URI = URI + '.' + CurrentCompressionExtension;
+      DestFile = DestFile + '.' + CurrentCompressionExtension;
+      if(Target)
+         MetaKey = string(Target->MetaKey) + '.' + CurrentCompressionExtension;
+   }
+
+   // load the filesize
+   if(MetaIndexParser)
+   {
+      indexRecords::checkSum *Record = MetaIndexParser->Lookup(MetaKey);
+      if(Record)
+         FileSize = Record->Size;
+
+      InitByHashIfNeeded(MetaKey);
    }
 
    Desc.Description = URIDesc;
@@ -981,154 +1210,186 @@ void pkgAcqIndex::Init(string const &URI, string const &URIDesc, string const &S
    QueueURI(Desc);
 }
                                                                        /*}}}*/
+// AcqIndex::AdjustForByHash - modify URI for by-hash support          /*{{{*/
+void pkgAcqIndex::InitByHashIfNeeded(const std::string MetaKey)
+{
+   // TODO:
+   //  - (maybe?) add support for by-hash into the sources.list as flag
+   //  - make apt-ftparchive generate the hashes (and expire?)
+   std::string HostKnob = "APT::Acquire::" + ::URI(Desc.URI).Host + "::By-Hash";
+   if(_config->FindB("APT::Acquire::By-Hash", false) == true ||
+      _config->FindB(HostKnob, false) == true ||
+      MetaIndexParser->GetSupportsAcquireByHash())
+   {
+      indexRecords::checkSum *Record = MetaIndexParser->Lookup(MetaKey);
+      if(Record)
+      {
+         // FIXME: should we really use the best hash here? or a fixed one?
+         const HashString *TargetHash = Record->Hashes.find("");
+         std::string ByHash = "/by-hash/" + TargetHash->HashType() + "/" + TargetHash->HashValue();
+         size_t trailing_slash = Desc.URI.find_last_of("/");
+         Desc.URI = Desc.URI.replace(
+            trailing_slash,
+            Desc.URI.substr(trailing_slash+1).size()+1,
+            ByHash);
+      } else {
+         _error->Warning(
+            "Fetching ByHash requested but can not find record for %s",
+            MetaKey.c_str());
+      }
+   }
+}
+                                                                       /*}}}*/
 // AcqIndex::Custom600Headers - Insert custom request headers          /*{{{*/
 // ---------------------------------------------------------------------
 /* The only header we use is the last-modified header. */
+#if APT_PKG_ABI >= 413
+string pkgAcqIndex::Custom600Headers() const
+#else
 string pkgAcqIndex::Custom600Headers()
+#endif
 {
-   std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' '));
-   string Final = _config->FindDir("Dir::State::lists");
-   Final += URItoFileName(RealURI);
-   if (_config->FindB("Acquire::GzipIndexes",false))
-      Final += compExt;
-   
+   string Final = GetFinalFilename();
+
    string msg = "\nIndex-File: true";
-   // FIXME: this really should use "IndexTarget::IsOptional()" but that
-   //        seems to be difficult without breaking ABI
-   if (ShortDesc().find("Translation") != 0)
-      msg += "\nFail-Ignore: true";
    struct stat Buf;
    if (stat(Final.c_str(),&Buf) == 0)
       msg += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
 
+   if(Target->IsOptional())
+      msg += "\nFail-Ignore: true";
+
    return msg;
 }
                                                                        /*}}}*/
-void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/
+// pkgAcqIndex::Failed - getting the indexfile failed                  /*{{{*/
+void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
-   size_t const nextExt = CompressionExtension.find(' ');
+   Item::Failed(Message,Cnf);
+
+   size_t const nextExt = CompressionExtensions.find(' ');
    if (nextExt != std::string::npos)
    {
-      CompressionExtension = CompressionExtension.substr(nextExt+1);
+      CompressionExtensions = CompressionExtensions.substr(nextExt+1);
       Init(RealURI, Desc.Description, Desc.ShortDesc);
+      Status = StatIdle;
       return;
    }
 
    // on decompression failure, remove bad versions in partial/
-   if (Decompression && Erase) {
-      string s = _config->FindDir("Dir::State::lists") + "partial/";
-      s.append(URItoFileName(RealURI));
-      unlink(s.c_str());
+   if (Stage == STAGE_DECOMPRESS_AND_VERIFY)
+   {
+      unlink(EraseFileName.c_str());
    }
 
    Item::Failed(Message,Cnf);
+
+   if(Target->IsOptional() && ExpectedHashes.empty() && Stage == STAGE_DOWNLOAD)
+      Status = StatDone;
+   else
+      TransactionManager->AbortTransaction();
 }
                                                                        /*}}}*/
-// pkgAcqIndex::GetFinalFilename - Return the full final file path      /*{{{*/
-std::string pkgAcqIndex::GetFinalFilename(std::string const &URI,
-                                          std::string const &compExt)
+// pkgAcqIndex::GetFinalFilename - Return the full final file path     /*{{{*/
+std::string pkgAcqIndex::GetFinalFilename() const
 {
    std::string FinalFile = _config->FindDir("Dir::State::lists");
-   FinalFile += URItoFileName(URI);
-   if (_config->FindB("Acquire::GzipIndexes",false) == true)
-      FinalFile += '.' + compExt;
-   return FinalFile;
+   FinalFile += URItoFileName(RealURI);
+   return GetCompressedFileName(RealURI, FinalFile, CurrentCompressionExtension);
 }
                                                                        /*}}}*/
 // AcqIndex::ReverifyAfterIMS - Reverify index after an ims-hit                /*{{{*/
-void pkgAcqIndex::ReverifyAfterIMS(std::string const &FileName)
+void pkgAcqIndex::ReverifyAfterIMS()
 {
-   std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' '));
-   if (_config->FindB("Acquire::GzipIndexes",false) == true)
-      DestFile += compExt;
+   // update destfile to *not* include the compression extension when doing
+   // a reverify (as its uncompressed on disk already)
+   DestFile = GetCompressedFileName(RealURI, GetPartialFileNameFromURI(RealURI), CurrentCompressionExtension);
 
-   string FinalFile = GetFinalFilename(RealURI, compExt);
-   Rename(FinalFile, FileName);
-   Decompression = true;
-   Desc.URI = "copy:" + FileName;
+   // copy FinalFile into partial/ so that we check the hash again
+   string FinalFile = GetFinalFilename();
+   Stage = STAGE_DECOMPRESS_AND_VERIFY;
+   Desc.URI = "copy:" + FinalFile;
    QueueURI(Desc);
 }
                                                                        /*}}}*/
+// AcqIndex::ValidateFile - Validate the content of the downloaded file        /*{{{*/
+bool pkgAcqIndex::ValidateFile(const std::string &FileName)
+{
+   // FIXME: this can go away once we only ever download stuff that
+   //        has a valid hash and we never do GET based probing
+   // FIXME2: this also leaks debian-isms into the code and should go therefore
+
+   /* Always validate the index file for correctness (all indexes must
+    * have a Package field) (LP: #346386) (Closes: #627642) 
+    */
+   FileFd fd(FileName, FileFd::ReadOnly, FileFd::Extension);
+   // Only test for correctness if the content of the file is not empty
+   // (empty is ok)
+   if (fd.Size() > 0)
+   {
+      pkgTagSection sec;
+      pkgTagFile tag(&fd);
+      
+      // all our current indexes have a field 'Package' in each section
+      if (_error->PendingError() == true ||
+          tag.Step(sec) == false ||
+          sec.Exists("Package") == false)
+         return false;
+   }
+   return true;
+}
+                                                                       /*}}}*/
 // AcqIndex::Done - Finished a fetch                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* This goes through a number of states.. On the initial fetch the
    method could possibly return an alternate filename which points
    to the uncompressed version of the file. If this is so the file
    is copied into the partial directory. In all other cases the file
-   is decompressed with a gzip uri. */
-void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
+   is decompressed with a compressed uri. */
+void pkgAcqIndex::Done(string Message,
+                       unsigned long long Size,
+                       HashStringList const &Hashes,
                       pkgAcquire::MethodConfig *Cfg)
 {
-   Item::Done(Message,Size,Hash,Cfg);
-   std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' '));
+   Item::Done(Message,Size,Hashes,Cfg);
 
-   if (Decompression == true)
+   switch(Stage) 
    {
-      if (_config->FindB("Debug::pkgAcquire::Auth", false))
-      {
-         std::cerr << std::endl << RealURI << ": Computed Hash: " << Hash;
-         std::cerr << "  Expected Hash: " << ExpectedHash.toStr() << std::endl;
-      }
-
-      if (!ExpectedHash.empty() && ExpectedHash.toStr() != Hash)
-      {
-         Desc.URI = RealURI;
-        RenameOnError(HashSumMismatch);
-         return;
-      }
-
-      // FIXME: this can go away once we only ever download stuff that
-      //        has a valid hash and we never do GET based probing
-      //
-      /* Always verify the index file for correctness (all indexes must
-       * have a Package field) (LP: #346386) (Closes: #627642) 
-       */
-      FileFd fd(DestFile, FileFd::ReadOnly, FileFd::Extension);
-      // Only test for correctness if the file is not empty (empty is ok)
-      if (fd.Size() > 0)
-      {
-         pkgTagSection sec;
-         pkgTagFile tag(&fd);
-         
-         // all our current indexes have a field 'Package' in each section
-         if (_error->PendingError() == true || tag.Step(sec) == false || sec.Exists("Package") == false)
-         {
-            RenameOnError(InvalidFormat);
-            return;
-         }
-      }
-       
-      // Done, move it into position
-      string FinalFile = GetFinalFilename(RealURI, compExt);
-      Rename(DestFile,FinalFile);
-      chmod(FinalFile.c_str(),0644);
-      
-      /* We restore the original name to DestFile so that the clean operation
-         will work OK */
-      DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-      DestFile += URItoFileName(RealURI);
-      if (_config->FindB("Acquire::GzipIndexes",false))
-         DestFile += '.' + compExt;
-
-      // Remove the compressed version.
-      if (Erase == true)
-        unlink(DestFile.c_str());
+      case STAGE_DOWNLOAD:
+         StageDownloadDone(Message, Hashes, Cfg);
+         break;
+      case STAGE_DECOMPRESS_AND_VERIFY:
+         StageDecompressDone(Message, Hashes, Cfg);
+         break;
+   }
+}
+                                                                       /*}}}*/
+// AcqIndex::StageDownloadDone - Queue for decompress and verify       /*{{{*/
+void pkgAcqIndex::StageDownloadDone(string Message,
+                                    HashStringList const &Hashes,
+                                    pkgAcquire::MethodConfig *Cfg)
+{
+   // First check if the calculcated Hash of the (compressed) downloaded
+   // file matches the hash we have in the MetaIndexRecords for this file
+   if(VerifyHashByMetaKey(Hashes) == false)
+   {
+      RenameOnError(HashSumMismatch);
+      Failed(Message, Cfg);
       return;
    }
 
-   Erase = false;
    Complete = true;
-   
+
    // Handle the unzipd case
    string FileName = LookupTag(Message,"Alt-Filename");
    if (FileName.empty() == false)
    {
-      Decompression = true;
+      Stage = STAGE_DECOMPRESS_AND_VERIFY;
       Local = true;
       DestFile += ".decomp";
       Desc.URI = "copy:" + FileName;
       QueueURI(Desc);
-      Mode = "copy";
+      SetActiveSubprocess("copy");
       return;
    }
 
@@ -1139,355 +1400,502 @@ void pkgAcqIndex::Done(string Message,unsigned long long Size,string Hash,
       ErrorText = "Method gave a blank filename";
    }
 
-   if (FileName == DestFile)
-      Erase = true;
-   else
+   // Methods like e.g. "file:" will give us a (compressed) FileName that is
+   // not the "DestFile" we set, in this case we uncompress from the local file
+   if (FileName != DestFile)
       Local = true;
+   else
+      EraseFileName = FileName;
 
-   // The files timestamp matches, for non-local URLs reverify the local
-   // file, for local file, uncompress again to ensure the hashsum is still
-   // matching the Release file
-   bool const IsCDROM = RealURI.substr(0,6) == "cdrom:";
-   if ((Local == false || IsCDROM == true) &&
-        StringToBool(LookupTag(Message,"IMS-Hit"),false) == true)
+   // we need to verify the file against the current Release file again
+   // on if-modfied-since hit to avoid a stale attack against us
+   if(StringToBool(LookupTag(Message,"IMS-Hit"),false) == true)
    {
-      // set destfile to the final destfile
-      if(_config->FindB("Acquire::GzipIndexes",false) == false)
-      {
-         DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-         DestFile += URItoFileName(RealURI);
-      }
-
-      // do not reverify cdrom sources as apt-cdrom may rewrite the Packages
-      // file when its doing the indexcopy
-      if (IsCDROM == false)
-        ReverifyAfterIMS(FileName);
+      // The files timestamp matches, reverify by copy into partial/
+      EraseFileName = "";
+      ReverifyAfterIMS();
       return;
    }
-   string decompProg;
 
-   // If we enable compressed indexes, queue for hash verification
+   // If we have compressed indexes enabled, queue for hash verification
    if (_config->FindB("Acquire::GzipIndexes",false))
    {
-      DestFile = _config->FindDir("Dir::State::lists");
-      DestFile += URItoFileName(RealURI) + '.' + compExt;
-
-      Decompression = true;
+      DestFile = GetPartialFileNameFromURI(RealURI + '.' + CurrentCompressionExtension);
+      EraseFileName = "";
+      Stage = STAGE_DECOMPRESS_AND_VERIFY;
       Desc.URI = "copy:" + FileName;
       QueueURI(Desc);
-
+      SetActiveSubprocess("copy");
       return;
     }
 
    // get the binary name for your used compression type
-   decompProg = _config->Find(string("Acquire::CompressionTypes::").append(compExt),"");
-   if(decompProg.empty() == false);
-   else if(compExt == "uncompressed")
+   string decompProg;
+   if(CurrentCompressionExtension == "uncompressed")
       decompProg = "copy";
-   else {
-      _error->Error("Unsupported extension: %s", compExt.c_str());
+   else
+      decompProg = _config->Find(string("Acquire::CompressionTypes::").append(CurrentCompressionExtension),"");
+   if(decompProg.empty() == true)
+   {
+      _error->Error("Unsupported extension: %s", CurrentCompressionExtension.c_str());
       return;
    }
 
-   Decompression = true;
+   // queue uri for the next stage
+   Stage = STAGE_DECOMPRESS_AND_VERIFY;
    DestFile += ".decomp";
    Desc.URI = decompProg + ":" + FileName;
    QueueURI(Desc);
+   SetActiveSubprocess(decompProg);
+}
+                                                                       /*}}}*/
+// pkgAcqIndex::StageDecompressDone - Final verification               /*{{{*/
+void pkgAcqIndex::StageDecompressDone(string Message,
+                                      HashStringList const &Hashes,
+                                      pkgAcquire::MethodConfig *Cfg)
+{
+   if (ExpectedHashes.usable() && ExpectedHashes != Hashes)
+   {
+      Desc.URI = RealURI;
+      RenameOnError(HashSumMismatch);
+      printHashSumComparision(RealURI, ExpectedHashes, Hashes);
+      Failed(Message, Cfg);
+      return;
+   }
+
+   if(!ValidateFile(DestFile))
+   {
+      RenameOnError(InvalidFormat);
+      Failed(Message, Cfg);
+      return;
+   }
+
+   // remove the compressed version of the file
+   unlink(EraseFileName.c_str());
 
-   // FIXME: this points to a c++ string that goes out of scope
-   Mode = decompProg.c_str();
+   // Done, queue for rename on transaction finished
+   TransactionManager->TransactionStageCopy(this, DestFile, GetFinalFilename());
+
+   return;
 }
                                                                        /*}}}*/
-// AcqIndexTrans::pkgAcqIndexTrans - Constructor                       /*{{{*/
-// ---------------------------------------------------------------------
-/* The Translation file is added to the queue */
-pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner,
-                           string URI,string URIDesc,string ShortDesc) 
-  : pkgAcqIndex(Owner, URI, URIDesc, ShortDesc, HashString(), "")
+// AcqMetaBase::Add - Add a item to the current Transaction            /*{{{*/
+void pkgAcqMetaBase::Add(Item *I)
 {
+   Transaction.push_back(I);
 }
-pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, IndexTarget const *Target,
-                        HashString const &ExpectedHash, indexRecords const *MetaIndexParser)
-  : pkgAcqIndex(Owner, Target, ExpectedHash, MetaIndexParser)
+                                                                       /*}}}*/
+// AcqMetaBase::AbortTransaction - Abort the current Transaction       /*{{{*/
+void pkgAcqMetaBase::AbortTransaction()
 {
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "AbortTransaction: " << TransactionManager << std::endl;
+
+   // ensure the toplevel is in error state too
+   for (std::vector<Item*>::iterator I = Transaction.begin();
+        I != Transaction.end(); ++I)
+   {
+      if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+         std::clog << "  Cancel: " << (*I)->DestFile << std::endl;
+      // the transaction will abort, so stop anything that is idle
+      if ((*I)->Status == pkgAcquire::Item::StatIdle)
+      {
+         (*I)->Status = pkgAcquire::Item::StatDone;
+         (*I)->Dequeue();
+      }
+   }
+   Transaction.clear();
 }
                                                                        /*}}}*/
-// AcqIndexTrans::Custom600Headers - Insert custom request headers     /*{{{*/
-// ---------------------------------------------------------------------
-string pkgAcqIndexTrans::Custom600Headers()
+// AcqMetaBase::TransactionHasError - Check for errors in Transaction  /*{{{*/
+bool pkgAcqMetaBase::TransactionHasError()
 {
-   std::string const compExt = CompressionExtension.substr(0, CompressionExtension.find(' '));
-   string Final = _config->FindDir("Dir::State::lists");
-   Final += URItoFileName(RealURI);
-   if (_config->FindB("Acquire::GzipIndexes",false))
-      Final += compExt;
+   for (pkgAcquire::ItemIterator I = Transaction.begin();
+        I != Transaction.end(); ++I)
+      if((*I)->Status != pkgAcquire::Item::StatDone &&
+         (*I)->Status != pkgAcquire::Item::StatIdle)
+         return true;
 
-   struct stat Buf;
-   if (stat(Final.c_str(),&Buf) != 0)
-      return "\nFail-Ignore: true\nIndex-File: true";
-   return "\nFail-Ignore: true\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+   return false;
 }
                                                                        /*}}}*/
-// AcqIndexTrans::Failed - Silence failure messages for missing files  /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void pkgAcqIndexTrans::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
+// AcqMetaBase::CommitTransaction - Commit a transaction               /*{{{*/
+void pkgAcqMetaBase::CommitTransaction()
 {
-   size_t const nextExt = CompressionExtension.find(' ');
-   if (nextExt != std::string::npos)
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "CommitTransaction: " << this << std::endl;
+
+   // move new files into place *and* remove files that are not
+   // part of the transaction but are still on disk
+   for (std::vector<Item*>::iterator I = Transaction.begin();
+        I != Transaction.end(); ++I)
    {
-      CompressionExtension = CompressionExtension.substr(nextExt+1);
-      Init(RealURI, Desc.Description, Desc.ShortDesc);
-      Status = StatIdle;
-      return;
-   }
+      if((*I)->PartialFile != "")
+      {
+        if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+           std::clog << "mv " << (*I)->PartialFile << " -> "<< (*I)->DestFile << " "
+              << (*I)->DescURI() << std::endl;
 
-   if (Cnf->LocalOnly == true || 
-       StringToBool(LookupTag(Message,"Transient-Failure"),false) == false)
-   {      
-      // Ignore this
-      Status = StatDone;
-      Complete = false;
-      Dequeue();
-      return;
+        Rename((*I)->PartialFile, (*I)->DestFile);
+      } else {
+         if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+            std::clog << "rm "
+                      <<  (*I)->DestFile
+                      << " "
+                      << (*I)->DescURI()
+                      << std::endl;
+         unlink((*I)->DestFile.c_str());
+      }
+      // mark that this transaction is finished
+      (*I)->TransactionManager = 0;
    }
+   Transaction.clear();
+}
+                                                                       /*}}}*/
+// AcqMetaBase::TransactionStageCopy - Stage a file for copying                /*{{{*/
+void pkgAcqMetaBase::TransactionStageCopy(Item *I,
+                                          const std::string &From,
+                                          const std::string &To)
+{
+   I->PartialFile = From;
+   I->DestFile = To;
+}
+                                                                       /*}}}*/
+// AcqMetaBase::TransactionStageRemoval - Sage a file for removal      /*{{{*/
+void pkgAcqMetaBase::TransactionStageRemoval(Item *I,
+                                             const std::string &FinalFile)
+{
+   I->PartialFile = "";
+   I->DestFile = FinalFile; 
+}
+                                                                       /*}}}*/
+// AcqMetaBase::GenerateAuthWarning - Check gpg authentication error   /*{{{*/
+bool pkgAcqMetaBase::CheckStopAuthentication(const std::string &RealURI,
+                                             const std::string &Message)
+{
+   // FIXME: this entire function can do now that we disallow going to
+   //        a unauthenticated state and can cleanly rollback
 
-   Item::Failed(Message,Cnf);
+   string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+
+   if(FileExists(Final))
+   {
+      Status = StatTransientNetworkError;
+      _error->Warning(_("An error occurred during the signature "
+                        "verification. The repository is not updated "
+                        "and the previous index files will be used. "
+                        "GPG error: %s: %s\n"),
+                      Desc.Description.c_str(),
+                      LookupTag(Message,"Message").c_str());
+      RunScripts("APT::Update::Auth-Failure");
+      return true;
+   } else if (LookupTag(Message,"Message").find("NODATA") != string::npos) {
+      /* Invalid signature file, reject (LP: #346386) (Closes: #627642) */
+      _error->Error(_("GPG error: %s: %s"),
+                    Desc.Description.c_str(),
+                    LookupTag(Message,"Message").c_str());
+      Status = StatError;
+      return true;
+   } else {
+      _error->Warning(_("GPG error: %s: %s"),
+                      Desc.Description.c_str(),
+                      LookupTag(Message,"Message").c_str());
+   }
+   // gpgv method failed
+   ReportMirrorFailure("GPGFailure");
+   return false;
 }
                                                                        /*}}}*/
-pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,                                /*{{{*/
+// AcqMetaSig::AcqMetaSig - Constructor                                        /*{{{*/
+pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,
+                             pkgAcqMetaBase *TransactionManager,
                             string URI,string URIDesc,string ShortDesc,
-                            string MetaIndexURI, string MetaIndexURIDesc,
-                            string MetaIndexShortDesc,
+                             string MetaIndexFile,
                             const vector<IndexTarget*>* IndexTargets,
                             indexRecords* MetaIndexParser) :
-   Item(Owner), RealURI(URI), MetaIndexURI(MetaIndexURI),
-   MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
-   MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets)
+   pkgAcqMetaBase(Owner, IndexTargets, MetaIndexParser,
+                  HashStringList(), TransactionManager),
+   RealURI(URI), MetaIndexFile(MetaIndexFile), URIDesc(URIDesc),
+   ShortDesc(ShortDesc)
 {
    DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(URI);
+   DestFile += URItoFileName(RealURI);
 
-   // remove any partial downloaded sig-file in partial/. 
-   // it may confuse proxies and is too small to warrant a 
+   // remove any partial downloaded sig-file in partial/.
+   // it may confuse proxies and is too small to warrant a
    // partial download anyway
    unlink(DestFile.c_str());
 
+   // set the TransactionManager
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "New pkgAcqMetaSig with TransactionManager "
+                << TransactionManager << std::endl;
+
    // Create the item
    Desc.Description = URIDesc;
    Desc.Owner = this;
    Desc.ShortDesc = ShortDesc;
    Desc.URI = URI;
-      
-   string Final = _config->FindDir("Dir::State::lists");
-   Final += URItoFileName(RealURI);
-   if (RealFileExists(Final) == true)
-   {
-      // File was already in place.  It needs to be re-downloaded/verified
-      // because Release might have changed, we do give it a different
-      // name than DestFile because otherwise the http method will
-      // send If-Range requests and there are too many broken servers
-      // out there that do not understand them
-      LastGoodSig = DestFile+".reverify";
-      Rename(Final,LastGoodSig);
-   }
 
    QueueURI(Desc);
 }
                                                                        /*}}}*/
 pkgAcqMetaSig::~pkgAcqMetaSig()                                                /*{{{*/
 {
-   // if the file was never queued undo file-changes done in the constructor
-   if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false &&
-        LastGoodSig.empty() == false)
-   {
-      string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
-      if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true)
-        Rename(LastGoodSig, Final);
-   }
-
 }
                                                                        /*}}}*/
 // pkgAcqMetaSig::Custom600Headers - Insert custom request headers     /*{{{*/
 // ---------------------------------------------------------------------
-/* The only header we use is the last-modified header. */
+#if APT_PKG_ABI >= 413
+string pkgAcqMetaSig::Custom600Headers() const
+#else
 string pkgAcqMetaSig::Custom600Headers()
+#endif
 {
-   struct stat Buf;
-   if (stat(LastGoodSig.c_str(),&Buf) != 0)
-      return "\nIndex-File: true";
-
-   return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+   std::string Header = GetCustom600Headers(RealURI);
+   return Header;
 }
-
-void pkgAcqMetaSig::Done(string Message,unsigned long long Size,string MD5,
+                                                                       /*}}}*/
+// pkgAcqMetaSig::Done - The signature was downloaded/verified         /*{{{*/
+// ---------------------------------------------------------------------
+/* The only header we use is the last-modified header. */
+void pkgAcqMetaSig::Done(string Message,unsigned long long Size,
+                         HashStringList const &Hashes,
                         pkgAcquire::MethodConfig *Cfg)
 {
-   Item::Done(Message,Size,MD5,Cfg);
+   Item::Done(Message, Size, Hashes, Cfg);
 
-   string FileName = LookupTag(Message,"Filename");
-   if (FileName.empty() == true)
+   if(AuthPass == false)
    {
-      Status = StatError;
-      ErrorText = "Method gave a blank filename";
+      if(CheckDownloadDone(Message, RealURI) == true)
+      {
+         // destfile will be modified to point to MetaIndexFile for the
+         // gpgv method, so we need to save it here
+         MetaIndexFileSignature = DestFile;
+         QueueForSignatureVerify(MetaIndexFile, MetaIndexFileSignature);
+      }
       return;
    }
-
-   if (FileName != DestFile)
+   else
    {
-      // We have to copy it into place
-      Local = true;
-      Desc.URI = "copy:" + FileName;
-      QueueURI(Desc);
-      return;
+      if(CheckAuthDone(Message, RealURI) == true)
+      {
+         std::string FinalFile = _config->FindDir("Dir::State::lists");
+         FinalFile += URItoFileName(RealURI);
+         TransactionManager->TransactionStageCopy(this, MetaIndexFileSignature, FinalFile);
+      }
    }
-
-   Complete = true;
-
-   // put the last known good file back on i-m-s hit (it will
-   // be re-verified again)
-   // Else do nothing, we have the new file in DestFile then
-   if(StringToBool(LookupTag(Message,"IMS-Hit"),false) == true)
-      Rename(LastGoodSig, DestFile);
-
-   // queue a pkgAcqMetaIndex to be verified against the sig we just retrieved
-   new pkgAcqMetaIndex(Owner, MetaIndexURI, MetaIndexURIDesc, 
-                      MetaIndexShortDesc,  DestFile, IndexTargets, 
-                      MetaIndexParser);
-
 }
                                                                        /*}}}*/
 void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)/*{{{*/
 {
-   string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+   Item::Failed(Message,Cnf);
 
-   // if we get a network error we fail gracefully
-   if(Status == StatTransientNetworkError)
-   {
-      Item::Failed(Message,Cnf);
-      // move the sigfile back on transient network failures 
-      if(FileExists(LastGoodSig))
-        Rename(LastGoodSig,Final);
+   // check if we need to fail at this point 
+   if (AuthPass == true && CheckStopAuthentication(RealURI, Message))
+         return;
 
-      // set the status back to , Item::Failed likes to reset it
-      Status = pkgAcquire::Item::StatTransientNetworkError;
-      return;
+   // FIXME: meh, this is not really elegant
+   string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
+   string const InReleaseURI = RealURI.replace(RealURI.rfind("Release.gpg"), 12,
+                                         "InRelease");
+   string const FinalInRelease = _config->FindDir("Dir::State::lists") + URItoFileName(InReleaseURI);
+
+   if (RealFileExists(Final) || RealFileExists(FinalInRelease))
+   {
+      std::string downgrade_msg;
+      strprintf(downgrade_msg, _("The repository '%s' is no longer signed."),
+                URIDesc.c_str());
+      if(_config->FindB("Acquire::AllowDowngradeToInsecureRepositories"))
+      {
+         // meh, the users wants to take risks (we still mark the packages
+         // from this repository as unauthenticated)
+         _error->Warning("%s", downgrade_msg.c_str());
+         _error->Warning(_("This is normally not allowed, but the option "
+                           "Acquire::AllowDowngradeToInsecureRepositories was "
+                           "given to override it."));
+         Status = StatDone;
+      } else {
+         _error->Error("%s", downgrade_msg.c_str());
+         Rename(MetaIndexFile, MetaIndexFile+".FAILED");
+        Item::Failed("Message: " + downgrade_msg, Cnf);
+         TransactionManager->AbortTransaction();
+         return;
+      }
    }
+   else
+      _error->Warning(_("The data from '%s' is not signed. Packages "
+              "from that repository can not be authenticated."),
+           URIDesc.c_str());
 
-   // Delete any existing sigfile when the acquire failed
-   unlink(Final.c_str());
+   // this ensures that any file in the lists/ dir is removed by the
+   // transaction
+   DestFile = GetPartialFileNameFromURI(RealURI);
+   TransactionManager->TransactionStageRemoval(this, DestFile);
 
-   // queue a pkgAcqMetaIndex with no sigfile
-   new pkgAcqMetaIndex(Owner, MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
-                      "", IndexTargets, MetaIndexParser);
+   // only allow going further if the users explicitely wants it
+   if(AllowInsecureRepositories(MetaIndexParser, TransactionManager, this) == true)
+   {
+      // we parse the indexes here because at this point the user wanted
+      // a repository that may potentially harm him
+      MetaIndexParser->Load(MetaIndexFile);
+      QueueIndexes(true);
+   }
 
-   if (Cnf->LocalOnly == true || 
+   // FIXME: this is used often (e.g. in pkgAcqIndexTrans) so refactor
+   if (Cnf->LocalOnly == true ||
        StringToBool(LookupTag(Message,"Transient-Failure"),false) == false)
-   {      
+   {
       // Ignore this
       Status = StatDone;
-      Complete = false;
-      Dequeue();
-      return;
    }
-   
-   Item::Failed(Message,Cnf);
 }
                                                                        /*}}}*/
 pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner,                    /*{{{*/
+                                 pkgAcqMetaBase *TransactionManager,
                                 string URI,string URIDesc,string ShortDesc,
-                                string SigFile,
-                                const vector<struct IndexTarget*>* IndexTargets,
+                                 string MetaIndexSigURI,string MetaIndexSigURIDesc, string MetaIndexSigShortDesc,
+                                const vector<IndexTarget*>* IndexTargets,
                                 indexRecords* MetaIndexParser) :
-   Item(Owner), RealURI(URI), SigFile(SigFile), IndexTargets(IndexTargets),
-   MetaIndexParser(MetaIndexParser), AuthPass(false), IMSHit(false)
+   pkgAcqMetaBase(Owner, IndexTargets, MetaIndexParser, HashStringList(),
+                  TransactionManager), 
+   RealURI(URI), URIDesc(URIDesc), ShortDesc(ShortDesc),
+   MetaIndexSigURI(MetaIndexSigURI), MetaIndexSigURIDesc(MetaIndexSigURIDesc),
+   MetaIndexSigShortDesc(MetaIndexSigShortDesc)
 {
-   DestFile = _config->FindDir("Dir::State::lists") + "partial/";
-   DestFile += URItoFileName(URI);
+   if(TransactionManager == NULL)
+   {
+      this->TransactionManager = this;
+      this->TransactionManager->Add(this);
+   }
+
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "New pkgAcqMetaIndex with TransactionManager "
+                << this->TransactionManager << std::endl;
+
+
+   Init(URIDesc, ShortDesc);
+}
+                                                                       /*}}}*/
+// pkgAcqMetaIndex::Init - Delayed constructor                         /*{{{*/
+void pkgAcqMetaIndex::Init(std::string URIDesc, std::string ShortDesc)
+{
+   DestFile = GetPartialFileNameFromURI(RealURI);
 
    // Create the item
    Desc.Description = URIDesc;
    Desc.Owner = this;
    Desc.ShortDesc = ShortDesc;
-   Desc.URI = URI;
+   Desc.URI = RealURI;
 
+   // we expect more item
+   ExpectedAdditionalItems = IndexTargets->size();
    QueueURI(Desc);
 }
                                                                        /*}}}*/
 // pkgAcqMetaIndex::Custom600Headers - Insert custom request headers   /*{{{*/
 // ---------------------------------------------------------------------
-/* The only header we use is the last-modified header. */
+#if APT_PKG_ABI >= 413
+string pkgAcqMetaIndex::Custom600Headers() const
+#else
 string pkgAcqMetaIndex::Custom600Headers()
+#endif
 {
-   string Final = _config->FindDir("Dir::State::lists");
-   Final += URItoFileName(RealURI);
-   
-   struct stat Buf;
-   if (stat(Final.c_str(),&Buf) != 0)
-      return "\nIndex-File: true";
-   
-   return "\nIndex-File: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+   return GetCustom600Headers(RealURI);
 }
                                                                        /*}}}*/
-void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,string Hash, /*{{{*/
+void pkgAcqMetaIndex::Done(string Message,unsigned long long Size,     /*{{{*/
+                           HashStringList const &Hashes,
                           pkgAcquire::MethodConfig *Cfg)
 {
-   Item::Done(Message,Size,Hash,Cfg);
-
-   // MetaIndexes are done in two passes: one to download the
-   // metaindex with an appropriate method, and a second to verify it
-   // with the gpgv method
+   Item::Done(Message,Size,Hashes,Cfg);
 
-   if (AuthPass == true)
+   if(CheckDownloadDone(Message, RealURI))
    {
-      AuthDone(Message);
+      // we have a Release file, now download the Signature, all further
+      // verify/queue for additional downloads will be done in the
+      // pkgAcqMetaSig::Done() code
+      std::string MetaIndexFile = DestFile;
+      new pkgAcqMetaSig(Owner, TransactionManager, 
+                        MetaIndexSigURI, MetaIndexSigURIDesc,
+                        MetaIndexSigShortDesc, MetaIndexFile, IndexTargets, 
+                        MetaIndexParser);
 
-      // all cool, move Release file into place
-      Complete = true;
+      string FinalFile = _config->FindDir("Dir::State::lists");
+      FinalFile += URItoFileName(RealURI);
+      TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
    }
-   else
-   {
-      RetrievalDone(Message);
-      if (!Complete)
-         // Still more retrieving to do
-         return;
+}
+                                                                       /*}}}*/
+bool pkgAcqMetaBase::CheckAuthDone(string Message, const string &RealURI)      /*{{{*/
+{
+   // At this point, the gpgv method has succeeded, so there is a
+   // valid signature from a key in the trusted keyring.  We
+   // perform additional verification of its contents, and use them
+   // to verify the indexes we are about to download
 
-      if (SigFile == "")
-      {
-         // There was no signature file, so we are finished.  Download
-         // the indexes and do only hashsum verification if possible
-         MetaIndexParser->Load(DestFile);
-         QueueIndexes(false);
-      }
-      else
-      {
-         // There was a signature file, so pass it to gpgv for
-         // verification
-
-         if (_config->FindB("Debug::pkgAcquire::Auth", false))
-            std::cerr << "Metaindex acquired, queueing gpg verification ("
-                      << SigFile << "," << DestFile << ")\n";
-         AuthPass = true;
-         Desc.URI = "gpgv:" + SigFile;
-         QueueURI(Desc);
-         Mode = "gpgv";
-        return;
-      }
+   if (!MetaIndexParser->Load(DestFile))
+   {
+      Status = StatAuthError;
+      ErrorText = MetaIndexParser->ErrorText;
+      return false;
    }
 
-   if (Complete == true)
+   if (!VerifyVendor(Message, RealURI))
    {
-      string FinalFile = _config->FindDir("Dir::State::lists");
-      FinalFile += URItoFileName(RealURI);
-      if (SigFile == DestFile)
-        SigFile = FinalFile;
-      Rename(DestFile,FinalFile);
-      chmod(FinalFile.c_str(),0644);
-      DestFile = FinalFile;
+      return false;
    }
+
+   if (_config->FindB("Debug::pkgAcquire::Auth", false))
+      std::cerr << "Signature verification succeeded: "
+                << DestFile << std::endl;
+
+   // Download further indexes with verification 
+   //
+   // it would be really nice if we could simply do
+   //    if (IMSHit == false) QueueIndexes(true)
+   // and skip the download if the Release file has not changed
+   // - but right now the list cleaner will needs to be tricked
+   //   to not delete all our packages/source indexes in this case
+   QueueIndexes(true);
+
+   return true;
+}
+                                                                       /*}}}*/
+// pkgAcqMetaBase::GetCustom600Headers - Get header for AcqMetaBase     /*{{{*/
+// ---------------------------------------------------------------------
+string pkgAcqMetaBase::GetCustom600Headers(const string &RealURI) const
+{
+   std::string Header = "\nIndex-File: true";
+   std::string MaximumSize;
+   strprintf(MaximumSize, "\nMaximum-Size: %i",
+             _config->FindI("Acquire::MaxReleaseFileSize", 10*1000*1000));
+   Header += MaximumSize;
+
+   string FinalFile = _config->FindDir("Dir::State::lists");
+   FinalFile += URItoFileName(RealURI);
+
+   struct stat Buf;
+   if (stat(FinalFile.c_str(),&Buf) == 0)
+      Header += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+
+   return Header;
+}
+                                                                       /*}}}*/
+// pkgAcqMetaBase::QueueForSignatureVerify                             /*{{{*/
+void pkgAcqMetaBase::QueueForSignatureVerify(const std::string &MetaIndexFile,
+                                    const std::string &MetaIndexFileSignature)
+{
+   AuthPass = true;
+   Desc.URI = "gpgv:" + MetaIndexFileSignature;
+   DestFile = MetaIndexFile;
+   QueueURI(Desc);
+   SetActiveSubprocess("gpgv");
 }
                                                                        /*}}}*/
-void pkgAcqMetaIndex::RetrievalDone(string Message)                    /*{{{*/
+// pkgAcqMetaBase::CheckDownloadDone                                   /*{{{*/
+bool pkgAcqMetaBase::CheckDownloadDone(const std::string &Message,
+                                       const std::string &RealURI)
 {
    // We have just finished downloading a Release file (it is not
    // verified yet)
@@ -1497,7 +1905,7 @@ void pkgAcqMetaIndex::RetrievalDone(string Message)                       /*{{{*/
    {
       Status = StatError;
       ErrorText = "Method gave a blank filename";
-      return;
+      return false;
    }
 
    if (FileName != DestFile)
@@ -1505,7 +1913,7 @@ void pkgAcqMetaIndex::RetrievalDone(string Message)                       /*{{{*/
       Local = true;
       Desc.URI = "copy:" + FileName;
       QueueURI(Desc);
-      return;
+      return false;
    }
 
    // make sure to verify against the right file on I-M-S hit
@@ -1514,181 +1922,74 @@ void pkgAcqMetaIndex::RetrievalDone(string Message)                    /*{{{*/
    {
       string FinalFile = _config->FindDir("Dir::State::lists");
       FinalFile += URItoFileName(RealURI);
-      if (SigFile == DestFile)
-      {
-        SigFile = FinalFile;
-        // constructor of pkgAcqMetaClearSig moved it out of the way,
-        // now move it back in on IMS hit for the 'old' file
-        string const OldClearSig = DestFile + ".reverify";
-        if (RealFileExists(OldClearSig) == true)
-           Rename(OldClearSig, FinalFile);
-      }
       DestFile = FinalFile;
    }
-   Complete = true;
-}
-                                                                       /*}}}*/
-void pkgAcqMetaIndex::AuthDone(string Message)                         /*{{{*/
-{
-   // At this point, the gpgv method has succeeded, so there is a
-   // valid signature from a key in the trusted keyring.  We
-   // perform additional verification of its contents, and use them
-   // to verify the indexes we are about to download
-
-   if (!MetaIndexParser->Load(DestFile))
-   {
-      Status = StatAuthError;
-      ErrorText = MetaIndexParser->ErrorText;
-      return;
-   }
 
-   if (!VerifyVendor(Message))
-   {
-      return;
-   }
-
-   if (_config->FindB("Debug::pkgAcquire::Auth", false))
-      std::cerr << "Signature verification succeeded: "
-                << DestFile << std::endl;
-
-   // do not trust any previously unverified content that we may have
-   string LastGoodSigFile = _config->FindDir("Dir::State::lists").append("partial/").append(URItoFileName(RealURI));
-   if (DestFile != SigFile)
-      LastGoodSigFile.append(".gpg");
-   LastGoodSigFile.append(".reverify");
-   if(IMSHit == false && RealFileExists(LastGoodSigFile) == false)
-   {
-      for (vector <struct IndexTarget*>::const_iterator Target = IndexTargets->begin();
-           Target != IndexTargets->end();
-           ++Target)
-      {
-         // remove old indexes
-         std::string index = _config->FindDir("Dir::State::lists") +
-            URItoFileName((*Target)->URI);
-         unlink(index.c_str());
-         // and also old gzipindexes
-         std::vector<std::string> types = APT::Configuration::getCompressionTypes();
-         for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
-         {
-            index += '.' + (*t);
-            unlink(index.c_str());
-         }
-      }
-   }
-
-
-   // Download further indexes with verification
-   QueueIndexes(true);
-
-   // is it a clearsigned MetaIndex file?
-   if (DestFile == SigFile)
-      return;
+   // set Item to complete as the remaining work is all local (verify etc)
+   Complete = true;
 
-   // Done, move signature file into position
-   string VerifiedSigFile = _config->FindDir("Dir::State::lists") +
-      URItoFileName(RealURI) + ".gpg";
-   Rename(SigFile,VerifiedSigFile);
-   chmod(VerifiedSigFile.c_str(),0644);
+   return true;
 }
                                                                        /*}}}*/
-void pkgAcqMetaIndex::QueueIndexes(bool verify)                                /*{{{*/
+void pkgAcqMetaBase::QueueIndexes(bool verify)                         /*{{{*/
 {
-#if 0
-   /* Reject invalid, existing Release files (LP: #346386) (Closes: #627642)
-    * FIXME: Disabled; it breaks unsigned repositories without hashes */
-   if (!verify && FileExists(DestFile) && !MetaIndexParser->Load(DestFile))
-   {
-      Status = StatError;
-      ErrorText = MetaIndexParser->ErrorText;
-      return;
-   }
-#endif
-   bool transInRelease = false;
-   {
-      std::vector<std::string> const keys = MetaIndexParser->MetaKeys();
-      for (std::vector<std::string>::const_iterator k = keys.begin(); k != keys.end(); ++k)
-        // FIXME: Feels wrong to check for hardcoded string here, but what should we do else…
-        if (k->find("Translation-") != std::string::npos)
-        {
-           transInRelease = true;
-           break;
-        }
-   }
+   // at this point the real Items are loaded in the fetcher
+   ExpectedAdditionalItems = 0;
 
-   for (vector <struct IndexTarget*>::const_iterator Target = IndexTargets->begin();
+   vector <struct IndexTarget*>::const_iterator Target;
+   for (Target = IndexTargets->begin();
         Target != IndexTargets->end();
         ++Target)
    {
-      HashString ExpectedIndexHash;
+      HashStringList ExpectedIndexHashes;
       const indexRecords::checkSum *Record = MetaIndexParser->Lookup((*Target)->MetaKey);
-      bool compressedAvailable = false;
-      if (Record == NULL)
+
+      // optional target that we do not have in the Release file are 
+      // skipped
+      if (verify == true && Record == NULL && (*Target)->IsOptional())
+         continue;
+
+      // targets without a hash record are a error when verify is required
+      if (verify == true && Record == NULL)
       {
-        if ((*Target)->IsOptional() == true)
-        {
-           std::vector<std::string> types = APT::Configuration::getCompressionTypes();
-           for (std::vector<std::string>::const_iterator t = types.begin(); t != types.end(); ++t)
-              if (MetaIndexParser->Exists((*Target)->MetaKey + "." + *t) == true)
-              {
-                 compressedAvailable = true;
-                 break;
-              }
-        }
-        else if (verify == true)
-        {
-           Status = StatAuthError;
-           strprintf(ErrorText, _("Unable to find expected entry '%s' in Release file (Wrong sources.list entry or malformed file)"), (*Target)->MetaKey.c_str());
-           return;
-        }
+         Status = StatAuthError;
+         strprintf(ErrorText, _("Unable to find expected entry '%s' in Release file (Wrong sources.list entry or malformed file)"), (*Target)->MetaKey.c_str());
+         return;
       }
-      else
+
+      if (Record)
+         ExpectedIndexHashes = Record->Hashes;
+      
+      if (_config->FindB("Debug::pkgAcquire::Auth", false))
       {
-        ExpectedIndexHash = Record->Hash;
-        if (_config->FindB("Debug::pkgAcquire::Auth", false))
-        {
-           std::cerr << "Queueing: " << (*Target)->URI << std::endl;
-           std::cerr << "Expected Hash: " << ExpectedIndexHash.toStr() << std::endl;
-           std::cerr << "For: " << Record->MetaKeyFilename << std::endl;
-        }
-        if (verify == true && ExpectedIndexHash.empty() == true && (*Target)->IsOptional() == false)
-        {
-           Status = StatAuthError;
-           strprintf(ErrorText, _("Unable to find hash sum for '%s' in Release file"), (*Target)->MetaKey.c_str());
-           return;
-        }
-      }
+         std::cerr << "Queueing: " << (*Target)->URI << std::endl
+                   << "Expected Hash:" << std::endl;
+         for (HashStringList::const_iterator hs = ExpectedIndexHashes.begin(); hs != ExpectedIndexHashes.end(); ++hs)
+            std::cerr <<  "\t- " << hs->toStr() << std::endl;
+         std::cerr << "For: " << Record->MetaKeyFilename << std::endl;
 
-      if ((*Target)->IsOptional() == true)
+      }
+      if (verify == true && ExpectedIndexHashes.empty() == true)
       {
-        if ((*Target)->IsSubIndex() == true)
-           new pkgAcqSubIndex(Owner, (*Target)->URI, (*Target)->Description,
-                               (*Target)->ShortDesc, ExpectedIndexHash);
-        else if (transInRelease == false || Record != NULL || compressedAvailable == true)
-        {
-           if (_config->FindB("Acquire::PDiffs",true) == true && transInRelease == true &&
-               MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true)
-              new pkgAcqDiffIndex(Owner, (*Target)->URI, (*Target)->Description,
-                                  (*Target)->ShortDesc, ExpectedIndexHash);
-           else
-              new pkgAcqIndexTrans(Owner, *Target, ExpectedIndexHash, MetaIndexParser);
-        }
-        continue;
+         Status = StatAuthError;
+         strprintf(ErrorText, _("Unable to find hash sum for '%s' in Release file"), (*Target)->MetaKey.c_str());
+         return;
       }
 
-      /* Queue Packages file (either diff or full packages files, depending
+      /* Queue the Index file (Packages, Sources, Translation-$foo
+         (either diff or full packages files, depending
          on the users option) - we also check if the PDiff Index file is listed
          in the Meta-Index file. Ideal would be if pkgAcqDiffIndex would test this
          instead, but passing the required info to it is to much hassle */
       if(_config->FindB("Acquire::PDiffs",true) == true && (verify == false ||
-         MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true))
-        new pkgAcqDiffIndex(Owner, (*Target)->URI, (*Target)->Description,
-                            (*Target)->ShortDesc, ExpectedIndexHash);
+          MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true))
+         new pkgAcqDiffIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser);
       else
-        new pkgAcqIndex(Owner, *Target, ExpectedIndexHash, MetaIndexParser);
+         new pkgAcqIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser);
    }
 }
                                                                        /*}}}*/
-bool pkgAcqMetaIndex::VerifyVendor(string Message)                     /*{{{*/
+bool pkgAcqMetaBase::VerifyVendor(string Message, const string &RealURI)/*{{{*/
 {
    string::size_type pos;
 
@@ -1765,147 +2066,169 @@ bool pkgAcqMetaIndex::VerifyVendor(string Message)                    /*{{{*/
    return true;
 }
                                                                        /*}}}*/
-// pkgAcqMetaIndex::Failed - no Release file present or no signature file present      /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void pkgAcqMetaIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)
+// pkgAcqMetaIndex::Failed - no Release file present                   /*{{{*/
+void pkgAcqMetaIndex::Failed(string Message,
+                             pkgAcquire::MethodConfig * Cnf)
 {
-   if (AuthPass == true)
-   {
-      // gpgv method failed, if we have a good signature 
-      string LastGoodSigFile = _config->FindDir("Dir::State::lists").append("partial/").append(URItoFileName(RealURI));
-      if (DestFile != SigFile)
-        LastGoodSigFile.append(".gpg");
-      LastGoodSigFile.append(".reverify");
-
-      if(FileExists(LastGoodSigFile))
-      {
-        string VerifiedSigFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
-        if (DestFile != SigFile)
-           VerifiedSigFile.append(".gpg");
-        Rename(LastGoodSigFile, VerifiedSigFile);
-        Status = StatTransientNetworkError;
-        _error->Warning(_("An error occurred during the signature "
-                          "verification. The repository is not updated "
-                          "and the previous index files will be used. "
-                          "GPG error: %s: %s\n"),
-                        Desc.Description.c_str(),
-                        LookupTag(Message,"Message").c_str());
-        RunScripts("APT::Update::Auth-Failure");
-        return;
-      } else if (LookupTag(Message,"Message").find("NODATA") != string::npos) {
-        /* Invalid signature file, reject (LP: #346386) (Closes: #627642) */
-        _error->Error(_("GPG error: %s: %s"),
-                        Desc.Description.c_str(),
-                        LookupTag(Message,"Message").c_str());
-        return;
-      } else {
-        _error->Warning(_("GPG error: %s: %s"),
-                        Desc.Description.c_str(),
-                        LookupTag(Message,"Message").c_str());
-      }
-      // gpgv method failed 
-      ReportMirrorFailure("GPGFailure");
-   }
+   pkgAcquire::Item::Failed(Message, Cnf);
+   Status = StatDone;
 
-   /* Always move the meta index, even if gpgv failed. This ensures
-    * that PackageFile objects are correctly filled in */
-   if (FileExists(DestFile)) {
-      string FinalFile = _config->FindDir("Dir::State::lists");
-      FinalFile += URItoFileName(RealURI);
-      /* InRelease files become Release files, otherwise
-       * they would be considered as trusted later on */
-      if (SigFile == DestFile) {
-        RealURI = RealURI.replace(RealURI.rfind("InRelease"), 9,
-                                      "Release");
-        FinalFile = FinalFile.replace(FinalFile.rfind("InRelease"), 9,
-                                      "Release");
-        SigFile = FinalFile;
-      }
-      Rename(DestFile,FinalFile);
-      chmod(FinalFile.c_str(),0644);
+   string FinalFile = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
 
-      DestFile = FinalFile;
-   }
+   _error->Warning(_("The repository '%s' does not have a Release file. "
+                     "This is deprecated, please contact the owner of the "
+                     "repository."), URIDesc.c_str());
 
-   // No Release file was present, or verification failed, so fall
+   // No Release file was present so fall
    // back to queueing Packages files without verification
-   QueueIndexes(false);
+   // only allow going further if the users explicitely wants it
+   if(AllowInsecureRepositories(MetaIndexParser, TransactionManager, this) == true)
+   {
+      // Done, queue for rename on transaction finished
+      if (FileExists(DestFile)) 
+         TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
+
+      // queue without any kind of hashsum support
+      QueueIndexes(false);
+   }
+}
+                                                                       /*}}}*/
+void pkgAcqMetaIndex::Finished()                                       /*{{{*/
+{
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "Finished: " << DestFile <<std::endl;
+   if(TransactionManager != NULL &&
+      TransactionManager->TransactionHasError() == false)
+      TransactionManager->CommitTransaction();
 }
                                                                        /*}}}*/
 pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire *Owner,              /*{{{*/
                string const &URI, string const &URIDesc, string const &ShortDesc,
                string const &MetaIndexURI, string const &MetaIndexURIDesc, string const &MetaIndexShortDesc,
                string const &MetaSigURI, string const &MetaSigURIDesc, string const &MetaSigShortDesc,
-               const vector<struct IndexTarget*>* IndexTargets,
+               const vector<IndexTarget*>* IndexTargets,
                indexRecords* MetaIndexParser) :
-       pkgAcqMetaIndex(Owner, URI, URIDesc, ShortDesc, "", IndexTargets, MetaIndexParser),
-       MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
-       MetaSigURI(MetaSigURI), MetaSigURIDesc(MetaSigURIDesc), MetaSigShortDesc(MetaSigShortDesc)
+   pkgAcqMetaIndex(Owner, NULL, URI, URIDesc, ShortDesc, MetaSigURI, MetaSigURIDesc,MetaSigShortDesc, IndexTargets, MetaIndexParser),
+       MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
+       MetaSigURI(MetaSigURI), MetaSigURIDesc(MetaSigURIDesc), MetaSigShortDesc(MetaSigShortDesc)
 {
-   SigFile = DestFile;
+   // index targets + (worst case:) Release/Release.gpg
+   ExpectedAdditionalItems = IndexTargets->size() + 2;
 
-   // keep the old InRelease around in case of transistent network errors
-   string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
-   if (RealFileExists(Final) == true)
-   {
-      string const LastGoodSig = DestFile + ".reverify";
-      Rename(Final,LastGoodSig);
-   }
 }
                                                                        /*}}}*/
 pkgAcqMetaClearSig::~pkgAcqMetaClearSig()                              /*{{{*/
 {
-   // if the file was never queued undo file-changes done in the constructor
-   if (QueueCounter == 1 && Status == StatIdle && FileSize == 0 && Complete == false)
-   {
-      string const Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
-      string const LastGoodSig = DestFile + ".reverify";
-      if (RealFileExists(Final) == false && RealFileExists(LastGoodSig) == true)
-        Rename(LastGoodSig, Final);
-   }
 }
                                                                        /*}}}*/
 // pkgAcqMetaClearSig::Custom600Headers - Insert custom request headers        /*{{{*/
 // ---------------------------------------------------------------------
-// FIXME: this can go away once the InRelease file is used widely
+#if APT_PKG_ABI >= 413
+string pkgAcqMetaClearSig::Custom600Headers() const
+#else
 string pkgAcqMetaClearSig::Custom600Headers()
+#endif
 {
-   string Final = _config->FindDir("Dir::State::lists");
-   Final += URItoFileName(RealURI);
+   string Header = GetCustom600Headers(RealURI);
+   Header += "\nFail-Ignore: true";
+   return Header;
+}
+                                                                       /*}}}*/
+// pkgAcqMetaClearSig::Done - We got a file                            /*{{{*/
+// ---------------------------------------------------------------------
+void pkgAcqMetaClearSig::Done(std::string Message,unsigned long long Size,
+                              HashStringList const &Hashes,
+                              pkgAcquire::MethodConfig *Cnf)
+{
+   Item::Done(Message, Size, Hashes, Cnf);
 
-   struct stat Buf;
-   if (stat(Final.c_str(),&Buf) != 0)
+   // if we expect a ClearTextSignature (InRelase), ensure that
+   // this is what we get and if not fail to queue a 
+   // Release/Release.gpg, see #346386
+   if (FileExists(DestFile) && !StartsWithGPGClearTextSignature(DestFile))
+   {
+      pkgAcquire::Item::Failed(Message, Cnf);
+      RenameOnError(NotClearsigned);
+      TransactionManager->AbortTransaction();
+      return;
+   }
+
+   if(AuthPass == false)
    {
-      Final = DestFile + ".reverify";
-      if (stat(Final.c_str(),&Buf) != 0)
-        return "\nIndex-File: true\nFail-Ignore: true\n";
+      if(CheckDownloadDone(Message, RealURI) == true)
+         QueueForSignatureVerify(DestFile, DestFile);
+      return;
    }
+   else
+   {
+      if(CheckAuthDone(Message, RealURI) == true)
+      {
+         string FinalFile = _config->FindDir("Dir::State::lists");
+         FinalFile += URItoFileName(RealURI);
 
-   return "\nIndex-File: true\nFail-Ignore: true\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+         // queue for copy in place
+         TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
+      }
+   }
 }
                                                                        /*}}}*/
 void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*{{{*/
 {
+   Item::Failed(Message, Cnf);
+
+   // we failed, we will not get additional items from this method
+   ExpectedAdditionalItems = 0;
+
    if (AuthPass == false)
    {
-      // Remove the 'old' InRelease file if we try Release.gpg now as otherwise
-      // the file will stay around and gives a false-auth impression (CVE-2012-0214)
+      // Queue the 'old' InRelease file for removal if we try Release.gpg
+      // as otherwise the file will stay around and gives a false-auth
+      // impression (CVE-2012-0214)
       string FinalFile = _config->FindDir("Dir::State::lists");
       FinalFile.append(URItoFileName(RealURI));
-      if (FileExists(FinalFile))
-        unlink(FinalFile.c_str());
+      TransactionManager->TransactionStageRemoval(this, FinalFile);
+      Status = StatDone;
 
-      new pkgAcqMetaSig(Owner,
-                       MetaSigURI, MetaSigURIDesc, MetaSigShortDesc,
+      new pkgAcqMetaIndex(Owner, TransactionManager,
                        MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
+                       MetaSigURI, MetaSigURIDesc, MetaSigShortDesc,
                        IndexTargets, MetaIndexParser);
-      if (Cnf->LocalOnly == true ||
-         StringToBool(LookupTag(Message, "Transient-Failure"), false) == false)
-        Dequeue();
    }
    else
-      pkgAcqMetaIndex::Failed(Message, Cnf);
+   {
+      if(CheckStopAuthentication(RealURI, Message))
+         return;
+
+      _error->Warning(_("The data from '%s' is not signed. Packages "
+                        "from that repository can not be authenticated."),
+                      URIDesc.c_str());
+
+      // No Release file was present, or verification failed, so fall
+      // back to queueing Packages files without verification
+      // only allow going further if the users explicitely wants it
+      if(AllowInsecureRepositories(MetaIndexParser, TransactionManager, this) == true)
+      {
+        Status = StatDone;
+
+         /* Always move the meta index, even if gpgv failed. This ensures
+          * that PackageFile objects are correctly filled in */
+         if (FileExists(DestFile))
+         {
+            string FinalFile = _config->FindDir("Dir::State::lists");
+            FinalFile += URItoFileName(RealURI);
+            /* InRelease files become Release files, otherwise
+             * they would be considered as trusted later on */
+            RealURI = RealURI.replace(RealURI.rfind("InRelease"), 9,
+                                      "Release");
+            FinalFile = FinalFile.replace(FinalFile.rfind("InRelease"), 9,
+                                          "Release");
+
+            // Done, queue for rename on transaction finished
+            TransactionManager->TransactionStageCopy(this, DestFile, FinalFile);
+         }
+         QueueIndexes(false);
+      }
+   }
 }
                                                                        /*}}}*/
 // AcqArchive::AcqArchive - Constructor                                        /*{{{*/
@@ -1915,7 +2238,7 @@ void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*
 pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
                             pkgRecords *Recs,pkgCache::VerIterator const &Version,
                             string &StoreFilename) :
-               Item(Owner), Version(Version), Sources(Sources), Recs(Recs), 
+               Item(Owner, HashStringList()), Version(Version), Sources(Sources), Recs(Recs), 
                StoreFilename(StoreFilename), Vf(Version.FileList()), 
               Trusted(false)
 {
@@ -2000,7 +2323,6 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
    checking later. */
 bool pkgAcqArchive::QueueNext()
 {
-   string const ForceHash = _config->Find("Acquire::ForceHash");
    for (; Vf.end() == false; ++Vf)
    {
       // Ignore not source sources
@@ -2021,31 +2343,10 @@ bool pkgAcqArchive::QueueNext()
       pkgRecords::Parser &Parse = Recs->Lookup(Vf);
       if (_error->PendingError() == true)
         return false;
-      
+
       string PkgFile = Parse.FileName();
-      if (ForceHash.empty() == false)
-      {
-        if(stringcasecmp(ForceHash, "sha512") == 0)
-           ExpectedHash = HashString("SHA512", Parse.SHA512Hash());
-        else if(stringcasecmp(ForceHash, "sha256") == 0)
-           ExpectedHash = HashString("SHA256", Parse.SHA256Hash());
-        else if (stringcasecmp(ForceHash, "sha1") == 0)
-           ExpectedHash = HashString("SHA1", Parse.SHA1Hash());
-        else
-           ExpectedHash = HashString("MD5Sum", Parse.MD5Hash());
-      }
-      else
-      {
-        string Hash;
-        if ((Hash = Parse.SHA512Hash()).empty() == false)
-           ExpectedHash = HashString("SHA512", Hash);
-        else if ((Hash = Parse.SHA256Hash()).empty() == false)
-           ExpectedHash = HashString("SHA256", Hash);
-        else if ((Hash = Parse.SHA1Hash()).empty() == false)
-           ExpectedHash = HashString("SHA1", Hash);
-        else
-           ExpectedHash = HashString("MD5Sum", Parse.MD5Hash());
-      }
+      ExpectedHashes = Parse.Hashes();
+
       if (PkgFile.empty() == true)
         return _error->Error(_("The package index files are corrupted. No Filename: "
                              "field for package %s."),
@@ -2132,10 +2433,10 @@ bool pkgAcqArchive::QueueNext()
 // AcqArchive::Done - Finished fetching                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
+void pkgAcqArchive::Done(string Message,unsigned long long Size, HashStringList const &CalcHashes,
                         pkgAcquire::MethodConfig *Cfg)
 {
-   Item::Done(Message,Size,CalcHash,Cfg);
+   Item::Done(Message, Size, CalcHashes, Cfg);
    
    // Check the size
    if (Size != Version->Size)
@@ -2143,11 +2444,12 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
       RenameOnError(SizeMismatch);
       return;
    }
-   
-   // Check the hash
-   if(ExpectedHash.toStr() != CalcHash)
+
+   // FIXME: could this empty() check impose *any* sort of security issue?
+   if(ExpectedHashes.usable() && ExpectedHashes != CalcHashes)
    {
       RenameOnError(HashSumMismatch);
+      printHashSumComparision(DestFile, ExpectedHashes, CalcHashes);
       return;
    }
 
@@ -2160,21 +2462,19 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
       return;
    }
 
-   Complete = true;
-
    // Reference filename
    if (FileName != DestFile)
    {
       StoreFilename = DestFile = FileName;
       Local = true;
+      Complete = true;
       return;
    }
-   
+
    // Done, move it into position
    string FinalFile = _config->FindDir("Dir::Cache::Archives");
    FinalFile += flNotDir(StoreFilename);
    Rename(DestFile,FinalFile);
-   
    StoreFilename = DestFile = FinalFile;
    Complete = true;
 }
@@ -2184,8 +2484,8 @@ void pkgAcqArchive::Done(string Message,unsigned long long Size,string CalcHash,
 /* Here we try other sources */
 void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
-   ErrorText = LookupTag(Message,"Message");
-   
+   Item::Failed(Message,Cnf);
+
    /* We don't really want to retry on failed media swaps, this prevents 
       that. An interesting observation is that permanent failures are not
       recorded. */
@@ -2195,10 +2495,10 @@ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
       // Vf = Version.FileList();
       while (Vf.end() == false) ++Vf;
       StoreFilename = string();
-      Item::Failed(Message,Cnf);
       return;
    }
-   
+
+   Status = StatIdle;
    if (QueueNext() == false)
    {
       // This is the retry counter
@@ -2211,15 +2511,19 @@ void pkgAcqArchive::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
         if (QueueNext() == true)
            return;
       }
-      
+
       StoreFilename = string();
-      Item::Failed(Message,Cnf);
+      Status = StatError;
    }
 }
                                                                        /*}}}*/
 // AcqArchive::IsTrusted - Determine whether this archive comes from a trusted source /*{{{*/
 // ---------------------------------------------------------------------
+#if APT_PKG_ABI >= 413
+APT_PURE bool pkgAcqArchive::IsTrusted() const
+#else
 APT_PURE bool pkgAcqArchive::IsTrusted()
+#endif
 {
    return Trusted;
 }
@@ -2238,11 +2542,11 @@ void pkgAcqArchive::Finished()
 // AcqFile::pkgAcqFile - Constructor                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* The file is added to the queue */
-pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash,
+pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI, HashStringList const &Hashes,
                       unsigned long long Size,string Dsc,string ShortDesc,
                       const string &DestDir, const string &DestFilename,
                        bool IsIndexFile) :
-                       Item(Owner), ExpectedHash(Hash), IsIndexFile(IsIndexFile)
+                       Item(Owner, Hashes), IsIndexFile(IsIndexFile)
 {
    Retries = _config->FindI("Acquire::Retries",0);
    
@@ -2279,15 +2583,16 @@ pkgAcqFile::pkgAcqFile(pkgAcquire *Owner,string URI,string Hash,
 // AcqFile::Done - Item downloaded OK                                  /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash,
+void pkgAcqFile::Done(string Message,unsigned long long Size,HashStringList const &CalcHashes,
                      pkgAcquire::MethodConfig *Cnf)
 {
-   Item::Done(Message,Size,CalcHash,Cnf);
+   Item::Done(Message,Size,CalcHashes,Cnf);
 
    // Check the hash
-   if(!ExpectedHash.empty() && ExpectedHash.toStr() != CalcHash)
+   if(ExpectedHashes.usable() && ExpectedHashes != CalcHashes)
    {
       RenameOnError(HashSumMismatch);
+      printHashSumComparision(DestFile, ExpectedHashes, CalcHashes);
       return;
    }
    
@@ -2328,7 +2633,12 @@ void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash,
       // Symlink the file
       if (symlink(FileName.c_str(),DestFile.c_str()) != 0)
       {
-        ErrorText = "Link to " + DestFile + " failure ";
+        _error->PushToStack();
+        _error->Errno("pkgAcqFile::Done", "Symlinking file %s failed", DestFile.c_str());
+        std::stringstream msg;
+        _error->DumpErrors(msg);
+        _error->RevertToStack();
+        ErrorText = msg.str();
         Status = StatError;
         Complete = false;
       }      
@@ -2340,25 +2650,29 @@ void pkgAcqFile::Done(string Message,unsigned long long Size,string CalcHash,
 /* Here we try other sources */
 void pkgAcqFile::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 {
-   ErrorText = LookupTag(Message,"Message");
-   
+   Item::Failed(Message,Cnf);
+
    // This is the retry counter
    if (Retries != 0 &&
        Cnf->LocalOnly == false &&
        StringToBool(LookupTag(Message,"Transient-Failure"),false) == true)
    {
-      Retries--;
+      --Retries;
       QueueURI(Desc);
+      Status = StatIdle;
       return;
    }
-   
-   Item::Failed(Message,Cnf);
+
 }
                                                                        /*}}}*/
 // AcqIndex::Custom600Headers - Insert custom request headers          /*{{{*/
 // ---------------------------------------------------------------------
 /* The only header we use is the last-modified header. */
+#if APT_PKG_ABI >= 413
+string pkgAcqFile::Custom600Headers() const
+#else
 string pkgAcqFile::Custom600Headers()
+#endif
 {
    if (IsIndexFile)
       return "\nIndex-File: true";
index 384c5ee2bd012df8300829a366bdac9edec3a227..1af737e00f07461bc11568f1702863bcc963cb48 100644 (file)
@@ -46,6 +46,8 @@
 class indexRecords;
 class pkgRecords;
 class pkgSourceList;
+class IndexTarget;
+class pkgAcqMetaBase;
 
 /** \brief Represents the process by which a pkgAcquire object should  {{{
  *  retrieve a file or a collection of files.
@@ -61,6 +63,10 @@ class pkgSourceList;
  */
 class pkgAcquire::Item : public WeakPointable
 {  
+   friend class pkgAcqMetaBase;
+
+   void *d;
+
    protected:
    
    /** \brief The acquire object with which this item is associated. */
@@ -71,12 +77,11 @@ class pkgAcquire::Item : public WeakPointable
     *  \param Item Metadata about this item (its URI and
     *  description).
     */
-   inline void QueueURI(ItemDesc &Item)
-                 {Owner->Enqueue(Item);};
+   void QueueURI(ItemDesc &Item);
 
    /** \brief Remove this item from its owner's queue. */
-   inline void Dequeue() {Owner->Dequeue(this);};
-   
+   void Dequeue();
+
    /** \brief Rename a file without modifying its timestamp.
     *
     *  Many item methods call this as their final action.
@@ -86,7 +91,7 @@ class pkgAcquire::Item : public WeakPointable
     *  \param To The new name of \a From.  If \a To exists it will be
     *  overwritten.
     */
-   void Rename(std::string From,std::string To);
+   bool Rename(std::string From,std::string To);
 
    public:
 
@@ -115,7 +120,7 @@ class pkgAcquire::Item : public WeakPointable
        /** \brief The item was could not be downloaded because of 
        *  a transient network error (e.g. network down)
        */
-       StatTransientNetworkError
+       StatTransientNetworkError,
      } Status;
 
    /** \brief Contains a textual description of the error encountered
@@ -132,7 +137,12 @@ class pkgAcquire::Item : public WeakPointable
    /** \brief If not \b NULL, contains the name of a subprocess that
     *  is operating on this object (for instance, "gzip" or "gpgv").
     */
-   const char *Mode;
+   APT_DEPRECATED const char *Mode;
+
+   /** \brief contains the name of the subprocess that is operating on this object
+    * (for instance, "gzip", "rred" or "gpgv"). This is obsoleting #Mode from above
+    * as it can manage the lifetime of included string properly. */
+   std::string ActiveSubprocess;
 
    /** \brief A client-supplied unique identifier.
     * 
@@ -166,12 +176,28 @@ class pkgAcquire::Item : public WeakPointable
     *  \sa pkgAcquire
     */
    unsigned int QueueCounter;
+
+   /** \brief TransactionManager */
+   pkgAcqMetaBase *TransactionManager;
+
+   /** \brief The number of additional fetch items that are expected
+    *  once this item is done.
+    *
+    *  Some items like pkgAcqMeta{Index,Sig} will queue additional
+    *  items. This variable can be set by the methods if it knows
+    *  in advance how many items to expect to get a more accurate
+    *  progress.
+    */
+   unsigned int ExpectedAdditionalItems;
    
    /** \brief The name of the file into which the retrieved object
     *  will be written.
     */
    std::string DestFile;
 
+   /** \brief storge name until a transaction is finished */
+   std::string PartialFile;
+
    /** \brief Invoked by the acquire worker when the object couldn't
     *  be fetched.
     *
@@ -201,12 +227,12 @@ class pkgAcquire::Item : public WeakPointable
     *  \param Message Data from the acquire method.  Use LookupTag()
     *  to parse it.
     *  \param Size The size of the object that was fetched.
-    *  \param Hash The HashSum of the object that was fetched.
+    *  \param Hashes The HashSums of the object that was fetched.
     *  \param Cnf The method via which the object was fetched.
     *
     *  \sa pkgAcqMethod
     */
-   virtual void Done(std::string Message,unsigned long long Size,std::string Hash,
+   virtual void Done(std::string Message, unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
 
    /** \brief Invoked when the worker starts to fetch this object.
@@ -228,7 +254,11 @@ class pkgAcquire::Item : public WeakPointable
     *  line, so they should (if nonempty) have a leading newline and
     *  no trailing newline.
     */
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const {return std::string();};
+#else
    virtual std::string Custom600Headers() {return std::string();};
+#endif
 
    /** \brief A "descriptive" URI-like string.
     *
@@ -244,20 +274,27 @@ class pkgAcquire::Item : public WeakPointable
    /** \brief Invoked by the worker when the download is completely done. */
    virtual void Finished() {};
    
-   /** \brief HashSum 
+   /** \brief HashSums
     *
-    *  \return the HashSum of this object, if applicable; otherwise, an
-    *  empty string.
+    *  \return the HashSums of this object, if applicable; otherwise, an
+    *  empty list.
     */
-   virtual std::string HashSum() {return std::string();};
+   HashStringList HashSums() const {return ExpectedHashes;};
+   std::string HashSum() const {HashStringList const hashes = HashSums(); HashString const * const hs = hashes.find(NULL); return hs != NULL ? hs->toStr() : ""; };
 
    /** \return the acquire process with which this item is associated. */
+   pkgAcquire *GetOwner() const {return Owner;};
+#if APT_PKG_ABI < 413
    pkgAcquire *GetOwner() {return Owner;};
+#endif
 
    /** \return \b true if this object is being fetched from a trusted source. */
+#if APT_PKG_ABI >= 413
+   virtual bool IsTrusted() const {return false;};
+#else
    virtual bool IsTrusted() {return false;};
+#endif
    
-   // report mirror problems
    /** \brief Report mirror problem
     * 
     *  This allows reporting mirror failures back to a centralized
@@ -267,6 +304,11 @@ class pkgAcquire::Item : public WeakPointable
     */
    void ReportMirrorFailure(std::string FailCode);
 
+   /** \brief Set the name of the current active subprocess
+    *
+    *  See also #ActiveSubprocess
+    */
+   void SetActiveSubprocess(const std::string &subprocess);
 
    /** \brief Initialize an item.
     *
@@ -274,12 +316,12 @@ class pkgAcquire::Item : public WeakPointable
     *  process, but does not place it into any fetch queues (you must
     *  manually invoke QueueURI() to do so).
     *
-    *  Initializes all fields of the item other than Owner to 0,
-    *  false, or the empty string.
-    *
     *  \param Owner The new owner of this item.
+    *  \param ExpectedHashes of the file represented by this item
     */
-   Item(pkgAcquire *Owner);
+   Item(pkgAcquire *Owner,
+        HashStringList const &ExpectedHashes=HashStringList(),
+        pkgAcqMetaBase *TransactionManager=NULL);
 
    /** \brief Remove this item from its owner's queue by invoking
     *  pkgAcquire::Remove.
@@ -291,7 +333,10 @@ class pkgAcquire::Item : public WeakPointable
    enum RenameOnErrorState {
       HashSumMismatch,
       SizeMismatch,
-      InvalidFormat
+      InvalidFormat,
+      SignatureError,
+      NotClearsigned,
+      MaximumSizeExceeded
    };
 
    /** \brief Rename failed file and set error
@@ -299,62 +344,321 @@ class pkgAcquire::Item : public WeakPointable
     * \param state respresenting the error we encountered
     */
    bool RenameOnError(RenameOnErrorState const state);
+
+   /** \brief The HashSums of the item is supposed to have than done */
+   HashStringList ExpectedHashes;
+
+   /** \brief The item that is currently being downloaded. */
+   pkgAcquire::ItemDesc Desc;
 };
                                                                        /*}}}*/
 /** \brief Information about an index patch (aka diff). */             /*{{{*/
-struct DiffInfo {
+struct APT_HIDDEN DiffInfo {
    /** The filename of the diff. */
    std::string file;
 
-   /** The sha1 hash of the diff. */
-   std::string sha1;
+   /** The hashes of the diff */
+   HashStringList result_hashes;
+
+   /** The hashes of the file after the diff is applied */
+   HashStringList patch_hashes;
 
-   /** The size of the diff. */
-   unsigned long size;
+   /** The size of the file after the diff is applied */
+   unsigned long long result_size;
+
+   /** The size of the diff itself */
+   unsigned long long patch_size;
 };
                                                                        /*}}}*/
-/** \brief An item that is responsible for fetching a SubIndex         {{{
- *
- *  The MetaIndex file includes only records for important indexes
- *  and records for these SubIndex files so these can carry records
- *  for addition files like PDiffs and Translations
- */
-class pkgAcqSubIndex : public pkgAcquire::Item
+class pkgAcqMetaBase  : public pkgAcquire::Item                                /*{{{*/
 {
+   void *d;
+
  protected:
-   /** \brief If \b true, debugging information will be written to std::clog. */
-   bool Debug;
+   std::vector<Item*> Transaction;
 
-   /** \brief The item that is currently being downloaded. */
-   pkgAcquire::ItemDesc Desc;
+   /** \brief A package-system-specific parser for the meta-index file. */
+   indexRecords *MetaIndexParser;
 
-   /** \brief The Hash that this file should have after download
+   /** \brief The index files which should be looked up in the meta-index
+    *  and then downloaded.
     */
-   HashString ExpectedHash;
+   const std::vector<IndexTarget*>* IndexTargets;
 
- public:
-   // Specialized action members
-   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash,
-                    pkgAcquire::MethodConfig *Cnf);
-   virtual std::string DescURI() {return Desc.URI;};
-   virtual std::string Custom600Headers();
-   virtual bool ParseIndex(std::string const &IndexFile);
+   /** \brief If \b true, the index's signature is currently being verified.
+    */
+   bool AuthPass;
 
-   /** \brief Create a new pkgAcqSubIndex.
+   // required to deal gracefully with problems caused by incorrect ims hits
+   bool IMSHit; 
+
+   /** \brief Starts downloading the individual index files.
     *
-    *  \param Owner The Acquire object that owns this item.
+    *  \param verify If \b true, only indices whose expected hashsum
+    *  can be determined from the meta-index will be downloaded, and
+    *  the hashsums of indices will be checked (reporting
+    *  #StatAuthError if there is a mismatch).  If verify is \b false,
+    *  no hashsum checking will be performed.
+    */
+   void QueueIndexes(bool verify);
+
+   /** \brief Called when a file is finished being retrieved.
     *
-    *  \param URI The URI of the list file to download.
+    *  If the file was not downloaded to DestFile, a copy process is
+    *  set up to copy it to DestFile; otherwise, Complete is set to \b
+    *  true and the file is moved to its final location.
     *
-    *  \param URIDesc A long description of the list file to download.
+    *  \param Message The message block received from the fetch
+    *  subprocess.
+    */
+   bool CheckDownloadDone(const std::string &Message,
+                          const std::string &RealURI);
+
+   /** \brief Queue the downloaded Signature for verification */
+   void QueueForSignatureVerify(const std::string &MetaIndexFile,
+                                const std::string &MetaIndexFileSignature);
+
+   /** \brief get the custom600 header for all pkgAcqMeta */
+   std::string GetCustom600Headers(const std::string &RealURI) const;
+
+   /** \brief Called when authentication succeeded.
     *
-    *  \param ShortDesc A short description of the list file to download.
+    *  Sanity-checks the authenticated file, queues up the individual
+    *  index files for download, and saves the signature in the lists
+    *  directory next to the authenticated list file.
+    *
+    *  \param Message The message block received from the fetch
+    *  subprocess.
+    */
+   bool CheckAuthDone(std::string Message, const std::string &RealURI);
+
+   /** Check if the current item should fail at this point */
+   bool CheckStopAuthentication(const std::string &RealURI,
+                                const std::string &Message);
+
+   /** \brief Check that the release file is a release file for the
+    *  correct distribution.
     *
-    *  \param ExpectedHash The list file's MD5 signature.
+    *  \return \b true if no fatal errors were encountered.
+    */
+   bool VerifyVendor(std::string Message, const std::string &RealURI);
+   
+ public:
+   // transaction code
+   void Add(Item *I);
+   void AbortTransaction();
+   bool TransactionHasError() APT_PURE;
+   void CommitTransaction();
+
+   /** \brief Stage (queue) a copy action when the transaction is committed
+    */
+   void TransactionStageCopy(Item *I,
+                             const std::string &From, 
+                             const std::string &To);
+   /** \brief Stage (queue) a removal action when the transaction is committed
+    */
+   void TransactionStageRemoval(Item *I, const std::string &FinalFile);
+
+   pkgAcqMetaBase(pkgAcquire *Owner,
+                  const std::vector<IndexTarget*>* IndexTargets,
+                  indexRecords* MetaIndexParser,
+                  HashStringList const &ExpectedHashes=HashStringList(),
+                  pkgAcqMetaBase *TransactionManager=NULL)
+      : Item(Owner, ExpectedHashes, TransactionManager),
+        MetaIndexParser(MetaIndexParser), IndexTargets(IndexTargets),
+        AuthPass(false), IMSHit(false) {};
+};
+                                                                       /*}}}*/
+/** \brief An acquire item that downloads the detached signature       {{{
+ *  of a meta-index (Release) file, then queues up the release
+ *  file itself.
+ *
+ *  \todo Why protected members?
+ *
+ *  \sa pkgAcqMetaIndex
+ */
+class APT_HIDDEN pkgAcqMetaSig : public pkgAcqMetaBase
+{
+   void *d;
+
+   protected:
+
+   /** \brief The URI of the signature file.  Unlike Desc.URI, this is
+    *  never modified; it is used to determine the file that is being
+    *  downloaded.
+    */
+   std::string RealURI;
+
+   /** \brief The file we need to verify */
+   std::string MetaIndexFile;
+
+   /** \brief The file we use to verify the MetaIndexFile with */
+   std::string MetaIndexFileSignature;
+
+   /** \brief Long URI description used in the acquire system */
+   std::string URIDesc;
+
+   /** \brief Short URI description used in the acquire system */
+   std::string ShortDesc;
+
+   public:
+   
+   // Specialized action members
+   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
+   virtual void Done(std::string Message,unsigned long long Size,
+                     HashStringList const &Hashes,
+                    pkgAcquire::MethodConfig *Cnf);
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
+   virtual std::string DescURI() {return RealURI; };
+
+   /** \brief Create a new pkgAcqMetaSig. */
+   pkgAcqMetaSig(pkgAcquire *Owner,
+                 pkgAcqMetaBase *TransactionManager,
+                 std::string URI,std::string URIDesc, std::string ShortDesc,
+                 std::string MetaIndexFile,
+                const std::vector<IndexTarget*>* IndexTargets,
+                indexRecords* MetaIndexParser);
+   virtual ~pkgAcqMetaSig();
+};
+                                                                       /*}}}*/
+/** \brief An item that is responsible for downloading the meta-index  {{{
+ *  file (i.e., Release) itself and verifying its signature.
+ *
+ *  Once the download and verification are complete, the downloads of
+ *  the individual index files are queued up using pkgAcqDiffIndex.
+ *  If the meta-index file had a valid signature, the expected hashsums
+ *  of the index files will be the md5sums listed in the meta-index;
+ *  otherwise, the expected hashsums will be "" (causing the
+ *  authentication of the index files to be bypassed).
+ */
+class APT_HIDDEN pkgAcqMetaIndex : public pkgAcqMetaBase
+{
+   void *d;
+
+   protected:
+   /** \brief The URI that is actually being downloaded; never
+    *  modified by pkgAcqMetaIndex.
     */
-   pkgAcqSubIndex(pkgAcquire *Owner, std::string const &URI,std::string const &URIDesc,
-                  std::string const &ShortDesc, HashString const &ExpectedHash);
+   std::string RealURI;
+
+   std::string URIDesc;
+   std::string ShortDesc;
+
+   /** \brief The URI of the meta-index file for the detached signature */
+   std::string MetaIndexSigURI;
+
+   /** \brief A "URI-style" description of the meta-index file */
+   std::string MetaIndexSigURIDesc;
+
+   /** \brief A brief description of the meta-index file */
+   std::string MetaIndexSigShortDesc;
+
+   /** \brief delayed constructor */
+   void Init(std::string URIDesc, std::string ShortDesc);
+   
+   public:
+
+   // Specialized action members
+   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
+   virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
+                    pkgAcquire::MethodConfig *Cnf);
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
+   virtual std::string DescURI() {return RealURI; };
+   virtual void Finished();
+
+   /** \brief Create a new pkgAcqMetaIndex. */
+   pkgAcqMetaIndex(pkgAcquire *Owner,
+                   pkgAcqMetaBase *TransactionManager,
+                  std::string URI,std::string URIDesc, std::string ShortDesc,
+                   std::string MetaIndexSigURI, std::string MetaIndexSigURIDesc, std::string MetaIndexSigShortDesc,
+                  const std::vector<IndexTarget*>* IndexTargets,
+                  indexRecords* MetaIndexParser);
+};
+                                                                       /*}}}*/
+/** \brief An item repsonsible for downloading clearsigned metaindexes {{{*/
+class APT_HIDDEN pkgAcqMetaClearSig : public pkgAcqMetaIndex
+{
+   void *d;
+
+   /** \brief The URI of the meta-index file for the detached signature */
+   std::string MetaIndexURI;
+
+   /** \brief A "URI-style" description of the meta-index file */
+   std::string MetaIndexURIDesc;
+
+   /** \brief A brief description of the meta-index file */
+   std::string MetaIndexShortDesc;
+
+   /** \brief The URI of the detached meta-signature file if the clearsigned one failed. */
+   std::string MetaSigURI;
+
+   /** \brief A "URI-style" description of the meta-signature file */
+   std::string MetaSigURIDesc;
+
+   /** \brief A brief description of the meta-signature file */
+   std::string MetaSigShortDesc;
+
+public:
+   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
+   virtual std::string Custom600Headers();
+#endif
+   virtual void Done(std::string Message,unsigned long long Size,
+                     HashStringList const &Hashes,
+                    pkgAcquire::MethodConfig *Cnf);
+
+   /** \brief Create a new pkgAcqMetaClearSig. */
+   pkgAcqMetaClearSig(pkgAcquire *Owner,
+               std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc,
+               std::string const &MetaIndexURI, std::string const &MetaIndexURIDesc, std::string const &MetaIndexShortDesc,
+               std::string const &MetaSigURI, std::string const &MetaSigURIDesc, std::string const &MetaSigShortDesc,
+               const std::vector<IndexTarget*>* IndexTargets,
+               indexRecords* MetaIndexParser);
+   virtual ~pkgAcqMetaClearSig();
+};
+                                                                       /*}}}*/
+/** \brief Common base class for all classes that deal with fetching   {{{
+           indexes
+ */
+class pkgAcqBaseIndex : public pkgAcquire::Item
+{
+   void *d;
+
+ protected:
+   /** \brief Pointer to the IndexTarget data
+    */
+   const struct IndexTarget * Target;
+
+   /** \brief Pointer to the indexRecords parser */
+   indexRecords *MetaIndexParser;
+
+   /** \brief The MetaIndex Key */
+   std::string MetaKey;
+
+   /** \brief The URI of the index file to recreate at our end (either
+    *  by downloading it or by applying partial patches).
+    */
+   std::string RealURI;
+
+   bool VerifyHashByMetaKey(HashStringList const &Hashes);
+
+   pkgAcqBaseIndex(pkgAcquire *Owner,
+                   pkgAcqMetaBase *TransactionManager,
+                   struct IndexTarget const * const Target,
+                   HashStringList const &ExpectedHashes,
+                   indexRecords *MetaIndexParser)
+      : Item(Owner, ExpectedHashes, TransactionManager), Target(Target), 
+        MetaIndexParser(MetaIndexParser) {};
 };
                                                                        /*}}}*/
 /** \brief An item that is responsible for fetching an index file of   {{{
@@ -366,25 +670,14 @@ class pkgAcqSubIndex : public pkgAcquire::Item
  *
  *  \sa pkgAcqIndexDiffs, pkgAcqIndex
  */
-class pkgAcqDiffIndex : public pkgAcquire::Item
+class APT_HIDDEN pkgAcqDiffIndex : public pkgAcqBaseIndex
 {
+   void *d;
+
  protected:
    /** \brief If \b true, debugging information will be written to std::clog. */
    bool Debug;
 
-   /** \brief The item that is currently being downloaded. */
-   pkgAcquire::ItemDesc Desc;
-
-   /** \brief The URI of the index file to recreate at our end (either
-    *  by downloading it or by applying partial patches).
-    */
-   std::string RealURI;
-
-   /** \brief The Hash that the real index file should have after
-    *  all patches have been applied.
-    */
-   HashString ExpectedHash;
-
    /** \brief The index file which will be patched to generate the new
     *  file.
     */
@@ -395,13 +688,21 @@ class pkgAcqDiffIndex : public pkgAcquire::Item
     */
    std::string Description;
 
+   /** \brief If the copy step of the packages file is done
+    */
+   bool PackagesFileReadyInPartial;
+
  public:
    // Specialized action members
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash,
+   virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return RealURI + "Index";};
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
    virtual std::string Custom600Headers();
+#endif
 
    /** \brief Parse the Index file for a set of Packages diffs.
     *
@@ -426,10 +727,13 @@ class pkgAcqDiffIndex : public pkgAcquire::Item
     *
     *  \param ShortDesc A short description of the list file to download.
     *
-    *  \param ExpectedHash The list file's MD5 signature.
+    *  \param ExpectedHashes The list file's hashsums which are expected.
     */
-   pkgAcqDiffIndex(pkgAcquire *Owner,std::string URI,std::string URIDesc,
-                  std::string ShortDesc, HashString ExpectedHash);
+   pkgAcqDiffIndex(pkgAcquire *Owner,
+                   pkgAcqMetaBase *TransactionManager,
+                   struct IndexTarget const * const Target,
+                   HashStringList const &ExpectedHashes,
+                   indexRecords *MetaIndexParser);
 };
                                                                        /*}}}*/
 /** \brief An item that is responsible for fetching client-merge patches {{{
@@ -443,8 +747,10 @@ class pkgAcqDiffIndex : public pkgAcquire::Item
  *
  *  \sa pkgAcqDiffIndex, pkgAcqIndex
  */
-class pkgAcqIndexMergeDiffs : public pkgAcquire::Item
+class APT_HIDDEN pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex
 {
+   void *d;
+
    protected:
 
    /** \brief If \b true, debugging output will be written to
@@ -452,21 +758,6 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item
     */
    bool Debug;
 
-   /** \brief description of the item that is currently being
-    *  downloaded.
-    */
-   pkgAcquire::ItemDesc Desc;
-
-   /** \brief URI of the package index file that is being
-    *  reconstructed.
-    */
-   std::string RealURI;
-
-   /** \brief HashSum of the package index file that is being
-    *  reconstructed.
-    */
-   HashString ExpectedHash;
-
    /** \brief description of the file being downloaded. */
    std::string Description;
 
@@ -499,9 +790,8 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item
     *  outright; its arguments are ignored.
     */
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-
-   virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash,
-                    pkgAcquire::MethodConfig *Cnf);
+   virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
+        pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return RealURI + "Index";};
 
    /** \brief Create an index merge-diff item.
@@ -515,7 +805,7 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item
     *
     *  \param ShortDesc A brief description of this item.
     *
-    *  \param ExpectedHash The expected md5sum of the completely
+    *  \param ExpectedHashes The expected md5sum of the completely
     *  reconstructed package index file; the index file will be tested
     *  against this value when it is entirely reconstructed.
     *
@@ -525,9 +815,13 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item
     *  \param allPatches contains all related items so that each item can
     *  check if it was the last one to complete the download step
     */
-   pkgAcqIndexMergeDiffs(pkgAcquire *Owner,std::string const &URI,std::string const &URIDesc,
-                   std::string const &ShortDesc, HashString const &ExpectedHash,
-                   DiffInfo const &patch, std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches);
+   pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
+                         pkgAcqMetaBase *TransactionManager,
+                         struct IndexTarget const * const Target,
+                         HashStringList const &ExpectedHash,
+                         indexRecords *MetaIndexParser,
+                         DiffInfo const &patch, 
+                         std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches);
 };
                                                                        /*}}}*/
 /** \brief An item that is responsible for fetching server-merge patches {{{
@@ -541,8 +835,10 @@ class pkgAcqIndexMergeDiffs : public pkgAcquire::Item
  *
  *  \sa pkgAcqDiffIndex, pkgAcqIndex
  */
-class pkgAcqIndexDiffs : public pkgAcquire::Item
+class APT_HIDDEN pkgAcqIndexDiffs : public pkgAcqBaseIndex
 {
+   void *d;
+
    private:
 
    /** \brief Queue up the next diff download.
@@ -554,20 +850,20 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item
     *  \return \b true if an applicable diff was found, \b false
     *  otherwise.
     */
-   bool QueueNextDiff();
+   APT_HIDDEN bool QueueNextDiff();
 
    /** \brief Handle tasks that must be performed after the item
     *  finishes downloading.
     *
-    *  Dequeues the item and checks the resulting file's md5sum
-    *  against ExpectedHash after the last patch was applied.
+    *  Dequeues the item and checks the resulting file's hashsums
+    *  against ExpectedHashes after the last patch was applied.
     *  There is no need to check the md5/sha1 after a "normal" 
     *  patch because QueueNextDiff() will check the sha1 later.
     *
     *  \param allDone If \b true, the file was entirely reconstructed,
     *  and its md5sum is verified. 
     */
-   void Finish(bool allDone=false);
+   APT_HIDDEN void Finish(bool allDone=false);
 
    protected:
 
@@ -576,21 +872,6 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item
     */
    bool Debug;
 
-   /** \brief A description of the item that is currently being
-    *  downloaded.
-    */
-   pkgAcquire::ItemDesc Desc;
-
-   /** \brief The URI of the package index file that is being
-    *  reconstructed.
-    */
-   std::string RealURI;
-
-   /** \brief The HashSum of the package index file that is being
-    *  reconstructed.
-    */
-   HashString ExpectedHash;
-
    /** A description of the file being downloaded. */
    std::string Description;
 
@@ -604,9 +885,6 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item
     */
    std::vector<DiffInfo> available_patches;
 
-   /** Stop applying patches when reaching that sha1 */
-   std::string ServerSha1;
-
    /** The current status of this patch. */
    enum DiffState
      {
@@ -632,9 +910,9 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item
     */
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
 
-   virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash,
+   virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
-   virtual std::string DescURI() {return RealURI + "Index";};
+   virtual std::string DescURI() {return RealURI + "IndexDiffs";};
 
    /** \brief Create an index diff item.
     *
@@ -650,19 +928,19 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item
     *
     *  \param ShortDesc A brief description of this item.
     *
-    *  \param ExpectedHash The expected md5sum of the completely
+    *  \param ExpectedHashes The expected hashsums of the completely
     *  reconstructed package index file; the index file will be tested
     *  against this value when it is entirely reconstructed.
     *
-    *  \param ServerSha1 is the sha1sum of the current file on the server
-    *
     *  \param diffs The remaining diffs from the index of diffs.  They
     *  should be ordered so that each diff appears before any diff
     *  that depends on it.
     */
-   pkgAcqIndexDiffs(pkgAcquire *Owner,std::string URI,std::string URIDesc,
-                   std::string ShortDesc, HashString ExpectedHash,
-                   std::string ServerSha1,
+   pkgAcqIndexDiffs(pkgAcquire *Owner,
+                    pkgAcqMetaBase *TransactionManager,
+                    struct IndexTarget const * const Target,
+                    HashStringList const &ExpectedHash,
+                    indexRecords *MetaIndexParser,
                    std::vector<DiffInfo> diffs=std::vector<DiffInfo>());
 };
                                                                        /*}}}*/
@@ -673,56 +951,77 @@ class pkgAcqIndexDiffs : public pkgAcquire::Item
  *
  *  \todo Why does pkgAcqIndex have protected members?
  */
-class pkgAcqIndex : public pkgAcquire::Item
+class APT_HIDDEN pkgAcqIndex : public pkgAcqBaseIndex
 {
-   protected:
+   void *d;
 
-   /** \brief If \b true, the index file has been decompressed. */
-   bool Decompression;
+   protected:
 
-   /** \brief If \b true, the partially downloaded file will be
-    *  removed when the download completes.
+   /** \brief The stages the method goes through
+    *
+    *  The method first downloads the indexfile, then its decompressed (or
+    *  copied) and verified
     */
-   bool Erase;
+   enum AllStages {
+      STAGE_DOWNLOAD,
+      STAGE_DECOMPRESS_AND_VERIFY,
+   };
+   AllStages Stage;
 
-   // Unused, used to be used to verify that "Packages: " header was there
-   bool __DELME_ON_NEXT_ABI_BREAK_Verify;
+   /** \brief Handle what needs to be done when the download is done */
+   void StageDownloadDone(std::string Message,
+                          HashStringList const &Hashes,
+                          pkgAcquire::MethodConfig *Cfg);
 
-   /** \brief The download request that is currently being
-    *   processed.
+   /** \brief Handle what needs to be done when the decompression/copy is
+    *         done 
     */
-   pkgAcquire::ItemDesc Desc;
+   void StageDecompressDone(std::string Message,
+                            HashStringList const &Hashes,
+                            pkgAcquire::MethodConfig *Cfg);
 
-   /** \brief The object that is actually being fetched (minus any
-    *  compression-related extensions).
+   /** \brief If \b set, this partially downloaded file will be
+    *  removed when the download completes.
     */
-   std::string RealURI;
-
-   /** \brief The expected hashsum of the decompressed index file. */
-   HashString ExpectedHash;
+   std::string EraseFileName;
 
    /** \brief The compression-related file extensions that are being
     *  added to the downloaded file one by one if first fails (e.g., "gz bz2").
     */
-   std::string CompressionExtension;
+   std::string CompressionExtensions;
+
+   /** \brief The actual compression extension currently used */
+   std::string CurrentCompressionExtension;
 
-   /** \brief Get the full pathname of the final file for the given URI
+   /** \brief Do the changes needed to fetch via AptByHash (if needed) */
+   void InitByHashIfNeeded(const std::string MetaKey);
+
+   /** \brief Auto select the right compression to use */
+   void AutoSelectCompression();
+
+   /** \brief Get the full pathname of the final file for the current URI
     */
-   std::string GetFinalFilename(std::string const &URI,
-                                std::string const &compExt);
+   std::string GetFinalFilename() const;
 
    /** \brief Schedule file for verification after a IMS hit */
-   void ReverifyAfterIMS(std::string const &FileName);
+   void ReverifyAfterIMS();
+
+   /** \brief Validate the downloaded index file */
+   bool ValidateFile(const std::string &FileName);
 
    public:
    
    // Specialized action members
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash,
+   virtual void Done(std::string Message,unsigned long long Size, 
+                     HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
    virtual std::string Custom600Headers();
+#endif
    virtual std::string DescURI() {return Desc.URI;};
-   virtual std::string HashSum() {return ExpectedHash.toStr(); };
 
    /** \brief Create a pkgAcqIndex.
     *
@@ -735,7 +1034,7 @@ class pkgAcqIndex : public pkgAcquire::Item
     *
     *  \param ShortDesc A brief description of this index file.
     *
-    *  \param ExpectedHash The expected hashsum of this index file.
+    *  \param ExpectedHashes The expected hashsum of this index file.
     *
     *  \param compressExt The compression-related extension with which
     *  this index file should be downloaded, or "" to autodetect
@@ -744,47 +1043,21 @@ class pkgAcqIndex : public pkgAcquire::Item
     *  fallback is ".gz" or none.
     */
    pkgAcqIndex(pkgAcquire *Owner,std::string URI,std::string URIDesc,
-              std::string ShortDesc, HashString ExpectedHash, 
-              std::string compressExt="");
-   pkgAcqIndex(pkgAcquire *Owner, struct IndexTarget const * const Target,
-                        HashString const &ExpectedHash, indexRecords const *MetaIndexParser);
-   void Init(std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc);
-};
-                                                                       /*}}}*/
-/** \brief An acquire item that is responsible for fetching a          {{{
- *  translated index file.
- *
- *  The only difference from pkgAcqIndex is that transient failures
- *  are suppressed: no error occurs if the translated index file is
- *  missing.
- */
-class pkgAcqIndexTrans : public pkgAcqIndex
-{
-   public:
-  
-   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers();
-
-   /** \brief Create a pkgAcqIndexTrans.
-    *
-    *  \param Owner The pkgAcquire object with which this item is
-    *  associated.
-    *
-    *  \param URI The URI of the index file that is to be downloaded.
-    *
-    *  \param URIDesc A "URI-style" description of this index file.
-    *
-    *  \param ShortDesc A brief description of this index file.
-    */
-   pkgAcqIndexTrans(pkgAcquire *Owner,std::string URI,std::string URIDesc,
-                   std::string ShortDesc);
-   pkgAcqIndexTrans(pkgAcquire *Owner, struct IndexTarget const * const Target,
-                   HashString const &ExpectedHash, indexRecords const *MetaIndexParser);
+              std::string ShortDesc, HashStringList const &ExpectedHashes);
+   pkgAcqIndex(pkgAcquire *Owner, pkgAcqMetaBase *TransactionManager,
+               IndexTarget const * const Target,
+               HashStringList const &ExpectedHash,
+               indexRecords *MetaIndexParser);
+               
+   void Init(std::string const &URI, std::string const &URIDesc,
+             std::string const &ShortDesc);
 };
                                                                        /*}}}*/
 /** \brief Information about an index file. */                         /*{{{*/
-class IndexTarget
+class APT_HIDDEN IndexTarget
 {
+   void *d;
+
  public:
    /** \brief A URI from which the index file can be downloaded. */
    std::string URI;
@@ -803,230 +1076,18 @@ class IndexTarget
    virtual bool IsOptional() const {
       return false;
    }
-   virtual bool IsSubIndex() const {
-      return false;
-   }
 };
                                                                        /*}}}*/
 /** \brief Information about an optional index file. */                        /*{{{*/
-class OptionalIndexTarget : public IndexTarget
+class APT_HIDDEN OptionalIndexTarget : public IndexTarget
 {
+   void *d;
+
    virtual bool IsOptional() const {
       return true;
    }
 };
                                                                        /*}}}*/
-/** \brief Information about an subindex index file. */                        /*{{{*/
-class SubIndexTarget : public IndexTarget
-{
-   virtual bool IsSubIndex() const {
-      return true;
-   }
-};
-                                                                       /*}}}*/
-/** \brief Information about an subindex index file. */                        /*{{{*/
-class OptionalSubIndexTarget : public OptionalIndexTarget
-{
-   virtual bool IsSubIndex() const {
-      return true;
-   }
-};
-                                                                       /*}}}*/
-
-/** \brief An acquire item that downloads the detached signature       {{{
- *  of a meta-index (Release) file, then queues up the release
- *  file itself.
- *
- *  \todo Why protected members?
- *
- *  \sa pkgAcqMetaIndex
- */
-class pkgAcqMetaSig : public pkgAcquire::Item
-{
-   protected:
-   /** \brief The last good signature file */
-   std::string LastGoodSig;
-
-   /** \brief The fetch request that is currently being processed. */
-   pkgAcquire::ItemDesc Desc;
-
-   /** \brief The URI of the signature file.  Unlike Desc.URI, this is
-    *  never modified; it is used to determine the file that is being
-    *  downloaded.
-    */
-   std::string RealURI;
-
-   /** \brief The URI of the meta-index file to be fetched after the signature. */
-   std::string MetaIndexURI;
-
-   /** \brief A "URI-style" description of the meta-index file to be
-    *  fetched after the signature.
-    */
-   std::string MetaIndexURIDesc;
-
-   /** \brief A brief description of the meta-index file to be fetched
-    *  after the signature.
-    */
-   std::string MetaIndexShortDesc;
-
-   /** \brief A package-system-specific parser for the meta-index file. */
-   indexRecords* MetaIndexParser;
-
-   /** \brief The index files which should be looked up in the meta-index
-    *  and then downloaded.
-    *
-    *  \todo Why a list of pointers instead of a list of structs?
-    */
-   const std::vector<struct IndexTarget*>* IndexTargets;
-
-   public:
-   
-   // Specialized action members
-   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size,std::string Md5Hash,
-                    pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers();
-   virtual std::string DescURI() {return RealURI; };
-
-   /** \brief Create a new pkgAcqMetaSig. */
-   pkgAcqMetaSig(pkgAcquire *Owner,std::string URI,std::string URIDesc, std::string ShortDesc,
-                std::string MetaIndexURI, std::string MetaIndexURIDesc, std::string MetaIndexShortDesc,
-                const std::vector<struct IndexTarget*>* IndexTargets,
-                indexRecords* MetaIndexParser);
-   virtual ~pkgAcqMetaSig();
-};
-                                                                       /*}}}*/
-/** \brief An item that is responsible for downloading the meta-index  {{{
- *  file (i.e., Release) itself and verifying its signature.
- *
- *  Once the download and verification are complete, the downloads of
- *  the individual index files are queued up using pkgAcqDiffIndex.
- *  If the meta-index file had a valid signature, the expected hashsums
- *  of the index files will be the md5sums listed in the meta-index;
- *  otherwise, the expected hashsums will be "" (causing the
- *  authentication of the index files to be bypassed).
- */
-class pkgAcqMetaIndex : public pkgAcquire::Item
-{
-   protected:
-   /** \brief The fetch command that is currently being processed. */
-   pkgAcquire::ItemDesc Desc;
-
-   /** \brief The URI that is actually being downloaded; never
-    *  modified by pkgAcqMetaIndex.
-    */
-   std::string RealURI;
-
-   /** \brief The file in which the signature for this index was stored.
-    *
-    *  If empty, the signature and the md5sums of the individual
-    *  indices will not be checked.
-    */
-   std::string SigFile;
-
-   /** \brief The index files to download. */
-   const std::vector<struct IndexTarget*>* IndexTargets;
-
-   /** \brief The parser for the meta-index file. */
-   indexRecords* MetaIndexParser;
-
-   /** \brief If \b true, the index's signature is currently being verified.
-    */
-   bool AuthPass;
-   // required to deal gracefully with problems caused by incorrect ims hits
-   bool IMSHit; 
-
-   /** \brief Check that the release file is a release file for the
-    *  correct distribution.
-    *
-    *  \return \b true if no fatal errors were encountered.
-    */
-   bool VerifyVendor(std::string Message);
-
-   /** \brief Called when a file is finished being retrieved.
-    *
-    *  If the file was not downloaded to DestFile, a copy process is
-    *  set up to copy it to DestFile; otherwise, Complete is set to \b
-    *  true and the file is moved to its final location.
-    *
-    *  \param Message The message block received from the fetch
-    *  subprocess.
-    */
-   void RetrievalDone(std::string Message);
-
-   /** \brief Called when authentication succeeded.
-    *
-    *  Sanity-checks the authenticated file, queues up the individual
-    *  index files for download, and saves the signature in the lists
-    *  directory next to the authenticated list file.
-    *
-    *  \param Message The message block received from the fetch
-    *  subprocess.
-    */
-   void AuthDone(std::string Message);
-
-   /** \brief Starts downloading the individual index files.
-    *
-    *  \param verify If \b true, only indices whose expected hashsum
-    *  can be determined from the meta-index will be downloaded, and
-    *  the hashsums of indices will be checked (reporting
-    *  #StatAuthError if there is a mismatch).  If verify is \b false,
-    *  no hashsum checking will be performed.
-    */
-   void QueueIndexes(bool verify);
-   
-   public:
-   
-   // Specialized action members
-   virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size, std::string Hash,
-                    pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers();
-   virtual std::string DescURI() {return RealURI; };
-
-   /** \brief Create a new pkgAcqMetaIndex. */
-   pkgAcqMetaIndex(pkgAcquire *Owner,
-                  std::string URI,std::string URIDesc, std::string ShortDesc,
-                  std::string SigFile,
-                  const std::vector<struct IndexTarget*>* IndexTargets,
-                  indexRecords* MetaIndexParser);
-};
-                                                                       /*}}}*/
-/** \brief An item repsonsible for downloading clearsigned metaindexes {{{*/
-class pkgAcqMetaClearSig : public pkgAcqMetaIndex
-{
-   /** \brief The URI of the meta-index file for the detached signature */
-   std::string MetaIndexURI;
-
-   /** \brief A "URI-style" description of the meta-index file */
-   std::string MetaIndexURIDesc;
-
-   /** \brief A brief description of the meta-index file */
-   std::string MetaIndexShortDesc;
-
-   /** \brief The URI of the detached meta-signature file if the clearsigned one failed. */
-   std::string MetaSigURI;
-
-   /** \brief A "URI-style" description of the meta-signature file */
-   std::string MetaSigURIDesc;
-
-   /** \brief A brief description of the meta-signature file */
-   std::string MetaSigShortDesc;
-
-public:
-   void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual std::string Custom600Headers();
-
-   /** \brief Create a new pkgAcqMetaClearSig. */
-   pkgAcqMetaClearSig(pkgAcquire *Owner,
-               std::string const &URI, std::string const &URIDesc, std::string const &ShortDesc,
-               std::string const &MetaIndexURI, std::string const &MetaIndexURIDesc, std::string const &MetaIndexShortDesc,
-               std::string const &MetaSigURI, std::string const &MetaSigURIDesc, std::string const &MetaSigShortDesc,
-               const std::vector<struct IndexTarget*>* IndexTargets,
-               indexRecords* MetaIndexParser);
-   virtual ~pkgAcqMetaClearSig();
-};
-                                                                       /*}}}*/
 /** \brief An item that is responsible for fetching a package file.    {{{
  *
  *  If the package file already exists in the cache, nothing will be
@@ -1034,13 +1095,12 @@ public:
  */
 class pkgAcqArchive : public pkgAcquire::Item
 {
+   void *d;
+
    protected:
    /** \brief The package version being fetched. */
    pkgCache::VerIterator Version;
 
-   /** \brief The fetch command that is currently being processed. */
-   pkgAcquire::ItemDesc Desc;
-
    /** \brief The list of sources from which to pick archives to
     *  download this package from.
     */
@@ -1051,9 +1111,6 @@ class pkgAcqArchive : public pkgAcquire::Item
     */
    pkgRecords *Recs;
 
-   /** \brief The hashsum of this package. */
-   HashString ExpectedHash;
-
    /** \brief A location in which the actual filename of the package
     *  should be stored.
     */
@@ -1080,14 +1137,17 @@ class pkgAcqArchive : public pkgAcquire::Item
    public:
    
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size,std::string Hash,
+   virtual void Done(std::string Message,unsigned long long Size, HashStringList const &Hashes,
                     pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return Desc.URI;};
    virtual std::string ShortDesc() {return Desc.ShortDesc;};
    virtual void Finished();
-   virtual std::string HashSum() {return ExpectedHash.toStr(); };
+#if APT_PKG_ABI >= 413
+   virtual bool IsTrusted() const;
+#else
    virtual bool IsTrusted();
-   
+#endif
+
    /** \brief Create a new pkgAcqArchive.
     *
     *  \param Owner The pkgAcquire object with which this item is
@@ -1119,11 +1179,7 @@ class pkgAcqArchive : public pkgAcquire::Item
  */
 class pkgAcqFile : public pkgAcquire::Item
 {
-   /** \brief The currently active download process. */
-   pkgAcquire::ItemDesc Desc;
-
-   /** \brief The hashsum of the file to download, if it is known. */
-   HashString ExpectedHash;
+   void *d;
 
    /** \brief How many times to retry the download, set from
     *  Acquire::Retries.
@@ -1137,11 +1193,14 @@ class pkgAcqFile : public pkgAcquire::Item
    
    // Specialized action members
    virtual void Failed(std::string Message,pkgAcquire::MethodConfig *Cnf);
-   virtual void Done(std::string Message,unsigned long long Size,std::string CalcHash,
+   virtual void Done(std::string Message,unsigned long long Size, HashStringList const &CalcHashes,
                     pkgAcquire::MethodConfig *Cnf);
    virtual std::string DescURI() {return Desc.URI;};
-   virtual std::string HashSum() {return ExpectedHash.toStr(); };
+#if APT_PKG_ABI >= 413
+   virtual std::string Custom600Headers() const;
+#else
    virtual std::string Custom600Headers();
+#endif
 
    /** \brief Create a new pkgAcqFile object.
     *
@@ -1150,8 +1209,8 @@ class pkgAcqFile : public pkgAcquire::Item
     *
     *  \param URI The URI to download.
     *
-    *  \param Hash The hashsum of the file to download, if it is known;
-    *  otherwise "".
+    *  \param Hashes The hashsums of the file to download, if they are known;
+    *  otherwise empty list.
     *
     *  \param Size The size of the file to download, if it is known;
     *  otherwise 0.
@@ -1174,7 +1233,7 @@ class pkgAcqFile : public pkgAcquire::Item
     * is the absolute name to which the file should be downloaded.
     */
 
-   pkgAcqFile(pkgAcquire *Owner, std::string URI, std::string Hash, unsigned long long Size,
+   pkgAcqFile(pkgAcquire *Owner, std::string URI, HashStringList const &Hashes, unsigned long long Size,
              std::string Desc, std::string ShortDesc,
              const std::string &DestDir="", const std::string &DestFilename="",
              bool IsIndexFile=false);
index 746c553f1cc3cbea8d4518b7e8bca556b3eac825..c29ef469e18eb16d9e7d1c68187918819acaf6b2 100644 (file)
@@ -102,7 +102,10 @@ void pkgAcqMethod::Fail(string Err,bool Transient)
    if (Queue != 0)
    {
       std::cout << "400 URI Failure\nURI: " << Queue->Uri << "\n"
-               << "Message: " << Err << " " << IP << "\n";
+               << "Message: " << Err;
+      if (IP.empty() == false && _config->FindB("Acquire::Failure::ShowIP", true) == true)
+        std::cout << " " << IP;
+      std::cout << "\n";
       Dequeue();
    }
    else
@@ -118,6 +121,18 @@ void pkgAcqMethod::Fail(string Err,bool Transient)
 
    std::cout << "\n" << std::flush;
 }
+                                                                       /*}}}*/
+// AcqMethod::DropPrivsOrDie - Drop privileges or die          /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void pkgAcqMethod::DropPrivsOrDie()
+{
+   if (!DropPrivileges()) {
+      Fail(false);
+      exit(112);       /* call the european emergency number */
+   }
+}
+
                                                                        /*}}}*/
 // AcqMethod::URIStart - Indicate a download is starting               /*{{{*/
 // ---------------------------------------------------------------------
@@ -147,6 +162,16 @@ void pkgAcqMethod::URIStart(FetchResult &Res)
 // AcqMethod::URIDone - A URI is finished                              /*{{{*/
 // ---------------------------------------------------------------------
 /* */
+static void printHashStringList(HashStringList const * const list)
+{
+      for (HashStringList::const_iterator hash = list->begin(); hash != list->end(); ++hash)
+      {
+        // very old compatibility name for MD5Sum
+        if (hash->HashType() == "MD5Sum")
+           std::cout << "MD5-Hash: " << hash->HashValue() << "\n";
+        std::cout << hash->HashType() << "-Hash: " << hash->HashValue() << "\n";
+      }
+}
 void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
 {
    if (Queue == 0)
@@ -164,15 +189,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
    if (Res.LastModified != 0)
       std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
 
-   if (Res.MD5Sum.empty() == false)
-      std::cout << "MD5-Hash: " << Res.MD5Sum << "\n"
-               << "MD5Sum-Hash: " << Res.MD5Sum << "\n";
-   if (Res.SHA1Sum.empty() == false)
-      std::cout << "SHA1-Hash: " << Res.SHA1Sum << "\n";
-   if (Res.SHA256Sum.empty() == false)
-      std::cout << "SHA256-Hash: " << Res.SHA256Sum << "\n";
-   if (Res.SHA512Sum.empty() == false)
-      std::cout << "SHA512-Hash: " << Res.SHA512Sum << "\n";
+   printHashStringList(&Res.Hashes);
+
    if (UsedMirror.empty() == false)
       std::cout << "UsedMirror: " << UsedMirror << "\n";
    if (Res.GPGVOutput.empty() == false)
@@ -200,15 +218,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
       if (Alt->LastModified != 0)
         std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n";
 
-      if (Alt->MD5Sum.empty() == false)
-        std::cout << "Alt-MD5-Hash: " << Alt->MD5Sum << "\n";
-      if (Alt->SHA1Sum.empty() == false)
-        std::cout << "Alt-SHA1-Hash: " << Alt->SHA1Sum << "\n";
-      if (Alt->SHA256Sum.empty() == false)
-        std::cout << "Alt-SHA256-Hash: " << Alt->SHA256Sum << "\n";
-      if (Alt->SHA512Sum.empty() == false)
-         std::cout << "Alt-SHA512-Hash: " << Alt->SHA512Sum << "\n";
-     
+      printHashStringList(&Alt->Hashes);
+
       if (Alt->IMSHit == true)
         std::cout << "Alt-IMS-Hit: true\n";
    }
@@ -355,6 +366,17 @@ int pkgAcqMethod::Run(bool Single)
               Tmp->LastModified = 0;
            Tmp->IndexFile = StringToBool(LookupTag(Message,"Index-File"),false);
            Tmp->FailIgnore = StringToBool(LookupTag(Message,"Fail-Ignore"),false);
+           Tmp->ExpectedHashes = HashStringList();
+           for (char const * const * t = HashString::SupportedHashes(); *t != NULL; ++t)
+           {
+              std::string tag = "Expected-";
+              tag.append(*t);
+              std::string const hash = LookupTag(Message, tag.c_str());
+              if (hash.empty() == false)
+                 Tmp->ExpectedHashes.push_back(HashString(*t, hash));
+           }
+            char *End;
+            Tmp->MaximumSize = strtoll(LookupTag(Message, "Maximum-Size", "0").c_str(), &End, 10);
            Tmp->Next = 0;
            
            // Append it to the list
@@ -442,12 +464,9 @@ pkgAcqMethod::FetchResult::FetchResult() : LastModified(0),
 // ---------------------------------------------------------------------
 /* This hides the number of hashes we are supporting from the caller. 
    It just deals with the hash class. */
-void pkgAcqMethod::FetchResult::TakeHashes(Hashes &Hash)
+void pkgAcqMethod::FetchResult::TakeHashes(class Hashes &Hash)
 {
-   MD5Sum = Hash.MD5.Result();
-   SHA1Sum = Hash.SHA1.Result();
-   SHA256Sum = Hash.SHA256.Result();
-   SHA512Sum = Hash.SHA512.Result();
+   Hashes = Hash.GetHashStringList();
 }
                                                                        /*}}}*/
 void pkgAcqMethod::Dequeue() {                                         /*{{{*/
@@ -458,3 +477,5 @@ void pkgAcqMethod::Dequeue() {                                              /*{{{*/
    delete Tmp;
 }
                                                                        /*}}}*/
+
+pkgAcqMethod::~pkgAcqMethod() {}
index 221ccf2737bbf8fedd173a863d8ddf945496fe40..399454892997cc72ca401224b48a1e26e4569a43 100644 (file)
@@ -20,6 +20,7 @@
 #ifndef PKGLIB_ACQUIRE_METHOD_H
 #define PKGLIB_ACQUIRE_METHOD_H
 
+#include <apt-pkg/hashes.h>
 #include <apt-pkg/macros.h>
 
 #include <stdarg.h>
@@ -33,7 +34,6 @@
 #include <apt-pkg/strutl.h>
 #endif
 
-class Hashes;
 class pkgAcqMethod
 {
    protected:
@@ -44,17 +44,20 @@ class pkgAcqMethod
 
       std::string Uri;
       std::string DestFile;
+      int DestFileFd;
       time_t LastModified;
       bool IndexFile;
       bool FailIgnore;
+      HashStringList ExpectedHashes;
+      // a maximum size we will download, this can be the exact filesize
+      // for when we know it or a arbitrary limit when we don't know the
+      // filesize (like a InRelease file)
+      unsigned long long MaximumSize;
    };
    
    struct FetchResult
    {
-      std::string MD5Sum;
-      std::string SHA1Sum;
-      std::string SHA256Sum;
-      std::string SHA512Sum;
+      HashStringList Hashes;
       std::vector<std::string> GPGVOutput;
       time_t LastModified;
       bool IMSHit;
@@ -62,7 +65,7 @@ class pkgAcqMethod
       unsigned long long Size;
       unsigned long long ResumePoint;
       
-      void TakeHashes(Hashes &Hash);
+      void TakeHashes(class Hashes &Hash);
       FetchResult();
    };
 
@@ -106,8 +109,8 @@ class pkgAcqMethod
    inline void SetIP(std::string aIP) {IP = aIP;};
    
    pkgAcqMethod(const char *Ver,unsigned long Flags = 0);
-   virtual ~pkgAcqMethod() {};
-
+   virtual ~pkgAcqMethod();
+   void DropPrivsOrDie();
    private:
    APT_HIDDEN void Dequeue();
 };
index 047a655ced6dbddb7e10e882ff6e1e4b83b6d3bf..f4d1ad412fdc3c82ad8864fed14d271c49f9bfc1 100644 (file)
 #include <signal.h>
 #include <stdio.h>
 #include <errno.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
 
 #include <apti18n.h>
                                                                        /*}}}*/
 
 using namespace std;
 
+static void ChangeOwnerAndPermissionOfFile(char const * const requester, char const * const file, char const * const user, char const * const group, mode_t const mode) /*{{{*/
+{
+   if (getuid() == 0 && strlen(user) != 0 && strlen(group) != 0) // if we aren't root, we can't chown, so don't try it
+   {
+      // ensure the file is owned by root and has good permissions
+      struct passwd const * const pw = getpwnam(user);
+      struct group const * const gr = getgrnam(group);
+      if (pw != NULL && gr != NULL && chown(file, pw->pw_uid, gr->gr_gid) != 0)
+        _error->WarningE(requester, "chown to %s:%s of file %s failed", user, group, file);
+   }
+   if (chmod(file, mode) != 0)
+      _error->WarningE(requester, "chmod 0%o of file %s failed", mode, file);
+}
+                                                                       /*}}}*/
 // Worker::Worker - Constructor for Queue startup                      /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -306,7 +323,10 @@ bool pkgAcquire::Worker::RunMessages()
            
            pkgAcquire::Item *Owner = Itm->Owner;
            pkgAcquire::ItemDesc Desc = *Itm;
-           
+
+           if (RealFileExists(Owner->DestFile))
+              ChangeOwnerAndPermissionOfFile("201::URIDone", Owner->DestFile.c_str(), "root", "root", 0644);
+
            // Display update before completion
            if (Log != 0 && Log->MorePulses == true)
               Log->Pulse(Owner->GetOwner());
@@ -326,25 +346,30 @@ bool pkgAcquire::Worker::RunMessages()
                               Owner->DestFile.c_str(), LookupTag(Message,"Size","0").c_str(),TotalSize);
 
            // see if there is a hash to verify
-           string RecivedHash;
-           HashString expectedHash(Owner->HashSum());
-           if(!expectedHash.empty()) 
+           HashStringList ReceivedHashes;
+           HashStringList expectedHashes = Owner->HashSums();
+           for (HashStringList::const_iterator hs = expectedHashes.begin(); hs != expectedHashes.end(); ++hs)
            {
-              string hashTag = expectedHash.HashType()+"-Hash";
-              string hashSum = LookupTag(Message, hashTag.c_str());
-              if(!hashSum.empty())
-                 RecivedHash = expectedHash.HashType() + ":" + hashSum;
-              if(_config->FindB("Debug::pkgAcquire::Auth", false) == true)
-              {
-                 clog << "201 URI Done: " << Owner->DescURI() << endl
-                      << "RecivedHash: " << RecivedHash << endl
-                      << "ExpectedHash: " << expectedHash.toStr() 
-                      << endl << endl;
-              }
+              std::string const tagname = hs->HashType() + "-Hash";
+              std::string const hashsum = LookupTag(Message, tagname.c_str());
+              if (hashsum.empty() == false)
+                 ReceivedHashes.push_back(HashString(hs->HashType(), hashsum));
+           }
+
+           if(_config->FindB("Debug::pkgAcquire::Auth", false) == true)
+           {
+              std::clog << "201 URI Done: " << Owner->DescURI() << endl
+                 << "ReceivedHash:" << endl;
+              for (HashStringList::const_iterator hs = ReceivedHashes.begin(); hs != ReceivedHashes.end(); ++hs)
+                 std::clog <<  "\t- " << hs->toStr() << std::endl;
+              std::clog << "ExpectedHash:" << endl;
+              for (HashStringList::const_iterator hs = expectedHashes.begin(); hs != expectedHashes.end(); ++hs)
+                 std::clog <<  "\t- " << hs->toStr() << std::endl;
+              std::clog << endl;
            }
-           Owner->Done(Message, ServerSize, RecivedHash.c_str(), Config);
+           Owner->Done(Message, ServerSize, ReceivedHashes, Config);
            ItemDone();
-           
+
            // Log that we are done
            if (Log != 0)
            {
@@ -366,16 +391,21 @@ bool pkgAcquire::Worker::RunMessages()
         {
            if (Itm == 0)
            {
-              _error->Error("Method gave invalid 400 URI Failure message");
+              std::string const msg = LookupTag(Message,"Message");
+              _error->Error("Method gave invalid 400 URI Failure message: %s", msg.c_str());
               break;
            }
 
            // Display update before completion
            if (Log != 0 && Log->MorePulses == true)
               Log->Pulse(Itm->Owner->GetOwner());
-           
+
            pkgAcquire::Item *Owner = Itm->Owner;
            pkgAcquire::ItemDesc Desc = *Itm;
+
+           if (RealFileExists(Owner->DestFile))
+              ChangeOwnerAndPermissionOfFile("400::URIFailure", Owner->DestFile.c_str(), "root", "root", 0644);
+
            OwnerQ->ItemDone(Itm);
 
            // set some status
@@ -525,9 +555,25 @@ bool pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem *Item)
    Message.reserve(300);
    Message += "URI: " + Item->URI;
    Message += "\nFilename: " + Item->Owner->DestFile;
+   HashStringList const hsl = Item->Owner->HashSums();
+   for (HashStringList::const_iterator hs = hsl.begin(); hs != hsl.end(); ++hs)
+      Message += "\nExpected-" + hs->HashType() + ": " + hs->HashValue();
+   if(Item->Owner->FileSize > 0)
+   {
+      string MaximumSize;
+      strprintf(MaximumSize, "%llu", Item->Owner->FileSize);
+      Message += "\nMaximum-Size: " + MaximumSize;
+   }
    Message += Item->Owner->Custom600Headers();
    Message += "\n\n";
-   
+
+   if (RealFileExists(Item->Owner->DestFile))
+   {
+      std::string SandboxUser = _config->Find("APT::Sandbox::User");
+      ChangeOwnerAndPermissionOfFile("Item::QueueURI", Item->Owner->DestFile.c_str(),
+                                     SandboxUser.c_str(), "root", 0600);
+   }
+
    if (Debug == true)
       clog << " -> " << Access << ':' << QuoteString(Message,"\n") << endl;
    OutQueue += Message;
index 67aee4b59fc26cbac3df023ddbd58b973388eb2b..db8889c8e5a0106cc20bacf36431a431f8e23a54 100644 (file)
@@ -101,6 +101,11 @@ class pkgAcquire::Worker : public WeakPointable
     */
    int OutFd;
 
+   /** \brief The socket to send SCM_RIGHTS message through
+    */
+   int PrivSepSocketFd;
+   int PrivSepSocketFdChild;
+
    /** \brief Set to \b true if the worker is in a state in which it
     *  might generate data or command responses.
     *
index 057bc24cd35782bf61b64022fe9fcacd2e003d35..0c815c005bbc2a3710075b3344f626a716e89f72 100644 (file)
 #include <vector>
 #include <iostream>
 #include <sstream>
+#include <iomanip>
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-
+#include <pwd.h>
+#include <grp.h>
 #include <dirent.h>
 #include <sys/time.h>
 #include <sys/select.h>
 #include <errno.h>
+#include <sys/stat.h>
+#include <sys/types.h>
 
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -49,52 +54,110 @@ pkgAcquire::pkgAcquire() : LockFD(-1), Queues(0), Workers(0), Configs(0), Log(NU
                           Debug(_config->FindB("Debug::pkgAcquire",false)),
                           Running(false)
 {
-   string const Mode = _config->Find("Acquire::Queue-Mode","host");
-   if (strcasecmp(Mode.c_str(),"host") == 0)
-      QueueMode = QueueHost;
-   if (strcasecmp(Mode.c_str(),"access") == 0)
-      QueueMode = QueueAccess;
+   Initialize();
 }
-pkgAcquire::pkgAcquire(pkgAcquireStatus *Progress) :  LockFD(-1), Queues(0), Workers(0),
-                          Configs(0), Log(Progress), ToFetch(0),
+pkgAcquire::pkgAcquire(pkgAcquireStatus *Progress) : LockFD(-1), Queues(0), Workers(0),
+                          Configs(0), Log(NULL), ToFetch(0),
                           Debug(_config->FindB("Debug::pkgAcquire",false)),
                           Running(false)
+{
+   Initialize();
+   SetLog(Progress);
+}
+void pkgAcquire::Initialize()
 {
    string const Mode = _config->Find("Acquire::Queue-Mode","host");
    if (strcasecmp(Mode.c_str(),"host") == 0)
       QueueMode = QueueHost;
    if (strcasecmp(Mode.c_str(),"access") == 0)
       QueueMode = QueueAccess;
-   Setup(Progress, "");
+
+   // chown the auth.conf file as it will be accessed by our methods
+   std::string const SandboxUser = _config->Find("APT::Sandbox::User");
+   if (getuid() == 0 && SandboxUser.empty() == false) // if we aren't root, we can't chown, so don't try it
+   {
+      struct passwd const * const pw = getpwnam(SandboxUser.c_str());
+      struct group const * const gr = getgrnam("root");
+      if (pw != NULL && gr != NULL)
+      {
+        std::string const AuthConf = _config->FindFile("Dir::Etc::netrc");
+        if(AuthConf.empty() == false && RealFileExists(AuthConf) &&
+              chown(AuthConf.c_str(), pw->pw_uid, gr->gr_gid) != 0)
+           _error->WarningE("SetupAPTPartialDirectory", "chown to %s:root of file %s failed", SandboxUser.c_str(), AuthConf.c_str());
+      }
+   }
 }
                                                                        /*}}}*/
-// Acquire::Setup - Delayed Constructor                                        /*{{{*/
-// ---------------------------------------------------------------------
-/* Do everything needed to be a complete Acquire object and report the
-   success (or failure) back so the user knows that something is wrong… */
+// Acquire::GetLock - lock directory and prepare for action            /*{{{*/
+static bool SetupAPTPartialDirectory(std::string const &grand, std::string const &parent)
+{
+   std::string const partial = parent + "partial";
+   mode_t const mode = umask(S_IWGRP | S_IWOTH);
+   bool const creation_fail = (CreateAPTDirectoryIfNeeded(grand, partial) == false &&
+        CreateAPTDirectoryIfNeeded(parent, partial) == false);
+   umask(mode);
+   if (creation_fail == true)
+      return false;
+
+   std::string const SandboxUser = _config->Find("APT::Sandbox::User");
+   if (getuid() == 0 && SandboxUser.empty() == false) // if we aren't root, we can't chown, so don't try it
+   {
+      struct passwd const * const pw = getpwnam(SandboxUser.c_str());
+      struct group const * const gr = getgrnam("root");
+      if (pw != NULL && gr != NULL)
+      {
+         // chown the partial dir
+         if(chown(partial.c_str(), pw->pw_uid, gr->gr_gid) != 0)
+            _error->WarningE("SetupAPTPartialDirectory", "chown to %s:root of directory %s failed", SandboxUser.c_str(), partial.c_str());
+      }
+   }
+   if (chmod(partial.c_str(), 0700) != 0)
+      _error->WarningE("SetupAPTPartialDirectory", "chmod 0700 of directory %s failed", partial.c_str());
+
+   return true;
+}
 bool pkgAcquire::Setup(pkgAcquireStatus *Progress, string const &Lock)
 {
    Log = Progress;
+   if (Lock.empty())
+   {
+      string const listDir = _config->FindDir("Dir::State::lists");
+      if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir) == false)
+        return _error->Errno("Acquire", _("List directory %spartial is missing."), listDir.c_str());
+      string const archivesDir = _config->FindDir("Dir::Cache::Archives");
+      if (SetupAPTPartialDirectory(_config->FindDir("Dir::Cache"), archivesDir) == false)
+        return _error->Errno("Acquire", _("Archives directory %spartial is missing."), archivesDir.c_str());
+      return true;
+   }
+   return GetLock(Lock);
+}
+bool pkgAcquire::GetLock(std::string const &Lock)
+{
+   if (Lock.empty() == true)
+      return false;
 
    // check for existence and possibly create auxiliary directories
    string const listDir = _config->FindDir("Dir::State::lists");
-   string const partialListDir = listDir + "partial/";
    string const archivesDir = _config->FindDir("Dir::Cache::Archives");
-   string const partialArchivesDir = archivesDir + "partial/";
 
-   if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
-       CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false)
-      return _error->Errno("Acquire", _("List directory %spartial is missing."), listDir.c_str());
-
-   if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::Cache"), partialArchivesDir) == false &&
-       CreateAPTDirectoryIfNeeded(archivesDir, partialArchivesDir) == false)
-      return _error->Errno("Acquire", _("Archives directory %spartial is missing."), archivesDir.c_str());
+   if (Lock == listDir)
+   {
+      if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir) == false)
+        return _error->Errno("Acquire", _("List directory %spartial is missing."), listDir.c_str());
+   }
+   if (Lock == archivesDir)
+   {
+      if (SetupAPTPartialDirectory(_config->FindDir("Dir::Cache"), archivesDir) == false)
+        return _error->Errno("Acquire", _("Archives directory %spartial is missing."), archivesDir.c_str());
+   }
 
-   if (Lock.empty() == true || _config->FindB("Debug::NoLocking", false) == true)
+   if (_config->FindB("Debug::NoLocking", false) == true)
       return true;
 
    // Lock the directory this acquire object will work in
-   LockFD = GetLock(flCombine(Lock, "lock"));
+   if (LockFD != -1)
+      close(LockFD);
+   LockFD = ::GetLock(flCombine(Lock, "lock"));
    if (LockFD == -1)
       return _error->Error(_("Unable to lock directory %s"), Lock.c_str());
 
@@ -580,27 +643,18 @@ pkgAcquire::UriIterator pkgAcquire::UriEnd()
 // Acquire::MethodConfig::MethodConfig - Constructor                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-pkgAcquire::MethodConfig::MethodConfig()
+pkgAcquire::MethodConfig::MethodConfig() : d(NULL), Next(0), SingleInstance(false),
+   Pipeline(false), SendConfig(false), LocalOnly(false), NeedsCleanup(false),
+   Removable(false)
 {
-   SingleInstance = false;
-   Pipeline = false;
-   SendConfig = false;
-   LocalOnly = false;
-   Removable = false;
-   Next = 0;
 }
                                                                        /*}}}*/
 // Queue::Queue - Constructor                                          /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-pkgAcquire::Queue::Queue(string Name,pkgAcquire *Owner) : Name(Name), 
-            Owner(Owner)
+pkgAcquire::Queue::Queue(string Name,pkgAcquire *Owner) : d(NULL), Next(0),
+   Name(Name), Items(0), Workers(0), Owner(Owner), PipeDepth(0), MaxPipeDepth(1)
 {
-   Items = 0;
-   Next = 0;
-   Workers = 0;
-   MaxPipeDepth = 1;
-   PipeDepth = 0;
 }
                                                                        /*}}}*/
 // Queue::~Queue - Destructor                                          /*{{{*/
@@ -804,7 +858,7 @@ void pkgAcquire::Queue::Bump()
 // AcquireStatus::pkgAcquireStatus - Constructor                       /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-pkgAcquireStatus::pkgAcquireStatus() : d(NULL), Update(true), MorePulses(false)
+pkgAcquireStatus::pkgAcquireStatus() : d(NULL), Percent(0), Update(true), MorePulses(false)
 {
    Start();
 }
@@ -824,7 +878,9 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
    // Compute the total number of bytes to fetch
    unsigned int Unknown = 0;
    unsigned int Count = 0;
-   for (pkgAcquire::ItemCIterator I = Owner->ItemsBegin(); I != Owner->ItemsEnd();
+   bool UnfetchedReleaseFiles = false;
+   for (pkgAcquire::ItemCIterator I = Owner->ItemsBegin(); 
+        I != Owner->ItemsEnd();
        ++I, ++Count)
    {
       TotalItems++;
@@ -835,6 +891,13 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
       if ((*I)->Local == true)
         continue;
 
+      // see if the method tells us to expect more
+      TotalItems += (*I)->ExpectedAdditionalItems;
+
+      // check if there are unfetched Release files
+      if ((*I)->Complete == false && (*I)->ExpectedAdditionalItems > 0)
+         UnfetchedReleaseFiles = true;
+
       TotalBytes += (*I)->FileSize;
       if ((*I)->Complete == true)
         CurrentBytes += (*I)->FileSize;
@@ -846,6 +909,7 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
    unsigned long long ResumeSize = 0;
    for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0;
        I = Owner->WorkerStep(I))
+   {
       if (I->CurrentItem != 0 && I->CurrentItem->Owner->Complete == false)
       {
         CurrentBytes += I->CurrentSize;
@@ -856,6 +920,7 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
             I->CurrentItem->Owner->Complete == false)
            TotalBytes += I->CurrentSize;
       }
+   }
    
    // Normalize the figures and account for unknown size downloads
    if (TotalBytes <= 0)
@@ -866,6 +931,12 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
    // Wha?! Is not supposed to happen.
    if (CurrentBytes > TotalBytes)
       CurrentBytes = TotalBytes;
+
+   // debug
+   if (_config->FindB("Debug::acquire::progress", false) == true)
+      std::clog << " Bytes: " 
+                << SizeToStr(CurrentBytes) << " / " << SizeToStr(TotalBytes) 
+                << std::endl;
    
    // Compute the CPS
    struct timeval NewTime;
@@ -886,6 +957,14 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
       Time = NewTime;
    }
 
+   // calculate the percentage, if we have too little data assume 1%
+   if (TotalBytes > 0 && UnfetchedReleaseFiles)
+      Percent = 0;
+   else 
+      // use both files and bytes because bytes can be unreliable
+      Percent = (0.8 * (CurrentBytes/float(TotalBytes)*100.0) + 
+                 0.2 * (CurrentItems/float(TotalItems)*100.0));
+
    int fd = _config->FindI("APT::Status-Fd",-1);
    if(fd > 0) 
    {
@@ -903,13 +982,11 @@ bool pkgAcquireStatus::Pulse(pkgAcquire *Owner)
       else
         snprintf(msg,sizeof(msg), _("Retrieving file %li of %li"), i, TotalItems);
         
-
-
       // build the status str
       status << "dlstatus:" << i
-            << ":"  << (CurrentBytes/float(TotalBytes)*100.0) 
-            << ":" << msg 
-            << endl;
+             << ":"  << std::setprecision(3) << Percent
+             << ":" << msg 
+             << endl;
 
       std::string const dlstatus = status.str();
       FileFd::Write(fd, dlstatus.c_str(), dlstatus.size());
@@ -964,3 +1041,7 @@ void pkgAcquireStatus::Fetched(unsigned long long Size,unsigned long long Resume
    FetchedBytes += Size - Resume;
 }
                                                                        /*}}}*/
+
+APT_CONST pkgAcquire::UriIterator::~UriIterator() {}
+APT_CONST pkgAcquire::MethodConfig::~MethodConfig() {}
+APT_CONST pkgAcquireStatus::~pkgAcquireStatus() {}
index ef16d8556538bc2ab88bd88b71b0ec802db16d3c..f33362922dedcd451ea1c0d8afce73066e074a50 100644 (file)
@@ -351,14 +351,24 @@ class pkgAcquire
     *  long as the pkgAcquire object does.
     *  \param Lock defines a lock file that should be acquired to ensure
     *  only one Acquire class is in action at the time or an empty string
-    *  if no lock file should be used.
+    *  if no lock file should be used. If set also all needed directories
+    *  will be created.
     */
-   bool Setup(pkgAcquireStatus *Progress = NULL, std::string const &Lock = "");
+   APT_DEPRECATED bool Setup(pkgAcquireStatus *Progress = NULL, std::string const &Lock = "");
 
    void SetLog(pkgAcquireStatus *Progress) { Log = Progress; }
 
+   /** \brief acquire lock and perform directory setup
+    *
+    *  \param Lock defines a lock file that should be acquired to ensure
+    *  only one Acquire class is in action at the time or an empty string
+    *  if no lock file should be used. If set also all needed directories
+    *  will be created and setup.
+    */
+   bool GetLock(std::string const &Lock);
+
    /** \brief Construct a new pkgAcquire. */
-   pkgAcquire(pkgAcquireStatus *Log) APT_DEPRECATED;
+   pkgAcquire(pkgAcquireStatus *Log);
    pkgAcquire();
 
    /** \brief Destroy this pkgAcquire object.
@@ -368,6 +378,8 @@ class pkgAcquire
     */
    virtual ~pkgAcquire();
 
+   private:
+   APT_HIDDEN void Initialize();
 };
 
 /** \brief Represents a single download source from which an item
@@ -585,7 +597,7 @@ class pkgAcquire::UriIterator
     *
     *  \param Q The queue over which this UriIterator should iterate.
     */
-   UriIterator(pkgAcquire::Queue *Q) : CurQ(Q), CurItem(0)
+   UriIterator(pkgAcquire::Queue *Q) : d(NULL), CurQ(Q), CurItem(0)
    {
       while (CurItem == 0 && CurQ != 0)
       {
@@ -593,7 +605,7 @@ class pkgAcquire::UriIterator
         CurQ = CurQ->Next;
       }
    }   
-   virtual ~UriIterator() {};
+   virtual ~UriIterator();
 };
                                                                        /*}}}*/
 /** \brief Information about the properties of a single acquire method.        {{{*/
@@ -651,8 +663,7 @@ struct pkgAcquire::MethodConfig
     */
    MethodConfig();
 
-   /* \brief Destructor, empty currently */
-   virtual ~MethodConfig() {};
+   virtual ~MethodConfig();
 };
                                                                        /*}}}*/
 /** \brief A monitor object for downloads controlled by the pkgAcquire class.  {{{
@@ -714,6 +725,10 @@ class pkgAcquireStatus
    /** \brief The number of items that have been successfully downloaded. */
    unsigned long CurrentItems;
    
+   /** \brief The estimated percentage of the download (0-100)
+    */
+   double Percent;
+
    public:
 
    /** \brief If \b true, the download scheduler should call Pulse()
@@ -794,7 +809,7 @@ class pkgAcquireStatus
    
    /** \brief Initialize all counters to 0 and the time to the current time. */
    pkgAcquireStatus();
-   virtual ~pkgAcquireStatus() {};
+   virtual ~pkgAcquireStatus();
 };
                                                                        /*}}}*/
 /** @} */
index b8383105348421cf7457f8e41642e8ad739074fb..adbec82f71a9d2eddf72d0f1b65e11f5e2c11350 100644 (file)
@@ -640,13 +640,17 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
 // ProblemResolver::Resolve - calls a resolver to fix the situation    /*{{{*/
 // ---------------------------------------------------------------------
 /* */
+#if APT_PKG_ABI < 413
 bool pkgProblemResolver::Resolve(bool BrokenFix)
+{
+   return Resolve(BrokenFix, NULL);
+}
+#endif
+bool pkgProblemResolver::Resolve(bool BrokenFix, OpProgress * const Progress)
 {
    std::string const solver = _config->Find("APT::Solver", "internal");
-   if (solver != "internal") {
-      OpTextProgress Prog(*_config);
-      return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, &Prog);
-   }
+   if (solver != "internal")
+      return EDSP::ResolveExternal(solver.c_str(), Cache, false, false, false, Progress);
    return ResolveInternal(BrokenFix);
 }
                                                                        /*}}}*/
@@ -1140,13 +1144,17 @@ bool pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator I)
 /* This is the work horse of the soft upgrade routine. It is very gental 
    in that it does not install or remove any packages. It is assumed that the
    system was non-broken previously. */
+#if APT_PKG_ABI < 413
 bool pkgProblemResolver::ResolveByKeep()
+{
+   return ResolveByKeep(NULL);
+}
+#endif
+bool pkgProblemResolver::ResolveByKeep(OpProgress * const Progress)
 {
    std::string const solver = _config->Find("APT::Solver", "internal");
-   if (solver != "internal") {
-      OpTextProgress Prog(*_config);
-      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
-   }
+   if (solver != "internal")
+      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress);
    return ResolveByKeepInternal();
 }
                                                                        /*}}}*/
index f35bd9a133840b02a7835fc164a317b08d1166ec..2ac28c0d753a4b8896996a2f27bf8c4b3776c2bc 100644 (file)
@@ -82,9 +82,9 @@ class pkgSimulate : public pkgPackageManager                          /*{{{*/
    virtual bool Remove(PkgIterator Pkg,bool Purge);
 
 private:
-   void ShortBreaks();
-   void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate);
-   
+   APT_HIDDEN void ShortBreaks();
+   APT_HIDDEN void Describe(PkgIterator iPkg,std::ostream &out,bool Current,bool Candidate);
+
    public:
 
    pkgSimulate(pkgDepCache *Cache);
@@ -114,7 +114,7 @@ class pkgProblemResolver                                            /*{{{*/
    
    // Sort stuff
    static pkgProblemResolver *This;
-   static int ScoreSort(const void *a,const void *b) APT_PURE;
+   APT_HIDDEN static int ScoreSort(const void *a,const void *b) APT_PURE;
 
    struct PackageKill
    {
@@ -122,12 +122,12 @@ class pkgProblemResolver                                          /*{{{*/
       DepIterator Dep;
    };
 
-   void MakeScores();
-   bool DoUpgrade(pkgCache::PkgIterator Pkg);
+   APT_HIDDEN void MakeScores();
+   APT_HIDDEN bool DoUpgrade(pkgCache::PkgIterator Pkg);
+
+   APT_HIDDEN bool ResolveInternal(bool const BrokenFix = false);
+   APT_HIDDEN bool ResolveByKeepInternal();
 
-   bool ResolveInternal(bool const BrokenFix = false);
-   bool ResolveByKeepInternal();
-   
    protected:
    bool InstOrNewPolicyBroken(pkgCache::PkgIterator Pkg);
 
@@ -136,12 +136,22 @@ class pkgProblemResolver                                          /*{{{*/
    inline void Protect(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= Protected; Cache.MarkProtected(Pkg);};
    inline void Remove(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] |= ToRemove;};
    inline void Clear(pkgCache::PkgIterator Pkg) {Flags[Pkg->ID] &= ~(Protected | ToRemove);};
-   
-   // Try to intelligently resolve problems by installing and removing packages   
+
+   // Try to intelligently resolve problems by installing and removing packages
+#if APT_PKG_ABI >= 413
+   bool Resolve(bool BrokenFix = false, OpProgress * const Progress = NULL);
+#else
    bool Resolve(bool BrokenFix = false);
-   
+   bool Resolve(bool BrokenFix, OpProgress * const Progress);
+#endif
+
    // Try to resolve problems only by using keep
+#if APT_PKG_ABI >= 413
+   bool ResolveByKeep(OpProgress * const Progress = NULL);
+#else
    bool ResolveByKeep();
+   bool ResolveByKeep(OpProgress * const Progress);
+#endif
 
    APT_DEPRECATED void InstallProtect();
 
index 9982759c634d7cda87fc16df3d1e803925395114..01b85a74e94db869d2763b61d0a753b3cbc1cced 100644 (file)
 #include <apti18n.h>
                                                                        /*}}}*/
 namespace APT {
+// setDefaultConfigurationForCompressors                               /*{{{*/
+static void setDefaultConfigurationForCompressors() {
+       // Set default application paths to check for optional compression types
+       _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
+       _config->CndSet("Dir::Bin::xz", "/usr/bin/xz");
+       if (FileExists(_config->FindFile("Dir::Bin::xz")) == true) {
+               _config->Set("Dir::Bin::lzma", _config->FindFile("Dir::Bin::xz"));
+               _config->Set("APT::Compressor::lzma::Binary", "xz");
+               if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) {
+                       _config->Set("APT::Compressor::lzma::CompressArg::", "--format=lzma");
+                       _config->Set("APT::Compressor::lzma::CompressArg::", "-9");
+               }
+               if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) {
+                       _config->Set("APT::Compressor::lzma::UncompressArg::", "--format=lzma");
+                       _config->Set("APT::Compressor::lzma::UncompressArg::", "-d");
+               }
+       } else {
+               _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
+               if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) {
+                       _config->Set("APT::Compressor::lzma::CompressArg::", "--suffix=");
+                       _config->Set("APT::Compressor::lzma::CompressArg::", "-9");
+               }
+               if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) {
+                       _config->Set("APT::Compressor::lzma::UncompressArg::", "--suffix=");
+                       _config->Set("APT::Compressor::lzma::UncompressArg::", "-d");
+               }
+       }
+}
+                                                                       /*}}}*/
 // getCompressionTypes - Return Vector of usable compressiontypes      /*{{{*/
 // ---------------------------------------------------------------------
 /* return a vector of compression types in the preferred order. */
@@ -402,35 +431,6 @@ bool Configuration::checkArchitecture(std::string const &Arch) {
        return (std::find(archs.begin(), archs.end(), Arch) != archs.end());
 }
                                                                        /*}}}*/
-// setDefaultConfigurationForCompressors                               /*{{{*/
-void Configuration::setDefaultConfigurationForCompressors() {
-       // Set default application paths to check for optional compression types
-       _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2");
-       _config->CndSet("Dir::Bin::xz", "/usr/bin/xz");
-       if (FileExists(_config->FindFile("Dir::Bin::xz")) == true) {
-               _config->Set("Dir::Bin::lzma", _config->FindFile("Dir::Bin::xz"));
-               _config->Set("APT::Compressor::lzma::Binary", "xz");
-               if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) {
-                       _config->Set("APT::Compressor::lzma::CompressArg::", "--format=lzma");
-                       _config->Set("APT::Compressor::lzma::CompressArg::", "-9");
-               }
-               if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) {
-                       _config->Set("APT::Compressor::lzma::UncompressArg::", "--format=lzma");
-                       _config->Set("APT::Compressor::lzma::UncompressArg::", "-d");
-               }
-       } else {
-               _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma");
-               if (_config->Exists("APT::Compressor::lzma::CompressArg") == false) {
-                       _config->Set("APT::Compressor::lzma::CompressArg::", "--suffix=");
-                       _config->Set("APT::Compressor::lzma::CompressArg::", "-9");
-               }
-               if (_config->Exists("APT::Compressor::lzma::UncompressArg") == false) {
-                       _config->Set("APT::Compressor::lzma::UncompressArg::", "--suffix=");
-                       _config->Set("APT::Compressor::lzma::UncompressArg::", "-d");
-               }
-       }
-}
-                                                                       /*}}}*/
 // getCompressors - Return Vector of usealbe compressors               /*{{{*/
 // ---------------------------------------------------------------------
 /* return a vector of compressors used by apt-ftparchive in the
@@ -540,7 +540,7 @@ std::string const Configuration::getBuildProfilesString() {
                return "";
        std::vector<std::string>::const_iterator p = profiles.begin();
        std::string list = *p;
-       for (; p != profiles.end(); ++p)
+       for (++p; p != profiles.end(); ++p)
           list.append(",").append(*p);
        return list;
 }
index dfed194aed8f05a1427e310250fb3590b20a116c..c7b8d2d73d68e17b05011f789cfd7398bbb13158 100644 (file)
@@ -123,9 +123,6 @@ public:                                                                     /*{{{*/
        /** \return Return a comma-separated list of enabled build profile specifications */
        std::string static const getBuildProfilesString();
                                                                        /*}}}*/
-       private:                                                        /*{{{*/
-       void static setDefaultConfigurationForCompressors();
-                                                                       /*}}}*/
 };
                                                                        /*}}}*/
 }
index e388f2450cfa0f665ea44b34a3dd9b6f9e06d86d..4362f43e3ce9305a77a221c3958fe8ce31c26ae2 100644 (file)
@@ -6,6 +6,7 @@
 // Include Files                                                       /*{{{*/
 #include <config.h>
 
+#include <apt-pkg/cachefile.h>
 #include <apt-pkg/cachefilter.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/pkgcache.h>
                                                                        /*}}}*/
 namespace APT {
 namespace CacheFilter {
-PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) : d(NULL) {/*{{{*/
+APT_CONST Matcher::~Matcher() {}
+APT_CONST PackageMatcher::~PackageMatcher() {}
+
+// Name matches RegEx                                                  /*{{{*/
+PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) {
        pattern = new regex_t;
        int const Res = regcomp(pattern, Pattern.c_str(), REG_EXTENDED | REG_ICASE | REG_NOSUB);
        if (Res == 0)
@@ -34,41 +39,36 @@ PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::string const &Pattern) : d
        regerror(Res, pattern, Error, sizeof(Error));
        _error->Error(_("Regex compilation error - %s"), Error);
 }
-                                                                       /*}}}*/
-bool PackageNameMatchesRegEx::operator() (pkgCache::PkgIterator const &Pkg) {/*{{{*/
+bool PackageNameMatchesRegEx::operator() (pkgCache::PkgIterator const &Pkg) {
        if (unlikely(pattern == NULL))
                return false;
        else
                return regexec(pattern, Pkg.Name(), 0, 0, 0) == 0;
 }
-                                                                       /*}}}*/
-bool PackageNameMatchesRegEx::operator() (pkgCache::GrpIterator const &Grp) {/*{{{*/
+bool PackageNameMatchesRegEx::operator() (pkgCache::GrpIterator const &Grp) {
        if (unlikely(pattern == NULL))
                return false;
        else
                return regexec(pattern, Grp.Name(), 0, 0, 0) == 0;
 }
-                                                                       /*}}}*/
-PackageNameMatchesRegEx::~PackageNameMatchesRegEx() {                  /*{{{*/
+PackageNameMatchesRegEx::~PackageNameMatchesRegEx() {
        if (pattern == NULL)
                return;
        regfree(pattern);
        delete pattern;
 }
                                                                        /*}}}*/
-
-// Fnmatch support                                     /*{{{*/
-//----------------------------------------------------------------------
-bool PackageNameMatchesFnmatch::operator() (pkgCache::PkgIterator const &Pkg) {/*{{{*/
+// Name matches Fnmatch                                                        /*{{{*/
+PackageNameMatchesFnmatch::PackageNameMatchesFnmatch(std::string const &Pattern) :
+   Pattern(Pattern) {}
+bool PackageNameMatchesFnmatch::operator() (pkgCache::PkgIterator const &Pkg) {
    return fnmatch(Pattern.c_str(), Pkg.Name(), FNM_CASEFOLD) == 0;
 }
-                                                                       /*}}}*/
-bool PackageNameMatchesFnmatch::operator() (pkgCache::GrpIterator const &Grp) {/*{{{*/
+bool PackageNameMatchesFnmatch::operator() (pkgCache::GrpIterator const &Grp) {
    return fnmatch(Pattern.c_str(), Grp.Name(), FNM_CASEFOLD) == 0;
 }
                                                                        /*}}}*/
-
-// CompleteArch to <kernel>-<cpu> tuple                                        /*{{{*/
+// Architecture matches <kernel>-<cpu> specification                   /*{{{*/
 //----------------------------------------------------------------------
 /* The complete architecture, consisting of <kernel>-<cpu>. */
 static std::string CompleteArch(std::string const &arch) {
@@ -82,12 +82,10 @@ static std::string CompleteArch(std::string const &arch) {
        else if (arch == "any")                 return "*-*";
        else                                    return "linux-" + arch;
 }
-                                                                       /*}}}*/
-PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern) :/*{{{*/
-                                       literal(pattern), complete(CompleteArch(pattern)), isPattern(isPattern), d(NULL) {
+PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern) :
+                                       literal(pattern), complete(CompleteArch(pattern)), isPattern(isPattern) {
 }
-                                                                       /*}}}*/
-bool PackageArchitectureMatchesSpecification::operator() (char const * const &arch) {/*{{{*/
+bool PackageArchitectureMatchesSpecification::operator() (char const * const &arch) {
        if (strcmp(literal.c_str(), arch) == 0 ||
            strcmp(complete.c_str(), arch) == 0)
                return true;
@@ -96,16 +94,112 @@ bool PackageArchitectureMatchesSpecification::operator() (char const * const &ar
                return fnmatch(complete.c_str(), pkgarch.c_str(), 0) == 0;
        return fnmatch(pkgarch.c_str(), complete.c_str(), 0) == 0;
 }
-                                                                       /*}}}*/
-bool PackageArchitectureMatchesSpecification::operator() (pkgCache::PkgIterator const &Pkg) {/*{{{*/
+bool PackageArchitectureMatchesSpecification::operator() (pkgCache::PkgIterator const &Pkg) {
        return (*this)(Pkg.Arch());
+}
+PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification() {
 }
                                                                        /*}}}*/
-bool PackageArchitectureMatchesSpecification::operator() (pkgCache::VerIterator const &Ver) {/*{{{*/
-       return (*this)(Ver.ParentPkg());
+// Package is new install                                              /*{{{*/
+PackageIsNewInstall::PackageIsNewInstall(pkgCacheFile * const Cache) : Cache(Cache) {}
+APT_PURE bool PackageIsNewInstall::operator() (pkgCache::PkgIterator const &Pkg) {
+   return (*Cache)[Pkg].NewInstall();
 }
+PackageIsNewInstall::~PackageIsNewInstall() {}
                                                                        /*}}}*/
-PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification() {  /*{{{*/
+// Generica like True, False, NOT, AND, OR                             /*{{{*/
+APT_CONST bool TrueMatcher::operator() (pkgCache::PkgIterator const &) { return true; }
+APT_CONST bool TrueMatcher::operator() (pkgCache::GrpIterator const &) { return true; }
+APT_CONST bool TrueMatcher::operator() (pkgCache::VerIterator const &) { return true; }
+
+APT_CONST bool FalseMatcher::operator() (pkgCache::PkgIterator const &) { return false; }
+APT_CONST bool FalseMatcher::operator() (pkgCache::GrpIterator const &) { return false; }
+APT_CONST bool FalseMatcher::operator() (pkgCache::VerIterator const &) { return false; }
+
+NOTMatcher::NOTMatcher(Matcher * const matcher) : matcher(matcher) {}
+bool NOTMatcher::operator() (pkgCache::PkgIterator const &Pkg) { return ! (*matcher)(Pkg); }
+bool NOTMatcher::operator() (pkgCache::GrpIterator const &Grp) { return ! (*matcher)(Grp); }
+bool NOTMatcher::operator() (pkgCache::VerIterator const &Ver) { return ! (*matcher)(Ver); }
+NOTMatcher::~NOTMatcher() { delete matcher; }
+
+ANDMatcher::ANDMatcher() {}
+ANDMatcher::ANDMatcher(Matcher * const matcher1) {
+   AND(matcher1);
+}
+ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2) {
+   AND(matcher1).AND(matcher2);
+}
+ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3) {
+   AND(matcher1).AND(matcher2).AND(matcher3);
+}
+ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4) {
+   AND(matcher1).AND(matcher2).AND(matcher3).AND(matcher4);
+}
+ANDMatcher::ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5) {
+   AND(matcher1).AND(matcher2).AND(matcher3).AND(matcher4).AND(matcher5);
+}
+ANDMatcher& ANDMatcher::AND(Matcher * const matcher) { matchers.push_back(matcher); return *this; }
+bool ANDMatcher::operator() (pkgCache::PkgIterator const &Pkg) {
+   for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M)
+      if ((**M)(Pkg) == false)
+        return false;
+   return true;
+}
+bool ANDMatcher::operator() (pkgCache::GrpIterator const &Grp) {
+   for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M)
+      if ((**M)(Grp) == false)
+        return false;
+   return true;
+}
+bool ANDMatcher::operator() (pkgCache::VerIterator const &Ver) {
+   for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M)
+      if ((**M)(Ver) == false)
+        return false;
+   return true;
+}
+ANDMatcher::~ANDMatcher() {
+   for (std::vector<Matcher *>::iterator M = matchers.begin(); M != matchers.end(); ++M)
+      delete *M;
+}
+
+ORMatcher::ORMatcher() {}
+ORMatcher::ORMatcher(Matcher * const matcher1) {
+   OR(matcher1);
+}
+ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2) {
+   OR(matcher1).OR(matcher2);
+}
+ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3) {
+   OR(matcher1).OR(matcher2).OR(matcher3);
+}
+ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4) {
+   OR(matcher1).OR(matcher2).OR(matcher3).OR(matcher4);
+}
+ORMatcher::ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5) {
+   OR(matcher1).OR(matcher2).OR(matcher3).OR(matcher4).OR(matcher5);
+}
+ORMatcher& ORMatcher::OR(Matcher * const matcher) { matchers.push_back(matcher); return *this; }
+bool ORMatcher::operator() (pkgCache::PkgIterator const &Pkg) {
+   for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M)
+      if ((**M)(Pkg) == true)
+        return true;
+   return false;
+}
+bool ORMatcher::operator() (pkgCache::GrpIterator const &Grp) {
+   for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M)
+      if ((**M)(Grp) == true)
+        return true;
+   return false;
+}
+bool ORMatcher::operator() (pkgCache::VerIterator const &Ver) {
+   for (std::vector<Matcher *>::const_iterator M = matchers.begin(); M != matchers.end(); ++M)
+      if ((**M)(Ver) == true)
+        return true;
+   return false;
+}
+ORMatcher::~ORMatcher() {
+   for (std::vector<Matcher *>::iterator M = matchers.begin(); M != matchers.end(); ++M)
+      delete *M;
 }
                                                                        /*}}}*/
 
index 6d10d1163a23598c884789b2d194a52d399f8732..b4697b773d93d014b9b3b5dd87aeb9c5deed7cbf 100644 (file)
 #include <apt-pkg/cacheiterators.h>
 
 #include <string>
+#include <vector>
 
 #include <regex.h>
+
+class pkgCacheFile;
                                                                        /*}}}*/
 namespace APT {
 namespace CacheFilter {
 
-#define PACKAGE_MATCHER_ABI_COMPAT 1
-#ifdef PACKAGE_MATCHER_ABI_COMPAT
-
-// PackageNameMatchesRegEx                                             /*{{{*/
-class PackageNameMatchesRegEx {
-         /** \brief dpointer placeholder (for later in case we need it) */
-         void *d;
-       regex_t* pattern;
+class Matcher {
 public:
-       PackageNameMatchesRegEx(std::string const &Pattern);
-       bool operator() (pkgCache::PkgIterator const &Pkg);
-       bool operator() (pkgCache::GrpIterator const &Grp);
-       ~PackageNameMatchesRegEx();
+   virtual bool operator() (pkgCache::PkgIterator const &/*Pkg*/) = 0;
+   virtual bool operator() (pkgCache::GrpIterator const &/*Grp*/) = 0;
+   virtual bool operator() (pkgCache::VerIterator const &/*Ver*/) = 0;
+   virtual ~Matcher();
 };
-                                                                       /*}}}*/
-// PackageNameMatchesFnmatch                                           /*{{{*/
- class PackageNameMatchesFnmatch {
-         /** \brief dpointer placeholder (for later in case we need it) */
-         void *d;
-         const std::string Pattern;
+
+class PackageMatcher : public Matcher {
 public:
-         PackageNameMatchesFnmatch(std::string const &Pattern) 
-            : Pattern(Pattern) {};
-        bool operator() (pkgCache::PkgIterator const &Pkg);
-       bool operator() (pkgCache::GrpIterator const &Grp);
-       ~PackageNameMatchesFnmatch() {};
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg) = 0;
+   virtual bool operator() (pkgCache::VerIterator const &Ver) { return (*this)(Ver.ParentPkg()); }
+   virtual bool operator() (pkgCache::GrpIterator const &/*Grp*/) { return false; }
+   virtual ~PackageMatcher();
 };
-                                                                       /*}}}*/
-// PackageArchitectureMatchesSpecification                             /*{{{*/
-/** \class PackageArchitectureMatchesSpecification
-   \brief matching against architecture specification strings
 
-   The strings are of the format \<kernel\>-\<cpu\> where either component,
-   or the whole string, can be the wildcard "any" as defined in
-   debian-policy §11.1 "Architecture specification strings".
-
-   Examples: i386, mipsel, linux-any, any-amd64, any */
-class PackageArchitectureMatchesSpecification {
-       std::string literal;
-       std::string complete;
-       bool isPattern;
-       /** \brief dpointer placeholder (for later in case we need it) */
-       void *d;
+// Generica like True, False, NOT, AND, OR                             /*{{{*/
+class TrueMatcher : public Matcher {
 public:
-       /** \brief matching against architecture specification strings
-        *
-        * @param pattern is the architecture specification string
-        * @param isPattern defines if the given \b pattern is a
-        *        architecture specification pattern to match others against
-        *        or if it is the fixed string and matched against patterns
-        */
-       PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern = true);
-       bool operator() (char const * const &arch);
-       bool operator() (pkgCache::PkgIterator const &Pkg);
-       bool operator() (pkgCache::VerIterator const &Ver);
-       ~PackageArchitectureMatchesSpecification();
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+   virtual bool operator() (pkgCache::GrpIterator const &Grp);
+   virtual bool operator() (pkgCache::VerIterator const &Ver);
 };
-                                                                       /*}}}*/
 
-#else
+class FalseMatcher : public Matcher {
+public:
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+   virtual bool operator() (pkgCache::GrpIterator const &Grp);
+   virtual bool operator() (pkgCache::VerIterator const &Ver);
+};
 
-class PackageMatcher {
- public:
-   virtual bool operator() (pkgCache::PkgIterator const &Pkg) { return false; };
-   virtual bool operator() (pkgCache::GrpIterator const &Grp) { return false; };
-   virtual bool operator() (pkgCache::VerIterator const &Ver) { return false; };
-   
-   virtual ~PackageMatcher() {};
+class NOTMatcher : public Matcher {
+   Matcher * const matcher;
+public:
+   NOTMatcher(Matcher * const matcher);
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+   virtual bool operator() (pkgCache::GrpIterator const &Grp);
+   virtual bool operator() (pkgCache::VerIterator const &Ver);
+   virtual ~NOTMatcher();
 };
 
-// PackageNameMatchesRegEx                                             /*{{{*/
-class PackageNameMatchesRegEx : public PackageMatcher {
-         /** \brief dpointer placeholder (for later in case we need it) */
-         void *d;
+class ANDMatcher : public Matcher {
+   std::vector<Matcher *> matchers;
+public:
+   // 5 ought to be enough for everybody… c++11 variadic templates would be nice
+   ANDMatcher();
+   ANDMatcher(Matcher * const matcher1);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4);
+   ANDMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5);
+   ANDMatcher& AND(Matcher * const matcher);
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+   virtual bool operator() (pkgCache::GrpIterator const &Grp);
+   virtual bool operator() (pkgCache::VerIterator const &Ver);
+   virtual ~ANDMatcher();
+};
+class ORMatcher : public Matcher {
+   std::vector<Matcher *> matchers;
+public:
+   // 5 ought to be enough for everybody… c++11 variadic templates would be nice
+   ORMatcher();
+   ORMatcher(Matcher * const matcher1);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4);
+   ORMatcher(Matcher * const matcher1, Matcher * const matcher2, Matcher * const matcher3, Matcher * const matcher4, Matcher * const matcher5);
+   ORMatcher& OR(Matcher * const matcher);
+   virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+   virtual bool operator() (pkgCache::GrpIterator const &Grp);
+   virtual bool operator() (pkgCache::VerIterator const &Ver);
+   virtual ~ORMatcher();
+};
+                                                                       /*}}}*/
+class PackageNameMatchesRegEx : public PackageMatcher {                        /*{{{*/
        regex_t* pattern;
 public:
        PackageNameMatchesRegEx(std::string const &Pattern);
@@ -98,20 +102,16 @@ public:
        virtual ~PackageNameMatchesRegEx();
 };
                                                                        /*}}}*/
-// PackageNameMatchesFnmatch                                           /*{{{*/
-   class PackageNameMatchesFnmatch : public PackageMatcher{
-         /** \brief dpointer placeholder (for later in case we need it) */
-         void *d;
-         const std::string Pattern;
+class PackageNameMatchesFnmatch : public PackageMatcher {              /*{{{*/
+       const std::string Pattern;
 public:
-         PackageNameMatchesFnmatch(std::string const &Pattern) 
-            : Pattern(Pattern) {};
-        virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+       PackageNameMatchesFnmatch(std::string const &Pattern);
+       virtual bool operator() (pkgCache::PkgIterator const &Pkg);
        virtual bool operator() (pkgCache::GrpIterator const &Grp);
        virtual ~PackageNameMatchesFnmatch() {};
 };
                                                                        /*}}}*/
-// PackageArchitectureMatchesSpecification                             /*{{{*/
+class PackageArchitectureMatchesSpecification : public PackageMatcher {        /*{{{*/
 /** \class PackageArchitectureMatchesSpecification
    \brief matching against architecture specification strings
 
@@ -120,12 +120,9 @@ public:
    debian-policy §11.1 "Architecture specification strings".
 
    Examples: i386, mipsel, linux-any, any-amd64, any */
-class PackageArchitectureMatchesSpecification : public PackageMatcher {
        std::string literal;
        std::string complete;
        bool isPattern;
-       /** \brief dpointer placeholder (for later in case we need it) */
-       void *d;
 public:
        /** \brief matching against architecture specification strings
         *
@@ -137,11 +134,18 @@ public:
        PackageArchitectureMatchesSpecification(std::string const &pattern, bool const isPattern = true);
        bool operator() (char const * const &arch);
        virtual bool operator() (pkgCache::PkgIterator const &Pkg);
-       virtual bool operator() (pkgCache::VerIterator const &Ver);
        virtual ~PackageArchitectureMatchesSpecification();
 };
-#endif
                                                                        /*}}}*/
+class PackageIsNewInstall : public PackageMatcher {                    /*{{{*/
+       pkgCacheFile * const Cache;
+public:
+       PackageIsNewInstall(pkgCacheFile * const Cache);
+       virtual bool operator() (pkgCache::PkgIterator const &Pkg);
+       virtual ~PackageIsNewInstall();
+};
+                                                                       /*}}}*/
+
 }
 }
 #endif
index 513f40f17c68fcac9d53473e31741acd84b4797b..fe798799cdbdb161c7888268dd7f152234f805e5 100644 (file)
@@ -159,10 +159,14 @@ class pkgCache::PkgIterator: public Iterator<Package, PkgIterator> {
        enum OkState {NeedsNothing,NeedsUnpack,NeedsConfigure};
 
        // Accessors
-       inline const char *Name() const {return S->Name == 0?0:Owner->StrP + S->Name;}
+       inline const char *Name() const { return Group().Name(); }
        // Versions have sections - and packages can have different versions with different sections
        // so this interface is broken by design. Run as fast as you can to Version.Section().
-       APT_DEPRECATED inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;}
+       APT_DEPRECATED inline const char *Section() const {
+          APT_IGNORE_DEPRECATED_PUSH
+          return S->Section == 0?0:Owner->StrP + S->Section;
+          APT_IGNORE_DEPRECATED_POP
+       }
        inline bool Purge() const {return S->CurrentState == pkgCache::State::Purge ||
                (S->CurrentVer == 0 && S->CurrentState == pkgCache::State::NotInstalled);}
        inline const char *Arch() const {return S->Arch == 0?0:Owner->StrP + S->Arch;}
@@ -213,6 +217,14 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
        // Accessors
        inline const char *VerStr() const {return S->VerStr == 0?0:Owner->StrP + S->VerStr;}
        inline const char *Section() const {return S->Section == 0?0:Owner->StrP + S->Section;}
+#if APT_PKG_ABI >= 413
+       /** \brief source package name this version comes from
+          Always contains the name, even if it is the same as the binary name */
+       inline const char *SourcePkgName() const {return Owner->StrP + S->SourcePkgName;}
+       /** \brief source version this version comes from
+          Always contains the version string, even if it is the same as the binary version */
+       inline const char *SourceVerStr() const {return Owner->StrP + S->SourceVerStr;}
+#endif
        inline const char *Arch() const {
                if ((S->MultiArch & pkgCache::Version::All) == pkgCache::Version::All)
                        return "all";
@@ -334,7 +346,7 @@ class pkgCache::PrvIterator : public Iterator<Provides, PrvIterator> {
        inline void operator ++() {operator ++(0);}
 
        // Accessors
-       inline const char *Name() const {return Owner->StrP + Owner->PkgP[S->ParentPkg].Name;}
+       inline const char *Name() const {return ParentPkg().Name();}
        inline const char *ProvideVersion() const {return S->ProvideVersion == 0?0:Owner->StrP + S->ProvideVersion;}
        inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);}
        inline VerIterator OwnerVer() const {return VerIterator(*Owner,Owner->VerP + S->Version);}
index 2ed6a96da2348a65cd56a0d0282e1972d67e1a96..9127a4064f94748f1cf88667e0fe3682205f38e4 100644 (file)
@@ -24,6 +24,7 @@
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/macros.h>
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/fileutl.h>
 
 #include <stddef.h>
 #include <stdio.h>
 #include <apti18n.h>
                                                                        /*}}}*/
 namespace APT {
-// FromTask - Return all packages in the cache from a specific task    /*{{{*/
-bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
+
+// PackageFrom - selecting the appropriate method for package selection        /*{{{*/
+bool CacheSetHelper::PackageFrom(enum PkgSelector const select, PackageContainerInterface * const pci,
+      pkgCacheFile &Cache, std::string const &pattern) {
+       switch (select) {
+       case UNKNOWN: return false;
+       case REGEX: return PackageFromRegEx(pci, Cache, pattern);
+       case TASK: return PackageFromTask(pci, Cache, pattern);
+       case FNMATCH: return PackageFromFnmatch(pci, Cache, pattern);
+       case PACKAGENAME: return PackageFromPackageName(pci, Cache, pattern);
+       case STRING: return PackageFromString(pci, Cache, pattern);
+       }
+       return false;
+}
+                                                                       /*}}}*/
+// PackageFromTask - Return all packages in the cache from a specific task /*{{{*/
+bool CacheSetHelper::PackageFromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) {
        size_t const archfound = pattern.find_last_of(':');
        std::string arch = "native";
        if (archfound != std::string::npos) {
@@ -54,7 +70,7 @@ bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci,
 
        bool const wasEmpty = pci->empty();
        if (wasEmpty == true)
-               pci->setConstructor(TASK);
+               pci->setConstructor(CacheSetHelper::TASK);
 
        // get the records
        pkgRecords Recs(Cache);
@@ -90,32 +106,32 @@ bool PackageContainerInterface::FromTask(PackageContainerInterface * const pci,
                        continue;
 
                pci->insert(Pkg);
-               helper.showTaskSelection(Pkg, pattern);
+               showPackageSelection(Pkg, CacheSetHelper::TASK, pattern);
                found = true;
        }
        regfree(&Pattern);
 
        if (found == false) {
-               helper.canNotFindTask(pci, Cache, pattern);
-               pci->setConstructor(UNKNOWN);
+               canNotFindPackage(CacheSetHelper::TASK, pci, Cache, pattern);
+               pci->setConstructor(CacheSetHelper::UNKNOWN);
                return false;
        }
 
-       if (wasEmpty == false && pci->getConstructor() != UNKNOWN)
-               pci->setConstructor(UNKNOWN);
+       if (wasEmpty == false && pci->getConstructor() != CacheSetHelper::UNKNOWN)
+               pci->setConstructor(CacheSetHelper::UNKNOWN);
 
        return true;
 }
                                                                        /*}}}*/
-// FromRegEx - Return all packages in the cache matching a pattern     /*{{{*/
-bool PackageContainerInterface::FromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
+// PackageFromRegEx - Return all packages in the cache matching a pattern /*{{{*/
+bool CacheSetHelper::PackageFromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) {
        static const char * const isregex = ".?+*|[^$";
        if (pattern.find_first_of(isregex) == std::string::npos)
                return false;
 
        bool const wasEmpty = pci->empty();
        if (wasEmpty == true)
-               pci->setConstructor(REGEX);
+               pci->setConstructor(CacheSetHelper::REGEX);
 
        size_t archfound = pattern.find_last_of(':');
        std::string arch = "native";
@@ -149,28 +165,25 @@ bool PackageContainerInterface::FromRegEx(PackageContainerInterface * const pci,
                }
 
                pci->insert(Pkg);
-               helper.showRegExSelection(Pkg, pattern);
+               showPackageSelection(Pkg, CacheSetHelper::REGEX, pattern);
                found = true;
        }
 
        if (found == false) {
-               helper.canNotFindRegEx(pci, Cache, pattern);
-               pci->setConstructor(UNKNOWN);
+               canNotFindPackage(CacheSetHelper::REGEX, pci, Cache, pattern);
+               pci->setConstructor(CacheSetHelper::UNKNOWN);
                return false;
        }
 
-       if (wasEmpty == false && pci->getConstructor() != UNKNOWN)
-               pci->setConstructor(UNKNOWN);
+       if (wasEmpty == false && pci->getConstructor() != CacheSetHelper::UNKNOWN)
+               pci->setConstructor(CacheSetHelper::UNKNOWN);
 
        return true;
 }
                                                                        /*}}}*/
-// FromFnmatch - Returns the package defined  by this fnmatch          /*{{{*/
-bool 
-PackageContainerInterface::FromFnmatch(PackageContainerInterface * const pci, 
-                                       pkgCacheFile &Cache,
-                                       std::string pattern,
-                                       CacheSetHelper &helper)
+// PackageFromFnmatch - Returns the package defined  by this fnmatch   /*{{{*/
+bool CacheSetHelper::PackageFromFnmatch(PackageContainerInterface * const pci,
+                                       pkgCacheFile &Cache, std::string pattern)
 {
        static const char * const isfnmatch = ".?*[]!";
        if (pattern.find_first_of(isfnmatch) == std::string::npos)
@@ -178,7 +191,7 @@ PackageContainerInterface::FromFnmatch(PackageContainerInterface * const pci,
 
        bool const wasEmpty = pci->empty();
        if (wasEmpty == true)
-               pci->setConstructor(FNMATCH);
+               pci->setConstructor(CacheSetHelper::FNMATCH);
 
        size_t archfound = pattern.find_last_of(':');
        std::string arch = "native";
@@ -212,33 +225,25 @@ PackageContainerInterface::FromFnmatch(PackageContainerInterface * const pci,
                }
 
                pci->insert(Pkg);
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-               helper.showFnmatchSelection(Pkg, pattern);
-#else
-               helper.showRegExSelection(Pkg, pattern);
-#endif
+               showPackageSelection(Pkg, CacheSetHelper::FNMATCH, pattern);
                found = true;
        }
 
        if (found == false) {
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-               helper.canNotFindFnmatch(pci, Cache, pattern);
-#else
-                helper.canNotFindRegEx(pci, Cache, pattern);
-#endif
-               pci->setConstructor(UNKNOWN);
+               canNotFindPackage(CacheSetHelper::FNMATCH, pci, Cache, pattern);
+               pci->setConstructor(CacheSetHelper::UNKNOWN);
                return false;
        }
 
-       if (wasEmpty == false && pci->getConstructor() != UNKNOWN)
-               pci->setConstructor(UNKNOWN);
+       if (wasEmpty == false && pci->getConstructor() != CacheSetHelper::UNKNOWN)
+               pci->setConstructor(CacheSetHelper::UNKNOWN);
 
        return true;
 }
                                                                        /*}}}*/
-// FromName - Returns the package defined  by this string              /*{{{*/
-pkgCache::PkgIterator PackageContainerInterface::FromName(pkgCacheFile &Cache,
-                       std::string const &str, CacheSetHelper &helper) {
+// PackageFromName - Returns the package defined  by this string       /*{{{*/
+pkgCache::PkgIterator CacheSetHelper::PackageFromName(pkgCacheFile &Cache,
+                       std::string const &str) {
        std::string pkg = str;
        size_t archfound = pkg.find_last_of(':');
        std::string arch;
@@ -259,13 +264,13 @@ pkgCache::PkgIterator PackageContainerInterface::FromName(pkgCacheFile &Cache,
                Pkg = Cache.GetPkgCache()->FindPkg(pkg, arch);
 
        if (Pkg.end() == true)
-               return helper.canNotFindPkgName(Cache, str);
+               return canNotFindPkgName(Cache, str);
        return Pkg;
 }
                                                                        /*}}}*/
-// FromGroup - Returns the package defined  by this string             /*{{{*/
-bool PackageContainerInterface::FromGroup(PackageContainerInterface * const pci, pkgCacheFile &Cache,
-                       std::string pkg, CacheSetHelper &helper) {
+// PackageFromPackageName - Returns the package defined  by this string /*{{{*/
+bool CacheSetHelper::PackageFromPackageName(PackageContainerInterface * const pci, pkgCacheFile &Cache,
+                       std::string pkg) {
        if (unlikely(Cache.GetPkgCache() == 0))
                return false;
 
@@ -305,7 +310,7 @@ bool PackageContainerInterface::FromGroup(PackageContainerInterface * const pci,
                }
        }
 
-       pkgCache::PkgIterator Pkg = helper.canNotFindPkgName(Cache, pkg);
+       pkgCache::PkgIterator Pkg = canNotFindPkgName(Cache, pkg);
        if (Pkg.end() == true)
           return false;
 
@@ -313,19 +318,18 @@ bool PackageContainerInterface::FromGroup(PackageContainerInterface * const pci,
        return true;
 }
                                                                        /*}}}*/
-// FromString - Return all packages matching a specific string         /*{{{*/
-bool PackageContainerInterface::FromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str, CacheSetHelper &helper) {
+// PackageFromString - Return all packages matching a specific string  /*{{{*/
+bool CacheSetHelper::PackageFromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str) {
        bool found = true;
        _error->PushToStack();
 
-       if (FromGroup(pci, Cache, str, helper) == false &&
-                FromTask(pci, Cache, str, helper) == false &&
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-                FromFnmatch(pci, Cache, str, helper) == false)
-#endif
-                FromRegEx(pci, Cache, str, helper) == false)
+       if (PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, str) == false &&
+                PackageFrom(CacheSetHelper::TASK, pci, Cache, str) == false &&
+                // FIXME: hm, hm, regexp/fnmatch incompatible?
+                PackageFrom(CacheSetHelper::FNMATCH, pci, Cache, str) == false &&
+                PackageFrom(CacheSetHelper::REGEX, pci, Cache, str) == false)
        {
-               helper.canNotFindPackage(pci, Cache, str);
+               canNotFindPackage(CacheSetHelper::PACKAGENAME, pci, Cache, str);
                found = false;
        }
 
@@ -336,51 +340,50 @@ bool PackageContainerInterface::FromString(PackageContainerInterface * const pci
        return found;
 }
                                                                        /*}}}*/
-// FromCommandLine - Return all packages specified on commandline      /*{{{*/
-bool PackageContainerInterface::FromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper) {
+// PackageFromCommandLine - Return all packages specified on commandline /*{{{*/
+bool CacheSetHelper::PackageFromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline) {
        bool found = false;
        for (const char **I = cmdline; *I != 0; ++I)
-               found |= PackageContainerInterface::FromString(pci, Cache, *I, helper);
+               found |= PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, *I);
        return found;
 }
                                                                        /*}}}*/
 // FromModifierCommandLine - helper doing the work for PKG:GroupedFromCommandLine      /*{{{*/
-bool PackageContainerInterface::FromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci,
+bool CacheSetHelper::PackageFromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci,
                                                        pkgCacheFile &Cache, const char * cmdline,
-                                                       std::list<Modifier> const &mods, CacheSetHelper &helper) {
+                                                       std::list<PkgModifier> const &mods) {
        std::string str = cmdline;
        unsigned short fallback = modID;
        bool modifierPresent = false;
-       for (std::list<Modifier>::const_iterator mod = mods.begin();
+       for (std::list<PkgModifier>::const_iterator mod = mods.begin();
             mod != mods.end(); ++mod) {
                size_t const alength = strlen(mod->Alias);
                switch(mod->Pos) {
-               case Modifier::POSTFIX:
+               case PkgModifier::POSTFIX:
                        if (str.compare(str.length() - alength, alength,
                                        mod->Alias, 0, alength) != 0)
                                continue;
                        str.erase(str.length() - alength);
                        modID = mod->ID;
                        break;
-               case Modifier::PREFIX:
+               case PkgModifier::PREFIX:
                        continue;
-               case Modifier::NONE:
+               case PkgModifier::NONE:
                        continue;
                }
                modifierPresent = true;
                break;
        }
        if (modifierPresent == true) {
-               bool const errors = helper.showErrors(false);
-               pkgCache::PkgIterator Pkg = FromName(Cache, cmdline, helper);
-               helper.showErrors(errors);
-               if (Pkg.end() == false) {
-                       pci->insert(Pkg);
+               bool const errors = showErrors(false);
+               bool const found = PackageFrom(PACKAGENAME, pci, Cache, cmdline);
+               showErrors(errors);
+               if (found == true) {
                        modID = fallback;
                        return true;
                }
        }
-       return FromString(pci, Cache, str, helper);
+       return PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, str);
 }
                                                                        /*}}}*/
 // FromModifierCommandLine - helper doing the work for VER:GroupedFromCommandLine      /*{{{*/
@@ -389,7 +392,7 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID,
                                                        pkgCacheFile &Cache, const char * cmdline,
                                                        std::list<Modifier> const &mods,
                                                        CacheSetHelper &helper) {
-       Version select = NEWEST;
+       CacheSetHelper::VerSelector select = CacheSetHelper::NEWEST;
        std::string str = cmdline;
        if (unlikely(str.empty() == true))
                return false;
@@ -432,7 +435,8 @@ bool VersionContainerInterface::FromModifierCommandLine(unsigned short &modID,
 // FromCommandLine - Return all versions specified on commandline      /*{{{*/
 bool VersionContainerInterface::FromCommandLine(VersionContainerInterface * const vci,
                                                pkgCacheFile &Cache, const char **cmdline,
-                                               Version const &fallback, CacheSetHelper &helper) {
+                                               CacheSetHelper::VerSelector const fallback,
+                                               CacheSetHelper &helper) {
        bool found = false;
        for (const char **I = cmdline; *I != 0; ++I)
                found |= VersionContainerInterface::FromString(vci, Cache, *I, fallback, helper);
@@ -442,8 +446,17 @@ bool VersionContainerInterface::FromCommandLine(VersionContainerInterface * cons
 // FromString - Returns all versions spedcified by a string            /*{{{*/
 bool VersionContainerInterface::FromString(VersionContainerInterface * const vci,
                                           pkgCacheFile &Cache, std::string pkg,
-                                          Version const &fallback, CacheSetHelper &helper,
+                                          CacheSetHelper::VerSelector const fallback,
+                                          CacheSetHelper &helper,
                                           bool const onlyFromName) {
+       PackageSet pkgset;
+       if(FileExists(pkg)) {
+               helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg);
+               if(pkgset.empty() == true)
+                       return false;
+               return VersionContainerInterface::FromPackage(vci, Cache, pkgset.begin(), fallback, helper);
+       }
+
        std::string ver;
        bool verIsRel = false;
        size_t const vertag = pkg.find_last_of("/=");
@@ -452,15 +465,14 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
                verIsRel = (pkg[vertag] == '/');
                pkg.erase(vertag);
        }
-       PackageSet pkgset;
        if (onlyFromName == false)
-               PackageContainerInterface::FromString(&pkgset, Cache, pkg, helper);
+               helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg);
        else {
-               pkgset.insert(PackageContainerInterface::FromName(Cache, pkg, helper));
+               helper.PackageFrom(CacheSetHelper::PACKAGENAME, &pkgset, Cache, pkg);
        }
 
        bool errors = true;
-       if (pkgset.getConstructor() != PackageSet::UNKNOWN)
+       if (pkgset.getConstructor() != CacheSetHelper::UNKNOWN)
                errors = helper.showErrors(false);
 
        bool found = false;
@@ -479,7 +491,7 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
                        if (P->VersionList != 0)
                                V = P.VersionList();
                        else
-                               V = helper.canNotFindNewestVer(Cache, P);
+                               V = helper.canNotGetVersion(CacheSetHelper::NEWEST, Cache, P);
                } else {
                        pkgVersionMatch Match(ver, (verIsRel == true ? pkgVersionMatch::Release :
                                        pkgVersionMatch::Version));
@@ -496,11 +508,14 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
                }
                if (V.end() == true)
                        continue;
-               helper.showSelectedVersion(P, V, ver, verIsRel);
+               if (verIsRel == true)
+                       helper.showVersionSelection(P, V, CacheSetHelper::RELEASE, ver);
+               else
+                       helper.showVersionSelection(P, V, CacheSetHelper::VERSIONNUMBER, ver);
                vci->insert(V);
                found = true;
        }
-       if (pkgset.getConstructor() != PackageSet::UNKNOWN)
+       if (pkgset.getConstructor() != CacheSetHelper::UNKNOWN)
                helper.showErrors(errors);
        return found;
 }
@@ -509,30 +524,30 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
 bool VersionContainerInterface::FromPackage(VersionContainerInterface * const vci,
                                            pkgCacheFile &Cache,
                                            pkgCache::PkgIterator const &P,
-                                           Version const &fallback,
+                                           CacheSetHelper::VerSelector const fallback,
                                            CacheSetHelper &helper) {
        pkgCache::VerIterator V;
        bool showErrors;
        bool found = false;
        switch(fallback) {
-       case ALL:
+       case CacheSetHelper::ALL:
                if (P->VersionList != 0)
                        for (V = P.VersionList(); V.end() != true; ++V)
                                found |= vci->insert(V);
                else
-                       helper.canNotFindAllVer(vci, Cache, P);
+                       helper.canNotFindVersion(CacheSetHelper::ALL, vci, Cache, P);
                break;
-       case CANDANDINST:
+       case CacheSetHelper::CANDANDINST:
                found |= vci->insert(getInstalledVer(Cache, P, helper));
                found |= vci->insert(getCandidateVer(Cache, P, helper));
                break;
-       case CANDIDATE:
+       case CacheSetHelper::CANDIDATE:
                found |= vci->insert(getCandidateVer(Cache, P, helper));
                break;
-       case INSTALLED:
+       case CacheSetHelper::INSTALLED:
                found |= vci->insert(getInstalledVer(Cache, P, helper));
                break;
-       case CANDINST:
+       case CacheSetHelper::CANDINST:
                showErrors = helper.showErrors(false);
                V = getCandidateVer(Cache, P, helper);
                if (V.end() == true)
@@ -541,9 +556,9 @@ bool VersionContainerInterface::FromPackage(VersionContainerInterface * const vc
                if (V.end() == false)
                        found |= vci->insert(V);
                else
-                       helper.canNotFindInstCandVer(vci, Cache, P);
+                       helper.canNotFindVersion(CacheSetHelper::CANDINST, vci, Cache, P);
                break;
-       case INSTCAND:
+       case CacheSetHelper::INSTCAND:
                showErrors = helper.showErrors(false);
                V = getInstalledVer(Cache, P, helper);
                if (V.end() == true)
@@ -552,14 +567,18 @@ bool VersionContainerInterface::FromPackage(VersionContainerInterface * const vc
                if (V.end() == false)
                        found |= vci->insert(V);
                else
-                       helper.canNotFindInstCandVer(vci, Cache, P);
+                       helper.canNotFindVersion(CacheSetHelper::INSTCAND, vci, Cache, P);
                break;
-       case NEWEST:
+       case CacheSetHelper::NEWEST:
                if (P->VersionList != 0)
                        found |= vci->insert(P.VersionList());
                else
-                       helper.canNotFindNewestVer(Cache, P);
+                       helper.canNotFindVersion(CacheSetHelper::NEWEST, vci, Cache, P);
                break;
+       case CacheSetHelper::RELEASE:
+       case CacheSetHelper::VERSIONNUMBER:
+               // both make no sense here, so always false
+               return false;
        }
        return found;
 }
@@ -576,7 +595,7 @@ pkgCache::VerIterator VersionContainerInterface::getCandidateVer(pkgCacheFile &C
                Cand = Cache[Pkg].CandidateVerIter(Cache);
        }
        if (Cand.end() == true)
-               return helper.canNotFindCandidateVer(Cache, Pkg);
+               return helper.canNotGetVersion(CacheSetHelper::CANDIDATE, Cache, Pkg);
        return Cand;
 }
                                                                        /*}}}*/
@@ -584,19 +603,26 @@ pkgCache::VerIterator VersionContainerInterface::getCandidateVer(pkgCacheFile &C
 pkgCache::VerIterator VersionContainerInterface::getInstalledVer(pkgCacheFile &Cache,
                pkgCache::PkgIterator const &Pkg, CacheSetHelper &helper) {
        if (Pkg->CurrentVer == 0)
-               return helper.canNotFindInstalledVer(Cache, Pkg);
+               return helper.canNotGetVersion(CacheSetHelper::INSTALLED, Cache, Pkg);
        return Pkg.CurrentVer();
 }
                                                                        /*}}}*/
 
-// canNotFindPkgName - handle the case no package has this name                /*{{{*/
-pkgCache::PkgIterator CacheSetHelper::canNotFindPkgName(pkgCacheFile &Cache,
-                       std::string const &str) {
-       if (ShowError == true)
-               _error->Insert(ErrorType, _("Unable to locate package %s"), str.c_str());
-       return pkgCache::PkgIterator(Cache, 0);
+// canNotFindPackage - with the given selector and pattern             /*{{{*/
+void CacheSetHelper::canNotFindPackage(enum PkgSelector const select,
+      PackageContainerInterface * const pci, pkgCacheFile &Cache,
+      std::string const &pattern) {
+       switch (select) {
+APT_IGNORE_DEPRECATED_PUSH
+       case REGEX: canNotFindRegEx(pci, Cache, pattern); break;
+       case TASK: canNotFindTask(pci, Cache, pattern); break;
+       case FNMATCH: canNotFindFnmatch(pci, Cache, pattern); break;
+       case PACKAGENAME: canNotFindPackage(pci, Cache, pattern); break;
+       case STRING: canNotFindPackage(pci, Cache, pattern); break;
+       case UNKNOWN: break;
+APT_IGNORE_DEPRECATED_POP
+       }
 }
-                                                                       /*}}}*/
 // canNotFindTask - handle the case no package is found for a task     /*{{{*/
 void CacheSetHelper::canNotFindTask(PackageContainerInterface * const /*pci*/, pkgCacheFile &/*Cache*/, std::string pattern) {
        if (ShowError == true)
@@ -608,17 +634,45 @@ void CacheSetHelper::canNotFindRegEx(PackageContainerInterface * const /*pci*/,
        if (ShowError == true)
                _error->Insert(ErrorType, _("Couldn't find any package by regex '%s'"), pattern.c_str());
 }
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+                                                                       /*}}}*/
 // canNotFindFnmatch - handle the case no package is found by a fnmatch        /*{{{*/
-void CacheSetHelper::canNotFindFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern) {
+   void CacheSetHelper::canNotFindFnmatch(PackageContainerInterface * const /*pci*/, pkgCacheFile &/*Cache*/, std::string pattern) {
        if (ShowError == true)
                _error->Insert(ErrorType, _("Couldn't find any package by glob '%s'"), pattern.c_str());
 }
-#endif                                                                 /*}}}*/
+                                                                       /*}}}*/
 // canNotFindPackage - handle the case no package is found from a string/*{{{*/
 APT_CONST void CacheSetHelper::canNotFindPackage(PackageContainerInterface * const /*pci*/, pkgCacheFile &/*Cache*/, std::string const &/*str*/) {
 }
                                                                        /*}}}*/
+                                                                       /*}}}*/
+// canNotFindPkgName - handle the case no package has this name                /*{{{*/
+pkgCache::PkgIterator CacheSetHelper::canNotFindPkgName(pkgCacheFile &Cache,
+                       std::string const &str) {
+       if (ShowError == true)
+               _error->Insert(ErrorType, _("Unable to locate package %s"), str.c_str());
+       return pkgCache::PkgIterator(Cache, 0);
+}
+                                                                       /*}}}*/
+// canNotFindVersion - for package by selector                         /*{{{*/
+void CacheSetHelper::canNotFindVersion(enum VerSelector const select, VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg)
+{
+       switch (select) {
+APT_IGNORE_DEPRECATED_PUSH
+       case ALL: canNotFindAllVer(vci, Cache, Pkg); break;
+       case INSTCAND: canNotFindInstCandVer(vci, Cache, Pkg); break;
+       case CANDINST: canNotFindCandInstVer(vci, Cache, Pkg); break;
+       case NEWEST: canNotFindNewestVer(Cache, Pkg); break;
+       case CANDIDATE: canNotFindCandidateVer(Cache, Pkg); break;
+       case INSTALLED: canNotFindInstalledVer(Cache, Pkg); break;
+APT_IGNORE_DEPRECATED_POP
+       case CANDANDINST: canNotGetCandInstVer(Cache, Pkg); break;
+       case RELEASE:
+       case VERSIONNUMBER:
+               // invalid in this branch
+               break;
+       }
+}
 // canNotFindAllVer                                                    /*{{{*/
 void CacheSetHelper::canNotFindAllVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &/*Cache*/,
                pkgCache::PkgIterator const &Pkg) {
@@ -627,19 +681,37 @@ void CacheSetHelper::canNotFindAllVer(VersionContainerInterface * const /*vci*/,
 }
                                                                        /*}}}*/
 // canNotFindInstCandVer                                               /*{{{*/
-void CacheSetHelper::canNotFindInstCandVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &/*Cache*/,
+void CacheSetHelper::canNotFindInstCandVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &Cache,
                pkgCache::PkgIterator const &Pkg) {
-       if (ShowError == true)
-               _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str());
+       canNotGetInstCandVer(Cache, Pkg);
 }
                                                                        /*}}}*/
 // canNotFindInstCandVer                                               /*{{{*/
-void CacheSetHelper::canNotFindCandInstVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &/*Cache*/,
+void CacheSetHelper::canNotFindCandInstVer(VersionContainerInterface * const /*vci*/, pkgCacheFile &Cache,
                pkgCache::PkgIterator const &Pkg) {
-       if (ShowError == true)
-               _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str());
+       canNotGetCandInstVer(Cache, Pkg);
 }
                                                                        /*}}}*/
+                                                                       /*}}}*/
+// canNotGetVersion - for package by selector                          /*{{{*/
+pkgCache::VerIterator CacheSetHelper::canNotGetVersion(enum VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
+       switch (select) {
+APT_IGNORE_DEPRECATED_PUSH
+       case NEWEST: return canNotFindNewestVer(Cache, Pkg);
+       case CANDIDATE: return canNotFindCandidateVer(Cache, Pkg);
+       case INSTALLED: return canNotFindInstalledVer(Cache, Pkg);
+APT_IGNORE_DEPRECATED_POP
+       case CANDINST: return canNotGetCandInstVer(Cache, Pkg);
+       case INSTCAND: return canNotGetInstCandVer(Cache, Pkg);
+       case ALL:
+       case CANDANDINST:
+       case RELEASE:
+       case VERSIONNUMBER:
+               // invalid in this branch
+               return pkgCache::VerIterator(Cache, 0);
+       }
+       return pkgCache::VerIterator(Cache, 0);
+}
 // canNotFindNewestVer                                                 /*{{{*/
 pkgCache::VerIterator CacheSetHelper::canNotFindNewestVer(pkgCacheFile &Cache,
                pkgCache::PkgIterator const &Pkg) {
@@ -664,6 +736,37 @@ pkgCache::VerIterator CacheSetHelper::canNotFindInstalledVer(pkgCacheFile &Cache
        return pkgCache::VerIterator(Cache, 0);
 }
                                                                        /*}}}*/
+// canNotFindInstCandVer                                               /*{{{*/
+pkgCache::VerIterator CacheSetHelper::canNotGetInstCandVer(pkgCacheFile &Cache,
+               pkgCache::PkgIterator const &Pkg) {
+       if (ShowError == true)
+               _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str());
+       return pkgCache::VerIterator(Cache, 0);
+}
+                                                                       /*}}}*/
+// canNotFindInstCandVer                                               /*{{{*/
+pkgCache::VerIterator CacheSetHelper::canNotGetCandInstVer(pkgCacheFile &Cache,
+               pkgCache::PkgIterator const &Pkg) {
+       if (ShowError == true)
+               _error->Insert(ErrorType, _("Can't select installed nor candidate version from package '%s' as it has neither of them"), Pkg.FullName(true).c_str());
+       return pkgCache::VerIterator(Cache, 0);
+}
+                                                                       /*}}}*/
+                                                                       /*}}}*/
+// showPackageSelection - by selector and given pattern                        /*{{{*/
+APT_CONST void CacheSetHelper::showPackageSelection(pkgCache::PkgIterator const &pkg, enum PkgSelector const select,
+                                      std::string const &pattern) {
+       switch (select) {
+APT_IGNORE_DEPRECATED_PUSH
+       case REGEX: showRegExSelection(pkg, pattern); break;
+       case TASK: showTaskSelection(pkg, pattern); break;
+       case FNMATCH: showFnmatchSelection(pkg, pattern); break;
+APT_IGNORE_DEPRECATED_POP
+       case PACKAGENAME: /* no suprises here */ break;
+       case STRING: /* handled by the special cases */ break;
+       case UNKNOWN: break;
+       }
+}
 // showTaskSelection                                                   /*{{{*/
 APT_CONST void CacheSetHelper::showTaskSelection(pkgCache::PkgIterator const &/*pkg*/,
                                       std::string const &/*pattern*/) {
@@ -674,14 +777,35 @@ APT_CONST void CacheSetHelper::showRegExSelection(pkgCache::PkgIterator const &/
                                        std::string const &/*pattern*/) {
 }
                                                                        /*}}}*/
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
 // showFnmatchSelection                                                        /*{{{*/
-APT_CONST void CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator const &pkg,
-                                          std::string const &pattern) {
+APT_CONST void CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator const &/*pkg*/,
+                                         std::string const &/*pattern*/) {
 }
                                                                        /*}}}*/
-#endif
-// showSelectedVersion                                                 /*{{{*/
+                                                                       /*}}}*/
+// showVersionSelection                                                        /*{{{*/
+APT_CONST void CacheSetHelper::showVersionSelection(pkgCache::PkgIterator const &Pkg,
+      pkgCache::VerIterator const &Ver, enum VerSelector const select, std::string const &pattern) {
+       switch (select) {
+APT_IGNORE_DEPRECATED_PUSH
+       case RELEASE:
+               showSelectedVersion(Pkg, Ver, pattern, true);
+               break;
+       case VERSIONNUMBER:
+               showSelectedVersion(Pkg, Ver, pattern, false);
+               break;
+APT_IGNORE_DEPRECATED_POP
+       case NEWEST:
+       case CANDIDATE:
+       case INSTALLED:
+       case CANDINST:
+       case INSTCAND:
+       case ALL:
+       case CANDANDINST:
+               // not really suprises, but in fact: just not implemented
+               break;
+       }
+}
 APT_CONST void CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator const &/*Pkg*/,
                                         pkgCache::VerIterator const /*Ver*/,
                                         std::string const &/*ver*/,
index b7229bc046c7a1f433d14984e7bc7e4a538d3627..884e8b859cff9aced5259d3251c0a8b75cd49800 100644 (file)
 #include <map>
 #include <set>
 #include <list>
+#include <vector>
 #include <string>
 #include <iterator>
+#include <algorithm>
 
 #include <stddef.h>
 
 #include <apt-pkg/error.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/macros.h>
 
 #ifndef APT_8_CLEANER_HEADERS
 #include <apt-pkg/cachefile.h>
@@ -51,36 +54,127 @@ public:                                                                    /*{{{*/
                        ShowError(ShowError), ErrorType(ErrorType) {}
        virtual ~CacheSetHelper() {}
 
-       virtual void showTaskSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern);
-       virtual void showRegExSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern);
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-       virtual void showFnmatchSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern);
-#endif
-       virtual void showSelectedVersion(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const Ver,
-                                std::string const &ver, bool const verIsRel);
+       enum PkgSelector { UNKNOWN, REGEX, TASK, FNMATCH, PACKAGENAME, STRING };
 
-       virtual void canNotFindTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
-       virtual void canNotFindRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-       virtual void canNotFindFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
-#endif
-       virtual void canNotFindPackage(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str);
+       virtual bool PackageFrom(enum PkgSelector const select, PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern);
+
+       virtual bool PackageFromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline);
+
+       struct PkgModifier {
+               enum Position { NONE, PREFIX, POSTFIX };
+               unsigned short ID;
+               const char * const Alias;
+               Position Pos;
+               PkgModifier (unsigned short const &id, const char * const alias, Position const &pos) : ID(id), Alias(alias), Pos(pos) {}
+       };
+       virtual bool PackageFromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci,
+                                           pkgCacheFile &Cache, const char * cmdline,
+                                           std::list<PkgModifier> const &mods);
+
+       // use PackageFrom(PACKAGENAME, …) instead
+       APT_DEPRECATED pkgCache::PkgIterator PackageFromName(pkgCacheFile &Cache, std::string const &pattern);
+
+       /** \brief be notified about the package being selected via pattern
+        *
+        * Main use is probably to show a message to the user what happened
+        *
+        * \param pkg is the package which was selected
+        * \param select is the selection method which choose the package
+        * \param pattern is the string used by the selection method to pick the package
+        */
+       virtual void showPackageSelection(pkgCache::PkgIterator const &pkg, PkgSelector const select, std::string const &pattern);
+       // use the method above instead, react only on the type you need and let the base handle the rest if need be
+       // this allows use to add new selection methods without breaking the ABI constantly with new virtual methods
+       APT_DEPRECATED virtual void showTaskSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern);
+       APT_DEPRECATED virtual void showRegExSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern);
+       APT_DEPRECATED virtual void showFnmatchSelection(pkgCache::PkgIterator const &pkg, std::string const &pattern);
+
+       /** \brief be notified if a package can't be found via pattern
+        *
+        * Can be used to show a message as well as to try something else to make it match
+        *
+        * \param select is the method tried for selection
+        * \param pci is the container the package should be inserted in
+        * \param Cache is the package universe available
+        * \param pattern is the string not matching anything
+        */
+       virtual void canNotFindPackage(enum PkgSelector const select, PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern);
+       // same as above for showPackageSelection
+       APT_DEPRECATED virtual void canNotFindTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       APT_DEPRECATED virtual void canNotFindRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       APT_DEPRECATED virtual void canNotFindFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       APT_DEPRECATED virtual void canNotFindPackage(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &str);
+
+       /** \brief specifies which version(s) we want to refer to */
+       enum VerSelector {
+               /** by release string */
+               RELEASE,
+               /** by version number string */
+               VERSIONNUMBER,
+               /** All versions */
+               ALL,
+               /** Candidate and installed version */
+               CANDANDINST,
+               /** Candidate version */
+               CANDIDATE,
+               /** Installed version */
+               INSTALLED,
+               /** Candidate or if non installed version */
+               CANDINST,
+               /** Installed or if non candidate version */
+               INSTCAND,
+               /** Newest version */
+               NEWEST
+       };
+
+       /** \brief be notified about the version being selected via pattern
+        *
+        * Main use is probably to show a message to the user what happened
+        * Note that at the moment this method is only called for RELEASE
+        * and VERSION selections, not for the others.
+        *
+        * \param Pkg is the package which was selected for
+        * \param Ver is the version selected
+        * \param select is the selection method which choose the version
+        * \param pattern is the string used by the selection method to pick the version
+        */
+       virtual void showVersionSelection(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const &Ver,
+             enum VerSelector const select, std::string const &pattern);
+       // renamed to have a similar interface to showPackageSelection
+       APT_DEPRECATED virtual void showSelectedVersion(pkgCache::PkgIterator const &Pkg, pkgCache::VerIterator const Ver,
+                                std::string const &ver, bool const verIsRel);
 
-       virtual void canNotFindAllVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg);
-       virtual void canNotFindInstCandVer(VersionContainerInterface * const vci, pkgCacheFile &Cache,
+       /** \brief be notified if a version can't be found for a package
+        *
+        * Main use is probably to show a message to the user what happened
+        *
+        * \param select is the method tried for selection
+        * \param vci is the container the version should be inserted in
+        * \param Cache is the package universe available
+        * \param Pkg is the package we wanted a version from
+        */
+       virtual void canNotFindVersion(enum VerSelector const select, VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg);
+       // same as above for showPackageSelection
+       APT_DEPRECATED virtual void canNotFindAllVer(VersionContainerInterface * const vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg);
+       APT_DEPRECATED virtual void canNotFindInstCandVer(VersionContainerInterface * const vci, pkgCacheFile &Cache,
                                pkgCache::PkgIterator const &Pkg);
-       virtual void canNotFindCandInstVer(VersionContainerInterface * const vci,
+       APT_DEPRECATED virtual void canNotFindCandInstVer(VersionContainerInterface * const vci,
                                pkgCacheFile &Cache,
                                pkgCache::PkgIterator const &Pkg);
 
-       virtual pkgCache::PkgIterator canNotFindPkgName(pkgCacheFile &Cache, std::string const &str);
-       virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache,
+       // the difference between canNotFind and canNotGet is that the later is more low-level
+       // and called from other places: In this case looking into the code is the only real answer…
+       virtual pkgCache::VerIterator canNotGetVersion(enum VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg);
+       // same as above for showPackageSelection
+       APT_DEPRECATED virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache,
                                pkgCache::PkgIterator const &Pkg);
-       virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache,
+       APT_DEPRECATED virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache,
                                pkgCache::PkgIterator const &Pkg);
-       virtual pkgCache::VerIterator canNotFindInstalledVer(pkgCacheFile &Cache,
+       APT_DEPRECATED virtual pkgCache::VerIterator canNotFindInstalledVer(pkgCacheFile &Cache,
                                pkgCache::PkgIterator const &Pkg);
 
+       virtual pkgCache::PkgIterator canNotFindPkgName(pkgCacheFile &Cache, std::string const &str);
+
        bool showErrors() const { return ShowError; }
        bool showErrors(bool const newValue) { if (ShowError == newValue) return ShowError; else return ((ShowError = newValue) == false); }
        GlobalError::MsgType errorType() const { return ErrorType; }
@@ -98,7 +192,19 @@ public:                                                                     /*{{{*/
 protected:
        bool ShowError;
        GlobalError::MsgType ErrorType;
+
+       pkgCache::VerIterator canNotGetInstCandVer(pkgCacheFile &Cache,
+               pkgCache::PkgIterator const &Pkg);
+       pkgCache::VerIterator canNotGetCandInstVer(pkgCacheFile &Cache,
+               pkgCache::PkgIterator const &Pkg);
+
+       bool PackageFromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       bool PackageFromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       bool PackageFromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       bool PackageFromPackageName(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern);
+       bool PackageFromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern);
 };                                                                     /*}}}*/
+
 class PackageContainerInterface {                                      /*{{{*/
 /** \class PackageContainerInterface
 
@@ -119,14 +225,7 @@ public:
                inline std::string FullName(bool const Pretty) const { return getPkg().FullName(Pretty); }
                inline std::string FullName() const { return getPkg().FullName(); }
                APT_DEPRECATED inline const char *Section() const {
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic push
-       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
-          return getPkg().Section();
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic pop
-#endif
+                  APT_IGNORE_DEPRECATED(return getPkg().Section();)
                }
                inline bool Purge() const {return getPkg().Purge(); }
                inline const char *Arch() const {return getPkg().Arch(); }
@@ -151,29 +250,46 @@ public:
        virtual bool empty() const = 0;
        virtual void clear() = 0;
 
-       enum Constructor { UNKNOWN, REGEX, TASK, FNMATCH };
-       virtual void setConstructor(Constructor const &con) = 0;
-       virtual Constructor getConstructor() const = 0;
-
-       static bool FromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper);
-       static bool FromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper);
-       static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper);
-       static bool FromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper);
-       static bool FromGroup(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper);
-       static bool FromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper);
-       static bool FromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper);
-
-       struct Modifier {
-               enum Position { NONE, PREFIX, POSTFIX };
-               unsigned short ID;
-               const char * const Alias;
-               Position Pos;
-               Modifier (unsigned short const &id, const char * const alias, Position const &pos) : ID(id), Alias(alias), Pos(pos) {}
-       };
-
-       static bool FromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci,
-                                           pkgCacheFile &Cache, const char * cmdline,
-                                           std::list<Modifier> const &mods, CacheSetHelper &helper);
+       // FIXME: This is a bloody hack removed soon. Use CacheSetHelper::PkgSelector !
+       enum APT_DEPRECATED Constructor { UNKNOWN = CacheSetHelper::UNKNOWN,
+               REGEX = CacheSetHelper::REGEX,
+               TASK = CacheSetHelper::TASK,
+               FNMATCH = CacheSetHelper::FNMATCH };
+APT_IGNORE_DEPRECATED_PUSH
+       void setConstructor(Constructor const by) { ConstructedBy = (CacheSetHelper::PkgSelector)by; }
+APT_IGNORE_DEPRECATED_POP
+
+       void setConstructor(CacheSetHelper::PkgSelector const by) { ConstructedBy = by; }
+       CacheSetHelper::PkgSelector getConstructor() const { return ConstructedBy; }
+       PackageContainerInterface() : ConstructedBy(CacheSetHelper::UNKNOWN) {}
+       PackageContainerInterface(CacheSetHelper::PkgSelector const by) : ConstructedBy(by) {}
+
+       APT_DEPRECATED static bool FromTask(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
+          return helper.PackageFrom(CacheSetHelper::TASK, pci, Cache, pattern); }
+       APT_DEPRECATED static bool FromRegEx(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
+          return helper.PackageFrom(CacheSetHelper::REGEX, pci, Cache, pattern); }
+       APT_DEPRECATED static bool FromFnmatch(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
+          return helper.PackageFrom(CacheSetHelper::FNMATCH, pci, Cache, pattern); }
+       APT_DEPRECATED static bool FromGroup(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
+          return helper.PackageFrom(CacheSetHelper::PACKAGENAME, pci, Cache, pattern); }
+       APT_DEPRECATED static bool FromString(PackageContainerInterface * const pci, pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
+          return helper.PackageFrom(CacheSetHelper::STRING, pci, Cache, pattern); }
+       APT_DEPRECATED static bool FromCommandLine(PackageContainerInterface * const pci, pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper) {
+          return helper.PackageFromCommandLine(pci, Cache, cmdline); }
+
+       APT_DEPRECATED typedef CacheSetHelper::PkgModifier Modifier;
+
+APT_IGNORE_DEPRECATED_PUSH
+       APT_DEPRECATED static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
+          return helper.PackageFromName(Cache, pattern); }
+       APT_DEPRECATED static bool FromModifierCommandLine(unsigned short &modID, PackageContainerInterface * const pci,
+             pkgCacheFile &Cache, const char * cmdline,
+             std::list<Modifier> const &mods, CacheSetHelper &helper) {
+          return helper.PackageFromModifierCommandLine(modID, pci, Cache, cmdline, mods); }
+APT_IGNORE_DEPRECATED_POP
+
+private:
+       CacheSetHelper::PkgSelector ConstructedBy;
 };
                                                                        /*}}}*/
 template<class Container> class PackageContainer : public PackageContainerInterface {/*{{{*/
@@ -237,11 +353,23 @@ public:                                                                   /*{{{*/
        iterator end() { return iterator(_cont.end()); }
        const_iterator find(pkgCache::PkgIterator const &P) const { return const_iterator(_cont.find(P)); }
 
-       void setConstructor(Constructor const &by) { ConstructedBy = by; }
-       Constructor getConstructor() const { return ConstructedBy; }
+       PackageContainer() : PackageContainerInterface() {}
+       PackageContainer(CacheSetHelper::PkgSelector const &by) : PackageContainerInterface(by) {}
+APT_IGNORE_DEPRECATED_PUSH
+       APT_DEPRECATED PackageContainer(Constructor const &by) : PackageContainerInterface((CacheSetHelper::PkgSelector)by) {}
+APT_IGNORE_DEPRECATED_POP
+
+       /** \brief sort all included versions with given comparer
 
-       PackageContainer() : ConstructedBy(UNKNOWN) {}
-       PackageContainer(Constructor const &by) : ConstructedBy(by) {}
+           Some containers are sorted by default, some are not and can't be,
+           but a few like std::vector can be sorted if need be, so this can be
+           specialized in later on. The default is that this will fail though.
+           Specifically, already sorted containers like std::set will return
+           false as well as there is no easy way to check that the given comparer
+           would sort in the same way the set is currently sorted
+
+           \return \b true if the set was sorted, \b false if not. */
+       template<class Compare> bool sort(Compare /*Comp*/) { return false; }
 
        /** \brief returns all packages in the cache who belong to the given task
 
@@ -252,8 +380,8 @@ public:                                                                     /*{{{*/
            \param pattern name of the task
            \param helper responsible for error and message handling */
        static PackageContainer FromTask(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
-               PackageContainer cont(TASK);
-               PackageContainerInterface::FromTask(&cont, Cache, pattern, helper);
+               PackageContainer cont(CacheSetHelper::TASK);
+               helper.PackageFrom(CacheSetHelper::TASK, &cont, Cache, pattern);
                return cont;
        }
        static PackageContainer FromTask(pkgCacheFile &Cache, std::string const &pattern) {
@@ -269,9 +397,9 @@ public:                                                                     /*{{{*/
            \param Cache the packages are in
            \param pattern regular expression for package names
            \param helper responsible for error and message handling */
-       static PackageContainer FromRegEx(pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
-               PackageContainer cont(REGEX);
-               PackageContainerInterface::FromRegEx(&cont, Cache, pattern, helper);
+       static PackageContainer FromRegEx(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
+               PackageContainer cont(CacheSetHelper::REGEX);
+               helper.PackageFrom(CacheSetHelper::REGEX, &cont, Cache, pattern);
                return cont;
        }
 
@@ -280,9 +408,9 @@ public:                                                                     /*{{{*/
                return FromRegEx(Cache, pattern, helper);
        }
 
-       static PackageContainer FromFnmatch(pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper) {
-               PackageContainer cont(FNMATCH);
-               PackageContainerInterface::FromFnmatch(&cont, Cache, pattern, helper);
+       static PackageContainer FromFnmatch(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
+               PackageContainer cont(CacheSetHelper::FNMATCH);
+               helper.PackageFrom(CacheSetHelper::FNMATCH, &cont, Cache, pattern);
                return cont;
        }
        static PackageContainer FromFnMatch(pkgCacheFile &Cache, std::string const &pattern) {
@@ -290,18 +418,20 @@ public:                                                                   /*{{{*/
                return FromFnmatch(Cache, pattern, helper);
        }
 
+APT_IGNORE_DEPRECATED_PUSH
        /** \brief returns a package specified by a string
 
            \param Cache the package is in
            \param pattern String the package name should be extracted from
            \param helper responsible for error and message handling */
-       static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
-               return PackageContainerInterface::FromName(Cache, pattern, helper);
+       APT_DEPRECATED static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
+               return helper.PackageFromName(Cache, pattern);
        }
-       static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern) {
+       APT_DEPRECATED static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &pattern) {
                CacheSetHelper helper;
-               return PackageContainerInterface::FromName(Cache, pattern, helper);
+               return FromName(Cache, pattern, helper);
        }
+APT_IGNORE_DEPRECATED_POP
 
        /** \brief returns all packages specified by a string
 
@@ -310,7 +440,7 @@ public:                                                                     /*{{{*/
            \param helper responsible for error and message handling */
        static PackageContainer FromString(pkgCacheFile &Cache, std::string const &pattern, CacheSetHelper &helper) {
                PackageContainer cont;
-               PackageContainerInterface::FromString(&cont, Cache, pattern, helper);
+               helper.PackageFrom(CacheSetHelper::PACKAGENAME, &cont, Cache, pattern);
                return cont;
        }
        static PackageContainer FromString(pkgCacheFile &Cache, std::string const &pattern) {
@@ -327,7 +457,7 @@ public:                                                                     /*{{{*/
            \param helper responsible for error and message handling */
        static PackageContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper) {
                PackageContainer cont;
-               PackageContainerInterface::FromCommandLine(&cont, Cache, cmdline, helper);
+               helper.PackageFromCommandLine(&cont, Cache, cmdline);
                return cont;
        }
        static PackageContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline) {
@@ -349,14 +479,14 @@ public:                                                                   /*{{{*/
        static std::map<unsigned short, PackageContainer> GroupedFromCommandLine(
                                                                                 pkgCacheFile &Cache,
                                                                                 const char **cmdline,
-                                                                                std::list<Modifier> const &mods,
+                                                                                std::list<CacheSetHelper::PkgModifier> const &mods,
                                                                                 unsigned short const &fallback,
                                                                                 CacheSetHelper &helper) {
                std::map<unsigned short, PackageContainer> pkgsets;
                for (const char **I = cmdline; *I != 0; ++I) {
                        unsigned short modID = fallback;
                        PackageContainer pkgset;
-                       PackageContainerInterface::FromModifierCommandLine(modID, &pkgset, Cache, *I, mods, helper);
+                       helper.PackageFromModifierCommandLine(modID, &pkgset, Cache, *I, mods);
                        pkgsets[modID].insert(pkgset);
                }
                return pkgsets;
@@ -364,22 +494,23 @@ public:                                                                   /*{{{*/
        static std::map<unsigned short, PackageContainer> GroupedFromCommandLine(
                                                                                 pkgCacheFile &Cache,
                                                                                 const char **cmdline,
-                                                                                std::list<Modifier> const &mods,
+                                                                                std::list<CacheSetHelper::PkgModifier> const &mods,
                                                                                 unsigned short const &fallback) {
                CacheSetHelper helper;
                return GroupedFromCommandLine(Cache, cmdline,
                                mods, fallback, helper);
        }
                                                                        /*}}}*/
-private:                                                               /*{{{*/
-       Constructor ConstructedBy;
-                                                                       /*}}}*/
 };                                                                     /*}}}*/
-
+// specialisations for push_back containers: std::list & std::vector   /*{{{*/
 template<> template<class Cont> void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(PackageContainer<Cont> const &pkgcont) {
        for (typename PackageContainer<Cont>::const_iterator p = pkgcont.begin(); p != pkgcont.end(); ++p)
                _cont.push_back(*p);
 }
+template<> template<class Cont> void PackageContainer<std::vector<pkgCache::PkgIterator> >::insert(PackageContainer<Cont> const &pkgcont) {
+       for (typename PackageContainer<Cont>::const_iterator p = pkgcont.begin(); p != pkgcont.end(); ++p)
+               _cont.push_back(*p);
+}
 // these two are 'inline' as otherwise the linker has problems with seeing these untemplated
 // specializations again and again - but we need to see them, so that library users can use them
 template<> inline bool PackageContainer<std::list<pkgCache::PkgIterator> >::insert(pkgCache::PkgIterator const &P) {
@@ -388,12 +519,65 @@ template<> inline bool PackageContainer<std::list<pkgCache::PkgIterator> >::inse
        _cont.push_back(P);
        return true;
 }
+template<> inline bool PackageContainer<std::vector<pkgCache::PkgIterator> >::insert(pkgCache::PkgIterator const &P) {
+       if (P.end() == true)
+               return false;
+       _cont.push_back(P);
+       return true;
+}
 template<> inline void PackageContainer<std::list<pkgCache::PkgIterator> >::insert(const_iterator begin, const_iterator end) {
        for (const_iterator p = begin; p != end; ++p)
                _cont.push_back(*p);
 }
+template<> inline void PackageContainer<std::vector<pkgCache::PkgIterator> >::insert(const_iterator begin, const_iterator end) {
+       for (const_iterator p = begin; p != end; ++p)
+               _cont.push_back(*p);
+}
+                                                                       /*}}}*/
+
+template<> template<class Compare> inline bool PackageContainer<std::vector<pkgCache::PkgIterator> >::sort(Compare Comp) {
+       std::sort(_cont.begin(), _cont.end(), Comp);
+       return true;
+}
+
+// class PackageUniverse - pkgCache as PackageContainerInterface       /*{{{*/
+/** \class PackageUniverse
+
+    Wraps around our usual pkgCache, so that it can be stuffed into methods
+    expecting a PackageContainer.
+
+    The wrapping is read-only in practice modeled by making erase and co
+    private methods. */
+class APT_HIDDEN PackageUniverse : public PackageContainerInterface {
+       pkgCache * const _cont;
+public:
+       typedef pkgCache::PkgIterator iterator;
+       typedef pkgCache::PkgIterator const_iterator;
+
+       APT_PUBLIC bool empty() const { return false; }
+       APT_PUBLIC size_t size() const { return _cont->Head().PackageCount; }
+
+       APT_PUBLIC const_iterator begin() const { return _cont->PkgBegin(); }
+       APT_PUBLIC const_iterator end() const { return  _cont->PkgEnd(); }
+       APT_PUBLIC iterator begin() { return _cont->PkgBegin(); }
+       APT_PUBLIC iterator end() { return _cont->PkgEnd(); }
+
+       APT_PUBLIC PackageUniverse(pkgCache * const Owner) : _cont(Owner) { }
+
+private:
+       bool insert(pkgCache::PkgIterator const &) { return true; }
+       template<class Cont> void insert(PackageContainer<Cont> const &) { }
+       void insert(const_iterator, const_iterator) { }
+
+       void clear() { }
+       iterator& erase(iterator &iter) { return iter; }
+       size_t erase(const pkgCache::PkgIterator) { return 0; }
+       void erase(iterator, iterator) { }
+};
+                                                                       /*}}}*/
 typedef PackageContainer<std::set<pkgCache::PkgIterator> > PackageSet;
 typedef PackageContainer<std::list<pkgCache::PkgIterator> > PackageList;
+typedef PackageContainer<std::vector<pkgCache::PkgIterator> > PackageVector;
 
 class VersionContainerInterface {                                      /*{{{*/
 /** \class APT::VersionContainerInterface
@@ -435,45 +619,63 @@ public:
        virtual void clear() = 0;
 
        /** \brief specifies which version(s) will be returned if non is given */
-       enum Version {
-               /** All versions */
-               ALL,
-               /** Candidate and installed version */
-               CANDANDINST,
-               /** Candidate version */
-               CANDIDATE,
-               /** Installed version */
-               INSTALLED,
-               /** Candidate or if non installed version */
-               CANDINST,
-               /** Installed or if non candidate version */
-               INSTCAND,
-               /** Newest version */
-               NEWEST
+       enum APT_DEPRECATED Version {
+               ALL = CacheSetHelper::ALL,
+               CANDANDINST = CacheSetHelper::CANDANDINST,
+               CANDIDATE = CacheSetHelper::CANDIDATE,
+               INSTALLED = CacheSetHelper::INSTALLED,
+               CANDINST = CacheSetHelper::CANDINST,
+               INSTCAND = CacheSetHelper::INSTCAND,
+               NEWEST = CacheSetHelper::NEWEST
        };
 
        struct Modifier {
-               enum Position { NONE, PREFIX, POSTFIX };
-               unsigned short ID;
+               unsigned short const ID;
                const char * const Alias;
-               Position Pos;
-               Version SelectVersion;
+               enum Position { NONE, PREFIX, POSTFIX } const Pos;
+               enum CacheSetHelper::VerSelector const SelectVersion;
                Modifier (unsigned short const &id, const char * const alias, Position const &pos,
-                         Version const &select) : ID(id), Alias(alias), Pos(pos),
+                         enum CacheSetHelper::VerSelector const select) : ID(id), Alias(alias), Pos(pos),
                         SelectVersion(select) {}
+APT_IGNORE_DEPRECATED_PUSH
+               APT_DEPRECATED Modifier(unsigned short const &id, const char * const alias, Position const &pos,
+                         Version const &select) : ID(id), Alias(alias), Pos(pos),
+                        SelectVersion((CacheSetHelper::VerSelector)select) {}
+APT_IGNORE_DEPRECATED_POP
        };
 
        static bool FromCommandLine(VersionContainerInterface * const vci, pkgCacheFile &Cache,
-                                   const char **cmdline, Version const &fallback,
+                                   const char **cmdline, CacheSetHelper::VerSelector const fallback,
                                    CacheSetHelper &helper);
+APT_IGNORE_DEPRECATED_PUSH
+       APT_DEPRECATED static bool FromCommandLine(VersionContainerInterface * const vci, pkgCacheFile &Cache,
+                                   const char **cmdline, Version const &fallback,
+                                   CacheSetHelper &helper) {
+          return FromCommandLine(vci, Cache, cmdline, (CacheSetHelper::VerSelector)fallback, helper);
+       }
+APT_IGNORE_DEPRECATED_POP
 
        static bool FromString(VersionContainerInterface * const vci, pkgCacheFile &Cache,
-                              std::string pkg, Version const &fallback, CacheSetHelper &helper,
+                              std::string pkg, CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper,
                               bool const onlyFromName = false);
+APT_IGNORE_DEPRECATED_PUSH
+       APT_DEPRECATED static bool FromString(VersionContainerInterface * const vci, pkgCacheFile &Cache,
+                              std::string pkg, Version const &fallback, CacheSetHelper &helper,
+                              bool const onlyFromName = false) {
+          return FromString(vci, Cache, pkg, (CacheSetHelper::VerSelector)fallback, helper, onlyFromName);
+       }
+APT_IGNORE_DEPRECATED_POP
 
        static bool FromPackage(VersionContainerInterface * const vci, pkgCacheFile &Cache,
-                               pkgCache::PkgIterator const &P, Version const &fallback,
+                               pkgCache::PkgIterator const &P, CacheSetHelper::VerSelector const fallback,
                                CacheSetHelper &helper);
+APT_IGNORE_DEPRECATED_PUSH
+       APT_DEPRECATED static bool FromPackage(VersionContainerInterface * const vci, pkgCacheFile &Cache,
+                               pkgCache::PkgIterator const &P, Version const &fallback,
+                               CacheSetHelper &helper) {
+          return FromPackage(vci, Cache, P, (CacheSetHelper::VerSelector)fallback, helper);
+       }
+APT_IGNORE_DEPRECATED_POP
 
        static bool FromModifierCommandLine(unsigned short &modID,
                                            VersionContainerInterface * const vci,
@@ -485,8 +687,17 @@ public:
        static bool FromDependency(VersionContainerInterface * const vci,
                                   pkgCacheFile &Cache,
                                   pkgCache::DepIterator const &D,
-                                  Version const &selector,
+                                  CacheSetHelper::VerSelector const selector,
                                   CacheSetHelper &helper);
+APT_IGNORE_DEPRECATED_PUSH
+       APT_DEPRECATED static bool FromDependency(VersionContainerInterface * const vci,
+                                  pkgCacheFile &Cache,
+                                  pkgCache::DepIterator const &D,
+                                  Version const &selector,
+                                  CacheSetHelper &helper) {
+          return FromDependency(vci, Cache, D, (CacheSetHelper::VerSelector)selector, helper);
+       }
+APT_IGNORE_DEPRECATED_POP
 
 protected:                                                             /*{{{*/
 
@@ -568,6 +779,18 @@ public:                                                                    /*{{{*/
        iterator end() { return iterator(_cont.end()); }
        const_iterator find(pkgCache::VerIterator const &V) const { return const_iterator(_cont.find(V)); }
 
+       /** \brief sort all included versions with given comparer
+
+           Some containers are sorted by default, some are not and can't be,
+           but a few like std::vector can be sorted if need be, so this can be
+           specialized in later on. The default is that this will fail though.
+           Specifically, already sorted containers like std::set will return
+           false as well as there is no easy way to check that the given comparer
+           would sort in the same way the set is currently sorted
+
+           \return \b true if the set was sorted, \b false if not. */
+       template<class Compare> bool sort(Compare /*Comp*/) { return false; }
+
        /** \brief returns all versions specified on the commandline
 
            Get all versions from the commandline, uses given default version if
@@ -577,35 +800,59 @@ public:                                                                   /*{{{*/
            \param fallback version specification
            \param helper responsible for error and message handling */
        static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline,
-                       Version const &fallback, CacheSetHelper &helper) {
+                       CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper) {
                VersionContainer vercon;
                VersionContainerInterface::FromCommandLine(&vercon, Cache, cmdline, fallback, helper);
                return vercon;
        }
        static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline,
-                       Version const &fallback) {
+                       CacheSetHelper::VerSelector const fallback) {
                CacheSetHelper helper;
                return FromCommandLine(Cache, cmdline, fallback, helper);
        }
        static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline) {
-               return FromCommandLine(Cache, cmdline, CANDINST);
+               return FromCommandLine(Cache, cmdline, CacheSetHelper::CANDINST);
        }
-
        static VersionContainer FromString(pkgCacheFile &Cache, std::string const &pkg,
-                       Version const &fallback, CacheSetHelper &helper,
-                       bool const onlyFromName = false) {
+                       CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper,
+                                           bool const /*onlyFromName = false*/) {
                VersionContainer vercon;
                VersionContainerInterface::FromString(&vercon, Cache, pkg, fallback, helper);
                return vercon;
        }
        static VersionContainer FromString(pkgCacheFile &Cache, std::string pkg,
-                       Version const &fallback) {
+                       CacheSetHelper::VerSelector const fallback) {
                CacheSetHelper helper;
                return FromString(Cache, pkg, fallback, helper);
        }
        static VersionContainer FromString(pkgCacheFile &Cache, std::string pkg) {
-               return FromString(Cache, pkg, CANDINST);
+               return FromString(Cache, pkg, CacheSetHelper::CANDINST);
+       }
+APT_IGNORE_DEPRECATED_PUSH
+       static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline,
+                       Version const &fallback, CacheSetHelper &helper) {
+               VersionContainer vercon;
+               VersionContainerInterface::FromCommandLine(&vercon, Cache, cmdline, (CacheSetHelper::VerSelector)fallback, helper);
+               return vercon;
+       }
+       static VersionContainer FromCommandLine(pkgCacheFile &Cache, const char **cmdline,
+                       Version const &fallback) {
+               CacheSetHelper helper;
+               return FromCommandLine(Cache, cmdline, (CacheSetHelper::VerSelector)fallback, helper);
+       }
+       static VersionContainer FromString(pkgCacheFile &Cache, std::string const &pkg,
+                       Version const &fallback, CacheSetHelper &helper,
+                                           bool const /*onlyFromName = false*/) {
+               VersionContainer vercon;
+               VersionContainerInterface::FromString(&vercon, Cache, pkg, (CacheSetHelper::VerSelector)fallback, helper);
+               return vercon;
+       }
+       static VersionContainer FromString(pkgCacheFile &Cache, std::string pkg,
+                       Version const &fallback) {
+               CacheSetHelper helper;
+               return FromString(Cache, pkg, (CacheSetHelper::VerSelector)fallback, helper);
        }
+APT_IGNORE_DEPRECATED_POP
 
        /** \brief returns all versions specified for the package
 
@@ -614,18 +861,31 @@ public:                                                                   /*{{{*/
            \param fallback the version(s) you want to get
            \param helper the helper used for display and error handling */
        static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P,
-               Version const &fallback, CacheSetHelper &helper) {
+               CacheSetHelper::VerSelector const fallback, CacheSetHelper &helper) {
                VersionContainer vercon;
                VersionContainerInterface::FromPackage(&vercon, Cache, P, fallback, helper);
                return vercon;
        }
        static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P,
-                                           Version const &fallback) {
+                                           CacheSetHelper::VerSelector const fallback) {
                CacheSetHelper helper;
                return FromPackage(Cache, P, fallback, helper);
        }
+APT_IGNORE_DEPRECATED_PUSH
+       static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P,
+               Version const &fallback, CacheSetHelper &helper) {
+               VersionContainer vercon;
+               VersionContainerInterface::FromPackage(&vercon, Cache, P, (CacheSetHelper::VerSelector)fallback, helper);
+               return vercon;
+       }
+       static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P,
+                                           Version const &fallback) {
+               CacheSetHelper helper;
+               return FromPackage(Cache, P, (CacheSetHelper::VerSelector)fallback, helper);
+       }
+APT_IGNORE_DEPRECATED_POP
        static VersionContainer FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P) {
-               return FromPackage(Cache, P, CANDIDATE);
+               return FromPackage(Cache, P, CacheSetHelper::CANDIDATE);
        }
 
        static std::map<unsigned short, VersionContainer> GroupedFromCommandLine(
@@ -654,26 +914,43 @@ public:                                                                   /*{{{*/
        }
 
        static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D,
-                                              Version const &selector, CacheSetHelper &helper) {
+                                              CacheSetHelper::VerSelector const selector, CacheSetHelper &helper) {
                VersionContainer vercon;
                VersionContainerInterface::FromDependency(&vercon, Cache, D, selector, helper);
                return vercon;
        }
        static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D,
-                                              Version const &selector) {
+                                              CacheSetHelper::VerSelector const selector) {
                CacheSetHelper helper;
                return FromPackage(Cache, D, selector, helper);
        }
+APT_IGNORE_DEPRECATED_PUSH
+       static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D,
+                                              Version const &selector, CacheSetHelper &helper) {
+               VersionContainer vercon;
+               VersionContainerInterface::FromDependency(&vercon, Cache, D, (CacheSetHelper::VerSelector)selector, helper);
+               return vercon;
+       }
+       static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D,
+                                              Version const &selector) {
+               CacheSetHelper helper;
+               return FromPackage(Cache, D, (CacheSetHelper::VerSelector)selector, helper);
+       }
+APT_IGNORE_DEPRECATED_POP
        static VersionContainer FromDependency(pkgCacheFile &Cache, pkgCache::DepIterator const &D) {
-               return FromPackage(Cache, D, CANDIDATE);
+               return FromPackage(Cache, D, CacheSetHelper::CANDIDATE);
        }
                                                                        /*}}}*/
 };                                                                     /*}}}*/
-
+// specialisations for push_back containers: std::list & std::vector   /*{{{*/
 template<> template<class Cont> void VersionContainer<std::list<pkgCache::VerIterator> >::insert(VersionContainer<Cont> const &vercont) {
        for (typename VersionContainer<Cont>::const_iterator v = vercont.begin(); v != vercont.end(); ++v)
                _cont.push_back(*v);
 }
+template<> template<class Cont> void VersionContainer<std::vector<pkgCache::VerIterator> >::insert(VersionContainer<Cont> const &vercont) {
+       for (typename VersionContainer<Cont>::const_iterator v = vercont.begin(); v != vercont.end(); ++v)
+               _cont.push_back(*v);
+}
 // these two are 'inline' as otherwise the linker has problems with seeing these untemplated
 // specializations again and again - but we need to see them, so that library users can use them
 template<> inline bool VersionContainer<std::list<pkgCache::VerIterator> >::insert(pkgCache::VerIterator const &V) {
@@ -682,11 +959,29 @@ template<> inline bool VersionContainer<std::list<pkgCache::VerIterator> >::inse
        _cont.push_back(V);
        return true;
 }
+template<> inline bool VersionContainer<std::vector<pkgCache::VerIterator> >::insert(pkgCache::VerIterator const &V) {
+       if (V.end() == true)
+               return false;
+       _cont.push_back(V);
+       return true;
+}
 template<> inline void VersionContainer<std::list<pkgCache::VerIterator> >::insert(const_iterator begin, const_iterator end) {
        for (const_iterator v = begin; v != end; ++v)
                _cont.push_back(*v);
 }
+template<> inline void VersionContainer<std::vector<pkgCache::VerIterator> >::insert(const_iterator begin, const_iterator end) {
+       for (const_iterator v = begin; v != end; ++v)
+               _cont.push_back(*v);
+}
+                                                                       /*}}}*/
+
+template<> template<class Compare> inline bool VersionContainer<std::vector<pkgCache::VerIterator> >::sort(Compare Comp) {
+       std::sort(_cont.begin(), _cont.end(), Comp);
+       return true;
+}
+
 typedef VersionContainer<std::set<pkgCache::VerIterator> > VersionSet;
 typedef VersionContainer<std::list<pkgCache::VerIterator> > VersionList;
+typedef VersionContainer<std::vector<pkgCache::VerIterator> > VersionVector;
 }
 #endif
index a5ad6a9ff130225d3fffd2caeb5f8405a96046a2..aaa7b82e0f3e392e682ce846cd449317893982cd 100644 (file)
@@ -822,8 +822,11 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                    /*{{{*/
    // check for existence and possibly create state directory for copying
    string const listDir = _config->FindDir("Dir::State::lists");
    string const partialListDir = listDir + "partial/";
-   if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
-       CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false)
+   mode_t const mode = umask(S_IWGRP | S_IWOTH);
+   bool const creation_fail = (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), partialListDir) == false &&
+        CreateAPTDirectoryIfNeeded(listDir, partialListDir) == false);
+   umask(mode);
+   if (creation_fail == true)
    {
       UnmountCDROM(CDROM, NULL);
       return _error->Errno("cdrom", _("List directory %spartial is missing."), listDir.c_str());
@@ -913,10 +916,14 @@ bool pkgCdrom::Add(pkgCdromStatus *log)                                   /*{{{*/
    return true;
 }
                                                                        /*}}}*/
-pkgUdevCdromDevices::pkgUdevCdromDevices()                                     /*{{{*/
-   : libudev_handle(NULL)
+pkgUdevCdromDevices::pkgUdevCdromDevices()                             /*{{{*/
+: libudev_handle(NULL), udev_new(NULL), udev_enumerate_add_match_property(NULL),
+   udev_enumerate_scan_devices(NULL), udev_enumerate_get_list_entry(NULL),
+   udev_device_new_from_syspath(NULL), udev_enumerate_get_udev(NULL),
+   udev_list_entry_get_name(NULL), udev_device_get_devnode(NULL),
+   udev_enumerate_new(NULL), udev_list_entry_get_next(NULL),
+   udev_device_get_property_value(NULL), udev_enumerate_add_match_sysattr(NULL)
 {
-
 }
                                                                        /*}}}*/
 
index 37128e9aa2c1de80782ad792e64d5630ebad226b..6edce5b6db0edf3e57759dc3f8a20055ccac8c21 100644 (file)
@@ -131,3 +131,5 @@ bool pkgArchiveCleaner::Go(std::string Dir,pkgCache &Cache)
    return true;
 }
                                                                        /*}}}*/
+
+APT_CONST pkgArchiveCleaner::~pkgArchiveCleaner() {}
index 930d54a7ff3021e4464b7982d201278bed6fbe7b..466cb67a92d0d143f71b83c79912618db93b3a59 100644 (file)
@@ -24,13 +24,13 @@ class pkgArchiveCleaner
    void *d;
 
    protected:
-   
+
    virtual void Erase(const char * /*File*/,std::string /*Pkg*/,std::string /*Ver*/,struct stat & /*St*/) {};
 
-   public:   
-   
+   public:
+
    bool Go(std::string Dir,pkgCache &Cache);
-   virtual ~pkgArchiveCleaner() {};
+   virtual ~pkgArchiveCleaner();
 };
 
 #endif
index 93c1f46647d47f7b0e42769e95ca98dcfe2b4f50..ff8b09ebc0b6c6f7eb36ced66c3c6024c64c896a 100644 (file)
@@ -33,6 +33,9 @@ using namespace std;
 CommandLine::CommandLine(Args *AList,Configuration *Conf) : ArgList(AList), 
                                  Conf(Conf), FileList(0)
 {
+}
+CommandLine::CommandLine() : ArgList(NULL), Conf(NULL), FileList(0)
+{
 }
                                                                        /*}}}*/
 // CommandLine::~CommandLine - Destructor                              /*{{{*/
index 143df58b23d1ebdc331631c3f9eb8913e213edb9..58cbaa8c38c4bca9e437aeb8fc712d2d61e7a207 100644 (file)
@@ -91,6 +91,7 @@ class CommandLine
    static CommandLine::Args MakeArgs(char ShortOpt, char const *LongOpt,
         char const *ConfName, unsigned long Flags) APT_CONST;
 
+   CommandLine();
    CommandLine(Args *AList,Configuration *Conf);
    ~CommandLine();
 };
index 00f6ad0f98ae9978679cb27a7e6a70c8cb97db4f..483d5bb1b7f1944070d2a1eb5af8e3bc80e086fe 100644 (file)
@@ -253,8 +253,11 @@ string Configuration::FindDir(const char *Name,const char *Default) const
 // Configuration::FindVector - Find a vector of values                 /*{{{*/
 // ---------------------------------------------------------------------
 /* Returns a vector of config values under the given item */
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
-vector<string> Configuration::FindVector(const char *Name) const { return FindVector(Name, ""); }
+#if APT_PKG_ABI < 413
+vector<string> Configuration::FindVector(const char *Name) const
+{
+   return FindVector(Name, "");
+}
 #endif
 vector<string> Configuration::FindVector(const char *Name, std::string const &Default) const
 {
index c256139f4b7412938f9b6b406ef2d090be94125b..8d7d510375a0db30f111bdf2ba6b43b81562879f 100644 (file)
@@ -34,6 +34,8 @@
 #include <vector>
 #include <iostream>
 
+#include <apt-pkg/macros.h>
+
 #ifndef APT_8_CLEANER_HEADERS
 using std::string;
 #endif
@@ -59,7 +61,7 @@ class Configuration
    
    Item *Root;
    bool ToFree;
-   
+
    Item *Lookup(Item *Head,const char *S,unsigned long const &Len,bool const &Create);
    Item *Lookup(const char *Name,const bool &Create);
    inline const Item *Lookup(const char *Name) const
@@ -82,14 +84,16 @@ class Configuration
     *
     * \param Name of the parent node
     * \param Default list of values separated by commas */
+#if APT_PKG_ABI >= 413
+   std::vector<std::string> FindVector(const char *Name, std::string const &Default = "") const;
+   std::vector<std::string> FindVector(std::string const &Name, std::string const &Default = "") const { return FindVector(Name.c_str(), Default); };
+#else
    std::vector<std::string> FindVector(const char *Name, std::string const &Default) const;
    std::vector<std::string> FindVector(std::string const &Name, std::string const &Default) const { return FindVector(Name.c_str(), Default); };
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-   std::vector<std::string> FindVector(const char *Name) const { return FindVector(Name, ""); };
-#else
    std::vector<std::string> FindVector(const char *Name) const;
-#endif
    std::vector<std::string> FindVector(std::string const &Name) const { return FindVector(Name.c_str(), ""); };
+#endif
+
    int FindI(const char *Name,int const &Default = 0) const;
    int FindI(std::string const &Name,int const &Default = 0) const {return FindI(Name.c_str(),Default);};
    bool FindB(const char *Name,bool const &Default = false) const;
@@ -129,7 +133,7 @@ class Configuration
    class MatchAgainstConfig
    {
      std::vector<regex_t *> patterns;
-     void clearPatterns();
+     APT_HIDDEN void clearPatterns();
 
    public:
      MatchAgainstConfig(char const * Config);
index 1ba4674e583194155be2477097188fff8775e19f..47033eadff01d0f6edac3a912122aa496badb3f1 100644 (file)
@@ -47,6 +47,8 @@
 #include <signal.h>
 #include <errno.h>
 #include <glob.h>
+#include <pwd.h>
+#include <grp.h>
 
 #include <set>
 #include <algorithm>
 #include <endian.h>
 #include <stdint.h>
 
+#if __gnu_linux__
+#include <sys/prctl.h>
+#endif
+
 #include <apti18n.h>
                                                                        /*}}}*/
 
@@ -656,6 +662,22 @@ string flCombine(string Dir,string File)
    return Dir + '/' + File;
 }
                                                                        /*}}}*/
+// flAbsPath - Return the absolute path of the filename                        /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string flAbsPath(string File)
+{
+   char *p = realpath(File.c_str(), NULL);
+   if (p == NULL)
+   {
+      _error->Errno("realpath", "flAbsPath failed");
+      return "";
+   }
+   std::string AbsPath(p);
+   free(p);
+   return AbsPath;
+}
+                                                                       /*}}}*/
 // SetCloseExec - Set the close on exec flag                           /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -835,6 +857,23 @@ bool ExecWait(pid_t Pid,const char *Name,bool Reap)
    return true;
 }
                                                                        /*}}}*/
+// StartsWithGPGClearTextSignature - Check if a file is Pgp/GPG clearsigned    /*{{{*/
+bool StartsWithGPGClearTextSignature(string const &FileName)
+{
+   static const char* SIGMSG = "-----BEGIN PGP SIGNED MESSAGE-----\n";
+   char buffer[strlen(SIGMSG)+1];
+   FILE* gpg = fopen(FileName.c_str(), "r");
+   if (gpg == NULL)
+      return false;
+
+   char const * const test = fgets(buffer, sizeof(buffer), gpg);
+   fclose(gpg);
+   if (test == NULL || strcmp(buffer, SIGMSG) != 0)
+      return false;
+
+   return true;
+}
+                                                                       /*}}}*/
 
 class FileFdPrivate {                                                  /*{{{*/
        public:
@@ -853,7 +892,7 @@ class FileFdPrivate {                                                       /*{{{*/
           bool eof;
           bool compressing;
 
-          LZMAFILE() : file(NULL), eof(false), compressing(false) {}
+          LZMAFILE() : file(NULL), eof(false), compressing(false) { buffer[0] = '\0'; }
           ~LZMAFILE() {
              if (compressing == true)
              {
@@ -1482,7 +1521,7 @@ bool FileFd::Read(void *To,unsigned long long Size,unsigned long long *Actual)
            int err;
            char const * const errmsg = BZ2_bzerror(d->bz2, &err);
            if (err != BZ_IO_ERROR)
-              return FileFdError("BZ2_bzread: %s (%d: %s)", _("Read error"), err, errmsg);
+              return FileFdError("BZ2_bzread: %s %s (%d: %s)", FileName.c_str(), _("Read error"), err, errmsg);
         }
 #endif
 #ifdef HAVE_LZMA
@@ -1913,7 +1952,6 @@ bool FileFd::Close()
    {
       if ((Flags & Compressed) != Compressed && iFd > 0 && close(iFd) != 0)
         Res &= _error->Errno("close",_("Problem closing the file %s"), FileName.c_str());
-
       if (d != NULL)
       {
         Res &= d->CloseDown(FileName);
@@ -1993,10 +2031,7 @@ APT_DEPRECATED gzFile FileFd::gzFd() {
 #endif
 }
 
-
-// Glob - wrapper around "glob()"                                      /*{{{*/
-// ---------------------------------------------------------------------
-/* */
+// Glob - wrapper around "glob()"                                      /*{{{*/
 std::vector<std::string> Glob(std::string const &pattern, int flags)
 {
    std::vector<std::string> result;
@@ -2022,8 +2057,7 @@ std::vector<std::string> Glob(std::string const &pattern, int flags)
    return result;
 }
                                                                        /*}}}*/
-
-std::string GetTempDir()
+std::string GetTempDir()                                               /*{{{*/
 {
    const char *tmpdir = getenv("TMPDIR");
 
@@ -2032,21 +2066,202 @@ std::string GetTempDir()
       tmpdir = P_tmpdir;
 #endif
 
-   // check that tmpdir is set and exists
    struct stat st;
-   if (!tmpdir || strlen(tmpdir) == 0 || stat(tmpdir, &st) != 0)
+   if (!tmpdir || strlen(tmpdir) == 0 || // tmpdir is set
+        stat(tmpdir, &st) != 0 || (st.st_mode & S_IFDIR) == 0 || // exists and is directory
+        access(tmpdir, R_OK | W_OK | X_OK) != 0 // current user has rwx access to directory
+      )
       tmpdir = "/tmp";
 
    return string(tmpdir);
 }
+                                                                       /*}}}*/
+FileFd* GetTempFile(std::string const &Prefix, bool ImmediateUnlink)   /*{{{*/
+{
+   char fn[512];
+   FileFd *Fd = new FileFd();
+
+   std::string tempdir = GetTempDir();
+   snprintf(fn, sizeof(fn), "%s/%s.XXXXXX", 
+            tempdir.c_str(), Prefix.c_str());
+   int fd = mkstemp(fn);
+   if(ImmediateUnlink)
+      unlink(fn);
+   if (fd < 0) 
+   {
+      _error->Errno("GetTempFile",_("Unable to mkstemp %s"), fn);
+      return NULL;
+   }
+   if (!Fd->OpenDescriptor(fd, FileFd::WriteOnly, FileFd::None, true))
+   {
+      _error->Errno("GetTempFile",_("Unable to write to %s"),fn);
+      return NULL;
+   }
 
-bool Rename(std::string From, std::string To)
+   return Fd;
+}
+                                                                       /*}}}*/
+bool Rename(std::string From, std::string To)                          /*{{{*/
 {
    if (rename(From.c_str(),To.c_str()) != 0)
    {
       _error->Error(_("rename failed, %s (%s -> %s)."),strerror(errno),
                     From.c_str(),To.c_str());
       return false;
-   }   
+   }
    return true;
 }
+                                                                       /*}}}*/
+bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode)/*{{{*/
+{
+   int fd;
+   if (Mode != FileFd::ReadOnly && Mode != FileFd::WriteOnly)
+      return _error->Error("Popen supports ReadOnly (x)or WriteOnly mode only");
+
+   int Pipe[2] = {-1, -1};
+   if(pipe(Pipe) != 0)
+      return _error->Errno("pipe", _("Failed to create subprocess IPC"));
+
+   std::set<int> keep_fds;
+   keep_fds.insert(Pipe[0]);
+   keep_fds.insert(Pipe[1]);
+   Child = ExecFork(keep_fds);
+   if(Child < 0)
+      return _error->Errno("fork", "Failed to fork");
+   if(Child == 0)
+   {
+      if(Mode == FileFd::ReadOnly)
+      {
+         close(Pipe[0]);
+         fd = Pipe[1];
+      }
+      else if(Mode == FileFd::WriteOnly)
+      {
+         close(Pipe[1]);
+         fd = Pipe[0];
+      }
+
+      if(Mode == FileFd::ReadOnly)
+      {
+         dup2(fd, 1);
+         dup2(fd, 2);
+      } else if(Mode == FileFd::WriteOnly)
+         dup2(fd, 0);
+
+      execv(Args[0], (char**)Args);
+      _exit(100);
+   }
+   if(Mode == FileFd::ReadOnly)
+   {
+      close(Pipe[1]);
+      fd = Pipe[0];
+   } else if(Mode == FileFd::WriteOnly)
+   {
+      close(Pipe[0]);
+      fd = Pipe[1];
+   }
+   Fd.OpenDescriptor(fd, Mode, FileFd::None, true);
+
+   return true;
+}
+                                                                       /*}}}*/
+bool DropPrivileges()                                                  /*{{{*/
+{
+   if(_config->FindB("Debug::NoDropPrivs", false) == true)
+      return true;
+
+#if __gnu_linux__
+#if defined(PR_SET_NO_NEW_PRIVS) && ( PR_SET_NO_NEW_PRIVS != 38 )
+#error "PR_SET_NO_NEW_PRIVS is defined, but with a different value than expected!"
+#endif
+   // see prctl(2), needs linux3.5 at runtime - magic constant to avoid it at buildtime
+   int ret = prctl(38, 1, 0, 0, 0);
+   // ignore EINVAL - kernel is too old to understand the option
+   if(ret < 0 && errno != EINVAL)
+      _error->Warning("PR_SET_NO_NEW_PRIVS failed with %i", ret);
+#endif
+
+   // empty setting disables privilege dropping - this also ensures
+   // backward compatibility, see bug #764506
+   const std::string toUser = _config->Find("APT::Sandbox::User");
+   if (toUser.empty())
+      return true;
+
+   // uid will be 0 in the end, but gid might be different anyway
+   uid_t const old_uid = getuid();
+   gid_t const old_gid = getgid();
+
+   if (old_uid != 0)
+      return true;
+
+   struct passwd *pw = getpwnam(toUser.c_str());
+   if (pw == NULL)
+      return _error->Error("No user %s, can not drop rights", toUser.c_str());
+
+   // Do not change the order here, it might break things
+   if (setgroups(1, &pw->pw_gid))
+      return _error->Errno("setgroups", "Failed to setgroups");
+
+   if (setegid(pw->pw_gid) != 0)
+      return _error->Errno("setegid", "Failed to setegid");
+
+   if (setgid(pw->pw_gid) != 0)
+      return _error->Errno("setgid", "Failed to setgid");
+
+   if (setuid(pw->pw_uid) != 0)
+      return _error->Errno("setuid", "Failed to setuid");
+
+   // the seteuid() is probably uneeded (at least thats what the linux
+   // man-page says about setuid(2)) but we cargo culted it anyway
+   if (seteuid(pw->pw_uid) != 0)
+      return _error->Errno("seteuid", "Failed to seteuid");
+
+   // Verify that the user has only a single group, and the correct one
+   gid_t groups[1];
+   if (getgroups(1, groups) != 1)
+      return _error->Errno("getgroups", "Could not get new groups");
+   if (groups[0] != pw->pw_gid)
+      return _error->Error("Could not switch group");
+
+   // Verify that gid, egid, uid, and euid changed
+   if (getgid() != pw->pw_gid)
+      return _error->Error("Could not switch group");
+   if (getegid() != pw->pw_gid)
+      return _error->Error("Could not switch effective group");
+   if (getuid() != pw->pw_uid)
+      return _error->Error("Could not switch user");
+   if (geteuid() != pw->pw_uid)
+      return _error->Error("Could not switch effective user");
+
+#ifdef HAVE_GETRESUID
+   // verify that the saved set-user-id was changed as well
+   uid_t ruid = 0;
+   uid_t euid = 0;
+   uid_t suid = 0;
+   if (getresuid(&ruid, &euid, &suid))
+      return _error->Errno("getresuid", "Could not get saved set-user-ID");
+   if (suid != pw->pw_uid)
+      return _error->Error("Could not switch saved set-user-ID");
+#endif
+
+#ifdef HAVE_GETRESGID
+   // verify that the saved set-group-id was changed as well
+   gid_t rgid = 0;
+   gid_t egid = 0;
+   gid_t sgid = 0;
+   if (getresgid(&rgid, &egid, &sgid))
+      return _error->Errno("getresuid", "Could not get saved set-group-ID");
+   if (sgid != pw->pw_gid)
+      return _error->Error("Could not switch saved set-group-ID");
+#endif
+
+   // Check that uid and gid changes do not work anymore
+   if (pw->pw_gid != old_gid && (setgid(old_gid) != -1 || setegid(old_gid) != -1))
+      return _error->Error("Could restore a gid to root, privilege dropping did not work");
+
+   if (pw->pw_uid != old_uid && (setuid(old_uid) != -1 || seteuid(old_uid) != -1))
+      return _error->Error("Could restore a uid to root, privilege dropping did not work");
+
+   return true;
+}
+                                                                       /*}}}*/
index 667057067393dcbbce03489c5bc0b34d53c8a39e..a64d6cb98bc1d76b92cf1748851e3fe903a9f597 100644 (file)
@@ -170,6 +170,8 @@ time_t GetModificationTime(std::string const &Path);
 bool Rename(std::string From, std::string To);
 
 std::string GetTempDir();
+FileFd* GetTempFile(std::string const &Prefix = "", 
+                    bool ImmediateUnlink = true);
 
 /** \brief Ensure the existence of the given Path
  *
@@ -193,6 +195,23 @@ pid_t ExecFork(std::set<int> keep_fds);
 void MergeKeepFdsFromConfiguration(std::set<int> &keep_fds);
 bool ExecWait(pid_t Pid,const char *Name,bool Reap = false);
 
+
+// check if the given file starts with a PGP cleartext signature
+bool StartsWithGPGClearTextSignature(std::string const &FileName);
+
+/**
+ * \brief Drop privileges
+ *
+ * Drop the privileges to the user _apt (or the one specified in
+ * APT::Sandbox::User). This does not set the supplementary group
+ * ids up correctly, it only uses the default group. Also prevent
+ * the process from gaining any new privileges afterwards, at least
+ * on Linux.
+ *
+ * \return true on success, false on failure with _error set
+ */
+bool DropPrivileges();
+
 // File string manipulators
 std::string flNotDir(std::string File);
 std::string flNotFile(std::string File);
@@ -200,7 +219,23 @@ std::string flNoLink(std::string File);
 std::string flExtension(std::string File);
 std::string flCombine(std::string Dir,std::string File);
 
+/** \brief Takes a file path and returns the absolute path
+ */
+std::string flAbsPath(std::string File);
+
 // simple c++ glob
 std::vector<std::string> Glob(std::string const &pattern, int flags=0);
 
+/** \brief Popen() implementation that execv() instead of using a shell
+ *
+ * \param Args the execv style command to run
+ * \param FileFd is a referenz to the FileFd to use for input or output
+ * \param Child a reference to the integer that stores the child pid
+ *        Note that you must call ExecWait() or similar to cleanup
+ * \param Mode is either FileFd::ReadOnly or FileFd::WriteOnly
+ * \return true on success, false on failure with _error set
+ */
+bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode);
+
+
 #endif
index f24dd964018852d7cf23dd0675250d209fe09e56..9d798cca986713faf5bbbeb9cc94ea9e799bfd24 100644 (file)
@@ -32,50 +32,30 @@ static char * GenerateTemporaryFileTemplate(const char *basename)   /*{{{*/
                                                                        /*}}}*/
 // ExecGPGV - returns the command needed for verify                    /*{{{*/
 // ---------------------------------------------------------------------
-/* Generating the commandline for calling gpgv is somehow complicated as
+/* Generating the commandline for calling gpg is somehow complicated as
    we need to add multiple keyrings and user supplied options.
-   Also, as gpgv has no options to enforce a certain reduced style of
+   Also, as gpg has no options to enforce a certain reduced style of
    clear-signed files (=the complete content of the file is signed and
    the content isn't encoded) we do a divide and conquer approach here
-   and split up the clear-signed file in message and signature for gpgv
+   and split up the clear-signed file in message and signature for gpg.
+   And as a cherry on the cake, we use our apt-key wrapper to do part
+   of the lifting in regards to merging keyrings. Fun for the whole family.
 */
 void ExecGPGV(std::string const &File, std::string const &FileGPG,
              int const &statusfd, int fd[2])
 {
    #define EINTERNAL 111
-   std::string const gpgvpath = _config->Find("Dir::Bin::gpg", "/usr/bin/gpgv");
-   // FIXME: remove support for deprecated APT::GPGV setting
-   std::string const trustedFile = _config->Find("APT::GPGV::TrustedKeyring", _config->FindFile("Dir::Etc::Trusted"));
-   std::string const trustedPath = _config->FindDir("Dir::Etc::TrustedParts");
+   std::string const aptkey = _config->FindFile("Dir::Bin::apt-key", "/usr/bin/apt-key");
 
    bool const Debug = _config->FindB("Debug::Acquire::gpgv", false);
 
-   if (Debug == true)
-   {
-      std::clog << "gpgv path: " << gpgvpath << std::endl;
-      std::clog << "Keyring file: " << trustedFile << std::endl;
-      std::clog << "Keyring path: " << trustedPath << std::endl;
-   }
-
-   std::vector<std::string> keyrings;
-   if (DirectoryExists(trustedPath))
-     keyrings = GetListOfFilesInDir(trustedPath, "gpg", false, true);
-   if (RealFileExists(trustedFile) == true)
-     keyrings.push_back(trustedFile);
-
    std::vector<const char *> Args;
-   Args.reserve(30);
-
-   if (keyrings.empty() == true)
-   {
-      // TRANSLATOR: %s is the trusted keyring parts directory
-      ioprintf(std::cerr, _("No keyring installed in %s."),
-           _config->FindDir("Dir::Etc::TrustedParts").c_str());
-      exit(EINTERNAL);
-   }
+   Args.reserve(10);
 
-   Args.push_back(gpgvpath.c_str());
-   Args.push_back("--ignore-time-conflict");
+   Args.push_back(aptkey.c_str());
+   Args.push_back("--quiet");
+   Args.push_back("--readonly");
+   Args.push_back("verify");
 
    char statusfdstr[10];
    if (statusfd != -1)
@@ -85,13 +65,6 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
       Args.push_back(statusfdstr);
    }
 
-   for (std::vector<std::string>::const_iterator K = keyrings.begin();
-       K != keyrings.end(); ++K)
-   {
-      Args.push_back("--keyring");
-      Args.push_back(K->c_str());
-   }
-
    Configuration::Item const *Opts;
    Opts = _config->Tree("Acquire::gpgv::Options");
    if (Opts != 0)
@@ -160,7 +133,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
 
    if (Debug == true)
    {
-      std::clog << "Preparing to exec: " << gpgvpath;
+      std::clog << "Preparing to exec: ";
       for (std::vector<const char *>::const_iterator a = Args.begin(); *a != NULL; ++a)
         std::clog << " " << *a;
       std::clog << std::endl;
@@ -168,7 +141,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
 
    if (statusfd != -1)
    {
-      int const nullfd = open("/dev/null", O_RDONLY);
+      int const nullfd = open("/dev/null", O_WRONLY);
       close(fd[0]);
       // Redirect output to /dev/null; we read from the status fd
       if (statusfd != STDOUT_FILENO)
@@ -185,7 +158,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
 
    if (releaseSignature == DETACHED)
    {
-      execvp(gpgvpath.c_str(), (char **) &Args[0]);
+      execvp(Args[0], (char **) &Args[0]);
       ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str());
       exit(EINTERNAL);
    }
@@ -205,7 +178,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
       {
         if (statusfd != -1)
            dup2(fd[1], statusfd);
-        execvp(gpgvpath.c_str(), (char **) &Args[0]);
+        execvp(Args[0], (char **) &Args[0]);
         ioprintf(std::cerr, "Couldn't execute %s to check %s", Args[0], File.c_str());
         UNLINK_EXIT(EINTERNAL);
       }
@@ -216,7 +189,7 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
       {
         if (errno == EINTR)
            continue;
-        ioprintf(std::cerr, _("Waited for %s but it wasn't there"), "gpgv");
+        ioprintf(std::cerr, _("Waited for %s but it wasn't there"), "apt-key");
         UNLINK_EXIT(EINTERNAL);
       }
 #undef UNLINK_EXIT
@@ -229,14 +202,14 @@ void ExecGPGV(std::string const &File, std::string const &FileGPG,
       // check if it exit'ed normally …
       if (WIFEXITED(Status) == false)
       {
-        ioprintf(std::cerr, _("Sub-process %s exited unexpectedly"), "gpgv");
+        ioprintf(std::cerr, _("Sub-process %s exited unexpectedly"), "apt-key");
         exit(EINTERNAL);
       }
 
       // … and with a good exit code
       if (WEXITSTATUS(Status) != 0)
       {
-        ioprintf(std::cerr, _("Sub-process %s returned an error code (%u)"), "gpgv", WEXITSTATUS(Status));
+        ioprintf(std::cerr, _("Sub-process %s returned an error code (%u)"), "apt-key", WEXITSTATUS(Status));
         exit(WEXITSTATUS(Status));
       }
 
index bb11a3fcabc3a2508f9c6fcd0c364d5de1f21bd6..6e7080bc90d9126e1f82240826d90dd90462ab5c 100644 (file)
@@ -29,7 +29,7 @@
 
 const char * HashString::_SupportedHashes[] =
 {
-   "SHA512", "SHA256", "SHA1", "MD5Sum", NULL
+   "SHA512", "SHA256", "SHA1", "MD5Sum", "Checksum-FileSize", NULL
 };
 
 HashString::HashString()
@@ -111,6 +111,8 @@ std::string HashString::GetHashForFile(std::string filename) const      /*{{{*/
       SHA512.AddFD(Fd);
       fileHash = (std::string)SHA512.Result();
    }
+   else if (strcasecmp(Type.c_str(), "Checksum-FileSize") == 0)
+      strprintf(fileHash, "%llu", Fd.FileSize());
    Fd.Close();
 
    return fileHash;
@@ -141,11 +143,27 @@ APT_PURE bool HashString::operator!=(HashString const &other) const
 }
                                                                        /*}}}*/
 
+bool HashStringList::usable() const                                    /*{{{*/
+{
+   if (empty() == true)
+      return false;
+   std::string const forcedType = _config->Find("Acquire::ForceHash", "");
+   if (forcedType.empty() == true)
+   {
+      // FileSize alone isn't usable
+      for (std::vector<HashString>::const_iterator hs = list.begin(); hs != list.end(); ++hs)
+        if (hs->HashType() != "Checksum-FileSize")
+           return true;
+      return false;
+   }
+   return find(forcedType) != NULL;
+}
+                                                                       /*}}}*/
 HashString const * HashStringList::find(char const * const type) const /*{{{*/
 {
    if (type == NULL || type[0] == '\0')
    {
-      std::string forcedType = _config->Find("Acquire::ForceHash", "");
+      std::string const forcedType = _config->Find("Acquire::ForceHash", "");
       if (forcedType.empty() == false)
         return find(forcedType.c_str());
       for (char const * const * t = HashString::SupportedHashes(); *t != NULL; ++t)
@@ -191,11 +209,23 @@ bool HashStringList::VerifyFile(std::string filename) const               /*{{{*/
    HashString const * const hs = find(NULL);
    if (hs == NULL || hs->VerifyFile(filename) == false)
       return false;
+   HashString const * const hsf = find("Checksum-FileSize");
+   if (hsf != NULL && hsf->VerifyFile(filename) == false)
+      return false;
    return true;
 }
                                                                        /*}}}*/
 bool HashStringList::operator==(HashStringList const &other) const     /*{{{*/
 {
+   std::string const forcedType = _config->Find("Acquire::ForceHash", "");
+   if (forcedType.empty() == false)
+   {
+      HashString const * const hs = find(forcedType);
+      HashString const * const ohs = other.find(forcedType);
+      if (hs == NULL || ohs == NULL)
+        return false;
+      return *hs == *ohs;
+   }
    short matches = 0;
    for (const_iterator hs = begin(); hs != end(); ++hs)
    {
@@ -216,11 +246,32 @@ bool HashStringList::operator!=(HashStringList const &other) const
 }
                                                                        /*}}}*/
 
-// Hashes::AddFD - Add the contents of the FD                          /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool Hashes::AddFD(int const Fd,unsigned long long Size, bool const addMD5,
-                  bool const addSHA1, bool const addSHA256, bool const addSHA512)
+// PrivateHashes                                                       /*{{{*/
+class PrivateHashes {
+public:
+   unsigned long long FileSize;
+
+   PrivateHashes() : FileSize(0) {}
+};
+                                                                       /*}}}*/
+// Hashes::Add* - Add the contents of data or FD                       /*{{{*/
+bool Hashes::Add(const unsigned char * const Data,unsigned long long const Size, unsigned int const Hashes)
+{
+   bool Res = true;
+APT_IGNORE_DEPRECATED_PUSH
+   if ((Hashes & MD5SUM) == MD5SUM)
+      Res &= MD5.Add(Data, Size);
+   if ((Hashes & SHA1SUM) == SHA1SUM)
+      Res &= SHA1.Add(Data, Size);
+   if ((Hashes & SHA256SUM) == SHA256SUM)
+      Res &= SHA256.Add(Data, Size);
+   if ((Hashes & SHA512SUM) == SHA512SUM)
+      Res &= SHA512.Add(Data, Size);
+APT_IGNORE_DEPRECATED_POP
+   d->FileSize += Size;
+   return Res;
+}
+bool Hashes::AddFD(int const Fd,unsigned long long Size, unsigned int const Hashes)
 {
    unsigned char Buf[64*64];
    bool const ToEOF = (Size == UntilEOF);
@@ -234,19 +285,12 @@ bool Hashes::AddFD(int const Fd,unsigned long long Size, bool const addMD5,
       if (ToEOF && Res == 0) // EOF
         break;
       Size -= Res;
-      if (addMD5 == true)
-        MD5.Add(Buf,Res);
-      if (addSHA1 == true)
-        SHA1.Add(Buf,Res);
-      if (addSHA256 == true)
-        SHA256.Add(Buf,Res);
-      if (addSHA512 == true)
-        SHA512.Add(Buf,Res);
+      if (Add(Buf, Res, Hashes) == false)
+        return false;
    }
    return true;
 }
-bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, bool const addMD5,
-                  bool const addSHA1, bool const addSHA256, bool const addSHA512)
+bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, unsigned int const Hashes)
 {
    unsigned char Buf[64*64];
    bool const ToEOF = (Size == 0);
@@ -265,15 +309,27 @@ bool Hashes::AddFD(FileFd &Fd,unsigned long long Size, bool const addMD5,
       else if (a == 0) // EOF
         break;
       Size -= a;
-      if (addMD5 == true)
-        MD5.Add(Buf, a);
-      if (addSHA1 == true)
-        SHA1.Add(Buf, a);
-      if (addSHA256 == true)
-        SHA256.Add(Buf, a);
-      if (addSHA512 == true)
-        SHA512.Add(Buf, a);
+      if (Add(Buf, a, Hashes) == false)
+        return false;
    }
    return true;
 }
                                                                        /*}}}*/
+HashStringList Hashes::GetHashStringList()
+{
+   HashStringList hashes;
+APT_IGNORE_DEPRECATED_PUSH
+   hashes.push_back(HashString("MD5Sum", MD5.Result().Value()));
+   hashes.push_back(HashString("SHA1", SHA1.Result().Value()));
+   hashes.push_back(HashString("SHA256", SHA256.Result().Value()));
+   hashes.push_back(HashString("SHA512", SHA512.Result().Value()));
+APT_IGNORE_DEPRECATED_POP
+   std::string SizeStr;
+   strprintf(SizeStr, "%llu", d->FileSize);
+   hashes.push_back(HashString("Checksum-FileSize", SizeStr));
+   return hashes;
+}
+APT_IGNORE_DEPRECATED_PUSH
+Hashes::Hashes() { d = new PrivateHashes(); }
+Hashes::~Hashes() { delete d; }
+APT_IGNORE_DEPRECATED_POP
index 5a4213868ccb52dc7d7e66e73bec0f0171d470b2..1548624575cc9c0d8f67f13cd48cc59f24eba22c 100644 (file)
@@ -53,9 +53,10 @@ class HashString
    HashString();
 
    // get hash type used
-   std::string HashType() { return Type; };
    std::string HashType() const { return Type; };
    std::string HashValue() const { return Hash; };
+   APT_DEPRECATED std::string HashType() { return Type; };
+   APT_DEPRECATED std::string HashValue() { return Hash; };
 
    // verify the given filename against the currently loaded hash
    bool VerifyFile(std::string filename) const;
@@ -115,6 +116,15 @@ class HashStringList
     */
    bool empty() const { return list.empty(); }
 
+   /** has the list at least one good entry
+    *
+    * similar to #empty, but handles forced hashes.
+    *
+    * @return if no hash is forced, same result as #empty,
+    * if one is forced \b true if this has is available, \b false otherwise
+    */
+   bool usable() const;
+
    typedef std::vector<HashString>::const_iterator const_iterator;
 
    /** iterator to the first element */
@@ -129,8 +139,10 @@ class HashStringList
    /** compare two HashStringList for similarity.
     *
     * Two lists are similar if at least one hashtype is in both lists
-    * and the hashsum matches. All hashes are checked, if one doesn't
-    * match false is returned regardless of how many matched before.
+    * and the hashsum matches. All hashes are checked by default,
+    * if one doesn't match false is returned regardless of how many
+    * matched before. If a hash is forced, only this hash is compared,
+    * all others are ignored.
     */
    bool operator==(HashStringList const &other) const;
    bool operator!=(HashStringList const &other) const;
@@ -151,32 +163,60 @@ class HashStringList
    std::vector<HashString> list;
 };
 
+class PrivateHashes;
 class Hashes
 {
+   PrivateHashes *d;
+
    public:
+   /* those will disappear in the future as it is hard to add new ones this way.
+    * Use Add* to build the results and get them via GetHashStringList() instead */
+   APT_DEPRECATED MD5Summation MD5;
+   APT_DEPRECATED SHA1Summation SHA1;
+   APT_DEPRECATED SHA256Summation SHA256;
+   APT_DEPRECATED SHA512Summation SHA512;
 
-   MD5Summation MD5;
-   SHA1Summation SHA1;
-   SHA256Summation SHA256;
-   SHA512Summation SHA512;
-   
    static const int UntilEOF = 0;
 
-   inline bool Add(const unsigned char *Data,unsigned long long Size)
+   bool Add(const unsigned char * const Data, unsigned long long const Size, unsigned int const Hashes = ~0);
+   inline bool Add(const char * const Data)
+   {return Add((unsigned char const * const)Data,strlen(Data));};
+   inline bool Add(const unsigned char * const Beg,const unsigned char * const End)
+   {return Add(Beg,End-Beg);};
+
+   enum SupportedHashes { MD5SUM = (1 << 0), SHA1SUM = (1 << 1), SHA256SUM = (1 << 2),
+      SHA512SUM = (1 << 3) };
+   bool AddFD(int const Fd,unsigned long long Size = 0, unsigned int const Hashes = ~0);
+   bool AddFD(FileFd &Fd,unsigned long long Size = 0, unsigned int const Hashes = ~0);
+
+   HashStringList GetHashStringList();
+
+APT_IGNORE_DEPRECATED_PUSH
+   Hashes();
+   virtual ~Hashes();
+APT_IGNORE_DEPRECATED_POP
+
+   private:
+   APT_HIDDEN APT_CONST inline unsigned int boolsToFlag(bool const addMD5, bool const addSHA1, bool const addSHA256, bool const addSHA512)
    {
-      return MD5.Add(Data,Size) && SHA1.Add(Data,Size) && SHA256.Add(Data,Size) && SHA512.Add(Data,Size);
+      unsigned int Hashes = ~0;
+      if (addMD5 == false) Hashes &= ~MD5SUM;
+      if (addSHA1 == false) Hashes &= ~SHA1SUM;
+      if (addSHA256 == false) Hashes &= ~SHA256SUM;
+      if (addSHA512 == false) Hashes &= ~SHA512SUM;
+      return Hashes;
+   }
+
+   public:
+   APT_DEPRECATED bool AddFD(int const Fd, unsigned long long Size, bool const addMD5,
+        bool const addSHA1, bool const addSHA256, bool const addSHA512) {
+      return AddFD(Fd, Size, boolsToFlag(addMD5, addSHA1, addSHA256, addSHA512));
+   };
+
+   APT_DEPRECATED bool AddFD(FileFd &Fd, unsigned long long Size, bool const addMD5,
+        bool const addSHA1, bool const addSHA256, bool const addSHA512) {
+      return AddFD(Fd, Size, boolsToFlag(addMD5, addSHA1, addSHA256, addSHA512));
    };
-   inline bool Add(const char *Data) {return Add((unsigned char const *)Data,strlen(Data));};
-   inline bool AddFD(int const Fd,unsigned long long Size = 0)
-   { return AddFD(Fd, Size, true, true, true, true); };
-   bool AddFD(int const Fd, unsigned long long Size, bool const addMD5,
-             bool const addSHA1, bool const addSHA256, bool const addSHA512);
-   inline bool AddFD(FileFd &Fd,unsigned long long Size = 0)
-   { return AddFD(Fd, Size, true, true, true, true); };
-   bool AddFD(FileFd &Fd, unsigned long long Size, bool const addMD5,
-             bool const addSHA1, bool const addSHA256, bool const addSHA512);
-   inline bool Add(const unsigned char *Beg,const unsigned char *End) 
-                  {return Add(Beg,End-Beg);};
 };
 
 #endif
index 2d6448e5e257fd7552abfebb415a877231885121..14541d4d8918af125c46c1d6769a8df3b4e37f77 100644 (file)
 #endif
 #endif
 
+#if __GNUC__ >= 4
+       #define APT_IGNORE_DEPRECATED_PUSH \
+               _Pragma("GCC diagnostic push") \
+               _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
+       #define APT_IGNORE_DEPRECATED_POP \
+               _Pragma("GCC diagnostic pop")
+       #define APT_IGNORE_DEPRECATED(XXX) \
+               APT_IGNORE_DEPRECATED_PUSH \
+               XXX \
+               APT_IGNORE_DEPRECATED_POP
+#else
+       #define APT_IGNORE_DEPRECATED_PUSH
+       #define APT_IGNORE_DEPRECATED_POP
+       #define APT_IGNORE_DEPRECATED(XXX) XXX
+#endif
+
 // These lines are extracted by the makefiles and the buildsystem
 // Increasing MAJOR or MINOR results in the need of recompiling all
 // reverse-dependencies of libapt-pkg against the new SONAME.
 // Non-ABI-Breaks should only increase RELEASE number.
 // See also buildlib/libversion.mak
 #define APT_PKG_MAJOR 4
-#define APT_PKG_MINOR 12
+#define APT_PKG_MINOR 15
 #define APT_PKG_RELEASE 0
+#define APT_PKG_ABI ((APT_PKG_MAJOR * 100) + APT_PKG_MINOR)
 
 #endif
index feaed67c89985d53d44bd7f5eb9aa1fb33b1191b..1e3778f4540821f248a326a8f70792764bbfb499 100644 (file)
@@ -152,18 +152,6 @@ static int parsenetrc_string (char *host, std::string &login, std::string &passw
 
   return retcode;
 }
-// for some unknown reason this method is exported so keep a compatible interface for now …
-int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL)
-{
-   std::string login_string, password_string;
-   int const ret = parsenetrc_string(host, login_string, password_string, netrcfile);
-   if (ret < 0)
-      return ret;
-   strncpy(login, login_string.c_str(), LOGINSIZE - 1);
-   strncpy(password, password_string.c_str(), PASSWORDSIZE - 1);
-   return ret;
-}
-
 
 void maybe_add_auth (URI &Uri, string NetRCFile)
 {
index dbeb45386a410a19aa30ccf0f473d43b8c68ed36..b5b56f5d40c5cfaf4853046d609530e8fd98b48d 100644 (file)
@@ -27,9 +27,5 @@
 
 class URI;
 
-// FIXME: kill this export on the next ABI break - strongly doubt its in use anyway
-// outside of the apt itself, its really a internal interface
-APT_DEPRECATED int parsenetrc (char *host, char *login, char *password, char *filename);
-
 void maybe_add_auth (URI &Uri, std::string NetRCFile);
 #endif
index 87f57a30ece365b886fe807a304275296c2d31e3..0ac587a9e22b111e796aff07791a8209a4a82d30 100644 (file)
@@ -74,6 +74,13 @@ bool Endswith(const std::string &s, const std::string &end)
    return (s.substr(s.size() - end.size(), s.size()) == end);
 }
 
+bool Startswith(const std::string &s, const std::string &start)
+{
+   if (start.size() > s.size())
+      return false;
+   return (s.substr(0, start.size()) == start);
+}
+
 }
 }
                                                                        /*}}}*/
@@ -772,86 +779,94 @@ string TimeRFC1123(time_t Date)
 
    In particular: this reads blocks from the input until it believes
    that it's run out of input text.  Each block is terminated by a
-   double newline ('\n' followed by '\n').  As noted below, there is a
-   bug in this code: it assumes that all the blocks have been read if
-   it doesn't see additional text in the buffer after the last one is
-   parsed, which will cause it to lose blocks if the last block
-   coincides with the end of the buffer.
+   double newline ('\n' followed by '\n').
  */
 bool ReadMessages(int Fd, vector<string> &List)
 {
    char Buffer[64000];
-   char *End = Buffer;
    // Represents any left-over from the previous iteration of the
    // parse loop.  (i.e., if a message is split across the end
    // of the buffer, it goes here)
    string PartialMessage;
-   
-   while (1)
-   {
-      int Res = read(Fd,End,sizeof(Buffer) - (End-Buffer));
+
+   do {
+      int const Res = read(Fd, Buffer, sizeof(Buffer));
       if (Res < 0 && errno == EINTR)
         continue;
-      
-      // Process is dead, this is kind of bad..
+
+      // process we read from has died
       if (Res == 0)
         return false;
-      
+
       // No data
-      if (Res < 0 && errno == EAGAIN)
+      if (Res < 0 && (errno == EAGAIN || errno == EWOULDBLOCK))
         return true;
       if (Res < 0)
         return false;
-                             
-      End += Res;
-      
-      // Look for the end of the message
-      for (char *I = Buffer; I + 1 < End; I++)
+
+      // extract the message(s) from the buffer
+      char const *Start = Buffer;
+      char const * const End = Buffer + Res;
+
+      char const * NL = (char const *) memchr(Start, '\n', End - Start);
+      if (NL == NULL)
       {
-        if (I[1] != '\n' ||
-              (I[0] != '\n' && strncmp(I, "\r\n\r\n", 4) != 0))
-           continue;
-        
-        // Pull the message out
-        string Message(Buffer,I-Buffer);
-        PartialMessage += Message;
-
-        // Fix up the buffer
-        for (; I < End && (*I == '\n' || *I == '\r'); ++I);
-        End -= I-Buffer;        
-        memmove(Buffer,I,End-Buffer);
-        I = Buffer;
-        
-        List.push_back(PartialMessage);
-        PartialMessage.clear();
+        // end of buffer: store what we have so far and read new data in
+        PartialMessage.append(Start, End - Start);
+        Start = End;
       }
-      if (End != Buffer)
-       {
-         // If there's text left in the buffer, store it
-         // in PartialMessage and throw the rest of the buffer
-         // away.  This allows us to handle messages that
-         // are longer than the static buffer size.
-         PartialMessage += string(Buffer, End);
-         End = Buffer;
-       }
       else
-       {
-         // BUG ALERT: if a message block happens to end at a
-         // multiple of 64000 characters, this will cause it to
-         // terminate early, leading to a badly formed block and
-         // probably crashing the method.  However, this is the only
-         // way we have to find the end of the message block.  I have
-         // an idea of how to fix this, but it will require changes
-         // to the protocol (essentially to mark the beginning and
-         // end of the block).
-         //
-         //  -- dburrows 2008-04-02
-         return true;
-       }
+        ++NL;
+
+      if (PartialMessage.empty() == false && Start < End)
+      {
+        // if we start with a new line, see if the partial message we have ended with one
+        // so that we properly detect records ending between two read() runs
+        // cases are: \n|\n  ,  \r\n|\r\n  and  \r\n\r|\n
+        // the case \r|\n\r\n is handled by the usual double-newline handling
+        if ((NL - Start) == 1 || ((NL - Start) == 2 && *Start == '\r'))
+        {
+           if (APT::String::Endswith(PartialMessage, "\n") || APT::String::Endswith(PartialMessage, "\r\n\r"))
+           {
+              PartialMessage.erase(PartialMessage.find_last_not_of("\r\n") + 1);
+              List.push_back(PartialMessage);
+              PartialMessage.clear();
+              while (NL < End && (*NL == '\n' || *NL == '\r')) ++NL;
+              Start = NL;
+           }
+        }
+      }
+
+      while (Start < End) {
+        char const * NL2 = (char const *) memchr(NL, '\n', End - NL);
+        if (NL2 == NULL)
+        {
+           // end of buffer: store what we have so far and read new data in
+           PartialMessage.append(Start, End - Start);
+           break;
+        }
+        ++NL2;
+
+        // did we find a double newline?
+        if ((NL2 - NL) == 1 || ((NL2 - NL) == 2 && *NL == '\r'))
+        {
+           PartialMessage.append(Start, NL2 - Start);
+           PartialMessage.erase(PartialMessage.find_last_not_of("\r\n") + 1);
+           List.push_back(PartialMessage);
+           PartialMessage.clear();
+           while (NL2 < End && (*NL2 == '\n' || *NL2 == '\r')) ++NL2;
+           Start = NL2;
+        }
+        NL = NL2;
+      }
+
+      // we have read at least one complete message and nothing left
+      if (PartialMessage.empty() == true)
+        return true;
 
       if (WaitFd(Fd) == false)
         return false;
-   }   
+   } while (true);
 }
                                                                        /*}}}*/
 // MonthConv - Converts a month string into a number                   /*{{{*/
@@ -1061,7 +1076,7 @@ bool StrToNum(const char *Str,unsigned long long &Res,unsigned Len,unsigned Base
 // ---------------------------------------------------------------------
 /* This is used in decoding the 256bit encoded fixed length fields in
    tar files */
-bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len)
+bool Base256ToNum(const char *Str,unsigned long long &Res,unsigned int Len)
 {
    if ((Str[0] & 0x80) == 0)
       return false;
@@ -1074,6 +1089,23 @@ bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len)
    }
 }
                                                                        /*}}}*/
+// Base256ToNum - Convert a fixed length binary to a number             /*{{{*/
+// ---------------------------------------------------------------------
+/* This is used in decoding the 256bit encoded fixed length fields in
+   tar files */
+bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len)
+{
+   unsigned long long Num;
+   bool rc;
+
+   rc = Base256ToNum(Str, Num, Len);
+   Res = Num;
+   if (Res != Num)
+      return false;
+
+   return rc;
+}
+                                                                       /*}}}*/
 // HexDigit - Convert a hex character into an integer                  /*{{{*/
 // ---------------------------------------------------------------------
 /* Helper for Hex2Num */
@@ -1287,10 +1319,12 @@ void ioprintf(ostream &out,const char *format,...)
    va_list args;
    ssize_t size = 400;
    while (true) {
+      bool ret = false;
       va_start(args,format);
-      if (iovprintf(out, format, args, size) == true)
-        return;
+      ret = iovprintf(out, format, args, size);
       va_end(args);
+      if (ret == true)
+        return;
    }
 }
 void strprintf(string &out,const char *format,...)
@@ -1299,10 +1333,12 @@ void strprintf(string &out,const char *format,...)
    ssize_t size = 400;
    std::ostringstream outstr;
    while (true) {
+      bool ret = false;
       va_start(args,format);
-      if (iovprintf(outstr, format, args, size) == true)
-        break;
+      ret = iovprintf(outstr, format, args, size);
       va_end(args);
+      if (ret == true)
+        break;
    }
    out = outstr.str();
 }
index 185cdc3fc5c3aae13a690d4be79aab053af0860c..e20ddca9c45d336694d004525dec27784a4f6f9a 100644 (file)
@@ -40,6 +40,7 @@ namespace APT {
    namespace String {
       std::string Strip(const std::string &s);
       bool Endswith(const std::string &s, const std::string &ending);
+      bool Startswith(const std::string &s, const std::string &starting);
    }
 }
 
@@ -72,6 +73,7 @@ bool ReadMessages(int Fd, std::vector<std::string> &List);
 bool StrToNum(const char *Str,unsigned long &Res,unsigned Len,unsigned Base = 0);
 bool StrToNum(const char *Str,unsigned long long &Res,unsigned Len,unsigned Base = 0);
 bool Base256ToNum(const char *Str,unsigned long &Res,unsigned int Len);
+bool Base256ToNum(const char *Str,unsigned long long &Res,unsigned int Len);
 bool Hex2Num(const std::string &Str,unsigned char *Num,unsigned int Length);
 
 // input changing string split
@@ -151,9 +153,9 @@ inline const char *DeNull(const char *s) {return (s == 0?"(null)":s);}
 class URI
 {
    void CopyFrom(const std::string &From);
-                
+
    public:
-   
+
    std::string Access;
    std::string User;
    std::string Password;
index 5b4289e929fc6ba07d5179b609df57f3f6f4b20f..cecfe41a9d477759ba2df6cea8bee44e1ad1e89b 100644 (file)
@@ -30,6 +30,7 @@
 #include <apt-pkg/pkgcachegen.h>
 #include <apt-pkg/pkgrecords.h>
 #include <apt-pkg/srcrecords.h>
+#include <apt-pkg/sptr.h>
 
 #include <stdio.h>
 #include <iostream>
@@ -130,7 +131,7 @@ string debSourcesIndex::Info(const char *Type) const
 // SourcesIndex::Index* - Return the URI to the index files            /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-inline string debSourcesIndex::IndexFile(const char *Type) const
+string debSourcesIndex::IndexFile(const char *Type) const
 {
    string s = URItoFileName(IndexURI(Type));
 
@@ -264,7 +265,7 @@ string debPackagesIndex::Info(const char *Type) const
 // PackagesIndex::Index* - Return the URI to the index files           /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-inline string debPackagesIndex::IndexFile(const char *Type) const
+string debPackagesIndex::IndexFile(const char *Type) const
 {
    string s =_config->FindDir("Dir::State::lists") + URItoFileName(IndexURI(Type));
 
@@ -420,7 +421,7 @@ debTranslationsIndex::debTranslationsIndex(string URI,string Dist,string Section
 // TranslationIndex::Trans* - Return the URI to the translation files  /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-inline string debTranslationsIndex::IndexFile(const char *Type) const
+string debTranslationsIndex::IndexFile(const char *Type) const
 {
    string s =_config->FindDir("Dir::State::lists") + URItoFileName(IndexURI(Type));
 
@@ -451,19 +452,6 @@ string debTranslationsIndex::IndexURI(const char *Type) const
    return Res;
 }
                                                                        /*}}}*/
-// TranslationsIndex::GetIndexes - Fetch the index files               /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool debTranslationsIndex::GetIndexes(pkgAcquire *Owner) const
-{
-   string const TranslationFile = string("Translation-").append(Language);
-   new pkgAcqIndexTrans(Owner, IndexURI(Language),
-                        Info(TranslationFile.c_str()),
-                        TranslationFile);
-
-   return true;
-}
-                                                                       /*}}}*/
 // TranslationsIndex::Describe - Give a descriptive path to the index  /*{{{*/
 // ---------------------------------------------------------------------
 /* This should help the user find the index in the sources.list and
@@ -634,7 +622,7 @@ bool debStatusIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
    pkgCache::PkgFileIterator CFile = Gen.GetCurFile();
    CFile->Size = Pkg.FileSize();
    CFile->mtime = Pkg.ModificationTime();
-   map_ptrloc const storage = Gen.WriteUniqString("now");
+   map_stringitem_t const storage = Gen.StoreString(pkgCacheGenerator::MIXED, "now");
    CFile->Archive = storage;
    
    if (Gen.MergeList(Parser) == false)
@@ -683,14 +671,144 @@ APT_CONST bool debStatusIndex::Exists() const
 }
                                                                        /*}}}*/
 
+// debDebPkgFile - Single .deb file                                    /*{{{*/
+// ---------------------------------------------------------------------
+debDebPkgFileIndex::debDebPkgFileIndex(std::string DebFile)
+   : pkgIndexFile(true), DebFile(DebFile)
+{
+   DebFileFullPath = flAbsPath(DebFile);
+}
+
+std::string debDebPkgFileIndex::ArchiveURI(std::string /*File*/) const
+{
+   return "file:" + DebFileFullPath;
+}
+
+bool debDebPkgFileIndex::Exists() const
+{
+   return FileExists(DebFile);
+}
+bool debDebPkgFileIndex::Merge(pkgCacheGenerator& Gen, OpProgress* Prog) const
+{
+   if(Prog)
+      Prog->SubProgress(0, "Reading deb file");
+
+   // get the control data out of the deb file vid dpkg -I
+   // ... can I haz libdpkg?
+   Configuration::Item const *Opts = _config->Tree("DPkg::Options");
+   std::string dpkg = _config->Find("Dir::Bin::dpkg","dpkg");
+   std::vector<const char *> Args;
+   Args.push_back(dpkg.c_str());
+   if (Opts != 0)
+   {
+      Opts = Opts->Child;
+      for (; Opts != 0; Opts = Opts->Next)
+      {
+        if (Opts->Value.empty() == true)
+           continue;
+        Args.push_back(Opts->Value.c_str());
+      }
+   }
+   Args.push_back("-I");
+   Args.push_back(DebFile.c_str());
+   Args.push_back("control");
+   Args.push_back(NULL);
+   FileFd PipeFd;
+   pid_t Child;
+   if(Popen((const char**)&Args[0], PipeFd, Child, FileFd::ReadOnly) == false)
+      return _error->Error("Popen failed");
+   // FIXME: static buffer
+   char buf[8*1024];
+   unsigned long long n = 0;
+   if(PipeFd.Read(buf, sizeof(buf)-1, &n) == false)
+      return _error->Errno("read", "Failed to read dpkg pipe");
+   ExecWait(Child, "Popen");
+
+   // now write the control data to a tempfile
+   SPtr<FileFd> DebControl = GetTempFile("deb-file-" + flNotDir(DebFile));
+   if(DebControl == NULL)
+      return false;
+   DebControl->Write(buf, n);
+   // append size of the file
+   FileFd Fd(DebFile, FileFd::ReadOnly);
+   string Size;
+   strprintf(Size, "Size: %llu\n", Fd.Size());
+   DebControl->Write(Size.c_str(), Size.size());
+   // and rewind for the listparser
+   DebControl->Seek(0);
+
+   // and give it to the list parser
+   debDebFileParser Parser(DebControl, DebFile);
+   if(Gen.SelectFile(DebFile, "local", *this) == false)
+      return _error->Error("Problem with SelectFile %s", DebFile.c_str());
+
+   pkgCache::PkgFileIterator File = Gen.GetCurFile();
+   File->Size = DebControl->Size();
+   File->mtime = DebControl->ModificationTime();
+   
+   if (Gen.MergeList(Parser) == false)
+      return _error->Error("Problem with MergeLister for %s", DebFile.c_str());
+
+   return true;
+}
+pkgCache::PkgFileIterator debDebPkgFileIndex::FindInCache(pkgCache &Cache) const
+{
+   pkgCache::PkgFileIterator File = Cache.FileBegin();
+   for (; File.end() == false; ++File)
+   {
+       if (File.FileName() == NULL || DebFile != File.FileName())
+        continue;
+
+       return File;
+   }
+   
+   return File;
+}
+unsigned long debDebPkgFileIndex::Size() const
+{
+   struct stat buf;
+   if(stat(DebFile.c_str(), &buf) != 0)
+      return 0;
+   return buf.st_size;
+}
+                                                                       /*}}}*/
+
+// debDscFileIndex stuff
+debDscFileIndex::debDscFileIndex(std::string &DscFile) 
+   : pkgIndexFile(true), DscFile(DscFile)
+{
+}
+
+bool debDscFileIndex::Exists() const
+{
+   return FileExists(DscFile);
+}
+
+unsigned long debDscFileIndex::Size() const
+{
+   struct stat buf;
+   if(stat(DscFile.c_str(), &buf) == 0)
+      return buf.st_size;
+   return 0;
+}
+
+// DscFileIndex::CreateSrcParser - Get a parser for the .dsc file      /*{{{*/
+pkgSrcRecords::Parser *debDscFileIndex::CreateSrcParser() const
+{
+   if (!FileExists(DscFile))
+      return NULL;
+
+   return new debDscRecordParser(DscFile,this);
+}
+                                                                       /*}}}*/
 // Index File types for Debian                                         /*{{{*/
-class debIFTypeSrc : public pkgIndexFile::Type
+class APT_HIDDEN debIFTypeSrc : public pkgIndexFile::Type
 {
    public:
    
    debIFTypeSrc() {Label = "Debian Source Index";};
 };
-class debIFTypePkg : public pkgIndexFile::Type
+class APT_HIDDEN debIFTypePkg : public pkgIndexFile::Type
 {
    public:
    
@@ -700,12 +818,12 @@ class debIFTypePkg : public pkgIndexFile::Type
    };
    debIFTypePkg() {Label = "Debian Package Index";};
 };
-class debIFTypeTrans : public debIFTypePkg
+class APT_HIDDEN debIFTypeTrans : public debIFTypePkg
 {
    public:
    debIFTypeTrans() {Label = "Debian Translation Index";};
 };
-class debIFTypeStatus : public pkgIndexFile::Type
+class APT_HIDDEN debIFTypeStatus : public pkgIndexFile::Type
 {
    public:
    
@@ -715,10 +833,42 @@ class debIFTypeStatus : public pkgIndexFile::Type
    };
    debIFTypeStatus() {Label = "Debian dpkg status file";};
 };
-static debIFTypeSrc _apt_Src;
-static debIFTypePkg _apt_Pkg;
-static debIFTypeTrans _apt_Trans;
-static debIFTypeStatus _apt_Status;
+class APT_HIDDEN debIFTypeDebPkgFile : public pkgIndexFile::Type
+{
+   public:
+   virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator File) const 
+   {
+      return new debDebFileRecordParser(File.FileName(),*File.Cache());
+   };
+   debIFTypeDebPkgFile() {Label = "deb Package file";};
+};
+class APT_HIDDEN debIFTypeDscFile : public pkgIndexFile::Type
+{
+   public:
+   virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string DscFile) const
+   {
+      return new debDscRecordParser(DscFile, NULL);
+   };
+   debIFTypeDscFile() {Label = "dsc File Source Index";};
+};
+class APT_HIDDEN debIFTypeDebianSourceDir : public pkgIndexFile::Type
+{
+   public:
+   virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string SourceDir) const
+   {
+      return new debDscRecordParser(SourceDir + string("/debian/control"), NULL);
+   };
+   debIFTypeDebianSourceDir() {Label = "debian/control File Source Index";};
+};
+
+APT_HIDDEN debIFTypeSrc _apt_Src;
+APT_HIDDEN debIFTypePkg _apt_Pkg;
+APT_HIDDEN debIFTypeTrans _apt_Trans;
+APT_HIDDEN debIFTypeStatus _apt_Status;
+APT_HIDDEN debIFTypeDebPkgFile _apt_DebPkgFile;
+// file based pseudo indexes
+APT_HIDDEN debIFTypeDscFile _apt_DscFile;
+APT_HIDDEN debIFTypeDebianSourceDir _apt_DebianSourceDir;
 
 const pkgIndexFile::Type *debSourcesIndex::GetType() const
 {
@@ -736,5 +886,23 @@ const pkgIndexFile::Type *debStatusIndex::GetType() const
 {
    return &_apt_Status;
 }
-
+const pkgIndexFile::Type *debDebPkgFileIndex::GetType() const
+{
+   return &_apt_DebPkgFile;
+}
+const pkgIndexFile::Type *debDscFileIndex::GetType() const
+{
+   return &_apt_DscFile;
+}
+const pkgIndexFile::Type *debDebianSourceDirIndex::GetType() const
+{
+   return &_apt_DebianSourceDir;
+}
                                                                        /*}}}*/
+
+debStatusIndex::~debStatusIndex() {}
+debPackagesIndex::~debPackagesIndex() {}
+debTranslationsIndex::~debTranslationsIndex() {}
+debSourcesIndex::~debSourcesIndex() {}
+
+debDebPkgFileIndex::~debDebPkgFileIndex() {}
index 017c69a0a907c67c36ad35f66128945dd1beef5a..312e915f18940cb555e83a20fdd59c14a5bd9668 100644 (file)
@@ -28,7 +28,7 @@ class pkgAcquire;
 class pkgCacheGenerator;
 
 
-class debStatusIndex : public pkgIndexFile
+class APT_HIDDEN debStatusIndex : public pkgIndexFile
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
@@ -52,10 +52,10 @@ class debStatusIndex : public pkgIndexFile
    virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
 
    debStatusIndex(std::string File);
-   virtual ~debStatusIndex() {};
+   virtual ~debStatusIndex();
 };
     
-class debPackagesIndex : public pkgIndexFile
+class APT_HIDDEN debPackagesIndex : public pkgIndexFile
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
@@ -65,10 +65,10 @@ class debPackagesIndex : public pkgIndexFile
    std::string Section;
    std::string Architecture;
 
-   std::string Info(const char *Type) const;
-   std::string IndexFile(const char *Type) const;
-   std::string IndexURI(const char *Type) const;
-   
+   APT_HIDDEN std::string Info(const char *Type) const;
+   APT_HIDDEN std::string IndexFile(const char *Type) const;
+   APT_HIDDEN std::string IndexURI(const char *Type) const;
+
    public:
    
    virtual const Type *GetType() const APT_CONST;
@@ -89,10 +89,10 @@ class debPackagesIndex : public pkgIndexFile
 
    debPackagesIndex(std::string const &URI, std::string const &Dist, std::string const &Section,
                        bool const &Trusted, std::string const &Arch = "native");
-   virtual ~debPackagesIndex() {};
+   virtual ~debPackagesIndex();
 };
 
-class debTranslationsIndex : public pkgIndexFile
+class APT_HIDDEN debTranslationsIndex : public pkgIndexFile
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
@@ -102,11 +102,11 @@ class debTranslationsIndex : public pkgIndexFile
    std::string Section;
    const char * const Language;
    
-   std::string Info(const char *Type) const;
-   std::string IndexFile(const char *Type) const;
-   std::string IndexURI(const char *Type) const;
+   APT_HIDDEN std::string Info(const char *Type) const;
+   APT_HIDDEN std::string IndexFile(const char *Type) const;
+   APT_HIDDEN std::string IndexURI(const char *Type) const;
 
-   inline std::string TranslationFile() const {return std::string("Translation-").append(Language);};
+   APT_HIDDEN std::string TranslationFile() const {return std::string("Translation-").append(Language);};
 
    public:
    
@@ -114,7 +114,6 @@ class debTranslationsIndex : public pkgIndexFile
 
    // Interface for acquire
    virtual std::string Describe(bool Short) const;   
-   virtual bool GetIndexes(pkgAcquire *Owner) const;
    
    // Interface for the Cache Generator
    virtual bool Exists() const;
@@ -124,10 +123,10 @@ class debTranslationsIndex : public pkgIndexFile
    virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
 
    debTranslationsIndex(std::string URI,std::string Dist,std::string Section, char const * const Language);
-   virtual ~debTranslationsIndex() {};
+   virtual ~debTranslationsIndex();
 };
 
-class debSourcesIndex : public pkgIndexFile
+class APT_HIDDEN debSourcesIndex : public pkgIndexFile
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
@@ -136,10 +135,10 @@ class debSourcesIndex : public pkgIndexFile
    std::string Dist;
    std::string Section;
 
-   std::string Info(const char *Type) const;
-   std::string IndexFile(const char *Type) const;
-   std::string IndexURI(const char *Type) const;
-   
+   APT_HIDDEN std::string Info(const char *Type) const;
+   APT_HIDDEN std::string IndexFile(const char *Type) const;
+   APT_HIDDEN std::string IndexURI(const char *Type) const;
+
    public:
 
    virtual const Type *GetType() const APT_CONST;
@@ -161,7 +160,61 @@ class debSourcesIndex : public pkgIndexFile
    virtual unsigned long Size() const;
    
    debSourcesIndex(std::string URI,std::string Dist,std::string Section,bool Trusted);
-   virtual ~debSourcesIndex() {};
+   virtual ~debSourcesIndex();
+};
+
+class APT_HIDDEN debDebPkgFileIndex : public pkgIndexFile
+{
+ private:
+   void *d;
+   std::string DebFile;
+   std::string DebFileFullPath;
+
+ public:
+   virtual const Type *GetType() const APT_CONST;
+
+   virtual std::string Describe(bool /*Short*/) const {
+      return DebFile;
+   }
+
+   // Interface for the Cache Generator
+   virtual bool Exists() const;
+   virtual bool HasPackages() const {
+      return true;
+   };
+   virtual unsigned long Size() const;
+   virtual bool Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const;
+   virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
+
+   // Interface for acquire
+   virtual std::string ArchiveURI(std::string /*File*/) const;
+
+   debDebPkgFileIndex(std::string DebFile);
+   virtual ~debDebPkgFileIndex();
+};
+
+class APT_HIDDEN debDscFileIndex : public pkgIndexFile
+{
+ private:
+   std::string DscFile;
+ public:
+   virtual const Type *GetType() const APT_CONST;
+   virtual pkgSrcRecords::Parser *CreateSrcParser() const;
+   virtual bool Exists() const;
+   virtual bool HasPackages() const {return false;};
+   virtual unsigned long Size() const;
+   virtual std::string Describe(bool /*Short*/) const {
+      return DscFile;
+   };
+
+   debDscFileIndex(std::string &DscFile);
+   virtual ~debDscFileIndex() {};
+};
+
+class APT_HIDDEN debDebianSourceDirIndex : public debDscFileIndex
+{
+ public:
+   virtual const Type *GetType() const APT_CONST;
 };
 
 #endif
index 4eef66c2b7bd1d0c736e69e2bbd6987990c6c23f..462818a039d7c24d354ab2669f5a70b5a3e335cd 100644 (file)
@@ -58,18 +58,6 @@ debListParser::debListParser(FileFd *File, string const &Arch) : Tags(File),
    MultiArchEnabled = Architectures.size() > 1;
 }
                                                                        /*}}}*/
-// ListParser::UniqFindTagWrite - Find the tag and write a unq string  /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-unsigned long debListParser::UniqFindTagWrite(const char *Tag)
-{
-   const char *Start;
-   const char *Stop;
-   if (Section.Find(Tag,Start,Stop) == false)
-      return 0;
-   return WriteUniqString(Start,Stop - Start);
-}
-                                                                       /*}}}*/
 // ListParser::Package - Return the package name                       /*{{{*/
 // ---------------------------------------------------------------------
 /* This is to return the name of the package this section describes */
@@ -144,9 +132,69 @@ unsigned char debListParser::ParseMultiArch(bool const showErrors) /*{{{*/
 /* */
 bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
 {
+   const char *Start;
+   const char *Stop;
+
    // Parse the section
-   unsigned long const idxSection = UniqFindTagWrite("Section");
-   Ver->Section = idxSection;
+   if (Section.Find("Section",Start,Stop) == true)
+   {
+      map_stringitem_t const idx = StoreString(pkgCacheGenerator::SECTION, Start, Stop - Start);
+      Ver->Section = idx;
+   }
+#if APT_PKG_ABI >= 413
+   // Parse the source package name
+   pkgCache::GrpIterator const G = Ver.ParentPkg().Group();
+   Ver->SourcePkgName = G->Name;
+   Ver->SourceVerStr = Ver->VerStr;
+   if (Section.Find("Source",Start,Stop) == true)
+   {
+      const char * const Space = (const char * const) memchr(Start, ' ', Stop - Start);
+      pkgCache::VerIterator V;
+
+      if (Space != NULL)
+      {
+        Stop = Space;
+        const char * const Open = (const char * const) memchr(Space, '(', Stop - Space);
+        if (likely(Open != NULL))
+        {
+           const char * const Close = (const char * const) memchr(Open, ')', Stop - Open);
+           if (likely(Close != NULL))
+           {
+              std::string const version(Open + 1, (Close - Open) - 1);
+              if (version != Ver.VerStr())
+              {
+                 map_stringitem_t const idx = StoreString(pkgCacheGenerator::VERSIONNUMBER, version);
+                 Ver->SourceVerStr = idx;
+              }
+           }
+        }
+      }
+
+      std::string const pkgname(Start, Stop - Start);
+      if (pkgname != G.Name())
+      {
+        for (pkgCache::PkgIterator P = G.PackageList(); P.end() == false; P = G.NextPkg(P))
+        {
+           for (V = P.VersionList(); V.end() == false; ++V)
+           {
+              if (pkgname == V.SourcePkgName())
+              {
+                 Ver->SourcePkgName = V->SourcePkgName;
+                 break;
+              }
+           }
+           if (V.end() == false)
+              break;
+        }
+        if (V.end() == true)
+        {
+           map_stringitem_t const idx = StoreString(pkgCacheGenerator::PKGNAME, pkgname);
+           Ver->SourcePkgName = idx;
+        }
+      }
+   }
+#endif
+
    Ver->MultiArch = ParseMultiArch(true);
    // Archive Size
    Ver->Size = Section.FindULL("Size");
@@ -155,10 +203,8 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
    Ver->InstalledSize *= 1024;
 
    // Priority
-   const char *Start;
-   const char *Stop;
    if (Section.Find("Priority",Start,Stop) == true)
-   {      
+   {
       if (GrabWord(string(Start,Stop-Start),PrioList,Ver->Priority) == false)
         Ver->Priority = pkgCache::State::Extra;
    }
@@ -195,35 +241,31 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
 /* This is to return the string describing the package in debian
    form. If this returns the blank string then the entry is assumed to
    only describe package properties */
-string debListParser::Description()
+string debListParser::Description(std::string const &lang)
 {
-   string const lang = DescriptionLanguage();
    if (lang.empty())
       return Section.FindS("Description");
    else
       return Section.FindS(string("Description-").append(lang).c_str());
 }
-                                                                        /*}}}*/
-// ListParser::DescriptionLanguage - Return the description lang string        /*{{{*/
-// ---------------------------------------------------------------------
-/* This is to return the string describing the language of
-   description. If this returns the blank string then the entry is
-   assumed to describe original description. */
-string debListParser::DescriptionLanguage()
+                                                                       /*}}}*/
+// ListParser::AvailableDescriptionLanguages                           /*{{{*/
+std::vector<std::string> debListParser::AvailableDescriptionLanguages()
 {
-   if (Section.FindS("Description").empty() == false)
-      return "";
-
-   std::vector<string> const lang = APT::Configuration::getLanguages(true);
-   for (std::vector<string>::const_iterator l = lang.begin();
-       l != lang.end(); ++l)
-      if (Section.FindS(string("Description-").append(*l).c_str()).empty() == false)
-        return *l;
-
-   return "";
+   std::vector<std::string> const understood = APT::Configuration::getLanguages();
+   std::vector<std::string> avail;
+   if (Section.Exists("Description") == true)
+      avail.push_back("");
+   for (std::vector<std::string>::const_iterator lang = understood.begin(); lang != understood.end(); ++lang)
+   {
+      std::string const tagname = "Description-" + *lang;
+      if (Section.Exists(tagname.c_str()) == true)
+        avail.push_back(*lang);
+   }
+   return avail;
 }
-                                                                        /*}}}*/
-// ListParser::Description - Return the description_md5 MD5SumValue    /*{{{*/
+                                                                       /*}}}*/
+// ListParser::Description_md5 - Return the description_md5 MD5SumValue        /*{{{*/
 // ---------------------------------------------------------------------
 /* This is to return the md5 string to allow the check if it is the right
    description. If no Description-md5 is found in the section it will be
@@ -234,7 +276,7 @@ MD5SumValue debListParser::Description_md5()
    string const value = Section.FindS("Description-md5");
    if (value.empty() == true)
    {
-      std::string const desc = Description() + "\n";
+      std::string const desc = Description("") + "\n";
       if (desc == "\n")
         return MD5SumValue();
 
@@ -260,12 +302,6 @@ MD5SumValue debListParser::Description_md5()
 bool debListParser::UsePackage(pkgCache::PkgIterator &Pkg,
                               pkgCache::VerIterator &Ver)
 {
-   if (Pkg->Section == 0)
-   {
-      unsigned long const idxSection = UniqFindTagWrite("Section");
-      Pkg->Section = idxSection;
-   }
-
    string const static myArch = _config->Find("APT::Architecture");
    // Possible values are: "all", "native", "installed" and "none"
    // The "installed" mode is handled by ParseStatus(), See #544481 and friends.
@@ -917,7 +953,7 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
 {
    // apt-secure does no longer download individual (per-section) Release
    // file. to provide Component pinning we use the section name now
-   map_ptrloc const storage = WriteUniqString(component);
+   map_stringitem_t const storage = StoreString(pkgCacheGenerator::MIXED, component);
    FileI->Component = storage;
 
    pkgTagFile TagFile(&File, File.Size());
@@ -926,19 +962,19 @@ bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
       return false;
 
    std::string data;
-   #define APT_INRELEASE(TAG, STORE) \
+   #define APT_INRELEASE(TYPE, TAG, STORE) \
    data = Section.FindS(TAG); \
    if (data.empty() == false) \
    { \
-      map_ptrloc const storage = WriteUniqString(data); \
+      map_stringitem_t const storage = StoreString(pkgCacheGenerator::TYPE, data); \
       STORE = storage; \
    }
-   APT_INRELEASE("Suite", FileI->Archive)
-   APT_INRELEASE("Component", FileI->Component)
-   APT_INRELEASE("Version", FileI->Version)
-   APT_INRELEASE("Origin", FileI->Origin)
-   APT_INRELEASE("Codename", FileI->Codename)
-   APT_INRELEASE("Label", FileI->Label)
+   APT_INRELEASE(MIXED, "Suite", FileI->Archive)
+   APT_INRELEASE(MIXED, "Component", FileI->Component)
+   APT_INRELEASE(VERSIONNUMBER, "Version", FileI->Version)
+   APT_INRELEASE(MIXED, "Origin", FileI->Origin)
+   APT_INRELEASE(MIXED, "Codename", FileI->Codename)
+   APT_INRELEASE(MIXED, "Label", FileI->Label)
    #undef APT_INRELEASE
    Section.FindFlag("NotAutomatic", FileI->Flags, pkgCache::Flag::NotAutomatic);
    Section.FindFlag("ButAutomaticUpgrades", FileI->Flags, pkgCache::Flag::ButAutomaticUpgrades);
@@ -958,7 +994,7 @@ unsigned char debListParser::GetPrio(string Str)
    return Out;
 }
                                                                        /*}}}*/
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
 bool debListParser::SameVersion(unsigned short const Hash,             /*{{{*/
       pkgCache::VerIterator const &Ver)
 {
@@ -979,3 +1015,22 @@ bool debListParser::SameVersion(unsigned short const Hash,                /*{{{*/
 }
                                                                        /*}}}*/
 #endif
+
+
+debDebFileParser::debDebFileParser(FileFd *File, std::string const &DebFile)
+   : debListParser(File, ""), DebFile(DebFile)
+{
+}
+
+bool debDebFileParser::UsePackage(pkgCache::PkgIterator &Pkg,
+                                  pkgCache::VerIterator &Ver)
+{
+   bool res = debListParser::UsePackage(Pkg, Ver);
+   // we use the full file path as a provides so that the file is found
+   // by its name
+   if(NewProvidesAllArch(Ver, DebFile, Ver.VerStr()) == false)
+      return false;
+   return res;
+}
+
+debListParser::~debListParser() {}
index 3b6963211649d503454bab13a1b6c6e1a5f3f2de..6279d83994750f4ac83b7957cff3a4218e5f88fd 100644 (file)
@@ -26,7 +26,7 @@
 
 class FileFd;
 
-class debListParser : public pkgCacheGenerator::ListParser
+class APT_HIDDEN debListParser : public pkgCacheGenerator::ListParser
 {
    public:
 
@@ -44,22 +44,22 @@ class debListParser : public pkgCacheGenerator::ListParser
    protected:
    pkgTagFile Tags;
    pkgTagSection Section;
-   unsigned long iOffset;
+   map_filesize_t iOffset;
    std::string Arch;
    std::vector<std::string> Architectures;
    bool MultiArchEnabled;
 
-   unsigned long UniqFindTagWrite(const char *Tag);
    virtual bool ParseStatus(pkgCache::PkgIterator &Pkg,pkgCache::VerIterator &Ver);
    bool ParseDepends(pkgCache::VerIterator &Ver,const char *Tag,
                     unsigned int Type);
    bool ParseProvides(pkgCache::VerIterator &Ver);
    bool NewProvidesAllArch(pkgCache::VerIterator &Ver, std::string const &Package, std::string const &Version);
    static bool GrabWord(std::string Word,WordList *List,unsigned char &Out);
-   
+   APT_HIDDEN unsigned char ParseMultiArch(bool const showErrors);
+
    public:
 
-   static unsigned char GetPrio(std::string Str);
+   APT_PUBLIC static unsigned char GetPrio(std::string Str);
       
    // These all operate against the current section
    virtual std::string Package();
@@ -67,46 +67,54 @@ class debListParser : public pkgCacheGenerator::ListParser
    virtual bool ArchitectureAll();
    virtual std::string Version();
    virtual bool NewVersion(pkgCache::VerIterator &Ver);
-   virtual std::string Description();
-   virtual std::string DescriptionLanguage();
+   virtual std::string Description(std::string const &lang);
+   virtual std::vector<std::string> AvailableDescriptionLanguages();
    virtual MD5SumValue Description_md5();
    virtual unsigned short VersionHash();
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
    virtual bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver);
 #endif
    virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
                           pkgCache::VerIterator &Ver);
-   virtual unsigned long Offset() {return iOffset;};
-   virtual unsigned long Size() {return Section.size();};
+   virtual map_filesize_t Offset() {return iOffset;};
+   virtual map_filesize_t Size() {return Section.size();};
 
    virtual bool Step();
    
    bool LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,FileFd &File,
                        std::string section);
 
-   static const char *ParseDepends(const char *Start,const char *Stop,
+   APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop,
         std::string &Package,std::string &Ver,unsigned int &Op);
-   static const char *ParseDepends(const char *Start,const char *Stop,
+   APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop,
         std::string &Package,std::string &Ver,unsigned int &Op,
         bool const &ParseArchFlags);
-   static const char *ParseDepends(const char *Start,const char *Stop,
+   APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop,
         std::string &Package,std::string &Ver,unsigned int &Op,
         bool const &ParseArchFlags, bool const &StripMultiArch);
-   static const char *ParseDepends(const char *Start,const char *Stop,
+   APT_PUBLIC static const char *ParseDepends(const char *Start,const char *Stop,
         std::string &Package,std::string &Ver,unsigned int &Op,
         bool const &ParseArchFlags, bool const &StripMultiArch,
         bool const &ParseRestrictionsList);
 
-   static const char *ConvertRelation(const char *I,unsigned int &Op);
+   APT_PUBLIC static const char *ConvertRelation(const char *I,unsigned int &Op);
 
    debListParser(FileFd *File, std::string const &Arch = "");
-   virtual ~debListParser() {};
+   virtual ~debListParser();
+};
 
-   private:
-   APT_HIDDEN unsigned char ParseMultiArch(bool const showErrors);
+class APT_HIDDEN debDebFileParser : public debListParser
+{
+ private:
+   std::string DebFile;
+
+ public:
+   debDebFileParser(FileFd *File, std::string const &DebFile);
+   virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
+                          pkgCache::VerIterator &Ver);
 };
 
-class debTranslationsParser : public debListParser
+class APT_HIDDEN debTranslationsParser : public debListParser
 {
  public:
    // a translation can never be a real package
index 6fd12add8f3589cf02fdb1fd84b596e70f7986b4..81e067424e215ca2e9c99748bd8d9bffb72c4d5b 100644 (file)
@@ -78,7 +78,6 @@ string debReleaseIndex::MetaIndexURI(const char *Type) const
    return Res;
 }
 
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
 std::string debReleaseIndex::LocalFileName() const
 {
    // see if we have a InRelease file
@@ -92,7 +91,6 @@ std::string debReleaseIndex::LocalFileName() const
 
    return "";
 }
-#endif
 
 string debReleaseIndex::IndexURISuffix(const char *Type, string const &Section, string const &Arch) const
 {
@@ -186,8 +184,8 @@ debReleaseIndex::~debReleaseIndex() {
                        delete *S;
 }
 
-vector <struct IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const {
-       vector <struct IndexTarget *>* IndexTargets = new vector <IndexTarget *>;
+vector <IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const {
+       vector <IndexTarget *>* IndexTargets = new vector <IndexTarget *>;
 
        map<string, vector<debSectionEntry const*> >::const_iterator const src = ArchEntries.find("source");
        if (src != ArchEntries.end()) {
@@ -253,38 +251,44 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const
 {
    bool const tryInRelease = _config->FindB("Acquire::TryInRelease", true);
 
+   indexRecords * const iR = new indexRecords(Dist);
+   if (Trusted == ALWAYS_TRUSTED)
+      iR->SetTrusted(true);
+   else if (Trusted == NEVER_TRUSTED)
+      iR->SetTrusted(false);
+
    // special case for --print-uris
    if (GetAll) {
-      vector <struct IndexTarget *> *targets = ComputeIndexTargets();
-      for (vector <struct IndexTarget*>::const_iterator Target = targets->begin(); Target != targets->end(); ++Target) {
+      vector <IndexTarget *> *targets = ComputeIndexTargets();
+      for (vector <IndexTarget*>::const_iterator Target = targets->begin(); Target != targets->end(); ++Target) {
         new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description,
-                        (*Target)->ShortDesc, HashString());
+                        (*Target)->ShortDesc, HashStringList());
       }
       delete targets;
 
       // this is normally created in pkgAcqMetaSig, but if we run
       // in --print-uris mode, we add it here
       if (tryInRelease == false)
-        new pkgAcqMetaIndex(Owner, MetaIndexURI("Release"),
-              MetaIndexInfo("Release"), "Release",
-              MetaIndexURI("Release.gpg"),
-              ComputeIndexTargets(),
-              new indexRecords (Dist));
+        new pkgAcqMetaIndex(Owner, NULL,
+                             MetaIndexURI("Release"),
+                             MetaIndexInfo("Release"), "Release",
+                             MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
+                             ComputeIndexTargets(),
+                             iR);
    }
-
    if (tryInRelease == true)
-      new pkgAcqMetaClearSig(Owner, MetaIndexURI("InRelease"),
-           MetaIndexInfo("InRelease"), "InRelease",
+      new pkgAcqMetaClearSig(Owner, 
+            MetaIndexURI("InRelease"), MetaIndexInfo("InRelease"), "InRelease",
            MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
            MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
            ComputeIndexTargets(),
-           new indexRecords (Dist));
+           iR);
    else
-      new pkgAcqMetaSig(Owner, MetaIndexURI("Release.gpg"),
-           MetaIndexInfo("Release.gpg"), "Release.gpg",
-           MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
-           ComputeIndexTargets(),
-           new indexRecords (Dist));
+      new pkgAcqMetaIndex(Owner, NULL,
+          MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
+          MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
+          ComputeIndexTargets(),
+          iR);
 
    return true;
 }
@@ -388,7 +392,7 @@ debReleaseIndex::debSectionEntry::debSectionEntry (string const &Section,
                bool const &IsSrc): Section(Section), IsSrc(IsSrc)
 {}
 
-class debSLTypeDebian : public pkgSourceList::Type
+class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type
 {
    protected:
 
@@ -471,7 +475,16 @@ class debSLTypeDebian : public pkgSourceList::Type
    }
 };
 
-class debSLTypeDeb : public debSLTypeDebian
+debDebFileMetaIndex::debDebFileMetaIndex(std::string const &DebFile)
+   : metaIndex(DebFile, "local-uri", "deb-dist"), DebFile(DebFile)
+{
+   DebIndex = new debDebPkgFileIndex(DebFile);
+   Indexes = new vector<pkgIndexFile *>();
+   Indexes->push_back(DebIndex);
+}
+
+
+class APT_HIDDEN debSLTypeDeb : public debSLTypeDebian
 {
    public:
 
@@ -489,7 +502,7 @@ class debSLTypeDeb : public debSLTypeDebian
    }   
 };
 
-class debSLTypeDebSrc : public debSLTypeDebian
+class APT_HIDDEN debSLTypeDebSrc : public debSLTypeDebian
 {
    public:
 
@@ -507,5 +520,26 @@ class debSLTypeDebSrc : public debSLTypeDebian
    }   
 };
 
-debSLTypeDeb _apt_DebType;
-debSLTypeDebSrc _apt_DebSrcType;
+class APT_HIDDEN debSLTypeDebFile : public pkgSourceList::Type
+{
+   public:
+
+   bool CreateItem(vector<metaIndex *> &List, string const &URI,
+                  string const &/*Dist*/, string const &/*Section*/,
+                  std::map<string, string> const &/*Options*/) const
+   {
+      metaIndex *mi = new debDebFileMetaIndex(URI);
+      List.push_back(mi);
+      return true;
+   }
+   
+   debSLTypeDebFile()
+   {
+      Name = "deb-file";
+      Label = "Debian Deb File";
+   }   
+};
+
+APT_HIDDEN debSLTypeDeb _apt_DebType;
+APT_HIDDEN debSLTypeDebSrc _apt_DebSrcType;
+APT_HIDDEN debSLTypeDebFile _apt_DebFileType;
index 2286fa8b2c88e63bb376e7eeb4ca783464432545..94d00576034a2d91736f8ae9fd107f2252cc3383 100644 (file)
 
 class pkgAcquire;
 class pkgIndexFile;
+class debDebPkgFileIndex;
+class IndexTarget;
 
-class debReleaseIndex : public metaIndex {
+class APT_HIDDEN debReleaseIndex : public metaIndex {
    public:
 
    class debSectionEntry
@@ -34,7 +36,7 @@ class debReleaseIndex : public metaIndex {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
    std::map<std::string, std::vector<debSectionEntry const*> > ArchEntries;
-   enum { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted;
+   enum APT_HIDDEN { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted;
 
    public:
 
@@ -44,16 +46,17 @@ class debReleaseIndex : public metaIndex {
 
    virtual std::string ArchiveURI(std::string const &File) const {return URI + File;};
    virtual bool GetIndexes(pkgAcquire *Owner, bool const &GetAll=false) const;
-   std::vector <struct IndexTarget *>* ComputeIndexTargets() const;
+   std::vector <IndexTarget *>* ComputeIndexTargets() const;
    std::string Info(const char *Type, std::string const &Section, std::string const &Arch="") const;
 
    std::string MetaIndexInfo(const char *Type) const;
    std::string MetaIndexFile(const char *Types) const;
    std::string MetaIndexURI(const char *Type) const;
 
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-   virtual std::string LocalFileName() const;
+#if APT_PKG_ABI >= 413
+   virtual
 #endif
+   std::string LocalFileName() const;
 
    std::string IndexURI(const char *Type, std::string const &Section, std::string const &Arch="native") const;
    std::string IndexURISuffix(const char *Type, std::string const &Section, std::string const &Arch="native") const;
@@ -71,4 +74,27 @@ class debReleaseIndex : public metaIndex {
    void PushSectionEntry(const debSectionEntry *Entry);
 };
 
+class APT_HIDDEN debDebFileMetaIndex : public metaIndex
+{
+ private:
+   std::string DebFile;
+   debDebPkgFileIndex *DebIndex;
+ public:
+   virtual std::string ArchiveURI(std::string const& /*File*/) const {
+      return DebFile;
+   }
+   virtual bool GetIndexes(pkgAcquire* /*Owner*/, const bool& /*GetAll=false*/) const {
+      return true;
+   }
+   virtual std::vector<pkgIndexFile *> *GetIndexFiles() {
+      return Indexes;
+   }
+   virtual bool IsTrusted() const {
+      return true;
+   }
+   debDebFileMetaIndex(std::string const &DebFile);
+   virtual ~debDebFileMetaIndex() {};
+
+};
+
 #endif
index 6063db5a8203d4a241aafd10dde4869092597100..b41aa558407466d20be8f6e8283480902598384a 100644 (file)
@@ -73,36 +73,17 @@ string debRecordParser::Homepage()
    return Section.FindS("Homepage");
 }
                                                                        /*}}}*/
-// RecordParser::MD5Hash - Return the archive hash                     /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-string debRecordParser::MD5Hash()
+// RecordParser::Hashes - return the available archive hashes          /*{{{*/
+HashStringList debRecordParser::Hashes() const
 {
-   return Section.FindS("MD5Sum");
-}
-                                                                       /*}}}*/
-// RecordParser::SHA1Hash - Return the archive hash                    /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-string debRecordParser::SHA1Hash()
-{
-   return Section.FindS("SHA1");
-}
-                                                                       /*}}}*/
-// RecordParser::SHA256Hash - Return the archive hash                  /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-string debRecordParser::SHA256Hash()
-{
-   return Section.FindS("SHA256");
-}
-                                                                       /*}}}*/
-// RecordParser::SHA512Hash - Return the archive hash                  /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-string debRecordParser::SHA512Hash()
-{
-   return Section.FindS("SHA512");
+   HashStringList hashes;
+   for (char const * const * type = HashString::SupportedHashes(); *type != NULL; ++type)
+   {
+      std::string const hash = Section.FindS(*type);
+      if (hash.empty() == false)
+        hashes.push_back(HashString(*type, hash));
+   }
+   return hashes;
 }
                                                                        /*}}}*/
 // RecordParser::Maintainer - Return the maintainer email              /*{{{*/
@@ -125,10 +106,12 @@ string debRecordParser::RecordField(const char *fieldName)
 // RecordParser::ShortDesc - Return a 1 line description               /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-string debRecordParser::ShortDesc()
+string debRecordParser::ShortDesc(std::string const &lang)
 {
-   string Res = LongDesc();
-   string::size_type Pos = Res.find('\n');
+   string const Res = LongDesc(lang);
+   if (Res.empty() == true)
+      return "";
+   string::size_type const Pos = Res.find('\n');
    if (Pos == string::npos)
       return Res;
    return string(Res,0,Pos);
@@ -137,26 +120,44 @@ string debRecordParser::ShortDesc()
 // RecordParser::LongDesc - Return a longer description                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-string debRecordParser::LongDesc()
-{
-  string orig, dest;
+string debRecordParser::LongDesc(std::string const &lang)
+{
+   string orig;
+   if (lang.empty() == true)
+   {
+      std::vector<string> const lang = APT::Configuration::getLanguages();
+      for (std::vector<string>::const_iterator l = lang.begin();
+           l != lang.end(); ++l)
+      {
+        std::string const tagname = "Description-" + *l;
+        orig = Section.FindS(tagname.c_str());
+        if (orig.empty() == false)
+           break;
+        else if (*l == "en")
+        {
+           orig = Section.FindS("Description");
+           if (orig.empty() == false)
+              break;
+        }
+      }
+      if (orig.empty() == true)
+        orig = Section.FindS("Description");
+   }
+   else
+   {
+      std::string const tagname = "Description-" + lang;
+      orig = Section.FindS(tagname.c_str());
+      if (orig.empty() == true && lang == "en")
+        orig = Section.FindS("Description");
+   }
 
-  if (!Section.FindS("Description").empty())
-     orig = Section.FindS("Description").c_str();
-  else
-  {
-     std::vector<string> const lang = APT::Configuration::getLanguages();
-     for (std::vector<string>::const_iterator l = lang.begin();
-         orig.empty() && l != lang.end(); ++l)
-       orig = Section.FindS(string("Description-").append(*l).c_str());
-  }
+   char const * const codeset = nl_langinfo(CODESET);
+   if (strcmp(codeset,"UTF-8") != 0) {
+      string dest;
+      UTF8ToCodeset(codeset, orig, &dest);
+      return dest;
+   }
 
-  char const * const codeset = nl_langinfo(CODESET);
-  if (strcmp(codeset,"UTF-8") != 0) {
-     UTF8ToCodeset(codeset, orig, &dest);
-     orig = dest;
-   }    
-  
    return orig;
 }
                                                                        /*}}}*/
@@ -206,3 +207,5 @@ void debRecordParser::GetRec(const char *&Start,const char *&Stop)
    Section.GetSection(Start,Stop);
 }
                                                                        /*}}}*/
+
+debRecordParser::~debRecordParser() {}
index bdac6c90b8c8883f779e68f8d78780a56bf573c1..7091c38e6560848965c4cee158b0a263849069e9 100644 (file)
 #include <apt-pkg/indexfile.h>
 #endif
 
-class debRecordParser : public pkgRecords::Parser
+class APT_HIDDEN debRecordParser : public pkgRecords::Parser
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
-
+   
+ protected:
    FileFd File;
    pkgTagFile Tags;
    pkgTagSection Section;
    
-   protected:
-   
    virtual bool Jump(pkgCache::VerFileIterator const &Ver);
    virtual bool Jump(pkgCache::DescFileIterator const &Desc);
    
  public:
+ public:
 
    // These refer to the archive file for the Version
    virtual std::string FileName();
-   virtual std::string MD5Hash();
-   virtual std::string SHA1Hash();
-   virtual std::string SHA256Hash();
-   virtual std::string SHA512Hash();
    virtual std::string SourcePkg();
    virtual std::string SourceVer();
-   
+
+   virtual HashStringList Hashes() const;
+
    // These are some general stats about the package
    virtual std::string Maintainer();
-   virtual std::string ShortDesc();
-   virtual std::string LongDesc();
+   virtual std::string ShortDesc(std::string const &lang);
+   virtual std::string LongDesc(std::string const &lang);
    virtual std::string Name();
    virtual std::string Homepage();
 
@@ -63,7 +60,18 @@ class debRecordParser : public pkgRecords::Parser
    virtual void GetRec(const char *&Start,const char *&Stop);
    
    debRecordParser(std::string FileName,pkgCache &Cache);
-   virtual ~debRecordParser() {};
+   virtual ~debRecordParser();
+};
+
+// custom record parser that reads deb files directly
+class APT_HIDDEN debDebFileRecordParser : public debRecordParser
+{
+ public:
+   virtual std::string FileName() {
+      return File.Name();
+   }
+   debDebFileRecordParser(std::string FileName,pkgCache &Cache)
+      : debRecordParser(FileName, Cache) {};
 };
 
 #endif
index 49a348dd4e9ebe7fe66447176a523c7de2ac8593..ca6d098967f38af7335835e6585dd291d50b1333 100644 (file)
@@ -18,6 +18,8 @@
 #include <apt-pkg/aptconfiguration.h>
 #include <apt-pkg/srcrecords.h>
 #include <apt-pkg/tagfile.h>
+#include <apt-pkg/hashes.h>
+#include <apt-pkg/gpgv.h>
 
 #include <ctype.h>
 #include <stdlib.h>
@@ -55,12 +57,13 @@ const char **debSrcRecordParser::Binaries()
       char* binStartNext = strchrnul(bin, ',');
       char* binEnd = binStartNext - 1;
       for (; isspace(*binEnd) != 0; --binEnd)
-        binEnd = '\0';
+        binEnd = 0;
       StaticBinList.push_back(bin);
       if (*binStartNext != ',')
         break;
       *binStartNext = '\0';
-      for (bin = binStartNext + 1; isspace(*bin) != 0; ++bin);
+      for (bin = binStartNext + 1; isspace(*bin) != 0; ++bin)
+         ;
    } while (*bin != '\0');
    StaticBinList.push_back(NULL);
 
@@ -190,16 +193,8 @@ bool debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2> &List)
         // we have it already, store the new hash and be done
         if (file != List.end())
         {
-#if __GNUC__ >= 4
-       // set for compatibility only, so warn users not us
-       #pragma GCC diagnostic push
-       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
            if (checksumField == "Files")
-              file->MD5Hash = hash;
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic pop
-#endif
+              APT_IGNORE_DEPRECATED(file->MD5Hash = hash;)
            // an error here indicates that we have two different hashes for the same file
            if (file->Hashes.push_back(hashString) == false)
               return _error->Error("Error parsing checksum in %s of source package %s", checksumField.c_str(), Package().c_str());
@@ -212,17 +207,11 @@ bool debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2> &List)
         F.FileSize = strtoull(size.c_str(), NULL, 10);
         F.Hashes.push_back(hashString);
 
-#if __GNUC__ >= 4
-       // set for compatibility only, so warn users not us
-       #pragma GCC diagnostic push
-       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
+        APT_IGNORE_DEPRECATED_PUSH
         F.Size = F.FileSize;
         if (checksumField == "Files")
            F.MD5Hash = hash;
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic pop
-#endif
+        APT_IGNORE_DEPRECATED_POP
 
         // Try to guess what sort of file it is we are getting.
         string::size_type Pos = F.Path.length()-1;
@@ -264,3 +253,21 @@ debSrcRecordParser::~debSrcRecordParser()
    free(Buffer);
 }
                                                                        /*}}}*/
+
+
+debDscRecordParser::debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index)
+   : debSrcRecordParser(DscFile, Index)
+{
+   // support clear signed files
+   if (OpenMaybeClearSignedFile(DscFile, Fd) == false)
+   {
+      _error->Error("Failed to open %s", DscFile.c_str());
+      return;
+   }
+
+   // re-init to ensure the updated Fd is used
+   Tags.Init(&Fd);
+   // read the first (and only) record
+   Step();
+
+}
index 2a3fc86c9a27f3448c42b6c58180030549d9aa68..cd246d624b9332dedc73db62919f3c63fdf4a4b8 100644 (file)
 
 class pkgIndexFile;
 
-class debSrcRecordParser : public pkgSrcRecords::Parser
+class APT_HIDDEN debSrcRecordParser : public pkgSrcRecords::Parser
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
 
+ protected:
    FileFd Fd;
    pkgTagFile Tags;
    pkgTagSection Sect;
@@ -61,4 +62,10 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
    virtual ~debSrcRecordParser();
 };
 
+class APT_HIDDEN debDscRecordParser : public debSrcRecordParser
+{
+ public:
+   debDscRecordParser(std::string const &DscFile, pkgIndexFile const *Index);
+};
+
 #endif
index 142f3a6e65dacbdc3fedc322bd30131f4bf014ad..9a5da9da1e8383c2b367b01b10aed912d90301c7 100644 (file)
@@ -38,7 +38,7 @@ using std::string;
 
 debSystem debSys;
 
-class debSystemPrivate {
+class APT_HIDDEN debSystemPrivate {
 public:
    debSystemPrivate() : LockFD(-1), LockCount(0), StatusFile(0)
    {
index a945f68fbaaeb93bb212e742783ae4482e4ff369..226cd60bfd91147a9d86c44e4d8277b1171bfcbb 100644 (file)
@@ -29,7 +29,7 @@ class debSystem : public pkgSystem
 {
    // private d-pointer
    debSystemPrivate *d;
-   bool CheckUpdates();
+   APT_HIDDEN bool CheckUpdates();
 
    public:
 
index e23ca466d89b9c774deadce4f57cd9a37d6cccb3..09bd9149f4bb93fc6ce3348ebd3edad50d562eac 100644 (file)
@@ -203,18 +203,10 @@ pkgCache::VerIterator FindNowVersion(const pkgCache::PkgIterator &Pkg)
 {
    pkgCache::VerIterator Ver;
    for (Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
-   {
-      pkgCache::VerFileIterator Vf = Ver.FileList();
-      pkgCache::PkgFileIterator F = Vf.File();
-      for (F = Vf.File(); F.end() == false; ++F)
-      {
-         if (F && F.Archive())
-         {
-            if (strcmp(F.Archive(), "now")) 
-               return Ver;
-         }
-      }
-   }
+      for (pkgCache::VerFileIterator Vf = Ver.FileList(); Vf.end() == false; ++Vf)
+        for (pkgCache::PkgFileIterator F = Vf.File(); F.end() == false; ++F)
+           if (F->Archive != 0 && strcmp(F.Archive(), "now") == 0)
+              return Ver;
    return Ver;
 }
                                                                        /*}}}*/
@@ -534,7 +526,7 @@ bool pkgDPkgPM::RunScriptsWithPkgs(const char *Cnf)
 void pkgDPkgPM::DoStdin(int master)
 {
    unsigned char input_buf[256] = {0,}; 
-   ssize_t len = read(0, input_buf, sizeof(input_buf));
+   ssize_t len = read(STDIN_FILENO, input_buf, sizeof(input_buf));
    if (len)
       FileFd::Write(master, input_buf, len);
    else
@@ -1057,7 +1049,6 @@ void pkgDPkgPM::BuildPackagesProgressMap()
    ++PackagesTotal;
 }
                                                                         /*}}}*/
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
 bool pkgDPkgPM::Go(int StatusFd)
 {
    APT::Progress::PackageManager *progress = NULL;
@@ -1066,9 +1057,8 @@ bool pkgDPkgPM::Go(int StatusFd)
    else
       progress = new APT::Progress::PackageManagerProgressFd(StatusFd);
    
-   return GoNoABIBreak(progress);
+   return Go(progress);
 }
-#endif
 
 void pkgDPkgPM::StartPtyMagic()
 {
@@ -1223,11 +1213,7 @@ void pkgDPkgPM::StopPtyMagic()
  * through to human readable (and i10n-able)
  * names and calculates a percentage for each step.
  */
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
 bool pkgDPkgPM::Go(APT::Progress::PackageManager *progress)
-#else
-bool pkgDPkgPM::GoNoABIBreak(APT::Progress::PackageManager *progress)
-#endif
 {
    pkgPackageManager::SigINTStop = false;
    d->progress = progress;
@@ -1716,7 +1702,7 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
    if (apportPkg.end() == true || apportPkg->CurrentVer == 0)
       return;
 
-   string pkgname, reportfile, srcpkgname, pkgver, arch;
+   string pkgname, reportfile, pkgver, arch;
    string::size_type pos;
    FILE *report;
 
@@ -1805,11 +1791,6 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
    if (Ver.end() == true)
       return;
    pkgver = Ver.VerStr() == NULL ? "unknown" : Ver.VerStr();
-   pkgRecords Recs(Cache);
-   pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
-   srcpkgname = Parse.SourcePkg();
-   if(srcpkgname.empty())
-      srcpkgname = pkgname;
 
    // if the file exists already, we check:
    // - if it was reported already (touched by apport). 
@@ -1860,7 +1841,16 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
    time_t now = time(NULL);
    fprintf(report, "Date: %s" , ctime(&now));
    fprintf(report, "Package: %s %s\n", pkgname.c_str(), pkgver.c_str());
+#if APT_PKG_ABI >= 413
+   fprintf(report, "SourcePackage: %s\n", Ver.SourcePkgName());
+#else
+   pkgRecords Recs(Cache);
+   pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
+   std::string srcpkgname = Parse.SourcePkg();
+   if(srcpkgname.empty())
+      srcpkgname = pkgname;
    fprintf(report, "SourcePackage: %s\n", srcpkgname.c_str());
+#endif
    fprintf(report, "ErrorMessage:\n %s\n", errormsg);
 
    // ensure that the log is flushed
index 2c1805015e82ef9f717bab5a049206e142478cec..2a6e7e004a24a5ec58e873577d75db22b39c3a97 100644 (file)
@@ -52,7 +52,7 @@ class pkgDPkgPM : public pkgPackageManager
       needs to declare a Replaces on the disappeared package.
       \param pkgname Name of the package that disappeared
    */
-   void handleDisappearAction(std::string const &pkgname);
+   APT_HIDDEN void handleDisappearAction(std::string const &pkgname);
 
    protected:
    int pkgFailures;
@@ -118,27 +118,14 @@ class pkgDPkgPM : public pkgPackageManager
    void DoTerminalPty(int master);
    void DoDpkgStatusFd(int statusfd);
    void ProcessDpkgStatusLine(char *line);
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
-   void DoDpkgStatusFd(int statusfd, int /*unused*/) {
-      DoDpkgStatusFd(statusfd);
-   }
-   void ProcessDpkgStatusLine(int /*unused*/, char *line) {
-      ProcessDpkgStatusLine(line);
-   }
-#endif
-
 
    // The Actuall installation implementation
    virtual bool Install(PkgIterator Pkg,std::string File);
    virtual bool Configure(PkgIterator Pkg);
    virtual bool Remove(PkgIterator Pkg,bool Purge = false);
 
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
    virtual bool Go(APT::Progress::PackageManager *progress);
-#else
    virtual bool Go(int StatusFd=-1);
-   bool GoNoABIBreak(APT::Progress::PackageManager *progress);
-#endif
 
    virtual void Reset();
    
index 16282df2135e358c9917139737527cffdd4f30d4..25c945ebb10df6db7fbab55399f22208a5314e2f 100644 (file)
@@ -237,9 +237,11 @@ bool pkgDepCache::writeStateFile(OpProgress * /*prog*/, bool InstalledOnly)        /*{{
 
    FileFd StateFile;
    string const state = _config->FindFile("Dir::State::extended_states");
+   if (CreateAPTDirectoryIfNeeded(_config->FindDir("Dir::State"), flNotFile(state)) == false)
+      return false;
 
    // if it does not exist, create a empty one
-   if(!RealFileExists(state)) 
+   if(!RealFileExists(state))
    {
       StateFile.Open(state, FileFd::WriteAtomic);
       StateFile.Close();
@@ -1961,3 +1963,17 @@ bool pkgDepCache::Sweep()                                                /*{{{*/
    return true;
 }
                                                                        /*}}}*/
+// DepCache::MarkAndSweep                                              /*{{{*/
+bool pkgDepCache::MarkAndSweep(InRootSetFunc &rootFunc)
+{
+   return MarkRequired(rootFunc) && Sweep();
+}
+bool pkgDepCache::MarkAndSweep()
+{
+   std::auto_ptr<InRootSetFunc> f(GetRootSetFunc());
+   if(f.get() != NULL)
+      return MarkAndSweep(*f.get());
+   else
+      return false;
+}
+                                                                       /*}}}*/
index bec651279237f4514f3a5a7d0e5241889149320b..20d263c67e11179492f211dcbf3f5135a137f5ca 100644 (file)
@@ -91,7 +91,7 @@ class pkgDepCache : protected pkgCache::Namespace
     *  \param follow_suggests If \b true, suggestions of the package
     *  will be recursively marked.
     */
-   void MarkPackage(const pkgCache::PkgIterator &pkg,
+   APT_HIDDEN void MarkPackage(const pkgCache::PkgIterator &pkg,
                    const pkgCache::VerIterator &ver,
                    bool const &follow_recommends,
                    bool const &follow_suggests);
@@ -169,7 +169,7 @@ class pkgDepCache : protected pkgCache::Namespace
        bool released;
 
        /** Action groups are noncopyable. */
-       ActionGroup(const ActionGroup &other);
+       APT_HIDDEN ActionGroup(const ActionGroup &other);
    public:
        /** \brief Create a new ActionGroup.
        *
@@ -396,19 +396,8 @@ class pkgDepCache : protected pkgCache::Namespace
     *  \param rootFunc A predicate that returns \b true for packages
     *  that should be added to the root set.
     */
-   bool MarkAndSweep(InRootSetFunc &rootFunc)
-   {
-     return MarkRequired(rootFunc) && Sweep();
-   }
-
-   bool MarkAndSweep()
-   {
-     std::auto_ptr<InRootSetFunc> f(GetRootSetFunc());
-     if(f.get() != NULL)
-       return MarkAndSweep(*f.get());
-     else
-       return false;
-   }
+   bool MarkAndSweep(InRootSetFunc &rootFunc);
+   bool MarkAndSweep();
 
    /** \name State Manipulators
     */
@@ -514,7 +503,7 @@ class pkgDepCache : protected pkgCache::Namespace
         bool const rPurge, unsigned long const Depth, bool const FromUser);
 
    private:
-   bool IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
+   APT_HIDDEN bool IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
                        unsigned long const Depth, bool const FromUser);
 };
 
index 0d0418e0633c52c191dde8d4b4a6f38448db2465..3c6a7e30f903131412a414ff6449096a99ec3cc4 100644 (file)
@@ -95,12 +95,15 @@ bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FILE* output,
 void EDSP::WriteScenarioVersion(pkgDepCache &Cache, FILE* output, pkgCache::PkgIterator const &Pkg,
                                pkgCache::VerIterator const &Ver)
 {
+   fprintf(output, "Package: %s\n", Pkg.Name());
+#if APT_PKG_ABI >= 413
+   fprintf(output, "Source: %s\n", Ver.SourcePkgName());
+#else
    pkgRecords Recs(Cache);
    pkgRecords::Parser &rec = Recs.Lookup(Ver.FileList());
    string srcpkg = rec.SourcePkg().empty() ? Pkg.Name() : rec.SourcePkg();
-
-   fprintf(output, "Package: %s\n", Pkg.Name());
    fprintf(output, "Source: %s\n", srcpkg.c_str());
+#endif
    fprintf(output, "Architecture: %s\n", Ver.Arch());
    fprintf(output, "Version: %s\n", Ver.VerStr());
    if (Pkg.CurrentVer() == Ver)
index 10313fd6195a472e650c23e9160d3b88a2c7ccdc..d005363620bae2c5f6369ca221c1210b605fa80d 100644 (file)
@@ -56,7 +56,7 @@ bool edspIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
    pkgCache::PkgFileIterator CFile = Gen.GetCurFile();
    CFile->Size = Pkg.FileSize();
    CFile->mtime = Pkg.ModificationTime();
-   map_ptrloc const storage = Gen.WriteUniqString("edsp::scenario");
+   map_stringitem_t const storage = Gen.StoreString(pkgCacheGenerator::MIXED, "edsp::scenario");
    CFile->Archive = storage;
 
    if (Gen.MergeList(Parser) == false)
@@ -65,7 +65,7 @@ bool edspIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
 }
                                                                        /*}}}*/
 // Index File types for APT                                            /*{{{*/
-class edspIFType: public pkgIndexFile::Type
+class APT_HIDDEN edspIFType: public pkgIndexFile::Type
 {
    public:
    virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator) const
@@ -75,7 +75,7 @@ class edspIFType: public pkgIndexFile::Type
    };
    edspIFType() {Label = "EDSP scenario file";};
 };
-static edspIFType _apt_Universe;
+APT_HIDDEN edspIFType _apt_Universe;
 
 const pkgIndexFile::Type *edspIndex::GetType() const
 {
index 609a2cde4ddf375200a387d31912ec55abd7521d..8c18d8cbdf9ce816f57fba774830febda8a10330 100644 (file)
@@ -18,7 +18,7 @@
 class OpProgress;
 class pkgCacheGenerator;
 
-class edspIndex : public debStatusIndex
+class APT_HIDDEN edspIndex : public debStatusIndex
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
index 959fb587fd946c4a5f02dfc5ea9b0bb4e2464ac3..86cd77606013f543c08688824c9e1a68b4622a4f 100644 (file)
@@ -25,7 +25,7 @@
 
 class FileFd;
 
-class edspListParser : public debListParser
+class APT_HIDDEN edspListParser : public debListParser
 {
    public:
    virtual bool NewVersion(pkgCache::VerIterator &Ver);
index 92edb8d7715dee2745295990910bc62b588ec2c9..063517421fa13b6415f223eaae0072bb270f6a74 100644 (file)
@@ -26,8 +26,6 @@
 #include <apti18n.h>
                                                                        /*}}}*/
 
-edspSystem edspSys;
-
 // System::debSystem - Constructor                                     /*{{{*/
 edspSystem::edspSystem()
 {
@@ -126,3 +124,5 @@ bool edspSystem::FindIndex(pkgCache::PkgFileIterator File,
    return false;
 }
                                                                        /*}}}*/
+
+APT_HIDDEN edspSystem edspSys;
index 65e36d714945dc709094b8ab8b8e8d98071577d8..06a63f40c265b5f10bc471260395e4ca6a706203 100644 (file)
@@ -22,7 +22,7 @@ class pkgIndexFile;
 class pkgPackageManager;
 class edspIndex;
 
-class edspSystem : public pkgSystem
+class APT_HIDDEN edspSystem : public pkgSystem
 {
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
@@ -45,6 +45,4 @@ class edspSystem : public pkgSystem
    ~edspSystem();
 };
 
-extern edspSystem edspSys;
-
 #endif
index 854ba1bd7d871f272f581358281398d504faa544..5fa57fd8b0ab2c4eecc478ccec5109c97d9c9059 100644 (file)
@@ -516,7 +516,7 @@ bool SigVerify::Verify(string prefix, string file, indexRecords *MetaIndex)
       return false;
    }
 
-   if (!Record->Hash.VerifyFile(prefix+file))
+   if (!Record->Hashes.VerifyFile(prefix+file))
    {
       _error->Warning(_("Hash mismatch for: %s"),file.c_str());
       return false;
@@ -524,8 +524,10 @@ bool SigVerify::Verify(string prefix, string file, indexRecords *MetaIndex)
 
    if(Debug == true)
    {
-      cout << "File: " << prefix+file << endl;
-      cout << "Expected Hash " << Record->Hash.toStr() << endl;
+      cout << "File: " << prefix+file << endl
+        << "Expected Hash " << endl;
+      for (HashStringList::const_iterator hs = Record->Hashes.begin(); hs != Record->Hashes.end(); ++hs)
+        std::cout <<  "\t- " << hs->toStr() << std::endl;
    }
 
    return true;
@@ -791,3 +793,5 @@ bool TranslationsCopy::CopyTranslations(string CDROM,string Name,   /*{{{*/
    return true;
 }
                                                                        /*}}}*/
+
+APT_CONST IndexCopy::~IndexCopy() {}
index 43cdb3f0a53a16d678013a7c8b10a058c0111731..701beb0758a565455500f845e347626618d56b0f 100644 (file)
@@ -53,7 +53,7 @@ class IndexCopy                                                               /*{{{*/
 
    bool CopyPackages(std::string CDROM,std::string Name,std::vector<std::string> &List,
                     pkgCdromStatus *log);
-   virtual ~IndexCopy() {};
+   virtual ~IndexCopy();
 };
                                                                        /*}}}*/
 class PackageCopy : public IndexCopy                                   /*{{{*/
@@ -93,8 +93,8 @@ class SigVerify                                                               /*{{{*/
    /** \brief dpointer placeholder (for later in case we need it) */
    void *d;
 
-   bool Verify(std::string prefix,std::string file, indexRecords *records);
-   bool CopyMetaIndex(std::string CDROM, std::string CDName, 
+   APT_HIDDEN bool Verify(std::string prefix,std::string file, indexRecords *records);
+   APT_HIDDEN bool CopyMetaIndex(std::string CDROM, std::string CDName,
                      std::string prefix, std::string file);
 
  public:
index b5c9ac77e7aa751d979ea8f48f62da39dd3a79c6..817165f087a4393655b314c95bf55a574bf2835b 100644 (file)
@@ -59,6 +59,7 @@ class pkgIndexFile
       const char *Label;
 
       virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator /*File*/) const {return 0;};
+      virtual pkgSrcRecords::Parser *CreateSrcPkgParser(std::string /*File*/) const {return 0;};
       Type();
       virtual ~Type() {};
    };
index 5353d109845cd6fe7ebf7584b6a56c3ee0c62906..d65266f649a229e843401e8f6ebd0762ab2bfd8c 100644 (file)
@@ -37,6 +37,11 @@ APT_PURE string indexRecords::GetSuite() const
    return this->Suite;
 }
 
+APT_PURE bool indexRecords::GetSupportsAcquireByHash() const
+{
+   return this->SupportsAcquireByHash;
+}
+
 APT_PURE bool indexRecords::CheckDist(const string MaybeDist) const
 {
    return (this->Dist == MaybeDist
@@ -53,7 +58,7 @@ APT_PURE time_t indexRecords::GetValidUntil() const
    return this->ValidUntil;
 }
 
-APT_PURE const indexRecords::checkSum *indexRecords::Lookup(const string MetaKey)
+APT_PURE indexRecords::checkSum *indexRecords::Lookup(const string MetaKey)
 {
    std::map<std::string, indexRecords::checkSum* >::const_iterator sum = Entries.find(MetaKey);
    if (sum == Entries.end())
@@ -86,12 +91,14 @@ bool indexRecords::Load(const string Filename)                              /*{{{*/
       strprintf(ErrorText, _("No sections in Release file %s"), Filename.c_str());
       return false;
    }
+   // FIXME: find better tag name
+   SupportsAcquireByHash = Section.FindB("Acquire-By-Hash", false);
 
    Suite = Section.FindS("Suite");
    Dist = Section.FindS("Codename");
 
-   int i;
-   for (i=0;HashString::SupportedHashes()[i] != NULL; i++)
+   bool FoundHashSum = false;
+   for (int i=0;HashString::SupportedHashes()[i] != NULL; i++)
    {
       if (!Section.Find(HashString::SupportedHashes()[i], Start, End))
         continue;
@@ -103,16 +110,24 @@ bool indexRecords::Load(const string Filename)                            /*{{{*/
       {
         if (!parseSumData(Start, End, Name, Hash, Size))
            return false;
-        indexRecords::checkSum *Sum = new indexRecords::checkSum;
-        Sum->MetaKeyFilename = Name;
-        Sum->Hash = HashString(HashString::SupportedHashes()[i],Hash);
-        Sum->Size = Size;
-        Entries[Name] = Sum;
+
+         if (Entries.find(Name) == Entries.end())
+         {
+            indexRecords::checkSum *Sum = new indexRecords::checkSum;
+            Sum->MetaKeyFilename = Name;
+            Sum->Size = Size;
+           std::string SizeStr;
+           strprintf(SizeStr, "%llu", Size);
+           Sum->Hashes.push_back(HashString("Checksum-FileSize", SizeStr));
+            APT_IGNORE_DEPRECATED(Sum->Hash = HashString(HashString::SupportedHashes()[i],Hash);)
+            Entries[Name] = Sum;
+         }
+         Entries[Name]->Hashes.push_back(HashString(HashString::SupportedHashes()[i],Hash));
+         FoundHashSum = true;
       }
-      break;
    }
 
-   if(HashString::SupportedHashes()[i] == NULL)
+   if(FoundHashSum == false)
    {
       strprintf(ErrorText, _("No Hash entry in Release file %s"), Filename.c_str());
       return false;
@@ -234,11 +249,44 @@ bool indexRecords::parseSumData(const char *&Start, const char *End,      /*{{{*/
    return true;
 }
                                                                        /*}}}*/
-indexRecords::indexRecords()
+
+APT_PURE bool indexRecords::IsAlwaysTrusted() const
+{
+   if (Trusted == ALWAYS_TRUSTED)
+      return true;
+   return false;
+}
+APT_PURE bool indexRecords::IsNeverTrusted() const
 {
+   if (Trusted == NEVER_TRUSTED)
+      return true;
+   return false;
+}
+void indexRecords::SetTrusted(bool const Trusted)
+{
+   if (Trusted == true)
+      this->Trusted = ALWAYS_TRUSTED;
+   else
+      this->Trusted = NEVER_TRUSTED;
 }
 
+#if APT_PKG_ABI >= 413
+indexRecords::indexRecords(const string &ExpectedDist) :
+   Trusted(CHECK_TRUST), d(NULL), ExpectedDist(ExpectedDist), ValidUntil(0),
+   SupportsAcquireByHash(false)
+{
+}
+#else
+indexRecords::indexRecords() :
+   Trusted(CHECK_TRUST), d(NULL), ExpectedDist(""), ValidUntil(0),
+   SupportsAcquireByHash(false)
+{
+}
 indexRecords::indexRecords(const string ExpectedDist) :
-   ExpectedDist(ExpectedDist), ValidUntil(0)
+   Trusted(CHECK_TRUST), d(NULL), ExpectedDist(ExpectedDist), ValidUntil(0),
+   SupportsAcquireByHash(false)
 {
 }
+#endif
+
+indexRecords::~indexRecords() {}
index e31f889ad17ea384d8bf69e5322323def33d22f6..35e534c12c0da9a6e582eb9d0d8dc8a9ab1e12fb 100644 (file)
 
 class indexRecords
 {
-   bool parseSumData(const char *&Start, const char *End, std::string &Name,
+   APT_HIDDEN bool parseSumData(const char *&Start, const char *End, std::string &Name,
                     std::string &Hash, unsigned long long &Size);
    public:
    struct checkSum;
    std::string ErrorText;
-   
+
+   private:
+   enum APT_HIDDEN { ALWAYS_TRUSTED, NEVER_TRUSTED, CHECK_TRUST } Trusted;
+   // dpointer (for later)
+   void * d;
+
    protected:
    std::string Dist;
    std::string Suite;
    std::string ExpectedDist;
    time_t ValidUntil;
+   bool SupportsAcquireByHash;
 
    std::map<std::string,checkSum *> Entries;
 
    public:
-
+#if APT_PKG_ABI >= 413
+   indexRecords(const std::string &ExpectedDist = "");
+#else
    indexRecords();
    indexRecords(const std::string ExpectedDist);
+#endif
 
    // Lookup function
-   virtual const checkSum *Lookup(const std::string MetaKey);
+   virtual checkSum *Lookup(const std::string MetaKey);
    /** \brief tests if a checksum for this file is available */
    bool Exists(std::string const &MetaKey) const;
    std::vector<std::string> MetaKeys();
 
    virtual bool Load(std::string Filename);
+   virtual bool CheckDist(const std::string MaybeDist) const;
+
    std::string GetDist() const;
    std::string GetSuite() const;
+   bool GetSupportsAcquireByHash() const;
    time_t GetValidUntil() const;
-   virtual bool CheckDist(const std::string MaybeDist) const;
    std::string GetExpectedDist() const;
-   virtual ~indexRecords(){};
+
+   /** \brief check if source is marked as always trusted */
+   bool IsAlwaysTrusted() const;
+   /** \brief check if source is marked as never trusted */
+   bool IsNeverTrusted() const;
+
+   /** \brief sets an explicit trust value
+    *
+    * \b true means that the source should always be considered trusted,
+    * while \b false marks a source as always untrusted, even if we have
+    * a valid signature and everything.
+    */
+   void SetTrusted(bool const Trusted);
+
+   virtual ~indexRecords();
 };
 
+APT_IGNORE_DEPRECATED_PUSH
 struct indexRecords::checkSum
 {
    std::string MetaKeyFilename;
-   HashString Hash;
+   HashStringList Hashes;
    unsigned long long Size;
+
+   APT_DEPRECATED HashString Hash;
 };
+APT_IGNORE_DEPRECATED_POP
 
 #endif
index 241628632ccdc24d958dc105ad04ac56b11039cf..f756eab26731ab2036b26a1803c2fa9f04980ba3 100644 (file)
@@ -88,9 +88,19 @@ bool pkgInitConfig(Configuration &Cnf)
    Cnf.Set("Dir::Ignore-Files-Silently::", "\\.orig$");
    Cnf.Set("Dir::Ignore-Files-Silently::", "\\.distUpgrade$");
 
+   // Repository security
+   // FIXME: this is set to "true" for backward compatibility, once
+   //        jessie is out we want to change this to "false" to
+   //        improve security
+   Cnf.CndSet("Acquire::AllowInsecureRepositories", true);
+   Cnf.CndSet("Acquire::AllowDowngradeToInsecureRepositories", false);
+
    // Default cdrom mount point
    Cnf.CndSet("Acquire::cdrom::mount", "/media/cdrom/");
 
+   // The default user we drop to in the methods
+   Cnf.CndSet("APT::Sandbox::User", "_apt");
+
    bool Res = true;
    
    // Read an alternate config file
index cf6c859125600c250f6363b7f8e1013cabd75aa0..5ea8bf4d025338a6a83ceb6eadf6931087787d41 100644 (file)
@@ -21,6 +21,8 @@
 namespace APT {
 namespace Progress {
 
+PackageManager::PackageManager() : d(NULL), percentage(0.0), last_reported_progress(-1) {}
+PackageManager::~PackageManager() {}
 
 /* Return a APT::Progress::PackageManager based on the global
  * apt configuration (i.e. APT::Status-Fd and APT::Status-deb822-Fd)
index 5d1a20e9bb814c765fa92b91908714e5472befe6..d8b4a5c8265b51b839ab8ec015985ed3295cb072 100644 (file)
@@ -26,9 +26,8 @@ namespace Progress {
     int last_reported_progress;
 
  public:
-    PackageManager()
-       : percentage(0.0), last_reported_progress(-1) {};
-    virtual ~PackageManager() {};
+    PackageManager();
+    virtual ~PackageManager();
 
     /* Global Start/Stop */
     virtual void Start(int /*child_pty*/=-1) {};
@@ -120,7 +119,7 @@ namespace Progress {
  class PackageManagerFancy : public PackageManager
  {
  private:
-    static void staticSIGWINCH(int);
+    APT_HIDDEN static void staticSIGWINCH(int);
     static std::vector<PackageManagerFancy*> instances;
     APT_HIDDEN bool DrawStatusLine();
 
diff --git a/apt-pkg/metaindex.cc b/apt-pkg/metaindex.cc
new file mode 100644 (file)
index 0000000..31a8ec0
--- /dev/null
@@ -0,0 +1,40 @@
+// Include Files                                                       /*{{{*/
+#include <apt-pkg/indexfile.h>
+#include <apt-pkg/metaindex.h>
+
+#include <stddef.h>
+
+#include <string>
+#include <vector>
+                                                                       /*}}}*/
+
+#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+std::string metaIndex::LocalFileName() const { return ""; }
+#else
+#include <apt-pkg/debmetaindex.h>
+std::string metaIndex::LocalFileName() const
+{
+   debReleaseIndex const * deb = dynamic_cast<debReleaseIndex const*>(this);
+   if (deb != NULL)
+      return deb->LocalFileName();
+
+   return "";
+}
+#endif
+
+metaIndex::metaIndex(std::string const &URI, std::string const &Dist,
+      char const * const Type)
+: Indexes(NULL), Type(Type), URI(URI), Dist(Dist), Trusted(false)
+{
+   /* nothing */
+}
+
+metaIndex::~metaIndex()
+{
+   if (Indexes == 0)
+      return;
+   for (std::vector<pkgIndexFile *>::iterator I = (*Indexes).begin();
+        I != (*Indexes).end(); ++I)
+      delete *I;
+   delete Indexes;
+}
index ffabaadbfcee359b106ab3f6c7fed6e5e7044a5a..6c3d2880b2f0bb09dc76a086ece1883867a580af 100644 (file)
@@ -40,33 +40,22 @@ class metaIndex
    virtual const char* GetType() const {return Type;}
 
    // interface to to query it
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-   // returns the path of the local file (or "" if its not available)
-   virtual std::string LocalFileName() const {return "";};
+#if APT_PKG_ABI >= 413
+   /** \return the path of the local file (or "" if its not available) */
+   virtual std::string LocalFileName() const;
+#else
+   std::string LocalFileName() const;
 #endif
 
    // Interface for acquire
    virtual std::string ArchiveURI(std::string const& File) const = 0;
    virtual bool GetIndexes(pkgAcquire *Owner, bool const &GetAll=false) const = 0;
-   virtual std::vector<pkgIndexFile *> *GetIndexFiles() = 0; 
+   virtual std::vector<pkgIndexFile *> *GetIndexFiles() = 0;
    virtual bool IsTrusted() const = 0;
 
-   metaIndex(std::string const &URI, std::string const &Dist, 
-             char const * const Type) 
-      : Indexes(NULL), Type(Type), URI(URI), Dist(Dist)
-   {
-      /* nothing */
-   }
-
-   virtual ~metaIndex() 
-   {
-      if (Indexes == 0)
-        return;
-      for (std::vector<pkgIndexFile *>::iterator I = (*Indexes).begin();
-           I != (*Indexes).end(); ++I)
-        delete *I;
-      delete Indexes;
-   }
+   metaIndex(std::string const &URI, std::string const &Dist,
+             char const * const Type);
+   virtual ~metaIndex();
 };
 
 #endif
index 249542c689370c0c0ed55a889343ecd9bbee9254..d137dc75a1c84bd2340d1f993d839f33383c1c4e 100644 (file)
@@ -28,6 +28,7 @@
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/strutl.h>
+#include <apt-pkg/install-progress.h>
 
 #include <stddef.h>
 #include <list>
@@ -399,7 +400,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
               // Check if the current version of the package is available and will satisfy this dependency
               if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
                   List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
-                  DepPkg.State() == PkgIterator::NeedsNothing)
+                  DepPkg.State() == PkgIterator::NeedsNothing &&
+                  (Cache[DepPkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
               {
                  Bad = false;
                  break;
@@ -412,8 +414,13 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
               if (PkgLoop == true)
               {
                  if (Debug)
-                    std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
-                 Bad = false;
+                    std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure";
+                 if (List->IsFlag(DepPkg,pkgOrderList::UnPacked))
+                    Bad = false;
+                 else if (Debug)
+                    std::clog << ", but it isn't unpacked yet";
+                 if (Debug)
+                    std::clog << std::endl;
               }
            }
 
@@ -425,7 +432,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
          if (Bad == false)
          {
             if (Debug)
-               std::clog << OutputInDepth(Depth) << "Found ok dep " << D.TargetPkg() << std::endl;
+               std::clog << OutputInDepth(Depth) << "Found ok dep " << Start.TargetPkg() << std::endl;
             continue;
          }
 
@@ -443,7 +450,8 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
               // Check if the current version of the package is available and will satisfy this dependency
               if (DepPkg.CurrentVer() == Ver && List->IsNow(DepPkg) == true &&
                   List->IsFlag(DepPkg,pkgOrderList::Removed) == false &&
-                  DepPkg.State() == PkgIterator::NeedsNothing)
+                  DepPkg.State() == PkgIterator::NeedsNothing &&
+                  (Cache[DepPkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
                   continue;
 
               // Check if the version that is going to be installed will satisfy the dependency
@@ -453,8 +461,13 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg, int const Depth)
               if (PkgLoop == true)
               {
                  if (Debug)
-                    std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure" << std::endl;
-                 Bad = false;
+                    std::clog << OutputInDepth(Depth) << "Package " << Pkg << " loops in SmartConfigure";
+                 if (List->IsFlag(DepPkg,pkgOrderList::UnPacked))
+                    Bad = false;
+                 else if (Debug)
+                    std::clog << ", but it isn't unpacked yet";
+                 if (Debug)
+                    std::clog << std::endl;
               }
               else
               {
@@ -721,7 +734,8 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c
 
                  // See if the current version is ok
                  if (Pkg.CurrentVer() == Ver && List->IsNow(Pkg) == true &&
-                     Pkg.State() == PkgIterator::NeedsNothing)
+                     Pkg.State() == PkgIterator::NeedsNothing &&
+                     (Cache[Pkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
                  {
                     Bad = false;
                     if (Debug)
@@ -743,8 +757,11 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c
                  PkgIterator DepPkg = Ver.ParentPkg();
 
                  // Not the install version
-                 if (Cache[DepPkg].InstallVer != *I ||
-                     (Cache[DepPkg].Keep() == true && DepPkg.State() == PkgIterator::NeedsNothing))
+                 if (Cache[DepPkg].InstallVer != *I)
+                    continue;
+
+                 if (Cache[DepPkg].Keep() == true && DepPkg.State() == PkgIterator::NeedsNothing &&
+                       (Cache[DepPkg].iFlags & pkgDepCache::ReInstall) != pkgDepCache::ReInstall)
                     continue;
 
                  if (List->IsFlag(DepPkg,pkgOrderList::Configured))
@@ -756,6 +773,16 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c
                  // check if it needs unpack or if if configure is enough
                  if (List->IsFlag(DepPkg,pkgOrderList::UnPacked) == false)
                  {
+                    // two packages pre-depending on each other can't be handled sanely
+                    if (List->IsFlag(DepPkg,pkgOrderList::Loop) && PkgLoop)
+                    {
+                       // this isn't an error as there is potential for something else to satisfy it
+                       // (like a provides or an or-group member)
+                       if (Debug)
+                          clog << OutputInDepth(Depth) << "Unpack loop detected between " << DepPkg.FullName() << " and " << Pkg.FullName() << endl;
+                       continue;
+                    }
+
                     if (Debug)
                        clog << OutputInDepth(Depth) << "Trying to SmartUnpack " << DepPkg.FullName() << endl;
                     if (NonLoopingSmart(UNPACK_IMMEDIATE, Pkg, DepPkg, Depth, PkgLoop, &Bad, &Changed) == false)
@@ -842,7 +869,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate, int c
                     // but if it fails ignore this failure and look for alternative ways of solving
                     if (Debug)
                     {
-                       clog << OutputInDepth(Depth) << "Avoidance unpack of " << ConflictPkg.FullName() << " failed for " << End << std::endl;
+                       clog << OutputInDepth(Depth) << "Avoidance unpack of " << ConflictPkg.FullName() << " failed for " << End << " ignoring:" << std::endl;
                        _error->DumpErrors(std::clog);
                     }
                     _error->RevertToStack();
@@ -1058,7 +1085,7 @@ pkgPackageManager::OrderResult pkgPackageManager::OrderInstall()
 // PM::DoInstallPostFork - compat /*{{{*/
 // ---------------------------------------------------------------------
                                                                        /*}}}*/
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
 pkgPackageManager::OrderResult
 pkgPackageManager::DoInstallPostFork(int statusFd)
 {
@@ -1079,7 +1106,7 @@ pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager *progress)
       return Failed;
    
    return Res;
-};
+}
 #else
 pkgPackageManager::OrderResult
 pkgPackageManager::DoInstallPostFork(int statusFd)
@@ -1095,7 +1122,7 @@ pkgPackageManager::DoInstallPostFork(int statusFd)
 // PM::DoInstall - Does the installation                               /*{{{*/
 // ---------------------------------------------------------------------
 /* compat */
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
 pkgPackageManager::OrderResult 
 pkgPackageManager::DoInstall(int statusFd)
 {
@@ -1119,7 +1146,7 @@ pkgPackageManager::OrderResult pkgPackageManager::DoInstall(int statusFd)
 // ---------------------------------------------------------------------
 /* This uses the filenames in FileNames and the information in the
    DepCache to perform the installation of packages.*/
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
 pkgPackageManager::OrderResult 
 pkgPackageManager::DoInstall(APT::Progress::PackageManager *progress)
 {
index d72790b6ec01cf1c2ad229059d4f0a8c053320a9..fce0ad301b42dcb3d038979f7b54eb0d6554b7e2 100644 (file)
@@ -44,6 +44,11 @@ class pkgDepCache;
 class pkgSourceList;
 class pkgOrderList;
 class pkgRecords;
+namespace APT {
+   namespace Progress {
+      class PackageManager;
+   }
+}
 
 
 class pkgPackageManager : protected pkgCache::Namespace
@@ -91,11 +96,10 @@ class pkgPackageManager : protected pkgCache::Namespace
    virtual bool Install(PkgIterator /*Pkg*/,std::string /*File*/) {return false;};
    virtual bool Configure(PkgIterator /*Pkg*/) {return false;};
    virtual bool Remove(PkgIterator /*Pkg*/,bool /*Purge*/=false) {return false;};
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
    virtual bool Go(APT::Progress::PackageManager * /*progress*/) {return true;};
-#else
-   virtual bool Go(int /*statusFd*/=-1) {return true;};
 #endif
+   virtual bool Go(int /*statusFd*/=-1) {return true;};
 
    virtual void Reset() {};
 
@@ -108,8 +112,8 @@ class pkgPackageManager : protected pkgCache::Namespace
    bool GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
                    pkgRecords *Recs);
 
-   // Do the installation 
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+   // Do the installation
+#if APT_PKG_ABI >= 413
    OrderResult DoInstall(APT::Progress::PackageManager *progress);
    // compat
    APT_DEPRECATED OrderResult DoInstall(int statusFd=-1);
@@ -123,7 +127,7 @@ class pkgPackageManager : protected pkgCache::Namespace
       Res = OrderInstall();
       return Res;
    };
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
    // stuff that needs to be done after the fork
    OrderResult DoInstallPostFork(APT::Progress::PackageManager *progress);
    // compat
index d7c9656b951ecb6e77543e0f1460259d37dcd831..b42f7e228a245f26552d9da1c7c74be5c1ca1119 100644 (file)
@@ -54,12 +54,8 @@ pkgCache::Header::Header()
    
    /* Whenever the structures change the major version should be bumped,
       whenever the generator changes the minor version should be bumped. */
-   MajorVersion = 8;
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
-   MinorVersion = 2;
-#else
-   MinorVersion = 1;
-#endif
+   MajorVersion = 10;
+   MinorVersion = 0;
    Dirty = false;
    
    HeaderSz = sizeof(pkgCache::Header);
@@ -86,11 +82,13 @@ pkgCache::Header::Header()
    MaxDescFileSize = 0;
    
    FileList = 0;
-   StringList = 0;
+#if APT_PKG_ABI < 413
+   APT_IGNORE_DEPRECATED(StringList = 0;)
+#endif
    VerSysName = 0;
    Architecture = 0;
-   memset(PkgHashTable,0,sizeof(PkgHashTable));
-   memset(GrpHashTable,0,sizeof(GrpHashTable));
+   SetArchitectures(0);
+   SetHashTableSize(_config->FindI("APT::Cache-HashTableSize", 10 * 1048));
    memset(Pools,0,sizeof(Pools));
 
    CacheFileSize = 0;
@@ -119,6 +117,7 @@ bool pkgCache::Header::CheckSizes(Header &Against) const
 // Cache::pkgCache - Constructor                                       /*{{{*/
 // ---------------------------------------------------------------------
 /* */
+APT_IGNORE_DEPRECATED_PUSH
 pkgCache::pkgCache(MMap *Map, bool DoMap) : Map(*Map)
 {
    // call getArchitectures() with cached=false to ensure that the 
@@ -128,6 +127,7 @@ pkgCache::pkgCache(MMap *Map, bool DoMap) : Map(*Map)
    if (DoMap == true)
       ReMap();
 }
+APT_IGNORE_DEPRECATED_POP
                                                                        /*}}}*/
 // Cache::ReMap - Reopen the cache file                                        /*{{{*/
 // ---------------------------------------------------------------------
@@ -145,7 +145,6 @@ bool pkgCache::ReMap(bool const &Errorchecks)
    DescP = (Description *)Map.Data();
    ProvideP = (Provides *)Map.Data();
    DepP = (Dependency *)Map.Data();
-   StringItemP = (StringItem *)Map.Data();
    StrP = (char *)Map.Data();
 
    if (Errorchecks == false)
@@ -168,15 +167,23 @@ bool pkgCache::ReMap(bool const &Errorchecks)
    if (Map.Size() < HeaderP->CacheFileSize)
       return _error->Error(_("The package cache file is corrupted, it is too small"));
 
+   if (HeaderP->VerSysName == 0 || HeaderP->Architecture == 0 || HeaderP->GetArchitectures() == 0)
+      return _error->Error(_("The package cache file is corrupted"));
+
    // Locate our VS..
-   if (HeaderP->VerSysName == 0 ||
-       (VS = pkgVersioningSystem::GetVS(StrP + HeaderP->VerSysName)) == 0)
+   if ((VS = pkgVersioningSystem::GetVS(StrP + HeaderP->VerSysName)) == 0)
       return _error->Error(_("This APT does not support the versioning system '%s'"),StrP + HeaderP->VerSysName);
 
-   // Chcek the arhcitecture
-   if (HeaderP->Architecture == 0 ||
-       _config->Find("APT::Architecture") != StrP + HeaderP->Architecture)
-      return _error->Error(_("The package cache was built for a different architecture"));
+   // Check the architecture
+   std::vector<std::string> archs = APT::Configuration::getArchitectures();
+   std::vector<std::string>::const_iterator a = archs.begin();
+   std::string list = *a;
+   for (++a; a != archs.end(); ++a)
+      list.append(",").append(*a);
+   if (_config->Find("APT::Architecture") != StrP + HeaderP->Architecture ||
+        list != StrP + HeaderP->GetArchitectures())
+      return _error->Error(_("The package cache was built for different architectures: %s vs %s"), StrP + HeaderP->GetArchitectures(), list.c_str());
+
    return true;
 }
                                                                        /*}}}*/
@@ -185,20 +192,20 @@ bool pkgCache::ReMap(bool const &Errorchecks)
 /* This is used to generate the hash entries for the HashTable. With my
    package list from bo this function gets 94% table usage on a 512 item
    table (480 used items) */
-unsigned long pkgCache::sHash(const string &Str) const
+map_id_t pkgCache::sHash(const string &Str) const
 {
    unsigned long Hash = 0;
    for (string::const_iterator I = Str.begin(); I != Str.end(); ++I)
       Hash = 41 * Hash + tolower_ascii(*I);
-   return Hash % _count(HeaderP->PkgHashTable);
+   return Hash % HeaderP->GetHashTableSize();
 }
 
-unsigned long pkgCache::sHash(const char *Str) const
+map_id_t pkgCache::sHash(const char *Str) const
 {
    unsigned long Hash = tolower_ascii(*Str);
    for (const char *I = Str + 1; *I != 0; ++I)
       Hash = 41 * Hash + tolower_ascii(*I);
-   return Hash % _count(HeaderP->PkgHashTable);
+   return Hash % HeaderP->GetHashTableSize();
 }
                                                                        /*}}}*/
 // Cache::SingleArchFindPkg - Locate a package by name                 /*{{{*/
@@ -209,13 +216,10 @@ unsigned long pkgCache::sHash(const char *Str) const
 pkgCache::PkgIterator pkgCache::SingleArchFindPkg(const string &Name)
 {
    // Look at the hash bucket
-   Package *Pkg = PkgP + HeaderP->PkgHashTable[Hash(Name)];
+   Package *Pkg = PkgP + HeaderP->PkgHashTableP()[Hash(Name)];
    for (; Pkg != PkgP; Pkg = PkgP + Pkg->NextPackage)
    {
-      if (unlikely(Pkg->Name == 0))
-        continue;
-
-      int const cmp = strcasecmp(Name.c_str(), StrP + Pkg->Name);
+      int const cmp = strcmp(Name.c_str(), StrP + (GrpP + Pkg->Group)->Name);
       if (cmp == 0)
         return PkgIterator(*this, Pkg);
       else if (cmp < 0)
@@ -274,12 +278,9 @@ pkgCache::GrpIterator pkgCache::FindGrp(const string &Name) {
                return GrpIterator(*this,0);
 
        // Look at the hash bucket for the group
-       Group *Grp = GrpP + HeaderP->GrpHashTable[sHash(Name)];
+       Group *Grp = GrpP + HeaderP->GrpHashTableP()[sHash(Name)];
        for (; Grp != GrpP; Grp = GrpP + Grp->Next) {
-               if (unlikely(Grp->Name == 0))
-                  continue;
-
-               int const cmp = strcasecmp(Name.c_str(), StrP + Grp->Name);
+               int const cmp = strcmp(Name.c_str(), StrP + Grp->Name);
                if (cmp == 0)
                        return GrpIterator(*this, Grp);
                else if (cmp < 0)
@@ -356,19 +357,15 @@ pkgCache::PkgIterator pkgCache::GrpIterator::FindPkg(string Arch) const {
           last one we check, so we do it now. */
        if (Arch == "native" || Arch == myArch || Arch == "all") {
                pkgCache::Package *Pkg = Owner->PkgP + S->LastPackage;
-               if (strcasecmp(myArch, Owner->StrP + Pkg->Arch) == 0)
+               if (strcmp(myArch, Owner->StrP + Pkg->Arch) == 0)
                        return PkgIterator(*Owner, Pkg);
                Arch = myArch;
        }
 
-       /* Iterate over the list to find the matching arch
-          unfortunately this list includes "package noise"
-          (= different packages with same calculated hash),
-          so we need to check the name also */
+       // Iterate over the list to find the matching arch
        for (pkgCache::Package *Pkg = PackageList(); Pkg != Owner->PkgP;
             Pkg = Owner->PkgP + Pkg->NextPackage) {
-               if (S->Name == Pkg->Name &&
-                   stringcasecmp(Arch, Owner->StrP + Pkg->Arch) == 0)
+               if (stringcmp(Arch, Owner->StrP + Pkg->Arch) == 0)
                        return PkgIterator(*Owner, Pkg);
                if ((Owner->PkgP + S->LastPackage) == Pkg)
                        break;
@@ -428,10 +425,10 @@ void pkgCache::GrpIterator::operator ++(int)
       S = Owner->GrpP + S->Next;
 
    // Follow the hash table
-   while (S == Owner->GrpP && (HashIndex+1) < (signed)_count(Owner->HeaderP->GrpHashTable))
+   while (S == Owner->GrpP && (HashIndex+1) < (signed)Owner->HeaderP->GetHashTableSize())
    {
       HashIndex++;
-      S = Owner->GrpP + Owner->HeaderP->GrpHashTable[HashIndex];
+      S = Owner->GrpP + Owner->HeaderP->GrpHashTableP()[HashIndex];
    }
 }
                                                                        /*}}}*/
@@ -445,10 +442,10 @@ void pkgCache::PkgIterator::operator ++(int)
       S = Owner->PkgP + S->NextPackage;
 
    // Follow the hash table
-   while (S == Owner->PkgP && (HashIndex+1) < (signed)_count(Owner->HeaderP->PkgHashTable))
+   while (S == Owner->PkgP && (HashIndex+1) < (signed)Owner->HeaderP->GetHashTableSize())
    {
       HashIndex++;
-      S = Owner->PkgP + Owner->HeaderP->PkgHashTable[HashIndex];
+      S = Owner->PkgP + Owner->HeaderP->PkgHashTableP()[HashIndex];
    }
 }
                                                                        /*}}}*/
@@ -1034,7 +1031,7 @@ bool pkgCache::PrvIterator::IsMultiArchImplicit() const
 {
    pkgCache::PkgIterator const Owner = OwnerPkg();
    pkgCache::PkgIterator const Parent = ParentPkg();
-   if (strcmp(Owner.Arch(), Parent.Arch()) != 0 || Owner->Name == Parent->Name)
+   if (strcmp(Owner.Arch(), Parent.Arch()) != 0 || Owner.Group()->Name == Parent.Group()->Name)
       return true;
    return false;
 }
index 5e8a9630a0b190afe2f82b1321ba96e6110c9ece..2ba23c5c04b7716817b3473c06e12a98d05645ae 100644 (file)
 
 #include <string>
 #include <time.h>
+#include <stdint.h>
 
 #ifndef APT_8_CLEANER_HEADERS
 using std::string;
 #endif
 
+#if APT_PKG_ABI >= 413
+// storing file sizes of indexes, which are way below 4 GB for now
+typedef uint32_t map_filesize_t;
+typedef map_filesize_t should_be_map_filesize_t;
+#else
+typedef unsigned long map_filesize_t;
+typedef unsigned int should_be_map_filesize_t;
+#endif
+#if APT_PKG_ABI >= 413
+// each package/group/dependency gets an id
+typedef uint32_t map_id_t;
+typedef map_id_t should_be_map_id_t;
+#else
+typedef unsigned long map_id_t;
+typedef unsigned int should_be_map_id_t;
+#endif
+#if APT_PKG_ABI >= 413
+// some files get an id, too, but in far less absolute numbers
+typedef uint16_t map_fileid_t;
+typedef map_fileid_t should_be_map_fileid_t;
+#else
+typedef unsigned long map_fileid_t;
+typedef unsigned int should_be_map_fileid_t;
+#endif
+#if APT_PKG_ABI >= 413
+// relative pointer from cache start
+typedef uint32_t map_pointer_t;
+#else
+typedef unsigned int map_pointer_t;
+#endif
+// same as the previous, but documented to be to a string item
+typedef map_pointer_t map_stringitem_t;
+#if APT_PKG_ABI >= 413
+typedef uint64_t should_be_uint64_t;
+typedef uint64_t should_be_uint64_small_t;
+#else
+typedef unsigned long long should_be_uint64_t;
+typedef unsigned long should_be_uint64_small_t;
+#endif
+
 class pkgVersioningSystem;
 class pkgCache                                                         /*{{{*/
 {
@@ -138,7 +179,7 @@ class pkgCache                                                              /*{{{*/
       /** \brief priority of a package version
 
           Zero is used for unparsable or absent Priority fields. */
-      enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5};
+      enum VerPriority {Required=1,Important=2,Standard=3,Optional=4,Extra=5};
       enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4};
       enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3};
       enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2,
@@ -158,8 +199,8 @@ class pkgCache                                                              /*{{{*/
    std::string CacheFile;
    MMap &Map;
 
-   unsigned long sHash(const std::string &S) const APT_PURE;
-   unsigned long sHash(const char *S) const APT_PURE;
+   map_id_t sHash(const std::string &S) const APT_PURE;
+   map_id_t sHash(const char *S) const APT_PURE;
    
    public:
    
@@ -174,7 +215,7 @@ class pkgCache                                                              /*{{{*/
    Description *DescP;
    Provides *ProvideP;
    Dependency *DepP;
-   StringItem *StringItemP;
+   APT_DEPRECATED StringItem *StringItemP;
    char *StrP;
 
    virtual bool ReMap(bool const &Errorchecks = true);
@@ -183,8 +224,8 @@ class pkgCache                                                              /*{{{*/
    inline void *DataEnd() {return ((unsigned char *)Map.Data()) + Map.Size();}
       
    // String hashing function (512 range)
-   inline unsigned long Hash(const std::string &S) const {return sHash(S);}
-   inline unsigned long Hash(const char *S) const {return sHash(S);}
+   inline map_id_t Hash(const std::string &S) const {return sHash(S);}
+   inline map_id_t Hash(const char *S) const {return sHash(S);}
 
    // Useful transformation things
    const char *Priority(unsigned char Priority);
@@ -218,7 +259,7 @@ class pkgCache                                                              /*{{{*/
 
 private:
    bool MultiArchEnabled;
-   PkgIterator SingleArchFindPkg(const std::string &Name);
+   APT_HIDDEN PkgIterator SingleArchFindPkg(const std::string &Name);
 };
                                                                        /*}}}*/
 // Header structure                                                    /*{{{*/
@@ -263,35 +304,36 @@ struct pkgCache::Header
        These indicate the number of each structure contained in the cache.
        PackageCount is especially useful for generating user state structures.
        See Package::Id for more info. */
-   unsigned long GroupCount;
-   unsigned long PackageCount;
-   unsigned long VersionCount;
-   unsigned long DescriptionCount;
-   unsigned long DependsCount;
-   unsigned long PackageFileCount;
-   unsigned long VerFileCount;
-   unsigned long DescFileCount;
-   unsigned long ProvidesCount;
+   map_id_t GroupCount;
+   map_id_t PackageCount;
+   map_id_t VersionCount;
+   map_id_t DescriptionCount;
+   map_id_t DependsCount;
+   map_fileid_t PackageFileCount;
+   map_fileid_t VerFileCount;
+   map_fileid_t DescFileCount;
+   map_id_t ProvidesCount;
 
    /** \brief index of the first PackageFile structure
 
        The PackageFile structures are singly linked lists that represent
        all package files that have been merged into the cache. */
-   map_ptrloc FileList;
-   /** \brief index of the first StringItem structure
-
-       The cache contains a list of all the unique strings (StringItems).
-       The parser reads this list into memory so it can match strings
-       against it.*/
-   map_ptrloc StringList;
+   map_pointer_t FileList;
+#if APT_PKG_ABI < 413
+   APT_DEPRECATED map_pointer_t StringList;
+#endif
    /** \brief String representing the version system used */
-   map_ptrloc VerSysName;
-   /** \brief Architecture(s) the cache was built against */
-   map_ptrloc Architecture;
+   map_pointer_t VerSysName;
+   /** \brief native architecture the cache was built against */
+   map_pointer_t Architecture;
+#if APT_PKG_ABI >= 413
+   /** \brief all architectures the cache was built against */
+   map_pointer_t Architectures;
+#endif
    /** \brief The maximum size of a raw entry from the original Package file */
-   unsigned long MaxVerFileSize;
+   map_filesize_t MaxVerFileSize;
    /** \brief The maximum size of a raw entry from the original Translation file */
-   unsigned long MaxDescFileSize;
+   map_filesize_t MaxDescFileSize;
 
    /** \brief The Pool structures manage the allocation pools that the generator uses
 
@@ -302,23 +344,37 @@ struct pkgCache::Header
        stores this information so future additions can make use of any unused pool
        blocks. */
    DynamicMMap::Pool Pools[9];
-   
+
    /** \brief hash tables providing rapid group/package name lookup
 
-       Each group/package name is inserted into the hash table using pkgCache::Hash(const &string)
+       Each group/package name is inserted into a hash table using pkgCache::Hash(const &string)
        By iterating over each entry in the hash table it is possible to iterate over
        the entire list of packages. Hash Collisions are handled with a singly linked
        list of packages based at the hash item. The linked list contains only
        packages that match the hashing function.
        In the PkgHashTable is it possible that multiple packages have the same name -
        these packages are stored as a sequence in the list.
-
-       Beware: The Hashmethod assumes that the hash table sizes are equal */
+       The size of both tables is the same. */
+#if APT_PKG_ABI >= 413
+   unsigned int HashTableSize;
+   unsigned int GetHashTableSize() const { return HashTableSize; }
+   void SetHashTableSize(unsigned int const sz) { HashTableSize = sz; }
+   map_pointer_t GetArchitectures() const { return Architectures; }
+   void SetArchitectures(map_pointer_t const idx) { Architectures = idx; }
+#else
+   // BEWARE: these tables are pretty much empty and just here for abi compat
    map_ptrloc PkgHashTable[2*1048];
    map_ptrloc GrpHashTable[2*1048];
+   unsigned int GetHashTableSize() const { return PkgHashTable[0]; }
+   void SetHashTableSize(unsigned int const sz) { PkgHashTable[0] = sz; }
+   map_pointer_t GetArchitectures() const { return PkgHashTable[1]; }
+   void SetArchitectures(map_pointer_t const idx) { PkgHashTable[1] = idx; }
+#endif
+   map_pointer_t * PkgHashTableP() const { return (map_pointer_t*) (this + 1); }
+   map_pointer_t * GrpHashTableP() const { return PkgHashTableP() + GetHashTableSize(); }
 
    /** \brief Size of the complete cache file */
-   unsigned long  CacheFileSize;
+   should_be_uint64_small_t CacheFileSize;
 
    bool CheckSizes(Header &Against) const APT_PURE;
    Header();
@@ -334,17 +390,17 @@ struct pkgCache::Header
 struct pkgCache::Group
 {
    /** \brief Name of the group */
-   map_ptrloc Name;            // StringItem
+   map_stringitem_t Name;
 
    // Linked List
    /** \brief Link to the first package which belongs to the group */
-   map_ptrloc FirstPackage;    // Package
+   map_pointer_t FirstPackage; // Package
    /** \brief Link to the last package which belongs to the group */
-   map_ptrloc LastPackage;     // Package
+   map_pointer_t LastPackage;  // Package
    /** \brief Link to the next Group */
-   map_ptrloc Next;            // Group
+   map_pointer_t Next;         // Group
    /** \brief unique sequel ID */
-   unsigned int ID;
+   should_be_map_id_t ID;
 
 };
                                                                        /*}}}*/
@@ -362,10 +418,13 @@ struct pkgCache::Group
 */
 struct pkgCache::Package
 {
-   /** \brief Name of the package */
-   map_ptrloc Name;              // StringItem
+   /** \brief Name of the package
+    * Note that the access method Name() will remain. It is just this data member
+    * deprecated as this information is already stored and available via the
+    * associated Group – so it is wasting precious binary cache space */
+   APT_DEPRECATED map_stringitem_t Name;
    /** \brief Architecture of the package */
-   map_ptrloc Arch;              // StringItem
+   map_stringitem_t Arch;
    /** \brief Base of a singly linked list of versions
 
        Each structure represents a unique version of the package.
@@ -375,24 +434,25 @@ struct pkgCache::Package
        versions of a package can be cleanly handled by the system.
        Furthermore, this linked list is guaranteed to be sorted
        from Highest version to lowest version with no duplicate entries. */
-   map_ptrloc VersionList;       // Version
+   map_pointer_t VersionList;       // Version
    /** \brief index to the installed version */
-   map_ptrloc CurrentVer;        // Version
-   /** \brief indicates the deduced section
-
-       Should be the index to the string "Unknown" or to the section
-       of the last parsed item. */
-   map_ptrloc Section;           // StringItem
+   map_pointer_t CurrentVer;        // Version
+   /** \brief indicates nothing (consistently)
+       This field used to contain ONE section the package belongs to,
+       if those differs between versions it is a RANDOM one.
+       The Section() method tries to reproduce it, but the only sane
+       thing to do is use the Section field from the version! */
+   APT_DEPRECATED map_ptrloc Section; // StringItem
    /** \brief index of the group this package belongs to */
-   map_ptrloc Group;             // Group the Package belongs to
+   map_pointer_t Group;             // Group the Package belongs to
 
    // Linked list
    /** \brief Link to the next package in the same bucket */
-   map_ptrloc NextPackage;       // Package
+   map_pointer_t NextPackage;       // Package
    /** \brief List of all dependencies on this package */
-   map_ptrloc RevDepends;        // Dependency
+   map_pointer_t RevDepends;        // Dependency
    /** \brief List of all "packages" this package provide */
-   map_ptrloc ProvidesList;      // Provides
+   map_pointer_t ProvidesList;      // Provides
 
    // Install/Remove/Purge etc
    /** \brief state that the user wishes the package to be in */
@@ -412,7 +472,7 @@ struct pkgCache::Package
        This allows clients to create an array of size PackageCount and use it to store
        state information for the package map. For instance the status file emitter uses
        this to track which packages have been emitted already. */
-   unsigned int ID;
+   should_be_map_id_t ID;
    /** \brief some useful indicators of the package's state */
    unsigned long Flags;
 };
@@ -426,30 +486,30 @@ struct pkgCache::Package
 struct pkgCache::PackageFile
 {
    /** \brief physical disk file that this PackageFile represents */
-   map_ptrloc FileName;        // StringItem
+   map_stringitem_t FileName;
    /** \brief the release information
 
        Please see the files document for a description of what the
        release information means. */
-   map_ptrloc Archive;         // StringItem
-   map_ptrloc Codename;        // StringItem
-   map_ptrloc Component;       // StringItem
-   map_ptrloc Version;         // StringItem
-   map_ptrloc Origin;          // StringItem
-   map_ptrloc Label;           // StringItem
-   map_ptrloc Architecture;    // StringItem
+   map_stringitem_t Archive;
+   map_stringitem_t Codename;
+   map_stringitem_t Component;
+   map_stringitem_t Version;
+   map_stringitem_t Origin;
+   map_stringitem_t Label;
+   map_stringitem_t Architecture;
    /** \brief The site the index file was fetched from */
-   map_ptrloc Site;            // StringItem
+   map_stringitem_t Site;
    /** \brief indicates what sort of index file this is
 
        @TODO enumerate at least the possible indexes */
-   map_ptrloc IndexType;       // StringItem
+   map_stringitem_t IndexType;
    /** \brief Size of the file
 
        Used together with the modification time as a
        simple check to ensure that the Packages
        file has not been altered since Cache generation. */
-   unsigned long Size;
+   map_filesize_t Size;
    /** \brief Modification time for the file */
    time_t mtime;
 
@@ -458,9 +518,9 @@ struct pkgCache::PackageFile
 
    // Linked list
    /** \brief Link to the next PackageFile in the Cache */
-   map_ptrloc NextFile;        // PackageFile
+   map_pointer_t NextFile;        // PackageFile
    /** \brief unique sequel ID */
-   unsigned int ID;
+   should_be_map_fileid_t ID;
 };
                                                                        /*}}}*/
 // VerFile structure                                                   /*{{{*/
@@ -471,13 +531,13 @@ struct pkgCache::PackageFile
 struct pkgCache::VerFile
 {
    /** \brief index of the package file that this version was found in */
-   map_ptrloc File;           // PackageFile
+   map_pointer_t File;           // PackageFile
    /** \brief next step in the linked list */
-   map_ptrloc NextFile;       // PkgVerFile
+   map_pointer_t NextFile;       // PkgVerFile
    /** \brief position in the package file */
-   map_ptrloc Offset;         // File offset
+   should_be_map_filesize_t Offset;         // File offset
    /** @TODO document pkgCache::VerFile::Size */
-   unsigned long Size;
+   map_filesize_t Size;
 };
                                                                        /*}}}*/
 // DescFile structure                                                  /*{{{*/
@@ -485,13 +545,13 @@ struct pkgCache::VerFile
 struct pkgCache::DescFile
 {
    /** \brief index of the file that this description was found in */
-   map_ptrloc File;           // PackageFile
+   map_pointer_t File;           // PackageFile
    /** \brief next step in the linked list */
-   map_ptrloc NextFile;       // PkgVerFile
+   map_pointer_t NextFile;       // PkgVerFile
    /** \brief position in the file */
-   map_ptrloc Offset;         // File offset
+   should_be_map_filesize_t Offset;         // File offset
    /** @TODO document pkgCache::DescFile::Size */
-   unsigned long Size;
+   map_filesize_t Size;
 };
                                                                        /*}}}*/
 // Version structure                                                   /*{{{*/
@@ -503,9 +563,17 @@ struct pkgCache::DescFile
 struct pkgCache::Version
 {
    /** \brief complete version string */
-   map_ptrloc VerStr;            // StringItem
+   map_stringitem_t VerStr;
    /** \brief section this version is filled in */
-   map_ptrloc Section;           // StringItem
+   map_stringitem_t Section;
+#if APT_PKG_ABI >= 413
+   /** \brief source package name this version comes from
+      Always contains the name, even if it is the same as the binary name */
+   map_stringitem_t SourcePkgName;
+   /** \brief source version this version comes from
+      Always contains the version string, even if it is the same as the binary version */
+   map_stringitem_t SourceVerStr;
+#endif
 
    /** \brief Multi-Arch capabilities of a package version */
    enum VerMultiArch { None = 0, /*!< is the default and doesn't trigger special behaviour */
@@ -527,33 +595,33 @@ struct pkgCache::Version
        applies to. If FileList is 0 then this is a blank version.
        The structure should also have a 0 in all other fields excluding
        pkgCache::Version::VerStr and Possibly pkgCache::Version::NextVer. */
-   map_ptrloc FileList;          // VerFile
+   map_pointer_t FileList;          // VerFile
    /** \brief next (lower or equal) version in the linked list */
-   map_ptrloc NextVer;           // Version
+   map_pointer_t NextVer;           // Version
    /** \brief next description in the linked list */
-   map_ptrloc DescriptionList;   // Description
+   map_pointer_t DescriptionList;   // Description
    /** \brief base of the dependency list */
-   map_ptrloc DependsList;       // Dependency
+   map_pointer_t DependsList;       // Dependency
    /** \brief links to the owning package
 
        This allows reverse dependencies to determine the package */
-   map_ptrloc ParentPkg;         // Package
+   map_pointer_t ParentPkg;         // Package
    /** \brief list of pkgCache::Provides */
-   map_ptrloc ProvidesList;      // Provides
+   map_pointer_t ProvidesList;      // Provides
 
    /** \brief archive size for this version
 
        For Debian this is the size of the .deb file. */
-   unsigned long long Size;      // These are the .deb size
+   should_be_uint64_t Size; // These are the .deb size
    /** \brief uncompressed size for this version */
-   unsigned long long InstalledSize;
+   should_be_uint64_t InstalledSize;
    /** \brief characteristic value representing this version
 
        No two packages in existence should have the same VerStr
        and Hash with different contents. */
    unsigned short Hash;
    /** \brief unique sequel ID */
-   unsigned int ID;
+   should_be_map_id_t ID;
    /** \brief parsed priority value */
    unsigned char Priority;
 };
@@ -566,22 +634,22 @@ struct pkgCache::Description
 
        If the value has a 0 length then this is read using the Package
        file else the Translation-CODE file is used. */
-   map_ptrloc language_code;     // StringItem
+   map_stringitem_t language_code;
    /** \brief MD5sum of the original description
 
        Used to map Translations of a description to a version
        and to check that the Translation is up-to-date. */
-   map_ptrloc md5sum;            // StringItem
+   map_stringitem_t md5sum;
 
    /** @TODO document pkgCache::Description::FileList */
-   map_ptrloc FileList;          // DescFile
+   map_pointer_t FileList;          // DescFile
    /** \brief next translation for this description */
-   map_ptrloc NextDesc;          // Description
+   map_pointer_t NextDesc;          // Description
    /** \brief the text is a description of this package */
-   map_ptrloc ParentPkg;         // Package
+   map_pointer_t ParentPkg;         // Package
 
    /** \brief unique sequel ID */
-   unsigned int ID;
+   should_be_map_id_t ID;
 };
                                                                        /*}}}*/
 // Dependency structure                                                        /*{{{*/
@@ -594,21 +662,21 @@ struct pkgCache::Description
 struct pkgCache::Dependency
 {
    /** \brief string of the version the dependency is applied against */
-   map_ptrloc Version;         // StringItem
+   map_stringitem_t Version;
    /** \brief index of the package this depends applies to
 
        The generator will - if the package does not already exist -
        create a blank (no version records) package. */
-   map_ptrloc Package;         // Package
+   map_pointer_t Package;         // Package
    /** \brief next dependency of this version */
-   map_ptrloc NextDepends;     // Dependency
+   map_pointer_t NextDepends;     // Dependency
    /** \brief next reverse dependency of this package */
-   map_ptrloc NextRevDepends;  // Dependency
+   map_pointer_t NextRevDepends;  // Dependency
    /** \brief version of the package which has the reverse depends */
-   map_ptrloc ParentVer;       // Version
+   map_pointer_t ParentVer;       // Version
 
    /** \brief unique sequel ID */
-   map_ptrloc ID;
+   should_be_map_id_t ID;
    /** \brief Dependency type - Depends, Recommends, Conflicts, etc */
    unsigned char Type;
    /** \brief comparison operator specified on the depends line
@@ -629,31 +697,23 @@ struct pkgCache::Dependency
 struct pkgCache::Provides
 {
    /** \brief index of the package providing this */
-   map_ptrloc ParentPkg;        // Package
+   map_pointer_t ParentPkg;        // Package
    /** \brief index of the version this provide line applies to */
-   map_ptrloc Version;          // Version
+   map_pointer_t Version;          // Version
    /** \brief version in the provides line (if any)
 
        This version allows dependencies to depend on specific versions of a
        Provides, as well as allowing Provides to override existing packages.
        This is experimental. Note that Debian doesn't allow versioned provides */
-   map_ptrloc ProvideVersion;   // StringItem
+   map_stringitem_t ProvideVersion;
    /** \brief next provides (based of package) */
-   map_ptrloc NextProvides;     // Provides
+   map_pointer_t NextProvides;     // Provides
    /** \brief next provides (based of version) */
-   map_ptrloc NextPkgProv;      // Provides
+   map_pointer_t NextPkgProv;      // Provides
 };
                                                                        /*}}}*/
-// StringItem structure                                                        /*{{{*/
-/** \brief used for generating single instances of strings
-
-    Some things like Section Name are are useful to have as unique tags.
-    It is part of a linked list based at pkgCache::Header::StringList
-
-    All strings are simply inlined any place in the file that is natural
-    for the writer. The client should make no assumptions about the positioning
-    of strings. All StringItems should be null-terminated. */
-struct pkgCache::StringItem
+// UNUSED StringItem structure                                         /*{{{*/
+struct APT_DEPRECATED  pkgCache::StringItem
 {
    /** \brief string this refers to */
    map_ptrloc String;        // StringItem
@@ -662,7 +722,6 @@ struct pkgCache::StringItem
 };
                                                                        /*}}}*/
 
-
 inline char const * pkgCache::NativeArch()
        { return StrP + HeaderP->Architecture; }
 
index 810f0b0225061597b29e278d0c9c713704940e9c..ba454f057e0f90378b2e800c5912992202810348 100644 (file)
@@ -57,8 +57,7 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) :
                    FoundFileDeps(0)
 {
    CurrentFile = 0;
-   memset(UniqHash,0,sizeof(UniqHash));
-   
+
    if (_error->PendingError() == true)
       return;
 
@@ -73,14 +72,35 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) :
 
       // Starting header
       *Cache.HeaderP = pkgCache::Header();
-      map_ptrloc const idxVerSysName = WriteStringInMap(_system->VS->Label);
+
+      // make room for the hashtables for packages and groups
+      if (Map.RawAllocate(2 * (Cache.HeaderP->GetHashTableSize() * sizeof(map_pointer_t))) == 0)
+        return;
+
+      map_stringitem_t const idxVerSysName = WriteStringInMap(_system->VS->Label);
+      if (unlikely(idxVerSysName == 0))
+        return;
       Cache.HeaderP->VerSysName = idxVerSysName;
-      // this pointer is set in ReMap, but we need it now for WriteUniqString
-      Cache.StringItemP = (pkgCache::StringItem *)Map.Data();
-      map_ptrloc const idxArchitecture = WriteUniqString(_config->Find("APT::Architecture"));
-      Cache.HeaderP->Architecture = idxArchitecture;
-      if (unlikely(idxVerSysName == 0 || idxArchitecture == 0))
+      map_stringitem_t const idxArchitecture = StoreString(MIXED, _config->Find("APT::Architecture"));
+      if (unlikely(idxArchitecture == 0))
         return;
+      Cache.HeaderP->Architecture = idxArchitecture;
+
+      std::vector<std::string> archs = APT::Configuration::getArchitectures();
+      if (archs.size() > 1)
+      {
+        std::vector<std::string>::const_iterator a = archs.begin();
+        std::string list = *a;
+        for (++a; a != archs.end(); ++a)
+           list.append(",").append(*a);
+        map_stringitem_t const idxArchitectures = WriteStringInMap(list);
+        if (unlikely(idxArchitectures == 0))
+           return;
+        Cache.HeaderP->SetArchitectures(idxArchitectures);
+      }
+      else
+        Cache.HeaderP->SetArchitectures(idxArchitecture);
+
       Cache.ReMap();
    }
    else
@@ -92,9 +112,9 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) :
       {
         _error->Error(_("Cache has an incompatible versioning system"));
         return;
-      }      
+      }
    }
-   
+
    Cache.HeaderP->Dirty = true;
    Map.Sync(0,sizeof(pkgCache::Header));
 }
@@ -126,10 +146,6 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM
 
    CurrentFile += (pkgCache::PackageFile const * const) newMap - (pkgCache::PackageFile const * const) oldMap;
 
-   for (size_t i = 0; i < _count(UniqHash); ++i)
-      if (UniqHash[i] != 0)
-        UniqHash[i] += (pkgCache::StringItem const * const) newMap - (pkgCache::StringItem const * const) oldMap;
-
    for (std::vector<pkgCache::GrpIterator*>::const_iterator i = Dynamic<pkgCache::GrpIterator>::toReMap.begin();
        i != Dynamic<pkgCache::GrpIterator>::toReMap.end(); ++i)
       (*i)->ReMap(oldMap, newMap);
@@ -153,27 +169,27 @@ void pkgCacheGenerator::ReMap(void const * const oldMap, void const * const newM
       (*i)->ReMap(oldMap, newMap);
 }                                                                      /*}}}*/
 // CacheGenerator::WriteStringInMap                                    /*{{{*/
-map_ptrloc pkgCacheGenerator::WriteStringInMap(const char *String,
+map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String,
                                        const unsigned long &Len) {
    void const * const oldMap = Map.Data();
-   map_ptrloc const index = Map.WriteString(String, Len);
+   map_stringitem_t const index = Map.WriteString(String, Len);
    if (index != 0)
       ReMap(oldMap, Map.Data());
    return index;
 }
                                                                        /*}}}*/
 // CacheGenerator::WriteStringInMap                                    /*{{{*/
-map_ptrloc pkgCacheGenerator::WriteStringInMap(const char *String) {
+map_stringitem_t pkgCacheGenerator::WriteStringInMap(const char *String) {
    void const * const oldMap = Map.Data();
-   map_ptrloc const index = Map.WriteString(String);
+   map_stringitem_t const index = Map.WriteString(String);
    if (index != 0)
       ReMap(oldMap, Map.Data());
    return index;
 }
                                                                        /*}}}*/
-map_ptrloc pkgCacheGenerator::AllocateInMap(const unsigned long &size) {/*{{{*/
+map_pointer_t pkgCacheGenerator::AllocateInMap(const unsigned long &size) {/*{{{*/
    void const * const oldMap = Map.Data();
-   map_ptrloc const index = Map.Allocate(size);
+   map_pointer_t const index = Map.Allocate(size);
    if (index != 0)
       ReMap(oldMap, Map.Data());
    return index;
@@ -253,16 +269,16 @@ bool pkgCacheGenerator::MergeList(ListParser &List,
       }
    }
 
-   if (Cache.HeaderP->PackageCount >= (1ULL<<sizeof(Cache.PkgP->ID)*8)-1)
+   if (Cache.HeaderP->PackageCount >= std::numeric_limits<map_id_t>::max())
       return _error->Error(_("Wow, you exceeded the number of package "
                             "names this APT is capable of."));
-   if (Cache.HeaderP->VersionCount >= (1ULL<<(sizeof(Cache.VerP->ID)*8))-1)
+   if (Cache.HeaderP->VersionCount >= std::numeric_limits<map_id_t>::max())
       return _error->Error(_("Wow, you exceeded the number of versions "
                             "this APT is capable of."));
-   if (Cache.HeaderP->DescriptionCount >= (1ULL<<(sizeof(Cache.DescP->ID)*8))-1)
+   if (Cache.HeaderP->DescriptionCount >= std::numeric_limits<map_id_t>::max())
       return _error->Error(_("Wow, you exceeded the number of descriptions "
                             "this APT is capable of."));
-   if (Cache.HeaderP->DependsCount >= (1ULL<<(sizeof(Cache.DepP->ID)*8))-1ULL)
+   if (Cache.HeaderP->DependsCount >= std::numeric_limits<map_id_t>::max())
       return _error->Error(_("Wow, you exceeded the number of dependencies "
                             "this APT is capable of."));
 
@@ -302,10 +318,9 @@ bool pkgCacheGenerator::MergeListPackage(ListParser &List, pkgCache::PkgIterator
 
    // Find the right version to write the description
    MD5SumValue CurMd5 = List.Description_md5();
-   if (CurMd5.Value().empty() == true || List.Description().empty() == true)
+   if (CurMd5.Value().empty() == true && List.Description("").empty() == true)
       return true;
-   std::string CurLang = List.DescriptionLanguage();
-
+   std::vector<std::string> availDesc = List.AvailableDescriptionLanguages();
    for (Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
    {
       pkgCache::DescIterator VerDesc = Ver.DescriptionList();
@@ -314,31 +329,16 @@ bool pkgCacheGenerator::MergeListPackage(ListParser &List, pkgCache::PkgIterator
       if (VerDesc.end() == true || MD5SumValue(VerDesc.md5()) != CurMd5)
         continue;
 
-      // don't add a new description if we have one for the given
-      // md5 && language
-      if (IsDuplicateDescription(VerDesc, CurMd5, CurLang) == true)
-        continue;
-
-      pkgCache::DescIterator Desc;
-      Dynamic<pkgCache::DescIterator> DynDesc(Desc);
-
-      map_ptrloc const descindex = NewDescription(Desc, CurLang, CurMd5, VerDesc->md5sum);
-      if (unlikely(descindex == 0 && _error->PendingError()))
-        return _error->Error(_("Error occurred while processing %s (%s%d)"),
-                             Pkg.Name(), "NewDescription", 1);
-
-      Desc->ParentPkg = Pkg.Index();
-
-      // we add at the end, so that the start is constant as we need
-      // that to be able to efficiently share these lists
-      VerDesc = Ver.DescriptionList(); // old value might be invalid after ReMap
-      for (;VerDesc.end() == false && VerDesc->NextDesc != 0; ++VerDesc);
-      map_ptrloc * const LastNextDesc = (VerDesc.end() == true) ? &Ver->DescriptionList : &VerDesc->NextDesc;
-      *LastNextDesc = descindex;
+      map_stringitem_t md5idx = VerDesc->md5sum;
+      for (std::vector<std::string>::const_iterator CurLang = availDesc.begin(); CurLang != availDesc.end(); ++CurLang)
+      {
+        // don't add a new description if we have one for the given
+        // md5 && language
+        if (IsDuplicateDescription(VerDesc, CurMd5, *CurLang) == true)
+           continue;
 
-      if (NewFileDesc(Desc,List) == false)
-        return _error->Error(_("Error occurred while processing %s (%s%d)"),
-                             Pkg.Name(), "NewFileDesc", 1);
+        AddNewDescription(List, Ver, *CurLang, CurMd5, md5idx);
+      }
 
       // we can stop here as all "same" versions will share the description
       break;
@@ -353,7 +353,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
 {
    pkgCache::VerIterator Ver = Pkg.VersionList();
    Dynamic<pkgCache::VerIterator> DynVer(Ver);
-   map_ptrloc *LastVer = &Pkg->VersionList;
+   map_pointer_t *LastVer = &Pkg->VersionList;
    void const * oldMap = Map.Data();
 
    unsigned short const Hash = List.VersionHash();
@@ -362,7 +362,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
       /* We know the list is sorted so we use that fact in the search.
          Insertion of new versions is done with correct sorting */
       int Res = 1;
-      for (; Ver.end() == false; LastVer = &Ver->NextVer, Ver++)
+      for (; Ver.end() == false; LastVer = &Ver->NextVer, ++Ver)
       {
         Res = Cache.VS->CmpVersion(Version,Ver.VerStr());
         // Version is higher as current version - insert here
@@ -398,13 +398,13 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
    }
 
    // Add a new version
-   map_ptrloc const verindex = NewVersion(Ver, Version, Pkg.Index(), Hash, *LastVer);
+   map_pointer_t const verindex = NewVersion(Ver, Version, Pkg.Index(), Hash, *LastVer);
    if (verindex == 0 && _error->PendingError())
       return _error->Error(_("Error occurred while processing %s (%s%d)"),
                           Pkg.Name(), "NewVersion", 1);
 
    if (oldMap != Map.Data())
-        LastVer += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap;
+        LastVer += (map_pointer_t const * const) Map.Data() - (map_pointer_t const * const) oldMap;
    *LastVer = verindex;
 
    if (unlikely(List.NewVersion(Ver) == false))
@@ -465,7 +465,7 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
                   D.ParentPkg().Group() == Grp)
                  continue;
 
-              map_ptrloc *OldDepLast = NULL;
+              map_pointer_t *OldDepLast = NULL;
               pkgCache::VerIterator ConVersion = D.ParentVer();
               Dynamic<pkgCache::VerIterator> DynV(ConVersion);
               // duplicate the Conflicts/Breaks/Replaces for :none arch
@@ -486,11 +486,10 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
       return true;
    }
 
-   /* Record the Description (it is not translated) */
+   /* Record the Description(s) based on their master md5sum */
    MD5SumValue CurMd5 = List.Description_md5();
-   if (CurMd5.Value().empty() == true || List.Description().empty() == true)
+   if (CurMd5.Value().empty() == true && List.Description("").empty() == true)
       return true;
-   std::string CurLang = List.DescriptionLanguage();
 
    /* Before we add a new description we first search in the group for
       a version with a description of the same MD5 - if so we reuse this
@@ -501,28 +500,44 @@ bool pkgCacheGenerator::MergeListVersion(ListParser &List, pkgCache::PkgIterator
       for (pkgCache::VerIterator V = P.VersionList();
           V.end() == false; ++V)
       {
-        if (IsDuplicateDescription(V.DescriptionList(), CurMd5, "") == false)
+        if (V->DescriptionList == 0 || MD5SumValue(V.DescriptionList().md5()) != CurMd5)
            continue;
         Ver->DescriptionList = V->DescriptionList;
-        return true;
       }
    }
 
-   // We haven't found reusable descriptions, so add the first description
-   pkgCache::DescIterator Desc = Ver.DescriptionList();
+   // We haven't found reusable descriptions, so add the first description(s)
+   map_stringitem_t md5idx = Ver->DescriptionList == 0 ? 0 : Ver.DescriptionList()->md5sum;
+   std::vector<std::string> availDesc = List.AvailableDescriptionLanguages();
+   for (std::vector<std::string>::const_iterator CurLang = availDesc.begin(); CurLang != availDesc.end(); ++CurLang)
+      if (AddNewDescription(List, Ver, *CurLang, CurMd5, md5idx) == false)
+        return false;
+   return true;
+}
+                                                                       /*}}}*/
+bool pkgCacheGenerator::AddNewDescription(ListParser &List, pkgCache::VerIterator &Ver, std::string const &lang, MD5SumValue const &CurMd5, map_stringitem_t &md5idx) /*{{{*/
+{
+   pkgCache::DescIterator Desc;
    Dynamic<pkgCache::DescIterator> DynDesc(Desc);
 
-   map_ptrloc const descindex = NewDescription(Desc, CurLang, CurMd5, 0);
+   map_pointer_t const descindex = NewDescription(Desc, lang, CurMd5, md5idx);
    if (unlikely(descindex == 0 && _error->PendingError()))
       return _error->Error(_("Error occurred while processing %s (%s%d)"),
-                          Pkg.Name(), "NewDescription", 2);
+           Ver.ParentPkg().Name(), "NewDescription", 1);
 
-   Desc->ParentPkg = Pkg.Index();
-   Ver->DescriptionList = descindex;
+   md5idx = Desc->md5sum;
+   Desc->ParentPkg = Ver.ParentPkg().Index();
+
+   // we add at the end, so that the start is constant as we need
+   // that to be able to efficiently share these lists
+   pkgCache::DescIterator VerDesc = Ver.DescriptionList(); // old value might be invalid after ReMap
+   for (;VerDesc.end() == false && VerDesc->NextDesc != 0; ++VerDesc);
+   map_pointer_t * const LastNextDesc = (VerDesc.end() == true) ? &Ver->DescriptionList : &VerDesc->NextDesc;
+   *LastNextDesc = descindex;
 
    if (NewFileDesc(Desc,List) == false)
       return _error->Error(_("Error occurred while processing %s (%s%d)"),
-                          Pkg.Name(), "NewFileDesc", 2);
+           Ver.ParentPkg().Name(), "NewFileDesc", 1);
 
    return true;
 }
@@ -589,19 +604,19 @@ bool pkgCacheGenerator::NewGroup(pkgCache::GrpIterator &Grp, const string &Name)
       return true;
 
    // Get a structure
-   map_ptrloc const Group = AllocateInMap(sizeof(pkgCache::Group));
+   map_pointer_t const Group = AllocateInMap(sizeof(pkgCache::Group));
    if (unlikely(Group == 0))
       return false;
 
    Grp = pkgCache::GrpIterator(Cache, Cache.GrpP + Group);
-   map_ptrloc const idxName = WriteStringInMap(Name);
+   map_stringitem_t const idxName = StoreString(PKGNAME, Name);
    if (unlikely(idxName == 0))
       return false;
    Grp->Name = idxName;
 
    // Insert it into the hash table
    unsigned long const Hash = Cache.Hash(Name);
-   map_ptrloc *insertAt = &Cache.HeaderP->GrpHashTable[Hash];
+   map_pointer_t *insertAt = &Cache.HeaderP->GrpHashTableP()[Hash];
    while (*insertAt != 0 && strcasecmp(Name.c_str(), Cache.StrP + (Cache.GrpP + *insertAt)->Name) > 0)
       insertAt = &(Cache.GrpP + *insertAt)->Next;
    Grp->Next = *insertAt;
@@ -626,7 +641,7 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name
         return true;
 
    // Get a structure
-   map_ptrloc const Package = AllocateInMap(sizeof(pkgCache::Package));
+   map_pointer_t const Package = AllocateInMap(sizeof(pkgCache::Package));
    if (unlikely(Package == 0))
       return false;
    Pkg = pkgCache::PkgIterator(Cache,Cache.PkgP + Package);
@@ -636,9 +651,9 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name
    {
       Grp->FirstPackage = Package;
       // Insert it into the hash table
-      unsigned long const Hash = Cache.Hash(Name);
-      map_ptrloc *insertAt = &Cache.HeaderP->PkgHashTable[Hash];
-      while (*insertAt != 0 && strcasecmp(Name.c_str(), Cache.StrP + (Cache.PkgP + *insertAt)->Name) > 0)
+      map_id_t const Hash = Cache.Hash(Name);
+      map_pointer_t *insertAt = &Cache.HeaderP->PkgHashTableP()[Hash];
+      while (*insertAt != 0 && strcasecmp(Name.c_str(), Cache.StrP + (Cache.GrpP + (Cache.PkgP + *insertAt)->Group)->Name) > 0)
         insertAt = &(Cache.PkgP + *insertAt)->NextPackage;
       Pkg->NextPackage = *insertAt;
       *insertAt = Package;
@@ -653,10 +668,10 @@ bool pkgCacheGenerator::NewPackage(pkgCache::PkgIterator &Pkg,const string &Name
    Grp->LastPackage = Package;
 
    // Set the name, arch and the ID
-   Pkg->Name = Grp->Name;
+   APT_IGNORE_DEPRECATED(Pkg->Name = Grp->Name;)
    Pkg->Group = Grp.Index();
    // all is mapped to the native architecture
-   map_ptrloc const idxArch = (Arch == "all") ? Cache.HeaderP->Architecture : WriteUniqString(Arch.c_str());
+   map_stringitem_t const idxArch = (Arch == "all") ? Cache.HeaderP->Architecture : StoreString(MIXED, Arch);
    if (unlikely(idxArch == 0))
       return false;
    Pkg->Arch = idxArch;
@@ -673,14 +688,14 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::GrpIterator &G,
    // copy P.Arch() into a string here as a cache remap
    // in NewDepends() later may alter the pointer location
    string Arch = P.Arch() == NULL ? "" : P.Arch();
-   map_ptrloc *OldDepLast = NULL;
+   map_pointer_t *OldDepLast = NULL;
    /* MultiArch handling introduces a lot of implicit Dependencies:
       - MultiArch: same → Co-Installable if they have the same version
       - All others conflict with all other group members */
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    pkgCache::PkgIterator D = G.PackageList();
    Dynamic<pkgCache::PkgIterator> DynD(D);
-   map_ptrloc const VerStrIdx = V->VerStr;
+   map_stringitem_t const VerStrIdx = V->VerStr;
    for (; D.end() != true; D = G.NextPkg(D))
    {
       if (Arch == D.Arch() || D->VersionList == 0)
@@ -713,11 +728,11 @@ bool pkgCacheGenerator::AddImplicitDepends(pkgCache::VerIterator &V,
    /* MultiArch handling introduces a lot of implicit Dependencies:
       - MultiArch: same → Co-Installable if they have the same version
       - All others conflict with all other group members */
-   map_ptrloc *OldDepLast = NULL;
+   map_pointer_t *OldDepLast = NULL;
    bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
    if (coInstall == true)
    {
-      map_ptrloc const VerStrIdx = V->VerStr;
+      map_stringitem_t const VerStrIdx = V->VerStr;
       // Replaces: ${self}:other ( << ${binary:Version})
       NewDepends(D, V, VerStrIdx,
                 pkgCache::Dep::Less, pkgCache::Dep::Replaces,
@@ -746,15 +761,15 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
       return true;
    
    // Get a structure
-   map_ptrloc const VerFile = AllocateInMap(sizeof(pkgCache::VerFile));
+   map_pointer_t const VerFile = AllocateInMap(sizeof(pkgCache::VerFile));
    if (VerFile == 0)
-      return 0;
+      return false;
    
    pkgCache::VerFileIterator VF(Cache,Cache.VerFileP + VerFile);
    VF->File = CurrentFile - Cache.PkgFileP;
    
    // Link it to the end of the list
-   map_ptrloc *Last = &Ver->FileList;
+   map_pointer_t *Last = &Ver->FileList;
    for (pkgCache::VerFileIterator V = Ver.FileList(); V.end() == false; ++V)
       Last = &V->NextFile;
    VF->NextFile = *Last;
@@ -772,14 +787,14 @@ bool pkgCacheGenerator::NewFileVer(pkgCache::VerIterator &Ver,
 // CacheGenerator::NewVersion - Create a new Version                   /*{{{*/
 // ---------------------------------------------------------------------
 /* This puts a version structure in the linked list */
-unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
+map_pointer_t pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
                                            const string &VerStr,
-                                           map_ptrloc const ParentPkg,
-                                           unsigned long const Hash,
-                                           unsigned long Next)
+                                           map_pointer_t const ParentPkg,
+                                           unsigned short const Hash,
+                                           map_pointer_t const Next)
 {
    // Get a structure
-   map_ptrloc const Version = AllocateInMap(sizeof(pkgCache::Version));
+   map_pointer_t const Version = AllocateInMap(sizeof(pkgCache::Version));
    if (Version == 0)
       return 0;
    
@@ -814,7 +829,7 @@ unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver,
       }
    }
    // haven't found the version string, so create
-   map_ptrloc const idxVerStr = WriteStringInMap(VerStr);
+   map_stringitem_t const idxVerStr = StoreString(VERSIONNUMBER, VerStr);
    if (unlikely(idxVerStr == 0))
       return 0;
    Ver->VerStr = idxVerStr;
@@ -831,7 +846,7 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
       return true;
    
    // Get a structure
-   map_ptrloc const DescFile = AllocateInMap(sizeof(pkgCache::DescFile));
+   map_pointer_t const DescFile = AllocateInMap(sizeof(pkgCache::DescFile));
    if (DescFile == 0)
       return false;
 
@@ -839,7 +854,7 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
    DF->File = CurrentFile - Cache.PkgFileP;
 
    // Link it to the end of the list
-   map_ptrloc *Last = &Desc->FileList;
+   map_pointer_t *Last = &Desc->FileList;
    for (pkgCache::DescFileIterator D = Desc.FileList(); D.end() == false; ++D)
       Last = &D->NextFile;
 
@@ -858,20 +873,20 @@ bool pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator &Desc,
 // CacheGenerator::NewDescription - Create a new Description           /*{{{*/
 // ---------------------------------------------------------------------
 /* This puts a description structure in the linked list */
-map_ptrloc pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
+map_pointer_t pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
                                            const string &Lang,
                                            const MD5SumValue &md5sum,
-                                           map_ptrloc idxmd5str)
+                                           map_stringitem_t const idxmd5str)
 {
    // Get a structure
-   map_ptrloc const Description = AllocateInMap(sizeof(pkgCache::Description));
+   map_pointer_t const Description = AllocateInMap(sizeof(pkgCache::Description));
    if (Description == 0)
       return 0;
 
    // Fill it in
    Desc = pkgCache::DescIterator(Cache,Cache.DescP + Description);
    Desc->ID = Cache.HeaderP->DescriptionCount++;
-   map_ptrloc const idxlanguage_code = WriteUniqString(Lang);
+   map_stringitem_t const idxlanguage_code = StoreString(MIXED, Lang);
    if (unlikely(idxlanguage_code == 0))
       return 0;
    Desc->language_code = idxlanguage_code;
@@ -880,7 +895,7 @@ map_ptrloc pkgCacheGenerator::NewDescription(pkgCache::DescIterator &Desc,
       Desc->md5sum = idxmd5str;
    else
    {
-      map_ptrloc const idxmd5sum = WriteStringInMap(md5sum.Value());
+      map_stringitem_t const idxmd5sum = WriteStringInMap(md5sum.Value());
       if (unlikely(idxmd5sum == 0))
         return 0;
       Desc->md5sum = idxmd5sum;
@@ -898,9 +913,9 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
                                   string const &Version,
                                   unsigned int const &Op,
                                   unsigned int const &Type,
-                                  map_ptrloc* &OldDepLast)
+                                  map_stringitem_t* &OldDepLast)
 {
-   map_ptrloc index = 0;
+   map_stringitem_t index = 0;
    if (Version.empty() == false)
    {
       int const CmpOp = Op & 0x0F;
@@ -911,25 +926,25 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
       if (index == 0)
       {
         void const * const oldMap = Map.Data();
-        index = WriteStringInMap(Version);
+        index = StoreString(VERSIONNUMBER, Version);
         if (unlikely(index == 0))
            return false;
         if (OldDepLast != 0 && oldMap != Map.Data())
-           OldDepLast += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap;
+           OldDepLast += (map_pointer_t const * const) Map.Data() - (map_pointer_t const * const) oldMap;
       }
    }
    return NewDepends(Pkg, Ver, index, Op, Type, OldDepLast);
 }
 bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
                                   pkgCache::VerIterator &Ver,
-                                  map_ptrloc const Version,
+                                  map_pointer_t const Version,
                                   unsigned int const &Op,
                                   unsigned int const &Type,
-                                  map_ptrloc* &OldDepLast)
+                                  map_pointer_t* &OldDepLast)
 {
    void const * const oldMap = Map.Data();
    // Get a structure
-   map_ptrloc const Dependency = AllocateInMap(sizeof(pkgCache::Dependency));
+   map_pointer_t const Dependency = AllocateInMap(sizeof(pkgCache::Dependency));
    if (unlikely(Dependency == 0))
       return false;
 
@@ -954,7 +969,7 @@ bool pkgCacheGenerator::NewDepends(pkgCache::PkgIterator &Pkg,
       for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; ++D)
         OldDepLast = &D->NextDepends;
    } else if (oldMap != Map.Data())
-      OldDepLast += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap;
+      OldDepLast += (map_pointer_t const * const) Map.Data() - (map_pointer_t const * const) oldMap;
 
    Dep->NextDepends = *OldDepLast;
    *OldDepLast = Dep.Index();
@@ -1019,7 +1034,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver,
       return true;
    
    // Get a structure
-   map_ptrloc const Provides = Owner->AllocateInMap(sizeof(pkgCache::Provides));
+   map_pointer_t const Provides = Owner->AllocateInMap(sizeof(pkgCache::Provides));
    if (unlikely(Provides == 0))
       return false;
    Cache.HeaderP->ProvidesCount++;
@@ -1031,7 +1046,7 @@ bool pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator &Ver,
    Prv->NextPkgProv = Ver->ProvidesList;
    Ver->ProvidesList = Prv.Index();
    if (Version.empty() == false) {
-      map_ptrloc const idxProvideVersion = WriteString(Version);
+      map_stringitem_t const idxProvideVersion = WriteString(Version);
       Prv->ProvideVersion = idxProvideVersion;
       if (unlikely(idxProvideVersion == 0))
         return false;
@@ -1066,14 +1081,14 @@ bool pkgCacheGenerator::SelectFile(const string &File,const string &Site,
                                   unsigned long Flags)
 {
    // Get some space for the structure
-   map_ptrloc const idxFile = AllocateInMap(sizeof(*CurrentFile));
+   map_pointer_t const idxFile = AllocateInMap(sizeof(*CurrentFile));
    if (unlikely(idxFile == 0))
       return false;
    CurrentFile = Cache.PkgFileP + idxFile;
 
    // Fill it in
-   map_ptrloc const idxFileName = WriteStringInMap(File);
-   map_ptrloc const idxSite = WriteUniqString(Site);
+   map_stringitem_t const idxFileName = WriteStringInMap(File);
+   map_stringitem_t const idxSite = StoreString(MIXED, Site);
    if (unlikely(idxFileName == 0 || idxSite == 0))
       return false;
    CurrentFile->FileName = idxFileName;
@@ -1081,7 +1096,7 @@ bool pkgCacheGenerator::SelectFile(const string &File,const string &Site,
    CurrentFile->NextFile = Cache.HeaderP->FileList;
    CurrentFile->Flags = Flags;
    CurrentFile->ID = Cache.HeaderP->PackageFileCount;
-   map_ptrloc const idxIndexType = WriteUniqString(Index.GetType()->Label);
+   map_stringitem_t const idxIndexType = StoreString(MIXED, Index.GetType()->Label);
    if (unlikely(idxIndexType == 0))
       return false;
    CurrentFile->IndexType = idxIndexType;
@@ -1098,57 +1113,27 @@ bool pkgCacheGenerator::SelectFile(const string &File,const string &Site,
 // ---------------------------------------------------------------------
 /* This is used to create handles to strings. Given the same text it
    always returns the same number */
-unsigned long pkgCacheGenerator::WriteUniqString(const char *S,
+map_stringitem_t pkgCacheGenerator::StoreString(enum StringType const type, const char *S,
                                                 unsigned int Size)
 {
-   /* We use a very small transient hash table here, this speeds up generation
-      by a fair amount on slower machines */
-   pkgCache::StringItem *&Bucket = UniqHash[(S[0]*5 + S[1]) % _count(UniqHash)];
-   if (Bucket != 0 && 
-       stringcmp(S,S+Size,Cache.StrP + Bucket->String) == 0)
-      return Bucket->String;
-   
-   // Search for an insertion point
-   pkgCache::StringItem *I = Cache.StringItemP + Cache.HeaderP->StringList;
-   int Res = 1;
-   map_ptrloc *Last = &Cache.HeaderP->StringList;
-   for (; I != Cache.StringItemP; Last = &I->NextItem, 
-        I = Cache.StringItemP + I->NextItem)
-   {
-      Res = stringcmp(S,S+Size,Cache.StrP + I->String);
-      if (Res >= 0)
-        break;
-   }
-   
-   // Match
-   if (Res == 0)
-   {
-      Bucket = I;
-      return I->String;
-   }
-   
-   // Get a structure
-   void const * const oldMap = Map.Data();
-   map_ptrloc const Item = AllocateInMap(sizeof(pkgCache::StringItem));
-   if (Item == 0)
-      return 0;
-
-   map_ptrloc const idxString = WriteStringInMap(S,Size);
-   if (unlikely(idxString == 0))
-      return 0;
-   if (oldMap != Map.Data()) {
-      Last += (map_ptrloc const * const) Map.Data() - (map_ptrloc const * const) oldMap;
-      I += (pkgCache::StringItem const * const) Map.Data() - (pkgCache::StringItem const * const) oldMap;
+   std::string const key(S, Size);
+
+   std::map<std::string,map_stringitem_t> * strings;
+   switch(type) {
+      case MIXED: strings = &strMixed; break;
+      case PKGNAME: strings = &strPkgNames; break;
+      case VERSIONNUMBER: strings = &strVersions; break;
+      case SECTION: strings = &strSections; break;
+      default: _error->Fatal("Unknown enum type used for string storage of '%s'", key.c_str()); return 0;
    }
-   *Last = Item;
 
-   // Fill in the structure
-   pkgCache::StringItem *ItemP = Cache.StringItemP + Item;
-   ItemP->NextItem = I - Cache.StringItemP;
-   ItemP->String = idxString;
+   std::map<std::string,map_stringitem_t>::const_iterator const item = strings->find(key);
+   if (item != strings->end())
+      return item->second;
 
-   Bucket = ItemP;
-   return ItemP->String;
+   map_stringitem_t const idxString = WriteStringInMap(S,Size);
+   strings->insert(std::make_pair(key, idxString));
+   return idxString;
 }
                                                                        /*}}}*/
 // CheckValidity - Check that a cache is up-to-date                    /*{{{*/
@@ -1258,9 +1243,9 @@ static bool CheckValidity(const string &CacheFile,
 // ---------------------------------------------------------------------
 /* Size is kind of an abstract notion that is only used for the progress
    meter */
-static unsigned long ComputeSize(FileIterator Start,FileIterator End)
+static map_filesize_t ComputeSize(FileIterator Start,FileIterator End)
 {
-   unsigned long TotalSize = 0;
+   map_filesize_t TotalSize = 0;
    for (; Start < End; ++Start)
    {
       if ((*Start)->HasPackages() == false)
@@ -1275,7 +1260,7 @@ static unsigned long ComputeSize(FileIterator Start,FileIterator End)
 /* */
 static bool BuildCache(pkgCacheGenerator &Gen,
                       OpProgress *Progress,
-                      unsigned long &CurrentSize,unsigned long TotalSize,
+                      map_filesize_t &CurrentSize,map_filesize_t TotalSize,
                       FileIterator Start, FileIterator End)
 {
    FileIterator I;
@@ -1294,7 +1279,7 @@ static bool BuildCache(pkgCacheGenerator &Gen,
         continue;
       }
       
-      unsigned long Size = (*I)->Size();
+      map_filesize_t Size = (*I)->Size();
       if (Progress != NULL)
         Progress->OverallProgress(CurrentSize,TotalSize,Size,_("Reading package lists"));
       CurrentSize += Size;
@@ -1311,7 +1296,7 @@ static bool BuildCache(pkgCacheGenerator &Gen,
       CurrentSize = 0;
       for (I = Start; I != End; ++I)
       {
-        unsigned long Size = (*I)->Size();
+        map_filesize_t Size = (*I)->Size();
         if (Progress != NULL)
            Progress->OverallProgress(CurrentSize,TotalSize,Size,_("Collecting File Provides"));
         CurrentSize += Size;
@@ -1325,9 +1310,9 @@ static bool BuildCache(pkgCacheGenerator &Gen,
                                                                        /*}}}*/
 // CacheGenerator::CreateDynamicMMap - load an mmap with configuration options /*{{{*/
 DynamicMMap* pkgCacheGenerator::CreateDynamicMMap(FileFd *CacheF, unsigned long Flags) {
-   unsigned long const MapStart = _config->FindI("APT::Cache-Start", 24*1024*1024);
-   unsigned long const MapGrow = _config->FindI("APT::Cache-Grow", 1*1024*1024);
-   unsigned long const MapLimit = _config->FindI("APT::Cache-Limit", 0);
+   map_filesize_t const MapStart = _config->FindI("APT::Cache-Start", 24*1024*1024);
+   map_filesize_t const MapGrow = _config->FindI("APT::Cache-Grow", 1*1024*1024);
+   map_filesize_t const MapLimit = _config->FindI("APT::Cache-Limit", 0);
    Flags |= MMap::Moveable;
    if (_config->FindB("APT::Cache-Fallback", false) == true)
       Flags |= MMap::Fallback;
@@ -1365,7 +1350,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
          Files.push_back (*j);
    }
    
-   unsigned long const EndOfSource = Files.size();
+   map_filesize_t const EndOfSource = Files.size();
    if (_system->AddStatusFiles(Files) == false)
       return false;
 
@@ -1455,8 +1440,8 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
    }
    
    // Lets try the source cache.
-   unsigned long CurrentSize = 0;
-   unsigned long TotalSize = 0;
+   map_filesize_t CurrentSize = 0;
+   map_filesize_t TotalSize = 0;
    if (CheckValidity(SrcCacheFile, List, Files.begin(),
                     Files.begin()+EndOfSource) == true)
    {
@@ -1464,7 +1449,7 @@ bool pkgCacheGenerator::MakeStatusCache(pkgSourceList &List,OpProgress *Progress
         std::clog << "srcpkgcache.bin is valid - populate MMap with it." << std::endl;
       // Preload the map with the source cache
       FileFd SCacheF(SrcCacheFile,FileFd::ReadOnly);
-      unsigned long const alloc = Map->RawAllocate(SCacheF.Size());
+      map_pointer_t const alloc = Map->RawAllocate(SCacheF.Size());
       if ((alloc == 0 && _error->PendingError())
                || SCacheF.Read((unsigned char *)Map->Data() + alloc,
                                SCacheF.Size()) == false)
@@ -1551,13 +1536,13 @@ APT_DEPRECATED bool pkgMakeOnlyStatusCache(OpProgress &Progress,DynamicMMap **Ou
 bool pkgCacheGenerator::MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap)
 {
    std::vector<pkgIndexFile *> Files;
-   unsigned long EndOfSource = Files.size();
+   map_filesize_t EndOfSource = Files.size();
    if (_system->AddStatusFiles(Files) == false)
       return false;
 
    SPtr<DynamicMMap> Map = CreateDynamicMMap(NULL);
-   unsigned long CurrentSize = 0;
-   unsigned long TotalSize = 0;
+   map_filesize_t CurrentSize = 0;
+   map_filesize_t TotalSize = 0;
    
    TotalSize = ComputeSize(Files.begin()+EndOfSource,Files.end());
    
index 1e1a710267341f72f8747286213e27138e4eb8a7..c4ace713dffaee8994799005930df6760821fc91 100644 (file)
 
 #include <vector>
 #include <string>
+#include <map>
 
 class FileFd;
 class pkgSourceList;
 class OpProgress;
 class pkgIndexFile;
 
-class pkgCacheGenerator                                                        /*{{{*/
+class APT_HIDDEN pkgCacheGenerator                                     /*{{{*/
 {
    private:
+   APT_HIDDEN map_stringitem_t WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); };
+   APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String);
+   APT_HIDDEN map_stringitem_t WriteStringInMap(const char *String, const unsigned long &Len);
+   APT_HIDDEN map_pointer_t AllocateInMap(const unsigned long &size);
 
-   pkgCache::StringItem *UniqHash[26];
-   APT_HIDDEN map_ptrloc WriteStringInMap(std::string const &String) { return WriteStringInMap(String.c_str()); };
-   APT_HIDDEN map_ptrloc WriteStringInMap(const char *String);
-   APT_HIDDEN map_ptrloc WriteStringInMap(const char *String, const unsigned long &Len);
-   APT_HIDDEN map_ptrloc AllocateInMap(const unsigned long &size);
+   std::map<std::string,map_stringitem_t> strMixed;
+   std::map<std::string,map_stringitem_t> strSections;
+   std::map<std::string,map_stringitem_t> strPkgNames;
+   std::map<std::string,map_stringitem_t> strVersions;
 
    public:
    
@@ -78,21 +82,22 @@ class pkgCacheGenerator                                                     /*{{{*/
    bool NewFileDesc(pkgCache::DescIterator &Desc,ListParser &List);
    bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
                   std::string const &Version, unsigned int const &Op,
-                  unsigned int const &Type, map_ptrloc* &OldDepLast);
+                  unsigned int const &Type, map_pointer_t* &OldDepLast);
    bool NewDepends(pkgCache::PkgIterator &Pkg, pkgCache::VerIterator &Ver,
-                  map_ptrloc const Version, unsigned int const &Op,
-                  unsigned int const &Type, map_ptrloc* &OldDepLast);
-   unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,unsigned long Next) APT_DEPRECATED
+                  map_pointer_t const Version, unsigned int const &Op,
+                  unsigned int const &Type, map_pointer_t* &OldDepLast);
+   map_pointer_t NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,map_pointer_t const Next) APT_DEPRECATED
    { return NewVersion(Ver, VerStr, 0, 0, Next); }
-   unsigned long NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,
-                           map_ptrloc const ParentPkg, unsigned long const Hash,
-                           unsigned long Next);
-   map_ptrloc NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_ptrloc Next);
+   map_pointer_t NewVersion(pkgCache::VerIterator &Ver,const std::string &VerStr,
+                           map_pointer_t const ParentPkg, unsigned short const Hash,
+                           map_pointer_t const Next);
+   map_pointer_t NewDescription(pkgCache::DescIterator &Desc,const std::string &Lang,const MD5SumValue &md5sum,map_stringitem_t const idxmd5str);
 
    public:
 
-   unsigned long WriteUniqString(const char *S,unsigned int Size);
-   inline unsigned long WriteUniqString(const std::string &S) {return WriteUniqString(S.c_str(),S.length());};
+   enum StringType { MIXED, PKGNAME, VERSIONNUMBER, SECTION };
+   map_stringitem_t StoreString(StringType const type, const char * S, unsigned int const Size);
+   inline map_stringitem_t StoreString(enum StringType const type, const std::string &S) {return StoreString(type, S.c_str(),S.length());};
 
    void DropProgress() {Progress = 0;};
    bool SelectFile(const std::string &File,const std::string &Site,pkgIndexFile const &Index,
@@ -106,10 +111,10 @@ class pkgCacheGenerator                                                   /*{{{*/
    bool MergeFileProvides(ListParser &List);
    bool FinishCache(OpProgress *Progress) APT_DEPRECATED APT_CONST;
 
-   static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
+   APT_PUBLIC static bool MakeStatusCache(pkgSourceList &List,OpProgress *Progress,
                        MMap **OutMap = 0,bool AllowMem = false);
-   static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap);
-   static DynamicMMap* CreateDynamicMMap(FileFd *CacheF, unsigned long Flags = 0);
+   APT_PUBLIC static bool MakeOnlyStatusCache(OpProgress *Progress,DynamicMMap **OutMap);
+   APT_PUBLIC static DynamicMMap* CreateDynamicMMap(FileFd *CacheF, unsigned long Flags = 0);
 
    void ReMap(void const * const oldMap, void const * const newMap);
 
@@ -125,27 +130,31 @@ class pkgCacheGenerator                                                   /*{{{*/
    APT_HIDDEN bool AddImplicitDepends(pkgCache::GrpIterator &G, pkgCache::PkgIterator &P,
                           pkgCache::VerIterator &V);
    APT_HIDDEN bool AddImplicitDepends(pkgCache::VerIterator &V, pkgCache::PkgIterator &D);
+
+   APT_HIDDEN bool AddNewDescription(ListParser &List, pkgCache::VerIterator &Ver,
+        std::string const &lang, MD5SumValue const &CurMd5, map_stringitem_t &md5idx);
 };
                                                                        /*}}}*/
 // This is the abstract package list parser class.                     /*{{{*/
-class pkgCacheGenerator::ListParser
+class APT_HIDDEN pkgCacheGenerator::ListParser
 {
    pkgCacheGenerator *Owner;
    friend class pkgCacheGenerator;
    
    // Some cache items
    pkgCache::VerIterator OldDepVer;
-   map_ptrloc *OldDepLast;
+   map_pointer_t *OldDepLast;
 
    // Flag file dependencies
    bool FoundFileDeps;
       
    protected:
 
-   inline unsigned long WriteUniqString(std::string S) {return Owner->WriteUniqString(S);};
-   inline unsigned long WriteUniqString(const char *S,unsigned int Size) {return Owner->WriteUniqString(S,Size);};
-   inline unsigned long WriteString(const std::string &S) {return Owner->WriteStringInMap(S);};
-   inline unsigned long WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);};
+   inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, std::string const &S) {return Owner->StoreString(type, S);};
+   inline map_stringitem_t StoreString(pkgCacheGenerator::StringType const type, const char *S,unsigned int Size) {return Owner->StoreString(type, S, Size);};
+
+   inline map_stringitem_t WriteString(const std::string &S) {return Owner->WriteStringInMap(S);};
+   inline map_stringitem_t WriteString(const char *S,unsigned int Size) {return Owner->WriteStringInMap(S,Size);};
    bool NewDepends(pkgCache::VerIterator &Ver,const std::string &Package, const std::string &Arch,
                   const std::string &Version,unsigned int Op,
                   unsigned int Type);
@@ -160,8 +169,8 @@ class pkgCacheGenerator::ListParser
    virtual bool ArchitectureAll() = 0;
    virtual std::string Version() = 0;
    virtual bool NewVersion(pkgCache::VerIterator &Ver) = 0;
-   virtual std::string Description() = 0;
-   virtual std::string DescriptionLanguage() = 0;
+   virtual std::string Description(std::string const &lang) = 0;
+   virtual std::vector<std::string> AvailableDescriptionLanguages() = 0;
    virtual MD5SumValue Description_md5() = 0;
    virtual unsigned short VersionHash() = 0;
    /** compare currently parsed version with given version
@@ -169,14 +178,14 @@ class pkgCacheGenerator::ListParser
     * \param Hash of the currently parsed version
     * \param Ver to compare with
     */
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
    virtual
 #endif
       APT_PURE bool SameVersion(unsigned short const Hash, pkgCache::VerIterator const &Ver);
    virtual bool UsePackage(pkgCache::PkgIterator &Pkg,
                           pkgCache::VerIterator &Ver) = 0;
-   virtual unsigned long Offset() = 0;
-   virtual unsigned long Size() = 0;
+   virtual map_filesize_t Offset() = 0;
+   virtual map_filesize_t Size() = 0;
    
    virtual bool Step() = 0;
    
@@ -184,7 +193,7 @@ class pkgCacheGenerator::ListParser
    virtual bool CollectFileProvides(pkgCache &/*Cache*/,
                                    pkgCache::VerIterator &/*Ver*/) {return true;};
 
-   ListParser() : FoundFileDeps(false) {};
+   ListParser() : Owner(NULL), OldDepLast(NULL), FoundFileDeps(false) {};
    virtual ~ListParser() {};
 };
                                                                        /*}}}*/
index c403e4dc312cde3725b4bd37cc8ce800f1fcdf4e..859af3a0921a0bc58d1d663c3f0fbaaf5a2fa9a3 100644 (file)
@@ -26,7 +26,7 @@
 // Records::pkgRecords - Constructor                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* This will create the necessary structures to access the status files */
-pkgRecords::pkgRecords(pkgCache &Cache) : d(NULL), Cache(Cache),
+pkgRecords::pkgRecords(pkgCache &aCache) : d(NULL), Cache(aCache),
   Files(Cache.HeaderP->PackageFileCount)
 {
    for (pkgCache::PkgFileIterator I = Cache.FileBegin();
index b5237b3a08052ef337ed11e31644e3df7a948e16..bcc05baba8054727f1e263aaf227498644134619 100644 (file)
@@ -18,6 +18,8 @@
 #define PKGLIB_PKGRECORDS_H
 
 #include <apt-pkg/pkgcache.h>
+#include <apt-pkg/hashes.h>
+#include <apt-pkg/macros.h>
 
 #include <string>
 #include <vector>
@@ -56,17 +58,46 @@ class pkgRecords::Parser                                            /*{{{*/
    
    // These refer to the archive file for the Version
    virtual std::string FileName() {return std::string();};
-   virtual std::string MD5Hash() {return std::string();};
-   virtual std::string SHA1Hash() {return std::string();};
-   virtual std::string SHA256Hash() {return std::string();};
-   virtual std::string SHA512Hash() {return std::string();};
    virtual std::string SourcePkg() {return std::string();};
    virtual std::string SourceVer() {return std::string();};
 
+   /** return all known hashes in this record.
+    *
+    * For authentication proposes packages come with hashsums which
+    * this method is supposed to parse and return so that clients can
+    * choose the hash to be used.
+    */
+   virtual HashStringList Hashes() const { return HashStringList(); };
+#if APT_PKG_ABI >= 413
+   APT_DEPRECATED std::string MD5Hash() const { return GetHashFromHashes("MD5Sum"); };
+   APT_DEPRECATED std::string SHA1Hash() const { return GetHashFromHashes("SHA1"); };
+   APT_DEPRECATED std::string SHA256Hash() const { return GetHashFromHashes("SHA256"); };
+   APT_DEPRECATED std::string SHA512Hash() const { return GetHashFromHashes("SHA512"); };
+#else
+   APT_DEPRECATED std::string MD5Hash() { return GetHashFromHashes("MD5Sum"); };
+   APT_DEPRECATED std::string SHA1Hash() { return GetHashFromHashes("SHA1"); };
+   APT_DEPRECATED std::string SHA256Hash() { return GetHashFromHashes("SHA256"); };
+   APT_DEPRECATED std::string SHA512Hash() { return GetHashFromHashes("SHA512"); };
+#endif
+
    // These are some general stats about the package
    virtual std::string Maintainer() {return std::string();};
-   virtual std::string ShortDesc() {return std::string();};
-   virtual std::string LongDesc() {return std::string();};
+   /** return short description in language from record.
+    *
+    * @see #LongDesc
+    */
+   virtual std::string ShortDesc(std::string const &/*lang*/) {return std::string();};
+   /** return long description in language from record.
+    *
+    * If \b lang is empty the "best" available language will be
+    * returned as determined by the APT::Languages configuration.
+    * If a (requested) language can't be found in this record an empty
+    * string will be returned.
+    */
+   virtual std::string LongDesc(std::string const &/*lang*/) {return std::string();};
+   std::string ShortDesc() {return ShortDesc("");};
+   std::string LongDesc() {return LongDesc("");};
+
    virtual std::string Name() {return std::string();};
    virtual std::string Homepage() {return std::string();}
 
@@ -77,6 +108,14 @@ class pkgRecords::Parser                                            /*{{{*/
    virtual void GetRec(const char *&Start,const char *&Stop) {Start = Stop = 0;};
    
    virtual ~Parser() {};
+
+   private:
+   APT_HIDDEN std::string GetHashFromHashes(char const * const type) const
+   {
+      HashStringList const hashes = Hashes();
+      HashString const * const hs = hashes.find(type);
+      return hs != NULL ? hs->HashValue() : "";
+   };
 };
                                                                        /*}}}*/
 #endif
index 6e33c67ed338944bf6a7c328741621c030b440d8..f88ffa7c82ab2980a55328e9fd56837b0e7f1883 100644 (file)
@@ -85,10 +85,12 @@ class pkgSystem
    virtual bool AddStatusFiles(std::vector<pkgIndexFile *> &List) = 0;   
    virtual bool FindIndex(pkgCache::PkgFileIterator File,
                          pkgIndexFile *&Found) const = 0;
-   
+
    /* Evauluate how 'right' we are for this system based on the filesystem
       etc.. */
-   virtual signed Score(Configuration const &/*Cnf*/) {return 0;};
+   virtual signed Score(Configuration const &/*Cnf*/) {
+      return 0;
+   };
    
    pkgSystem();
    virtual ~pkgSystem() {};
index e37899ec679446a6ba24a1a47b597ab9ffceb63f..7170e8b5ba4ab1f81fdd056b6a9d3f44dc4aee65 100644 (file)
@@ -119,7 +119,7 @@ bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List,
    std::vector<std::string> list_section = StringSplit(Section, " ");
    
    for (std::vector<std::string>::const_iterator U = list_uris.begin();
-        U != list_uris.end(); U++)
+        U != list_uris.end(); ++U)
    {
       std::string URI = (*U);
       if (!FixupURI(URI))
@@ -129,10 +129,10 @@ bool pkgSourceList::Type::ParseStanza(vector<metaIndex *> &List,
       }
 
       for (std::vector<std::string>::const_iterator I = list_dist.begin();
-           I != list_dist.end(); I++)
+           I != list_dist.end(); ++I)
       {
          for (std::vector<std::string>::const_iterator J = list_section.begin();
-              J != list_section.end(); J++)
+              J != list_section.end(); ++J)
          {
             if (CreateItem(List, URI, (*I), (*J), Options) == false)
             {
@@ -408,7 +408,7 @@ int pkgSourceList::ParseFileDeb822(string File)
       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++)
+        I != list_types.end(); ++I)
       {
          Type *Parse = Type::GetType((*I).c_str());
          if (Parse == 0)
index 9df0c1d7419c3fbd46e38fef1d113fbd8e06b067..9983575092f25d4fbb337104b28c028464b680b3 100644 (file)
@@ -55,12 +55,12 @@ class metaIndex;
 class pkgSourceList
 {
    public:
-   
+
    // List of supported source list types
    class Type
    {
       public:
-      
+
       // Global list of Items supported
       static Type **GlobalList;
       static unsigned long GlobalListLen;
@@ -83,9 +83,9 @@ class pkgSourceList
       Type();
       virtual ~Type() {};
    };
-   
+
    typedef std::vector<metaIndex *>::const_iterator const_iterator;
-   
+
    protected:
 
    std::vector<metaIndex *> SrcList;
index dde22bd6538f5bfde8d02193b8d624219c649440..c931e17b72f24f4865b2ba5572a5d25bdab75397 100644 (file)
@@ -30,11 +30,7 @@ class pkgSrcRecords
 {
    public:
 
-#if __GNUC__ >= 4
-       // ensure that con- & de-structor don't trigger this warning
-       #pragma GCC diagnostic push
-       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
+APT_IGNORE_DEPRECATED_PUSH
    // Describes a single file
    struct File
    {
@@ -48,9 +44,7 @@ class pkgSrcRecords
       unsigned long long FileSize;
       HashStringList Hashes;
    };
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic pop
-#endif
+APT_IGNORE_DEPRECATED_POP
 
    // Abstract parser for each source record
    class Parser
index bf865bdc46eea80357be7c0de85b31e51feeac8f..590206f1720b771e678c0b09f8923056a26dbe05 100644 (file)
@@ -47,16 +47,60 @@ public:
    unsigned long long Size;
 };
 
+class pkgTagSectionPrivate
+{
+public:
+   pkgTagSectionPrivate()
+   {
+   }
+   struct TagData {
+      unsigned int StartTag;
+      unsigned int EndTag;
+      unsigned int StartValue;
+      unsigned int NextInBucket;
+
+      TagData(unsigned int const StartTag) : StartTag(StartTag), EndTag(0), StartValue(0), NextInBucket(0) {}
+   };
+   std::vector<TagData> Tags;
+};
+
+static unsigned long AlphaHash(const char *Text, size_t Length)                /*{{{*/
+{
+   /* This very simple hash function for the last 8 letters gives
+      very good performance on the debian package files */
+   if (Length > 8)
+   {
+    Text += (Length - 8);
+    Length = 8;
+   }
+   unsigned long Res = 0;
+   for (size_t i = 0; i < Length; ++i)
+      Res = ((unsigned long)(Text[i]) & 0xDF) ^ (Res << 1);
+   return Res & 0xFF;
+}
+                                                                       /*}}}*/
+
 // TagFile::pkgTagFile - Constructor                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
 pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long long Size)
+   : d(NULL)
+{
+   Init(pFd, Size);
+}
+
+void pkgTagFile::Init(FileFd *pFd,unsigned long long Size)
 {
    /* The size is increased by 4 because if we start with the Size of the
       filename we need to try to read 1 char more to see an EOF faster, 1
       char the end-pointer can be on and maybe 2 newlines need to be added
       to the end of the file -> 4 extra chars */
    Size += 4;
+   if(d != NULL)
+   {
+      free(d->Buffer);
+      delete d;
+   }
    d = new pkgTagFilePrivate(pFd, Size);
 
    if (d->Fd.IsOpen() == false)
@@ -128,18 +172,23 @@ bool pkgTagFile::Resize(unsigned long long const newSize)
  */
 bool pkgTagFile::Step(pkgTagSection &Tag)
 {
-   while (Tag.Scan(d->Start,d->End - d->Start) == false)
+   if(Tag.Scan(d->Start,d->End - d->Start) == false)
    {
-      if (Fill() == false)
-        return false;
-      
-      if(Tag.Scan(d->Start,d->End - d->Start))
-        break;
+      do
+      {
+        if (Fill() == false)
+           return false;
+
+        if(Tag.Scan(d->Start,d->End - d->Start, false))
+           break;
+
+        if (Resize() == false)
+           return _error->Error(_("Unable to parse package file %s (1)"),
+                 d->Fd.Name().c_str());
 
-      if (Resize() == false)
-        return _error->Error(_("Unable to parse package file %s (1)"),
-                              d->Fd.Name().c_str());
+      } while (Tag.Scan(d->Start,d->End - d->Start, false) == false);
    }
+
    d->Start += Tag.size();
    d->iOffset += Tag.size();
 
@@ -233,7 +282,7 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long long Offset)
    if (Fill() == false)
       return false;
    
-   if (Tag.Scan(d->Start, d->End - d->Start) == false)
+   if (Tag.Scan(d->Start, d->End - d->Start, false) == false)
       return _error->Error(_("Unable to parse package file %s (2)"),d->Fd.Name().c_str());
    
    return true;
@@ -242,28 +291,64 @@ bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long long Offset)
 // pkgTagSection::pkgTagSection - Constructor                          /*{{{*/
 // ---------------------------------------------------------------------
 /* */
+APT_IGNORE_DEPRECATED_PUSH
 pkgTagSection::pkgTagSection()
-   : Section(0), TagCount(0), d(NULL), Stop(0)
+   : Section(0), d(NULL), Stop(0)
 {
+   d = new pkgTagSectionPrivate();
+#if APT_PKG_ABI < 413
+   TagCount = 0;
    memset(&Indexes, 0, sizeof(Indexes));
+#endif
    memset(&AlphaIndexes, 0, sizeof(AlphaIndexes));
 }
+APT_IGNORE_DEPRECATED_POP
                                                                        /*}}}*/
 // TagSection::Scan - Scan for the end of the header information       /*{{{*/
-// ---------------------------------------------------------------------
-/* This looks for the first double new line in the data stream.
-   It also indexes the tags in the section. */
+#if APT_PKG_ABI < 413
 bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength)
 {
+   return Scan(Start, MaxLength, true);
+}
+#endif
+bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength, bool const Restart)
+{
+   Section = Start;
    const char *End = Start + MaxLength;
-   Stop = Section = Start;
-   memset(AlphaIndexes,0,sizeof(AlphaIndexes));
+
+   if (Restart == false && d->Tags.empty() == false)
+   {
+      Stop = Section + d->Tags.back().StartTag;
+      if (End <= Stop)
+        return false;
+      Stop = (const char *)memchr(Stop,'\n',End - Stop);
+      if (Stop == NULL)
+        return false;
+      ++Stop;
+   }
+   else
+   {
+      Stop = Section;
+      if (d->Tags.empty() == false)
+      {
+        memset(&AlphaIndexes, 0, sizeof(AlphaIndexes));
+        d->Tags.clear();
+      }
+      d->Tags.reserve(0x100);
+   }
+#if APT_PKG_ABI >= 413
+   unsigned int TagCount = d->Tags.size();
+#else
+   APT_IGNORE_DEPRECATED(TagCount = d->Tags.size();)
+#endif
 
    if (Stop == 0)
       return false;
 
-   TagCount = 0;
-   while (TagCount+1 < sizeof(Indexes)/sizeof(Indexes[0]) && Stop < End)
+   pkgTagSectionPrivate::TagData lastTagData(0);
+   lastTagData.EndTag = 0;
+   unsigned long lastTagHash = 0;
+   while (Stop < End)
    {
       TrimRecord(true,End);
 
@@ -275,12 +360,45 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength)
       // Start a new index and add it to the hash
       if (isspace(Stop[0]) == 0)
       {
-        Indexes[TagCount++] = Stop - Section;
-        AlphaIndexes[AlphaHash(Stop,End)] = TagCount;
+        // store the last found tag
+        if (lastTagData.EndTag != 0)
+        {
+           if (AlphaIndexes[lastTagHash] != 0)
+              lastTagData.NextInBucket = AlphaIndexes[lastTagHash];
+           APT_IGNORE_DEPRECATED_PUSH
+           AlphaIndexes[lastTagHash] = TagCount;
+#if APT_PKG_ABI < 413
+           if (d->Tags.size() < sizeof(Indexes)/sizeof(Indexes[0]))
+              Indexes[d->Tags.size()] = lastTagData.StartTag;
+#endif
+           APT_IGNORE_DEPRECATED_POP
+           d->Tags.push_back(lastTagData);
+        }
+
+        APT_IGNORE_DEPRECATED(++TagCount;)
+        lastTagData = pkgTagSectionPrivate::TagData(Stop - Section);
+        // find the colon separating tag and value
+        char const * Colon = (char const *) memchr(Stop, ':', End - Stop);
+        if (Colon == NULL)
+           return false;
+        // find the end of the tag (which might or might not be the colon)
+        char const * EndTag = Colon;
+        --EndTag;
+        for (; EndTag > Stop && isspace(*EndTag) != 0; --EndTag)
+           ;
+        ++EndTag;
+        lastTagData.EndTag = EndTag - Section;
+        lastTagHash = AlphaHash(Stop, EndTag - Stop);
+        // find the beginning of the value
+        Stop = Colon + 1;
+        for (; isspace(*Stop) != 0; ++Stop);
+        if (Stop >= End)
+           return false;
+        lastTagData.StartValue = Stop - Section;
       }
 
       Stop = (const char *)memchr(Stop,'\n',End - Stop);
-      
+
       if (Stop == 0)
         return false;
 
@@ -291,7 +409,22 @@ bool pkgTagSection::Scan(const char *Start,unsigned long MaxLength)
       // Double newline marks the end of the record
       if (Stop+1 < End && Stop[1] == '\n')
       {
-        Indexes[TagCount] = Stop - Section;
+        if (lastTagData.EndTag != 0)
+        {
+           if (AlphaIndexes[lastTagHash] != 0)
+              lastTagData.NextInBucket = AlphaIndexes[lastTagHash];
+           APT_IGNORE_DEPRECATED(AlphaIndexes[lastTagHash] = TagCount;)
+#if APT_PKG_ABI < 413
+           APT_IGNORE_DEPRECATED(Indexes[d->Tags.size()] = lastTagData.StartTag;)
+#endif
+           d->Tags.push_back(lastTagData);
+        }
+
+        pkgTagSectionPrivate::TagData const td(Stop - Section);
+#if APT_PKG_ABI < 413
+        APT_IGNORE_DEPRECATED(Indexes[d->Tags.size()] = td.StartTag;)
+#endif
+        d->Tags.push_back(td);
         TrimRecord(false,End);
         return true;
       }
@@ -320,8 +453,12 @@ void pkgTagSection::Trim()
    for (; Stop > Section + 2 && (Stop[-2] == '\n' || Stop[-2] == '\r'); Stop--);
 }
                                                                        /*}}}*/
-// TagSection::Exists - return True if a tag exists                    /*{{{*/
+// TagSection::Exists - return True if a tag exists                    /*{{{*/
+#if APT_PKG_ABI >= 413
+bool pkgTagSection::Exists(const char* const Tag) const
+#else
 bool pkgTagSection::Exists(const char* const Tag)
+#endif
 {
    unsigned int tmp;
    return Find(Tag, tmp);
@@ -332,73 +469,43 @@ bool pkgTagSection::Exists(const char* const Tag)
 /* This searches the section for a tag that matches the given string. */
 bool pkgTagSection::Find(const char *Tag,unsigned int &Pos) const
 {
-   unsigned int Length = strlen(Tag);
-   unsigned int I = AlphaIndexes[AlphaHash(Tag)];
-   if (I == 0)
+   size_t const Length = strlen(Tag);
+   unsigned int Bucket = AlphaIndexes[AlphaHash(Tag, Length)];
+   if (Bucket == 0)
       return false;
-   I--;
-   
-   for (unsigned int Counter = 0; Counter != TagCount; Counter++, 
-       I = (I+1)%TagCount)
+
+   for (; Bucket != 0; Bucket = d->Tags[Bucket - 1].NextInBucket)
    {
-      const char *St;
-      St = Section + Indexes[I];
-      if (strncasecmp(Tag,St,Length) != 0)
+      if ((d->Tags[Bucket - 1].EndTag - d->Tags[Bucket - 1].StartTag) != Length)
         continue;
 
-      // Make sure the colon is in the right place
-      const char *C = St + Length;
-      for (; isspace(*C) != 0; C++);
-      if (*C != ':')
+      char const * const St = Section + d->Tags[Bucket - 1].StartTag;
+      if (strncasecmp(Tag,St,Length) != 0)
         continue;
-      Pos = I;
+
+      Pos = Bucket - 1;
       return true;
    }
 
    Pos = 0;
    return false;
 }
-                                                                       /*}}}*/
-// TagSection::Find - Locate a tag                                     /*{{{*/
-// ---------------------------------------------------------------------
-/* This searches the section for a tag that matches the given string. */
 bool pkgTagSection::Find(const char *Tag,const char *&Start,
                         const char *&End) const
 {
-   unsigned int Length = strlen(Tag);
-   unsigned int I = AlphaIndexes[AlphaHash(Tag)];
-   if (I == 0)
+   unsigned int Pos;
+   if (Find(Tag, Pos) == false)
       return false;
-   I--;
-   
-   for (unsigned int Counter = 0; Counter != TagCount; Counter++, 
-       I = (I+1)%TagCount)
-   {
-      const char *St;
-      St = Section + Indexes[I];
-      if (strncasecmp(Tag,St,Length) != 0)
-        continue;
-      
-      // Make sure the colon is in the right place
-      const char *C = St + Length;
-      for (; isspace(*C) != 0; C++);
-      if (*C != ':')
-        continue;
 
-      // Strip off the gunk from the start end
-      Start = C;
-      End = Section + Indexes[I+1];
-      if (Start >= End)
-        return _error->Error("Internal parsing error");
-      
-      for (; (isspace(*Start) != 0 || *Start == ':') && Start < End; Start++);
-      for (; isspace(End[-1]) != 0 && End > Start; End--);
-      
-      return true;
-   }
-   
-   Start = End = 0;
-   return false;
+   Start = Section + d->Tags[Pos].StartValue;
+   // Strip off the gunk from the end
+   End = Section + d->Tags[Pos + 1].StartTag;
+   if (unlikely(Start > End))
+      return _error->Error("Internal parsing error");
+
+   for (; isspace(End[-1]) != 0 && End > Start; --End);
+
+   return true;
 }
                                                                        /*}}}*/
 // TagSection::FindS - Find a string                                   /*{{{*/
@@ -461,6 +568,17 @@ unsigned long long pkgTagSection::FindULL(const char *Tag, unsigned long long co
    return Result;
 }
                                                                        /*}}}*/
+// TagSection::FindB - Find boolean value                              /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgTagSection::FindB(const char *Tag, bool const &Default) const
+{
+   const char *Start, *Stop;
+   if (Find(Tag, Start, Stop) == false)
+      return Default;
+   return StringToBool(string(Start, Stop));
+}
+                                                                       /*}}}*/
 // TagSection::FindFlag - Locate a yes/no type flag                    /*{{{*/
 // ---------------------------------------------------------------------
 /* The bits marked in Flag are masked on/off in Flags */
@@ -493,6 +611,18 @@ bool pkgTagSection::FindFlag(unsigned long &Flags, unsigned long Flag,
    return true;
 }
                                                                        /*}}}*/
+void pkgTagSection::Get(const char *&Start,const char *&Stop,unsigned int I) const
+{
+   Start = Section + d->Tags[I].StartTag;
+   Stop = Section + d->Tags[I+1].StartTag;
+}
+APT_PURE unsigned int pkgTagSection::Count() const {                   /*{{{*/
+   if (d->Tags.empty() == true)
+      return 0;
+   // the last element is just marking the end and isn't a real one
+   return d->Tags.size() - 1;
+}
+                                                                       /*}}}*/
 // TFRewrite - Rewrite a control record                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* This writes the control record to stdout rewriting it as necessary. The
@@ -682,3 +812,5 @@ bool TFRewrite(FILE *Output,pkgTagSection const &Tags,const char *Order[],
    return true;
 }
                                                                        /*}}}*/
+
+pkgTagSection::~pkgTagSection() { delete d; }
index d5b62e76dfd763ef7b541722b99665161f7a1bdf..d09e7046c23f7d9156a5b3eda5a77a23564a0557 100644 (file)
 #include <stdio.h>
 
 #include <string>
+#include <vector>
+#include <list>
 
 #ifndef APT_8_CLEANER_HEADERS
 #include <apt-pkg/fileutl.h>
 #endif
 
 class FileFd;
+class pkgTagSectionPrivate;
 
 class pkgTagSection
 {
    const char *Section;
-   // We have a limit of 256 tags per section.
-   unsigned int Indexes[256];
+   // We have a limit of 256 tags per section with the old abi
+#if APT_PKG_ABI < 413
+   APT_DEPRECATED unsigned int Indexes[256];
+#endif
    unsigned int AlphaIndexes[0x100];
-   unsigned int TagCount;
-   // dpointer placeholder (for later in case we need it)
-   void *d;
+#if APT_PKG_ABI < 413
+   APT_DEPRECATED unsigned int TagCount;
+#endif
 
-   /* This very simple hash function for the last 8 letters gives
-      very good performance on the debian package files */
-   inline static unsigned long AlphaHash(const char *Text, const char *End = 0)
-   {
-      unsigned long Res = 0;
-      for (; Text != End && *Text != ':' && *Text != 0; Text++)
-        Res = ((unsigned long)(*Text) & 0xDF) ^ (Res << 1);
-      return Res & 0xFF;
-   }
+   // dpointer placeholder (for later in case we need it)
+   pkgTagSectionPrivate *d;
 
    protected:
    const char *Stop;
@@ -63,23 +61,55 @@ class pkgTagSection
    bool Find(const char *Tag,const char *&Start, const char *&End) const;
    bool Find(const char *Tag,unsigned int &Pos) const;
    std::string FindS(const char *Tag) const;
-   signed int FindI(const char *Tag,signed long Default = 0) const ;
+   signed int FindI(const char *Tag,signed long Default = 0) const;
+   bool FindB(const char *Tag, bool const &Default = false) const;
    unsigned long long FindULL(const char *Tag, unsigned long long const &Default = 0) const;
    bool FindFlag(const char *Tag,unsigned long &Flags,
                 unsigned long Flag) const;
    bool static FindFlag(unsigned long &Flags, unsigned long Flag,
                                const char* Start, const char* Stop);
-   bool Scan(const char *Start,unsigned long MaxLength);
+
+   /** \brief searches the boundaries of the current section
+    *
+    * While parameter Start marks the beginning of the section, this method
+    * will search for the first double newline in the data stream which marks
+    * the end of the section. It also does a first pass over the content of
+    * the section parsing it as encountered for processing later on by Find
+    *
+    * @param Start is the beginning of the section
+    * @param MaxLength is the size of valid data in the stream pointed to by Start
+    * @param Restart if enabled internal state will be cleared, otherwise it is
+    *  assumed that now more data is available in the stream and the parsing will
+    *  start were it encountered insufficent data the last time.
+    *
+    * @return \b true if section end was found, \b false otherwise.
+    *  Beware that internal state will be inconsistent if \b false is returned!
+    */
+#if APT_PKG_ABI >= 413
+   APT_MUSTCHECK bool Scan(const char *Start, unsigned long MaxLength, bool const Restart = true);
+#else
+   APT_MUSTCHECK bool Scan(const char *Start, unsigned long MaxLength, bool const Restart);
+   APT_MUSTCHECK bool Scan(const char *Start, unsigned long MaxLength);
+#endif
+
    inline unsigned long size() const {return Stop - Section;};
    void Trim();
    virtual void TrimRecord(bool BeforeRecord, const char* &End);
-   
-   inline unsigned int Count() const {return TagCount;};
+
+   /** \brief amount of Tags in the current section
+    *
+    * Note: if a Tag is mentioned repeatly it will be counted multiple
+    * times, but only the last occurrence is available via Find methods.
+    */
+   unsigned int Count() const;
+#if APT_PKG_ABI >= 413
+   bool Exists(const char* const Tag) const;
+#else
    bool Exists(const char* const Tag);
-   inline void Get(const char *&Start,const char *&Stop,unsigned int I) const
-                   {Start = Section + Indexes[I]; Stop = Section + Indexes[I+1];}
-           
+#endif
+
+   void Get(const char *&Start,const char *&Stop,unsigned int I) const;
+
    inline void GetSection(const char *&Start,const char *&Stop) const
    {
       Start = Section;
@@ -87,7 +117,7 @@ class pkgTagSection
    };
    
    pkgTagSection();
-   virtual ~pkgTagSection() {};
+   virtual ~pkgTagSection();
 };
 
 class pkgTagFilePrivate;
@@ -105,6 +135,8 @@ class pkgTagFile
    unsigned long Offset();
    bool Jump(pkgTagSection &Tag,unsigned long long Offset);
 
+   void Init(FileFd *F,unsigned long long Size = 32*1024);
+
    pkgTagFile(FileFd *F,unsigned long long Size = 32*1024);
    virtual ~pkgTagFile();
 };
index 5d5b1962670383f248447b55e53f3c229f832d8d..2908a4820ba23b115363acd499e1494f2eb4068a 100644 (file)
@@ -27,8 +27,8 @@ bool ListUpdate(pkgAcquireStatus &Stat,
                pkgSourceList &List, 
                int PulseInterval)
 {
-   pkgAcquire Fetcher;
-   if (Fetcher.Setup(&Stat, _config->FindDir("Dir::State::Lists")) == false)
+   pkgAcquire Fetcher(&Stat);
+   if (Fetcher.GetLock(_config->FindDir("Dir::State::Lists")) == false)
       return false;
 
    // Populate it with the source selection
index 3835644def41223bbe2d96083a37bad3c0bc8ef1..e35cd14f6f410b98b3a03fef25a02e54edd727d2 100644 (file)
@@ -11,7 +11,8 @@
 #define PKGLIB_UPDATE_H
 
 class pkgAcquireStatus;
-
+class pkgSourceList;
+class pkgAcquire;
 
 bool ListUpdate(pkgAcquireStatus &progress, pkgSourceList &List, int PulseInterval=0);
 bool AcquireUpdate(pkgAcquire &Fetcher, int const PulseInterval = 0,
index 29b11937b391fd8164a6ccca1e3e2a9957351351..6c8721da8672ce1973c368d200d71d9be9d531eb 100644 (file)
    
    The problem resolver is used to resolve the problems.
  */
-bool pkgDistUpgrade(pkgDepCache &Cache)
+static bool pkgDistUpgrade(pkgDepCache &Cache, OpProgress * const Progress)
 {
    std::string const solver = _config->Find("APT::Solver", "internal");
-   if (solver != "internal") {
-      OpTextProgress Prog(*_config);
-      return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false, &Prog);
-   }
+   if (solver != "internal")
+      return EDSP::ResolveExternal(solver.c_str(), Cache, false, true, false, Progress);
+
+   if (Progress != NULL)
+      Progress->OverallProgress(0, 100, 1, _("Calculating upgrade"));
 
    pkgDepCache::ActionGroup group(Cache);
 
@@ -41,12 +42,18 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
       if (I->CurrentVer != 0)
         Cache.MarkInstall(I, false, 0, false);
 
+   if (Progress != NULL)
+      Progress->Progress(10);
+
    /* Auto upgrade all installed packages, this provides the basis 
       for the installation */
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
       if (I->CurrentVer != 0)
         Cache.MarkInstall(I, true, 0, false);
 
+   if (Progress != NULL)
+      Progress->Progress(50);
+
    /* Now, install each essential package which is not installed
       (and not provided by another package in the same name group) */
    std::string essential = _config->Find("pkgCacheGen::Essential", "all");
@@ -77,15 +84,24 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
       for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
         if ((I->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential)
            Cache.MarkInstall(I, true, 0, false);
-   
+
+   if (Progress != NULL)
+      Progress->Progress(55);
+
    /* We do it again over all previously installed packages to force 
       conflict resolution on them all. */
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
       if (I->CurrentVer != 0)
         Cache.MarkInstall(I, false, 0, false);
 
+   if (Progress != NULL)
+      Progress->Progress(65);
+
    pkgProblemResolver Fix(&Cache);
 
+   if (Progress != NULL)
+      Progress->Progress(95);
+
    // Hold back held packages.
    if (_config->FindB("APT::Ignore-Hold",false) == false)
    {
@@ -98,18 +114,26 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
         }
       }
    }
-   
-   return Fix.Resolve();
+
+   bool const success = Fix.Resolve(false, Progress);
+   if (Progress != NULL)
+      Progress->Done();
+   return success;
+}
+bool pkgDistUpgrade(pkgDepCache &Cache)
+{
+   return pkgDistUpgrade(Cache, NULL);
 }
                                                                        /*}}}*/
 // AllUpgradeNoNewPackages - Upgrade but no removals or new pkgs        /*{{{*/
-static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache)
+static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache, OpProgress * const Progress)
 {
    std::string const solver = _config->Find("APT::Solver", "internal");
-   if (solver != "internal") {
-      OpTextProgress Prog(*_config);
-      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
-   }
+   if (solver != "internal")
+      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress);
+
+   if (Progress != NULL)
+      Progress->OverallProgress(0, 100, 1, _("Calculating upgrade"));
 
    pkgDepCache::ActionGroup group(Cache);
 
@@ -131,8 +155,15 @@ static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache)
       if (I->CurrentVer != 0 && Cache[I].InstallVer != 0)
         Cache.MarkInstall(I, false, 0, false);
    }
-      
-   return Fix.ResolveByKeep();
+
+   if (Progress != NULL)
+      Progress->Progress(50);
+
+   // resolve remaining issues via keep
+   bool const success = Fix.ResolveByKeep(Progress);
+   if (Progress != NULL)
+      Progress->Done();
+   return success;
 }
                                                                        /*}}}*/
 // AllUpgradeWithNewInstalls - Upgrade + install new packages as needed /*{{{*/
@@ -141,13 +172,14 @@ static bool pkgAllUpgradeNoNewPackages(pkgDepCache &Cache)
  * Upgrade as much as possible without deleting anything (useful for
  * stable systems)
  */
-static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache)
+static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache, OpProgress * const Progress)
 {
    std::string const solver = _config->Find("APT::Solver", "internal");
-   if (solver != "internal") {
-      OpTextProgress Prog(*_config);
-      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, &Prog);
-   }
+   if (solver != "internal")
+      return EDSP::ResolveExternal(solver.c_str(), Cache, true, false, false, Progress);
+
+   if (Progress != NULL)
+      Progress->OverallProgress(0, 100, 1, _("Calculating upgrade"));
 
    pkgDepCache::ActionGroup group(Cache);
 
@@ -170,18 +202,30 @@ static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache)
       }
    }
 
+   if (Progress != NULL)
+      Progress->Progress(10);
+
    // then let auto-install loose
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
       if (Cache[I].Install())
         Cache.MarkInstall(I, true, 0, false);
 
+   if (Progress != NULL)
+      Progress->Progress(50);
+
    // ... but it may remove stuff, we we need to clean up afterwards again
    for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; ++I)
       if (Cache[I].Delete() == true)
         Cache.MarkKeep(I, false, false);
 
+   if (Progress != NULL)
+      Progress->Progress(60);
+
    // resolve remaining issues via keep
-   return Fix.ResolveByKeep();
+   bool const success = Fix.ResolveByKeep(Progress);
+   if (Progress != NULL)
+      Progress->Done();
+   return success;
 }
                                                                        /*}}}*/
 // AllUpgrade - Upgrade as many packages as possible                   /*{{{*/
@@ -189,9 +233,13 @@ static bool pkgAllUpgradeWithNewPackages(pkgDepCache &Cache)
 /* Right now the system must be consistent before this can be called.
    It also will not change packages marked for install, it only tries
    to install packages not marked for install */
+static bool pkgAllUpgrade(pkgDepCache &Cache, OpProgress * const Progress)
+{
+   return pkgAllUpgradeNoNewPackages(Cache, Progress);
+}
 bool pkgAllUpgrade(pkgDepCache &Cache)
 {
-   return pkgAllUpgradeNoNewPackages(Cache);
+   return pkgAllUpgrade(Cache, NULL);
 }
                                                                        /*}}}*/
 // MinimizeUpgrade - Minimizes the set of packages to be upgraded      /*{{{*/
@@ -239,24 +287,25 @@ bool pkgMinimizeUpgrade(pkgDepCache &Cache)
    return true;
 }
                                                                        /*}}}*/
-// APT::Upgrade::Upgrade - Upgrade using a specific strategy           /*{{{*/
+// APT::Upgrade::Upgrade - Upgrade using a specific strategy           /*{{{*/
+#if APT_PKG_ABI < 413
 bool APT::Upgrade::Upgrade(pkgDepCache &Cache, int mode)
 {
-   if (mode == 0) 
-   {
-      return pkgDistUpgrade(Cache);
-   }
+   return Upgrade(Cache, mode, NULL);
+}
+#endif
+bool APT::Upgrade::Upgrade(pkgDepCache &Cache, int mode, OpProgress * const Progress)
+{
+APT_IGNORE_DEPRECATED_PUSH
+   if (mode == ALLOW_EVERYTHING)
+      return pkgDistUpgrade(Cache, Progress);
    else if ((mode & ~FORBID_REMOVE_PACKAGES) == 0)
-   {
-      return pkgAllUpgradeWithNewPackages(Cache);
-   } 
+      return pkgAllUpgradeWithNewPackages(Cache, Progress);
    else if ((mode & ~(FORBID_REMOVE_PACKAGES|FORBID_INSTALL_NEW_PACKAGES)) == 0)
-   {
-      return pkgAllUpgradeNoNewPackages(Cache);
-   }
+      return pkgAllUpgradeNoNewPackages(Cache, Progress);
    else
       _error->Error("pkgAllUpgrade called with unsupported mode %i", mode);
-
+APT_IGNORE_DEPRECATED_POP
    return false;
 }
                                                                        /*}}}*/
index aa883df10aab1fe9d794042629d0a7e0932a336b..18b6aac7b03fedf7a25864c7538f3fc29b3545da 100644 (file)
 #ifndef PKGLIB_UPGRADE_H
 #define PKGLIB_UPGRADE_H
 
+#include <stddef.h>
+#include <apt-pkg/macros.h>
+
 class pkgDepCache;
+class OpProgress;
 
 namespace APT {
    namespace Upgrade {
       // FIXME: make this "enum class UpgradeMode {" once we enable c++11
       enum UpgradeMode {
          FORBID_REMOVE_PACKAGES = 1,
-         FORBID_INSTALL_NEW_PACKAGES = 2
+         FORBID_INSTALL_NEW_PACKAGES = 2,
+        ALLOW_EVERYTHING = 0
       };
+#if APT_PKG_ABI >= 413
+      bool Upgrade(pkgDepCache &Cache, int UpgradeMode, OpProgress * const Progress = NULL);
+#else
       bool Upgrade(pkgDepCache &Cache, int UpgradeMode);
+      bool Upgrade(pkgDepCache &Cache, int UpgradeMode, OpProgress * const Progress);
+#endif
    }
 }
 
 // please use APT::Upgrade::Upgrade() instead
-bool pkgDistUpgrade(pkgDepCache &Cache);
-bool pkgAllUpgrade(pkgDepCache &Cache);
-bool pkgMinimizeUpgrade(pkgDepCache &Cache);
-
+APT_DEPRECATED bool pkgDistUpgrade(pkgDepCache &Cache);
+APT_DEPRECATED bool pkgAllUpgrade(pkgDepCache &Cache);
 
+bool pkgMinimizeUpgrade(pkgDepCache &Cache);
 #endif
index fb33ff17d97f20f85a3cfcc9128cc7e7c98f7a8b..db5b87fc07f9aeafa811bb73eec496d7f50040cc 100644 (file)
 
 #include <apti18n.h>
 
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic push
-       #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-#endif
+// The whole vendor system is deprecated
+APT_IGNORE_DEPRECATED_PUSH
 
 #include <apt-pkg/vendor.h>
 #include <apt-pkg/vendorlist.h>
@@ -163,6 +161,4 @@ const Vendor* pkgVendorList::FindVendor(const std::vector<string> GPGVOutput)       /*
 }
                                                                        /*}}}*/
 
-#if __GNUC__ >= 4
-       #pragma GCC diagnostic pop
-#endif
+APT_IGNORE_DEPRECATED_POP
index 0f5b53e500666ff7d48ec48085cfa7fdb9480de3..14a53eacb495e61078baf2d36a542e4bbb0184a2 100644 (file)
@@ -64,8 +64,6 @@ void AcqTextStatus::IMSHit(pkgAcquire::ItemDesc &Itm)
       cout << '\r' << BlankLine << '\r';
 
    cout << _("Hit ") << Itm.Description;
-   if (Itm.Owner->FileSize != 0)
-      cout << " [" << SizeToStr(Itm.Owner->FileSize) << "B]";
    cout << endl;
    Update = true;
 }
@@ -119,6 +117,9 @@ void AcqTextStatus::Fail(pkgAcquire::ItemDesc &Itm)
    if (Itm.Owner->Status == pkgAcquire::Item::StatDone)
    {
       cout << _("Ign ") << Itm.Description << endl;
+      if (Itm.Owner->ErrorText.empty() == false &&
+           _config->FindB("Acquire::Progress::Ignore::ShowErrorText", false) == true)
+        cout << "  " << Itm.Owner->ErrorText << endl;
    }
    else
    {
@@ -142,6 +143,9 @@ void AcqTextStatus::Stop()
    if (Quiet <= 0)
       cout << '\r' << BlankLine << '\r' << flush;
 
+   if (_config->FindB("quiet::NoStatistic", false) == true)
+      return;
+
    if (FetchedBytes != 0 && _error->PendingError() == false)
       ioprintf(cout,_("Fetched %sB in %s (%sB/s)\n"),
               SizeToStr(FetchedBytes).c_str(),
@@ -170,7 +174,7 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner)
       ScreenWidth = sizeof(Buffer)-1;
 
    // Put in the percent done
-   sprintf(S,"%.0f%%",((CurrentBytes + CurrentItems)*100.0)/(TotalBytes+TotalItems));
+   sprintf(S,"%.0f%%", Percent);
 
    bool Shown = false;
    for (pkgAcquire::Worker *I = Owner->WorkersBegin(); I != 0;
@@ -201,9 +205,9 @@ bool AcqTextStatus::Pulse(pkgAcquire *Owner)
       S += strlen(S);
 
       // Show the short mode string
-      if (I->CurrentItem->Owner->Mode != 0)
+      if (I->CurrentItem->Owner->ActiveSubprocess.empty() == false)
       {
-        snprintf(S,End-S," %s",I->CurrentItem->Owner->Mode);
+        snprintf(S,End-S, " %s", I->CurrentItem->Owner->ActiveSubprocess.c_str());
         S += strlen(S);
       }
 
index 5e955ac395b2187138675df80ac6f3303702cd54..29e665245f5544065cb9bfc3718e93f33ba2cc32 100644 (file)
@@ -32,8 +32,10 @@ int CacheFile::NameComp(const void *a,const void *b)
    
    const pkgCache::Package &A = **(pkgCache::Package **)a;
    const pkgCache::Package &B = **(pkgCache::Package **)b;
+   const pkgCache::Group * const GA = SortCache->GrpP + A.Group;
+   const pkgCache::Group * const GB = SortCache->GrpP + B.Group;
 
-   return strcmp(SortCache->StrP + A.Name,SortCache->StrP + B.Name);
+   return strcmp(SortCache->StrP + GA->Name,SortCache->StrP + GB->Name);
 }
                                                                        /*}}}*/
 // CacheFile::Sort - Sort by name                                      /*{{{*/
index dce7e0a3a80bd18b9c90c26f1d2c5459aea79fe2..1fddabfbd5428de9c0e10fd7c1458b9b29b2f2eb 100644 (file)
@@ -6,7 +6,20 @@
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/macros.h>
+#include <apt-pkg/sourcelist.h>
+#include <apti18n.h>
 
+// FIXME: we need to find a way to export this 
+class APT_PUBLIC SourceList : public pkgSourceList
+{
+   
+ public:
+   // Add custom metaIndex (e.g. local files)
+   void AddMetaIndex(metaIndex *mi) {
+      SrcList.push_back(mi);
+   }
+
+};
 
 // class CacheFile - Cover class for some dependency cache functions   /*{{{*/
 // ---------------------------------------------------------------------
@@ -28,6 +41,16 @@ class APT_PUBLIC CacheFile : public pkgCacheFile
         return false;
       return true;
    }
+   // FIXME: this can go once the "libapt-pkg" pkgSourceList has a way
+   //        to add custom metaIndexes (or custom local files or so)
+   bool BuildSourceList(OpProgress */*Progress*/ = NULL) {
+      if (SrcList != NULL)
+         return true;
+      SrcList = new SourceList();
+      if (SrcList->ReadMainList() == false)
+         return _error->Error(_("The list of sources could not be read."));
+      return true;
+   }
    bool Open(bool WithLock = true) 
    {
       OpTextProgress Prog(*_config);
index eb77be274834e093de75e972a545cf9408818d57..cb68024db1d85e6af0513ba99291adfa2f20f779 100644 (file)
@@ -60,22 +60,22 @@ bool GetLocalitySortedVersionSet(pkgCacheFile &CacheFile,
       if (insertCurrentVer == true)
       {
         if (P->CurrentVer != 0)
-           vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::INSTALLED, helper);
+           vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::INSTALLED, helper);
       }
       else if (insertUpgradable == true)
       {
         if(P.CurrentVer() && state.Upgradable())
-           vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::CANDIDATE, helper);
+           vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper);
       }
       else if (insertManualInstalled == true)
       {
         if (P.CurrentVer() &&
               ((*DepCache)[P].Flags & pkgCache::Flag::Auto) == false)
-           vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::CANDIDATE, helper);
+           vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper);
       }
       else
       {
-         if (vci->FromPackage(vci, CacheFile, P, APT::VersionContainerInterface::CANDIDATE, helper) == false)
+         if (vci->FromPackage(vci, CacheFile, P, APT::CacheSetHelper::CANDIDATE, helper) == false)
         {
            // no candidate, this may happen for packages in
            // dpkg "deinstall ok config-file" state - we pick the first ver
index ca8f4be5d0bfe32e836c73983a3300d4ff8907e9..059c7637ef4613c176f9486b5927af97dbe4aaa9 100644 (file)
@@ -76,19 +76,16 @@ class CacheSetHelperVirtuals: public APT::CacheSetHelper {
 public:
    APT::PackageSet virtualPkgs;
 
-   virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
-      virtualPkgs.insert(Pkg);
-      return CacheSetHelper::canNotFindCandidateVer(Cache, Pkg);
+   virtual pkgCache::VerIterator canNotGetVersion(enum CacheSetHelper::VerSelector const select, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
+      if (select == NEWEST || select == CANDIDATE || select == ALL)
+        virtualPkgs.insert(Pkg);
+      return CacheSetHelper::canNotGetVersion(select, Cache, Pkg);
    }
 
-   virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
-      virtualPkgs.insert(Pkg);
-      return CacheSetHelper::canNotFindNewestVer(Cache, Pkg);
-   }
-
-   virtual void canNotFindAllVer(APT::VersionContainerInterface * vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
-      virtualPkgs.insert(Pkg);
-      CacheSetHelper::canNotFindAllVer(vci, Cache, Pkg);
+   virtual void canNotFindVersion(enum CacheSetHelper::VerSelector const select, APT::VersionContainerInterface * vci, pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
+      if (select == NEWEST || select == CANDIDATE || select == ALL)
+        virtualPkgs.insert(Pkg);
+      return CacheSetHelper::canNotFindVersion(select, vci, Cache, Pkg);
    }
 
    CacheSetHelperVirtuals(bool const ShowErrors = true, GlobalError::MsgType const &ErrorType = GlobalError::NOTICE) : CacheSetHelper(ShowErrors, ErrorType) {}
@@ -190,7 +187,7 @@ public:
        }
 
        virtual pkgCache::VerIterator canNotFindCandidateVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
-               APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, APT::VersionSet::CANDIDATE);
+               APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, CacheSetHelper::CANDIDATE);
                if (verset.empty() == false)
                        return *(verset.begin());
                else if (ShowError == true) {
@@ -203,7 +200,7 @@ public:
        virtual pkgCache::VerIterator canNotFindNewestVer(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg) {
                if (Pkg->ProvidesList != 0)
                {
-                       APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, APT::VersionSet::NEWEST);
+                       APT::VersionSet const verset = tryVirtualPackage(Cache, Pkg, CacheSetHelper::NEWEST);
                        if (verset.empty() == false)
                                return *(verset.begin());
                        if (ShowError == true)
@@ -231,7 +228,7 @@ public:
        }
 
        APT::VersionSet tryVirtualPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &Pkg,
-                                               APT::VersionSet::Version const &select) {
+                                               CacheSetHelper::VerSelector const select) {
                /* This is a pure virtual package and there is a single available
                   candidate providing it. */
                if (unlikely(Cache[Pkg].CandidateVer != 0) || Pkg->ProvidesList == 0)
index 0b5ba5b4fdf81c07846dacdbe2c06810dc2cbffb..bb9a00803ea7930ab601a83ff242579b45e8ebd5 100644 (file)
@@ -2,12 +2,17 @@
 #include <config.h>
 
 #include <apt-pkg/cmndline.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/init.h>
+#include <apt-pkg/error.h>
 
 #include <apt-private/private-cmndline.h>
 
 #include <vector>
 #include <stdarg.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -198,6 +203,7 @@ static bool addArgumentsAPTGet(std::vector<CommandLine::Args> &Args, char const
    addArg(0,"only-source","APT::Get::Only-Source",0);
    addArg(0,"arch-only","APT::Get::Arch-Only",0);
    addArg(0,"allow-unauthenticated","APT::Get::AllowUnauthenticated",0);
+   addArg(0,"allow-insecure-repositories","Acquire::AllowInsecureRepositories",0);
    addArg(0,"install-recommends","APT::Install-Recommends",CommandLine::Boolean);
    addArg(0,"install-suggests","APT::Install-Suggests",CommandLine::Boolean);
    addArg(0,"fix-policy","APT::Get::Fix-Policy-Broken",0);
@@ -286,3 +292,31 @@ std::vector<CommandLine::Args> getCommandArgs(char const * const Program, char c
                                                                        /*}}}*/
 #undef CmdMatches
 #undef addArg
+void ParseCommandLine(CommandLine &CmdL, CommandLine::Dispatch * const Cmds, CommandLine::Args * const Args,/*{{{*/
+      Configuration * const * const Cnf, pkgSystem ** const Sys, int const argc, const char *argv[], bool(*ShowHelp)(CommandLine &CmdL))
+{
+   CmdL = CommandLine(Args,_config);
+   if ((Cnf != NULL && pkgInitConfig(**Cnf) == false) ||
+       CmdL.Parse(argc,argv) == false ||
+       (Sys != NULL && pkgInitSystem(*_config, *Sys) == false))
+   {
+      if (_config->FindB("version") == true)
+        ShowHelp(CmdL);
+
+      _error->DumpErrors();
+      exit(100);
+   }
+
+   // See if the help should be shown
+   if (_config->FindB("help") == true || _config->FindB("version") == true)
+   {
+      ShowHelp(CmdL);
+      exit(0);
+   }
+   if (Cmds != NULL && CmdL.FileSize() == 0)
+   {
+      ShowHelp(CmdL);
+      exit(1);
+   }
+}
+                                                                       /*}}}*/
index d0af16782f697c754f9ff22daf40184160a58a5f..7b468456b857123bb8e91f0d49f43526fca656c3 100644 (file)
@@ -6,6 +6,12 @@
 
 #include <vector>
 
+class Configuration;
+class pkgSystem;
+
 APT_PUBLIC std::vector<CommandLine::Args> getCommandArgs(char const * const Program, char const * const Cmd);
+APT_PUBLIC void ParseCommandLine(CommandLine &CmdL, CommandLine::Dispatch * const Cmds, CommandLine::Args * const Args,
+      Configuration * const * const Cnf, pkgSystem ** const Sys, int const argc, const char * argv[],
+      bool(*ShowHelp)(CommandLine &CmdL));
 
 #endif
index be7d23c318163c5382bb4c6434133873a818afd6..37fae18e91633c9d22bd3bbff375744b9186566e 100644 (file)
@@ -5,6 +5,7 @@
 #include <apt-pkg/acquire-item.h>
 #include <apt-pkg/configuration.h>
 #include <apt-pkg/error.h>
+#include <apt-pkg/fileutl.h>
 #include <apt-pkg/strutl.h>
 
 #include <apt-private/private-output.h>
 #include <string>
 #include <vector>
 
+#include <unistd.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <fcntl.h>
+#include <sys/vfs.h>
+#include <sys/statvfs.h>
+#include <errno.h>
+
 #include <apti18n.h>
                                                                        /*}}}*/
 
+bool CheckDropPrivsMustBeDisabled(pkgAcquire &Fetcher)                 /*{{{*/
+{
+   // no need/possibility to drop privs
+   if(getuid() != 0)
+      return true;
+
+   // the user does not want to drop privs
+   std::string SandboxUser = _config->Find("APT::Sandbox::User");
+   if (SandboxUser.empty())
+      return true;
+
+   struct passwd const * const pw = getpwnam(SandboxUser.c_str());
+   if (pw == NULL)
+      return true;
+
+   if (seteuid(pw->pw_uid) != 0)
+      return _error->Errno("seteuid", "seteuid %u failed", pw->pw_uid);
+
+   bool res = true;
+   // check if we can write to destfile
+   for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin();
+       I != Fetcher.ItemsEnd() && res == true; ++I)
+   {
+      if ((*I)->DestFile.empty())
+        continue;
+      // we assume that an existing (partial) file means that we have sufficient rights
+      if (RealFileExists((*I)->DestFile))
+        continue;
+      int fd = open((*I)->DestFile.c_str(), O_CREAT | O_EXCL | O_RDWR, 0600);
+      if (fd < 0)
+      {
+        res = false;
+        std::string msg;
+        strprintf(msg, _("Can't drop privileges for downloading as file '%s' couldn't be accessed by user '%s'."),
+              (*I)->DestFile.c_str(), SandboxUser.c_str());
+        std::cerr << "W: " << msg << std::endl;
+        _config->Set("APT::Sandbox::User", "");
+        break;
+      }
+      unlink((*I)->DestFile.c_str());
+      close(fd);
+   }
+
+   if (seteuid(0) != 0)
+      return _error->Errno("seteuid", "seteuid %u failed", 0);
+
+   return res;
+}
+                                                                       /*}}}*/
 // CheckAuth - check if each download comes form a trusted source      /*{{{*/
 bool CheckAuth(pkgAcquire& Fetcher, bool const PromptUser)
 {
@@ -31,7 +89,7 @@ bool CheckAuth(pkgAcquire& Fetcher, bool const PromptUser)
    return AuthPrompt(UntrustedList, PromptUser);
 }
 
-bool AuthPrompt(std::string UntrustedList, bool const PromptUser)
+bool AuthPrompt(std::string const &UntrustedList, bool const PromptUser)
 {
    ShowList(c2out,_("WARNING: The following packages cannot be authenticated!"),UntrustedList,"");
 
@@ -98,3 +156,39 @@ bool AcquireRun(pkgAcquire &Fetcher, int const PulseInterval, bool * const Failu
    return true;
 }
                                                                        /*}}}*/
+bool CheckFreeSpaceBeforeDownload(std::string const &Dir, unsigned long long FetchBytes)/*{{{*/
+{
+   uint32_t const RAMFS_MAGIC = 0x858458f6;
+   /* Check for enough free space, but only if we are actually going to
+      download */
+   if (_config->FindB("APT::Get::Print-URIs", false) == true ||
+       _config->FindB("APT::Get::Download", true) == false)
+      return true;
+
+   struct statvfs Buf;
+   if (statvfs(Dir.c_str(),&Buf) != 0) {
+      if (errno == EOVERFLOW)
+        return _error->WarningE("statvfs",_("Couldn't determine free space in %s"),
+              Dir.c_str());
+      else
+        return _error->Errno("statvfs",_("Couldn't determine free space in %s"),
+              Dir.c_str());
+   }
+   else
+   {
+      unsigned long long const FreeBlocks = _config->Find("APT::Sandbox::User").empty() ? Buf.f_bfree : Buf.f_bavail;
+      if (FreeBlocks < (FetchBytes / Buf.f_bsize))
+      {
+        struct statfs Stat;
+        if (statfs(Dir.c_str(),&Stat) != 0
+#if HAVE_STRUCT_STATFS_F_TYPE
+              || Stat.f_type != RAMFS_MAGIC
+#endif
+           )
+           return _error->Error(_("You don't have enough free space in %s."),
+                 Dir.c_str());
+      }
+   }
+   return true;
+}
+                                                                       /*}}}*/
index a90ac7eaa1a626098bfd2d749b157d13ee31fb62..0a0ac6b95f7c151e36658de8e70e414355b416f8 100644 (file)
@@ -3,15 +3,21 @@
 
 #include <apt-pkg/macros.h>
 
+#include <string>
+
 class pkgAcquire;
 
+APT_PUBLIC bool CheckDropPrivsMustBeDisabled(pkgAcquire &Fetcher);
+
 // Check if all files in the fetcher are authenticated
 APT_PUBLIC bool CheckAuth(pkgAcquire& Fetcher, bool const PromptUser);
 
 // show a authentication warning prompt and return true if the system
 // should continue
-APT_PUBLIC bool AuthPrompt(std::string UntrustedList, bool const PromptUser);
+APT_PUBLIC bool AuthPrompt(std::string const &UntrustedList, bool const PromptUser);
 
 APT_PUBLIC bool AcquireRun(pkgAcquire &Fetcher, int const PulseInterval, bool * const Failure, bool * const TransientNetworkFailure);
 
+APT_PUBLIC bool CheckFreeSpaceBeforeDownload(std::string const &Dir, unsigned long long FetchBytes);
+
 #endif
index e08cd8057f1c0b8d3cc55b9bf2e88fa63dbd2285..79a22edf42d883005b1754f53044bbf109707125 100644 (file)
 #include <apt-pkg/packagemanager.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/upgrade.h>
+#include <apt-pkg/install-progress.h>
 
-#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
 #include <algorithm>
 #include <iostream>
 #include <set>
 #include <vector>
+#include <map>
 
 #include <apt-private/acqprogress.h>
 #include <apt-private/private-install.h>
@@ -95,7 +94,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
    {
       pkgSimulate PM(Cache);
 
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+#if APT_PKG_ABI >= 413
       APT::Progress::PackageManager *progress = APT::Progress::PackageManagerProgressFactory();
       pkgPackageManager::OrderResult Res = PM.DoInstall(progress);
       delete progress;
@@ -117,14 +116,14 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
       return false;
 
    // Create the download object
-   pkgAcquire Fetcher;
-   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));   
+   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
+   pkgAcquire Fetcher(&Stat);
    if (_config->FindB("APT::Get::Print-URIs", false) == true)
    {
       // force a hashsum for compatibility reasons
       _config->CndSet("Acquire::ForceHash", "md5sum");
    }
-   else if (Fetcher.Setup(&Stat, _config->FindDir("Dir::Cache::Archives")) == false)
+   else if (Fetcher.GetLock(_config->FindDir("Dir::Cache::Archives")) == false)
       return false;
 
    // Read the source list
@@ -175,33 +174,9 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
    if (_error->PendingError() == true)
       return false;
 
-   /* Check for enough free space, but only if we are actually going to
-      download */
-   if (_config->FindB("APT::Get::Print-URIs") == false &&
-       _config->FindB("APT::Get::Download",true) == true)
-   {
-      struct statvfs Buf;
-      std::string OutputDir = _config->FindDir("Dir::Cache::Archives");
-      if (statvfs(OutputDir.c_str(),&Buf) != 0) {
-        if (errno == EOVERFLOW)
-           return _error->WarningE("statvfs",_("Couldn't determine free space in %s"),
-                                OutputDir.c_str());
-        else
-           return _error->Errno("statvfs",_("Couldn't determine free space in %s"),
-                                OutputDir.c_str());
-      } else if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize)
-      {
-         struct statfs Stat;
-         if (statfs(OutputDir.c_str(),&Stat) != 0
-#if HAVE_STRUCT_STATFS_F_TYPE
-             || unsigned(Stat.f_type) != RAMFS_MAGIC
-#endif
-             )
-            return _error->Error(_("You don't have enough free space in %s."),
-                OutputDir.c_str());
-      }
-   }
-   
+   if (CheckFreeSpaceBeforeDownload(_config->FindDir("Dir::Cache::Archives"), (FetchBytes - FetchPBytes)) == false)
+      return false;
+
    // Fail safe check
    if (_config->FindI("quiet",0) >= 2 ||
        _config->FindB("APT::Get::Assume-Yes",false) == true)
@@ -331,8 +306,8 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask, bool Safety)
       }
 
       _system->UnLock();
-      
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR >= 13)
+
+#if APT_PKG_ABI >= 413
       APT::Progress::PackageManager *progress = APT::Progress::PackageManagerProgressFactory();
       pkgPackageManager::OrderResult Res = PM->DoInstall(progress);
       delete progress;
@@ -558,9 +533,9 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
 
    std::list<APT::VersionSet::Modifier> mods;
    mods.push_back(APT::VersionSet::Modifier(MOD_INSTALL, "+",
-               APT::VersionSet::Modifier::POSTFIX, APT::VersionSet::CANDIDATE));
+               APT::VersionSet::Modifier::POSTFIX, APT::CacheSetHelper::CANDIDATE));
    mods.push_back(APT::VersionSet::Modifier(MOD_REMOVE, "-",
-               APT::VersionSet::Modifier::POSTFIX, APT::VersionSet::NEWEST));
+               APT::VersionSet::Modifier::POSTFIX, APT::CacheSetHelper::NEWEST));
    CacheSetHelperAPTGet helper(c0out);
    verset = APT::VersionSet::GroupedFromCommandLine(Cache,
                CmdL.FileList + 1, mods, fallback, helper);
@@ -617,15 +592,14 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
       if (Fix != NULL)
       {
         // Call the scored problem resolver
+        OpTextProgress Progress(*_config);
+        bool const distUpgradeMode = strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0;
+
         bool resolver_fail = false;
-        if (UpgradeMode == 0)
-        {
-           if (strcmp(CmdL.FileList[0], "dist-upgrade") == 0 || strcmp(CmdL.FileList[0], "full-upgrade") == 0)
-              resolver_fail = APT::Upgrade::Upgrade(Cache, 0);
-           else
-              resolver_fail = Fix->Resolve(true);
-        } else
-           resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode);
+        if (distUpgradeMode == true || UpgradeMode != APT::Upgrade::ALLOW_EVERYTHING)
+           resolver_fail = APT::Upgrade::Upgrade(Cache, UpgradeMode, &Progress);
+        else
+           resolver_fail = Fix->Resolve(true, &Progress);
 
         if (resolver_fail == false && Cache->BrokenCount() == 0)
            return false;
@@ -680,10 +654,34 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
 bool DoInstall(CommandLine &CmdL)
 {
    CacheFile Cache;
+   // first check for local pkgs and add them to the cache
+   for (const char **I = CmdL.FileList; *I != 0; I++)
+   {
+      if(FileExists(*I))
+      {
+         // FIXME: make this more elegant
+         std::string TypeStr = flExtension(*I) + "-file";
+         pkgSourceList::Type *Type = pkgSourceList::Type::GetType(TypeStr.c_str());
+         if(Type != 0)
+         {
+            std::vector<metaIndex *> List;
+            std::map<std::string, std::string> Options;
+            if(Type->CreateItem(List, *I, "", "", Options))
+            {
+               // we have our own CacheFile that gives us a SourceList
+               // with superpowerz
+               SourceList *sources = (SourceList*)Cache.GetSourceList();
+               sources->AddMetaIndex(List[0]);
+            }
+         }
+      }
+   }
+
+   // then open the cache
    if (Cache.OpenForInstall() == false || 
        Cache.CheckDeps(CmdL.FileSize() != 1) == false)
       return false;
-
+   
    std::map<unsigned short, APT::VersionSet> verset;
 
    if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset, 0))
index 8daa4a7769e2e0c9939bf1476cfdcdd06cff1e1b..62276fbff0bb94204a0373bbe1d0261ee1ba0569 100644 (file)
@@ -16,8 +16,6 @@ class CacheFile;
 class CommandLine;
 class pkgProblemResolver;
 
-#define RAMFS_MAGIC     0x858458f6
-
 APT_PUBLIC bool DoInstall(CommandLine &Cmd);
 
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
index 5363486406d080856a12769c031aa576b23cb7cb..aa3a2c24baf88483139ba1a5b2e849ad33c2fa96 100644 (file)
@@ -37,28 +37,20 @@ struct PackageSortAlphabetic                                                /*{{{*/
        return (l_name < r_name);
     }
 };
-                                                                       /*}}}*/
-class PackageNameMatcher : public Matcher                              /*{{{*/
+
+class PackageNameMatcher : public Matcher
 {
-#ifdef PACKAGE_MATCHER_ABI_COMPAT
-#define PackageMatcher PackageNameMatchesFnmatch
-#endif
   public:
    PackageNameMatcher(const char **patterns)
    {
       for(int i=0; patterns[i] != NULL; ++i)
       {
          std::string pattern = patterns[i];
-#ifdef PACKAGE_MATCHER_ABI_COMPAT
-            APT::CacheFilter::PackageNameMatchesFnmatch *cachefilter = NULL;
-            cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern);
-#else
          APT::CacheFilter::PackageMatcher *cachefilter = NULL;
          if(_config->FindB("APT::Cmd::Use-Regexp", false) == true)
             cachefilter = new APT::CacheFilter::PackageNameMatchesRegEx(pattern);
          else
             cachefilter = new APT::CacheFilter::PackageNameMatchesFnmatch(pattern);
-#endif
          filters.push_back(cachefilter);
       }
    }
index fc76a05bc7a35f93ff4a45057adf2bb176997157..4e18030ab50c3659c4bd39234afb88e789748c47 100644 (file)
@@ -52,14 +52,14 @@ static void SigWinch(int)
 #endif
 }
                                                                        /*}}}*/
-bool InitOutput()                                                      /*{{{*/
+bool InitOutput(std::basic_streambuf<char> * const out)                        /*{{{*/
 {
    if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
       _config->Set("quiet","1");
 
-   c0out.rdbuf(cout.rdbuf());
-   c1out.rdbuf(cout.rdbuf());
-   c2out.rdbuf(cout.rdbuf());
+   c0out.rdbuf(out);
+   c1out.rdbuf(out);
+   c2out.rdbuf(out);
    if (_config->FindI("quiet",0) > 0)
       c0out.rdbuf(devnull.rdbuf());
    if (_config->FindI("quiet",0) > 1)
index e0dc9bf622042010a517d0f417d8eb76595deb0f..d5b57adecb9f4d5674f905ac9a476a0a18b79779 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <fstream>
 #include <string>
+#include <iostream>
 
 // forward declaration
 class pkgCacheFile;
@@ -20,7 +21,7 @@ APT_PUBLIC extern std::ostream c2out;
 APT_PUBLIC extern std::ofstream devnull;
 APT_PUBLIC extern unsigned int ScreenWidth;
 
-APT_PUBLIC bool InitOutput();
+APT_PUBLIC bool InitOutput(std::basic_streambuf<char> * const out = std::cout.rdbuf());
 
 void ListSingleVersion(pkgCacheFile &CacheFile, pkgRecords &records,
                        pkgCache::VerIterator const &V, std::ostream &out,
index 8ae6a6dac0d84109abca2e8262a3ca2084d6bd1d..289f035a643c924880d860af2896a4828ee6abdd 100644 (file)
@@ -141,16 +141,16 @@ bool ShowPackage(CommandLine &CmdL)                                       /*{{{*/
 {
    pkgCacheFile CacheFile;
    CacheSetHelperVirtuals helper(true, GlobalError::NOTICE);
-   APT::VersionList::Version const select = _config->FindB("APT::Cache::AllVersions", false) ?
-                       APT::VersionList::ALL : APT::VersionList::CANDIDATE;
+   APT::CacheSetHelper::VerSelector const select = _config->FindB("APT::Cache::AllVersions", false) ?
+                       APT::CacheSetHelper::ALL : APT::CacheSetHelper::CANDIDATE;
    APT::VersionList const verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper);
    for (APT::VersionList::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver)
       if (DisplayRecord(CacheFile, Ver, c1out) == false)
         return false;
 
-   if (select == APT::VersionList::CANDIDATE)
+   if (select == APT::CacheSetHelper::CANDIDATE)
    {
-      APT::VersionList const verset_all = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionList::ALL, helper);
+      APT::VersionList const verset_all = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::CacheSetHelper::ALL, helper);
       int const records = verset_all.size() - verset.size();
       if (records > 0)
          _error->Notice(P_("There is %i additional record. Please use the '-a' switch to see it", "There are %i additional records. Please use the '-a' switch to see them.", records), records);
index 1cf3012ed31e4721ea729e86e1a9c0220365da88..df77ac33a91b6230a06c90a9e7b4bab78bbbb4d3 100644 (file)
@@ -47,9 +47,7 @@ bool DoUpdate(CommandLine &CmdL)
       _config->CndSet("Acquire::ForceHash", "md5sum");
 
       // get a fetcher
-      pkgAcquire Fetcher;
-      if (Fetcher.Setup(&Stat) == false)
-        return false;
+      pkgAcquire Fetcher(&Stat);
 
       // Populate it with the source selection and get all Indexes 
       // (GetAll=true)
index 31f0675767a06ee97e96c5e6853a785a63594854..d13a6af49055a051e17e2e288c0a542ead575ac4 100644 (file)
@@ -22,10 +22,8 @@ static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
    if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false)
       return false;
 
-   c0out << _("Calculating upgrade... ") << std::flush;
    if(!DoCacheManipulationFromCommandLine(CmdL, Cache, UpgradeFlags))
       return false;
-   c0out << _("Done") << std::endl;
 
    return InstallPackages(Cache,true);
 }
@@ -35,7 +33,7 @@ static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
 /* Intelligent upgrader that will install and remove packages at will */
 bool DoDistUpgrade(CommandLine &CmdL)
 {
-   return UpgradeHelper(CmdL, 0);
+   return UpgradeHelper(CmdL, APT::Upgrade::ALLOW_EVERYTHING);
 }
                                                                        /*}}}*/
 bool DoUpgrade(CommandLine &CmdL)                                      /*{{{*/
index 6b72fb393b2a3c2ff2c2b4af07f519a0382e3d28..c0fd2e8c666aa2ddb36d219eaea3ec88b71b4674 100644 (file)
 /* If there is no socklen_t, define this for the netdb shim */
 #undef NEED_SOCKLEN_T_DEFINE
 
+/* We need the getresuid() function */
+#undef HAVE_GETRESUID
+#undef HAVE_GETRESGID
+
 /* Define to the size of the filesize containing structures */
 #undef _FILE_OFFSET_BITS
 
index ac0d48a362ab81d070b54aedc875a13a1932e61c..a5024c5812924738ddd0ab598854cccd41c9264c 100644 (file)
@@ -116,7 +116,7 @@ static bool ShowUnMet(pkgCache::VerIterator const &V, bool const Important)
                  continue;
 
            // Skip conflicts and replaces
-           if (End.IsNegative() == true)
+           if (End.IsNegative() == true || End->Type == pkgCache::Dep::Replaces)
               continue;
 
            // Verify the or group
@@ -133,7 +133,7 @@ static bool ShowUnMet(pkgCache::VerIterator const &V, bool const Important)
                  break;
               }
               delete [] VList;
-              
+
               if (Start == End)
                  break;
               ++Start;
@@ -191,7 +191,7 @@ static bool UnMet(CommandLine &CmdL)
    {
       CacheSetHelperVirtuals helper(true, GlobalError::NOTICE);
       APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1,
-                               APT::VersionList::CANDIDATE, helper);
+                               APT::CacheSetHelper::CANDIDATE, helper);
       for (APT::VersionList::iterator V = verset.begin(); V != verset.end(); ++V)
         if (ShowUnMet(V, Important) == false)
            return false;
@@ -264,6 +264,49 @@ static bool DumpPackage(CommandLine &CmdL)
    return true;
 }
                                                                        /*}}}*/
+// ShowHashTableStats - Show stats about a hashtable                   /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+static map_pointer_t PackageNext(pkgCache::Package const * const P) { return P->NextPackage; }
+static map_pointer_t GroupNext(pkgCache::Group const * const G) { return G->Next; }
+template<class T>
+static void ShowHashTableStats(std::string Type,
+                               T *StartP,
+                               map_pointer_t *Hashtable,
+                               unsigned long Size,
+                              map_pointer_t(*Next)(T const * const))
+{
+   // hashtable stats for the HashTable
+   unsigned long NumBuckets = Size;
+   unsigned long UsedBuckets = 0;
+   unsigned long UnusedBuckets = 0;
+   unsigned long LongestBucket = 0;
+   unsigned long ShortestBucket = NumBuckets;
+   unsigned long Entries = 0;
+   for (unsigned int i=0; i < NumBuckets; ++i)
+   {
+      T *P = StartP + Hashtable[i];
+      if(P == 0 || P == StartP)
+      {
+         ++UnusedBuckets;
+         continue;
+      }
+      ++UsedBuckets;
+      unsigned long ThisBucketSize = 0;
+      for (; P != StartP; P = StartP + Next(P))
+         ++ThisBucketSize;
+      Entries += ThisBucketSize;
+      LongestBucket = std::max(ThisBucketSize, LongestBucket);
+      ShortestBucket = std::min(ThisBucketSize, ShortestBucket);
+   }
+   cout << "Total buckets in " << Type << ": " << NumBuckets << std::endl;
+   cout << "  Unused: " << UnusedBuckets << std::endl;
+   cout << "  Used: " << UsedBuckets  << std::endl;
+   cout << "  Average entries: " << Entries/(double)NumBuckets << std::endl;
+   cout << "  Longest: " << LongestBucket << std::endl;
+   cout << "  Shortest: " << ShortestBucket << std::endl;
+}
+                                                                       /*}}}*/
 // Stats - Dump some nice statistics                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -335,45 +378,86 @@ static bool Stats(CommandLine &)
       SizeToStr(Cache->Head().DescFileCount*Cache->Head().DescFileSz) << ')' << endl;
    cout << _("Total Provides mappings: ") << Cache->Head().ProvidesCount << " (" <<
       SizeToStr(Cache->Head().ProvidesCount*Cache->Head().ProvidesSz) << ')' << endl;
-   
-   // String list stats
-   unsigned long Size = 0;
-   unsigned long Count = 0;
-   for (pkgCache::StringItem *I = Cache->StringItemP + Cache->Head().StringList;
-        I!= Cache->StringItemP; I = Cache->StringItemP + I->NextItem)
-   {
-      Count++;
-      Size += strlen(Cache->StrP + I->String) + 1;
-   }
-   cout << _("Total globbed strings: ") << Count << " (" << SizeToStr(Size) << ')' << endl;
 
-   unsigned long DepVerSize = 0;
+   // String list stats
+   std::set<map_stringitem_t> stritems;
+   for (pkgCache::GrpIterator G = Cache->GrpBegin(); G.end() == false; ++G)
+      stritems.insert(G->Name);
    for (pkgCache::PkgIterator P = Cache->PkgBegin(); P.end() == false; ++P)
    {
+      stritems.insert(P->Arch);
       for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
       {
+        if (V->VerStr != 0)
+           stritems.insert(V->VerStr);
+        if (V->Section != 0)
+           stritems.insert(V->Section);
+#if APT_PKG_ABI >= 413
+        stritems.insert(V->SourcePkgName);
+        stritems.insert(V->SourceVerStr);
+#endif
         for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; ++D)
         {
            if (D->Version != 0)
-              DepVerSize += strlen(D.TargetVer()) + 1;
+              stritems.insert(D->Version);
+        }
+        for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; ++D)
+        {
+           stritems.insert(D->md5sum);
+           stritems.insert(D->language_code);
         }
       }
+      for (pkgCache::PrvIterator Prv = P.ProvidesList(); Prv.end() == false; ++Prv)
+      {
+        if (Prv->ProvideVersion != 0)
+           stritems.insert(Prv->ProvideVersion);
+      }
    }
-   cout << _("Total dependency version space: ") << SizeToStr(DepVerSize) << endl;
-   
+   for (pkgCache::PkgFileIterator F = Cache->FileBegin(); F != Cache->FileEnd(); ++F)
+   {
+      stritems.insert(F->FileName);
+      stritems.insert(F->Archive);
+      stritems.insert(F->Codename);
+      stritems.insert(F->Component);
+      stritems.insert(F->Version);
+      stritems.insert(F->Origin);
+      stritems.insert(F->Label);
+      stritems.insert(F->Architecture);
+      stritems.insert(F->Site);
+      stritems.insert(F->IndexType);
+   }
+   unsigned long Size = 0;
+   for (std::set<map_stringitem_t>::const_iterator i = stritems.begin(); i != stritems.end(); ++i)
+      Size += strlen(Cache->StrP + *i) + 1;
+
+   cout << _("Total globbed strings: ") << stritems.size() << " (" << SizeToStr(Size) << ')' << endl;
+   stritems.clear();
+
    unsigned long Slack = 0;
    for (int I = 0; I != 7; I++)
       Slack += Cache->Head().Pools[I].ItemSize*Cache->Head().Pools[I].Count;
    cout << _("Total slack space: ") << SizeToStr(Slack) << endl;
-   
+
    unsigned long Total = 0;
-   Total = Slack + Size + Cache->Head().DependsCount*Cache->Head().DependencySz + 
-           Cache->Head().VersionCount*Cache->Head().VersionSz +
-           Cache->Head().PackageCount*Cache->Head().PackageSz + 
-           Cache->Head().VerFileCount*Cache->Head().VerFileSz +
-           Cache->Head().ProvidesCount*Cache->Head().ProvidesSz;
+#define APT_CACHESIZE(X,Y) (Cache->Head().X * Cache->Head().Y)
+   Total = Slack + Size +
+      APT_CACHESIZE(GroupCount, GroupSz) +
+      APT_CACHESIZE(PackageCount, PackageSz) +
+      APT_CACHESIZE(VersionCount, VersionSz) +
+      APT_CACHESIZE(DescriptionCount, DescriptionSz) +
+      APT_CACHESIZE(DependsCount, DependencySz) +
+      APT_CACHESIZE(PackageFileCount, PackageFileSz) +
+      APT_CACHESIZE(VerFileCount, VerFileSz) +
+      APT_CACHESIZE(DescFileCount, DescFileSz) +
+      APT_CACHESIZE(ProvidesCount, ProvidesSz) +
+      (2 * Cache->Head().GetHashTableSize() * sizeof(map_id_t));
    cout << _("Total space accounted for: ") << SizeToStr(Total) << endl;
-   
+#undef APT_CACHESIZE
+
+   // hashtable stats
+   ShowHashTableStats<pkgCache::Package>("PkgHashTable", Cache->PkgP, Cache->Head().PkgHashTableP(), Cache->Head().GetHashTableSize(), PackageNext);
+   ShowHashTableStats<pkgCache::Group>("GrpHashTable", Cache->GrpP, Cache->Head().GrpHashTableP(), Cache->Head().GetHashTableSize(), GroupNext);
+
    return true;
 }
                                                                        /*}}}*/
@@ -579,7 +663,7 @@ static bool ShowDepends(CommandLine &CmdL, bool const RevDepends)
       return false;
 
    CacheSetHelperVirtuals helper(false);
-   APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper);
+   APT::VersionList verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, APT::CacheSetHelper::CANDIDATE, helper);
    if (verset.empty() == true && helper.virtualPkgs.empty() == true)
       return _error->Error(_("No packages found"));
    std::vector<bool> Shown(Cache->Head().PackageCount);
@@ -647,7 +731,7 @@ static bool ShowDepends(CommandLine &CmdL, bool const RevDepends)
                if (Recurse == true && Shown[Trg->ID] == false)
                {
                  Shown[Trg->ID] = true;
-                 verset.insert(APT::VersionSet::FromPackage(CacheFile, Trg, APT::VersionSet::CANDIDATE, helper));
+                 verset.insert(APT::VersionSet::FromPackage(CacheFile, Trg, APT::CacheSetHelper::CANDIDATE, helper));
                }
 
              }
@@ -666,7 +750,7 @@ static bool ShowDepends(CommandLine &CmdL, bool const RevDepends)
                if (Recurse == true && Shown[V.ParentPkg()->ID] == false)
                {
                  Shown[V.ParentPkg()->ID] = true;
-                 verset.insert(APT::VersionSet::FromPackage(CacheFile, V.ParentPkg(), APT::VersionSet::CANDIDATE, helper));
+                 verset.insert(APT::VersionSet::FromPackage(CacheFile, V.ParentPkg(), APT::CacheSetHelper::CANDIDATE, helper));
                }
            }
 
@@ -761,9 +845,9 @@ static bool XVcg(CommandLine &CmdL)
 
    // Load the list of packages from the command line into the show list
    APT::CacheSetHelper helper(true, GlobalError::NOTICE);
-   std::list<APT::PackageSet::Modifier> mods;
-   mods.push_back(APT::PackageSet::Modifier(0, ",", APT::PackageSet::Modifier::POSTFIX));
-   mods.push_back(APT::PackageSet::Modifier(1, "^", APT::PackageSet::Modifier::POSTFIX));
+   std::list<APT::CacheSetHelper::PkgModifier> mods;
+   mods.push_back(APT::CacheSetHelper::PkgModifier(0, ",", APT::PackageSet::Modifier::POSTFIX));
+   mods.push_back(APT::CacheSetHelper::PkgModifier(1, "^", APT::PackageSet::Modifier::POSTFIX));
    std::map<unsigned short, APT::PackageSet> pkgsets =
                APT::PackageSet::GroupedFromCommandLine(CacheFile, CmdL.FileList + 1, mods, 0, helper);
 
@@ -973,9 +1057,9 @@ static bool Dotty(CommandLine &CmdL)
 
    // Load the list of packages from the command line into the show list
    APT::CacheSetHelper helper(true, GlobalError::NOTICE);
-   std::list<APT::PackageSet::Modifier> mods;
-   mods.push_back(APT::PackageSet::Modifier(0, ",", APT::PackageSet::Modifier::POSTFIX));
-   mods.push_back(APT::PackageSet::Modifier(1, "^", APT::PackageSet::Modifier::POSTFIX));
+   std::list<APT::CacheSetHelper::PkgModifier> mods;
+   mods.push_back(APT::CacheSetHelper::PkgModifier(0, ",", APT::PackageSet::Modifier::POSTFIX));
+   mods.push_back(APT::CacheSetHelper::PkgModifier(1, "^", APT::PackageSet::Modifier::POSTFIX));
    std::map<unsigned short, APT::PackageSet> pkgsets =
                APT::PackageSet::GroupedFromCommandLine(CacheFile, CmdL.FileList + 1, mods, 0, helper);
 
@@ -1231,7 +1315,7 @@ static bool DisplayRecord(pkgCacheFile &CacheFile, pkgCache::VerIterator V)
 struct ExDescFile
 {
    pkgCache::DescFile *Df;
-   map_ptrloc ID;
+   map_id_t ID;
 };
 
 // Search - Perform a search                                           /*{{{*/
@@ -1429,8 +1513,8 @@ static bool ShowPackage(CommandLine &CmdL)
 {
    pkgCacheFile CacheFile;
    CacheSetHelperVirtuals helper(true, GlobalError::NOTICE);
-   APT::VersionList::Version const select = _config->FindB("APT::Cache::AllVersions", true) ?
-                       APT::VersionList::ALL : APT::VersionList::CANDIDATE;
+   APT::CacheSetHelper::VerSelector const select = _config->FindB("APT::Cache::AllVersions", true) ?
+                       APT::CacheSetHelper::ALL : APT::CacheSetHelper::CANDIDATE;
    APT::VersionList const verset = APT::VersionList::FromCommandLine(CacheFile, CmdL.FileList + 1, select, helper);
    for (APT::VersionList::const_iterator Ver = verset.begin(); Ver != verset.end(); ++Ver)
       if (DisplayRecord(CacheFile, Ver) == false)
@@ -1812,26 +1896,10 @@ int main(int argc,const char *argv[])                                   /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-   
-   // Deal with stdout not being a tty
-   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
-      _config->Set("quiet","1");
+   InitOutput();
 
    if (_config->Exists("APT::Cache::Generate") == true)
       _config->Set("pkgCacheFile::Generate", _config->FindB("APT::Cache::Generate", true));
index 53efe65b89afcfeac2d5abbab55c291aaf261b67..327039e000ddfc7886f835eb15f665b9377a49cb 100644 (file)
@@ -31,6 +31,7 @@
 #include <unistd.h>
 
 #include <apt-private/private-cmndline.h>
+#include <apt-private/private-output.h>
 
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -249,24 +250,11 @@ int main(int argc,const char *argv[])                                     /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
-   // See if the help should be shown
-   if (_config->FindB("help") == true || _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-      return ShowHelp(CmdL);
+   InitOutput();
 
-   // Deal with stdout not being a tty
-   if (isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
-      _config->Set("quiet","1");
-   
    // Match the operation
    bool returned = CmdL.DispatchArg(Cmds);
 
index 40ba468eb3eb5e7ee03d721f59b7064db4bc0494..e0b8a624eeb7efdea1c598f58a8bc398bffe5bbe 100644 (file)
@@ -115,19 +115,8 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       CmdL.FileSize() == 0)
-      return ShowHelp(CmdL);
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    std::vector<std::string> const langs = APT::Configuration::getLanguages(true);
    _config->Clear("Acquire::Languages");
index 04e13bde902decdb722e6f7826853fd1c38e3ed5..f765234c5f8b61d5fc2a729e76d39699b277e047 100644 (file)
@@ -40,6 +40,8 @@ int main(int argc,const char *argv[])                                 /*{{{*/
                ShowHelp();
                return 0;
        }
+        // we really don't need anything
+        DropPrivileges();
 
        FILE* input = fdopen(STDIN_FILENO, "r");
        FILE* output = fopen("/tmp/dump.edsp", "w");
index e4428e05154e26ad2b4cef7d36a0423965702242..5211ee027e9af25d4374fd3d1939e2d9b6f18383 100644 (file)
@@ -33,6 +33,8 @@
 #include <apt-pkg/dirstream.h>
 #include <apt-pkg/mmap.h>
 
+#include <apt-private/private-cmndline.h>
+
 #include <iostream>
 #include <stdio.h>
 #include <string.h>
@@ -52,7 +54,7 @@ pkgCache *DebFile::Cache = 0;
 // ---------------------------------------------------------------------
 /* */
 DebFile::DebFile(const char *debfile)
-       : File(debfile, FileFd::ReadOnly), Size(0), Control(NULL), ControlLen(0),
+       : File(debfile, FileFd::ReadOnly), Control(NULL), ControlLen(0),
          DepOp(0), PreDepOp(0), Config(0), Template(0), Which(None)
 {
 }
@@ -103,10 +105,12 @@ bool DebFile::DoItem(Item &I, int &Fd)
        if (strcmp(I.Name, "control") == 0)
        {
                delete [] Control;
-               Control = new char[I.Size+1];
-               Control[I.Size] = 0;
+               Control = new char[I.Size+3];
+               Control[I.Size] = '\n';
+               Control[I.Size + 1] = '\n';
+               Control[I.Size + 2] = '\0';
                Which = IsControl;
-               ControlLen = I.Size;
+               ControlLen = I.Size + 3;
                // make it call the Process method below. this is so evil
                Fd = -2;
        }
@@ -138,7 +142,7 @@ bool DebFile::DoItem(Item &I, int &Fd)
 // ---------------------------------------------------------------------
 /* */
 bool DebFile::Process(Item &/*I*/, const unsigned char *data,
-               unsigned long size, unsigned long pos)
+               unsigned long long size, unsigned long long pos)
 {
        switch (Which)
        {
@@ -162,9 +166,10 @@ bool DebFile::Process(Item &/*I*/, const unsigned char *data,
 bool DebFile::ParseInfo()
 {
        if (Control == NULL) return false;
-       
+
        pkgTagSection Section;
-       Section.Scan(Control, ControlLen);
+       if (Section.Scan(Control, ControlLen) == false)
+               return false;
 
        Package = Section.FindS("Package");
        Version = GetInstalledVer(Package);
@@ -212,15 +217,15 @@ bool DebFile::ParseInfo()
 // ShowHelp - show a short help text                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-static int ShowHelp(void)
+static bool ShowHelp(CommandLine &)
 {
-       ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
+       ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
            COMMON_ARCH,__DATE__,__TIME__);
 
-       if (_config->FindB("version") == true) 
-               return 0;
+       if (_config->FindB("version") == true)
+               return true;
 
-       cout << 
+       cout <<
                _("Usage: apt-extracttemplates file1 [file2 ...]\n"
                "\n"
                "apt-extracttemplates is a tool to extract config and template info\n"
@@ -231,7 +236,7 @@ static int ShowHelp(void)
                "  -t   Set the temp dir\n"
                "  -c=? Read this configuration file\n"
                "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n");
-       return 0;
+       return true;
 }
                                                                        /*}}}*/
 // WriteFile - write the contents of the passed string to a file       /*{{{*/
@@ -353,20 +358,10 @@ int main(int argc, const char **argv)                                     /*{{{*/
        textdomain(PACKAGE);
 
        // Parse the command line and initialize the package library
-       CommandLine CmdL(Args,_config);
-       if (pkgInitConfig(*_config) == false ||
-           CmdL.Parse(argc,argv) == false ||
-           pkgInitSystem(*_config,_system) == false)
-       {
-               _error->DumpErrors();
-               return 100;
-       }
-       
-       // See if the help should be shown
-       if (_config->FindB("help") == true ||
-           CmdL.FileSize() == 0)
-               return ShowHelp();
-       
+       CommandLine::Dispatch Cmds[] = {{NULL, NULL}};
+       CommandLine CmdL;
+       ParseCommandLine(CmdL, Cmds, Args, &_config, &_system, argc, argv, ShowHelp);
+
        Go(CmdL);
 
        // Print any errors or warnings found during operation
index 9cc3f5f258be11451c4492a60ad9ccf1891abd05..829cdae755c39b5ca8eb5c1d6542c6f3589310e0 100644 (file)
@@ -20,7 +20,6 @@ class pkgCache;
 class DebFile : public pkgDirStream
 {
        FileFd File;
-       unsigned long Size;
        char *Control;
        unsigned long ControlLen;
        
@@ -29,7 +28,7 @@ public:
        ~DebFile();
        bool DoItem(Item &I, int &fd);
        bool Process(pkgDirStream::Item &I, const unsigned char *data, 
-               unsigned long size, unsigned long pos);
+               unsigned long long size, unsigned long long pos);
 
        bool Go();
        bool ParseInfo();
index a2853771227f9924ae36bcfdd334b101c982b475..33bbdd86189fa5305b09d79bf45bff1e7e67e6a8 100644 (file)
 #include <string.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
-#include <sys/statfs.h>
-#include <sys/statvfs.h>
 #include <sys/wait.h>
 #include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
+
 #include <algorithm>
 #include <fstream>
 #include <iostream>
@@ -135,28 +136,6 @@ static bool TryToInstallBuildDep(pkgCache::PkgIterator Pkg,pkgCacheFile &Cache,
    return true;
 }
                                                                        /*}}}*/
-
-
-// helper that can go wit hthe next ABI break
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
-static std::string MetaIndexFileNameOnDisk(metaIndex *metaindex)
-{
-   // FIXME: this cast is the horror, the horror
-   debReleaseIndex *r = (debReleaseIndex*)metaindex;
-
-   // see if we have a InRelease file
-   std::string PathInRelease =  r->MetaIndexFile("InRelease");
-   if (FileExists(PathInRelease))
-      return PathInRelease;
-
-   // and if not return the normal one
-   if (FileExists(PathInRelease))
-      return r->MetaIndexFile("Release");
-
-   return "";
-}
-#endif
-
 // GetReleaseForSourceRecord - Return Suite for the given srcrecord    /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -175,12 +154,8 @@ static std::string GetReleaseForSourceRecord(pkgSourceList *SrcList,
       {
          if (&CurrentIndexFile == (*IF))
          {
-#if (APT_PKG_MAJOR >= 4 && APT_PKG_MINOR < 13)
-            std::string path = MetaIndexFileNameOnDisk(*S);
-#else
-            std::string path = (*S)->LocalFileName();
-#endif
-            if (path != "") 
+            std::string const path = (*S)->LocalFileName();
+            if (path != "")
             {
                indexRecords records;
                records.Load(path);
@@ -195,7 +170,11 @@ static std::string GetReleaseForSourceRecord(pkgSourceList *SrcList,
 // FindSrc - Find a source record                                      /*{{{*/
 // ---------------------------------------------------------------------
 /* */
+#if APT_PKG_ABI >= 413
+static pkgSrcRecords::Parser *FindSrc(const char *Name,
+#else
 static pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
+#endif
                               pkgSrcRecords &SrcRecs,string &Src,
                               CacheFile &CacheFile)
 {
@@ -303,16 +282,21 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
                  (VF.File().Archive() != 0 && VF.File().Archive() == RelTag) ||
                  (VF.File().Codename() != 0 && VF.File().Codename() == RelTag)) 
               {
+                 // the Version we have is possibly fuzzy or includes binUploads,
+                 // so we use the Version of the SourcePkg (empty if same as package)
+#if APT_PKG_ABI >= 413
+                 Src = Ver.SourcePkgName();
+                 VerTag = Ver.SourceVerStr();
+#else
                  pkgRecords::Parser &Parse = Recs.Lookup(VF);
                  Src = Parse.SourcePkg();
                  // no SourcePkg name, so it is the "binary" name
                  if (Src.empty() == true)
                     Src = TmpSrc;
-                 // the Version we have is possibly fuzzy or includes binUploads,
-                 // so we use the Version of the SourcePkg (empty if same as package)
                  VerTag = Parse.SourceVer();
                  if (VerTag.empty() == true)
                     VerTag = Ver.VerStr();
+#endif
                  break;
               }
            }
@@ -343,10 +327,17 @@ static pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
         pkgCache::VerIterator Ver = Cache->GetCandidateVer(Pkg);
         if (Ver.end() == false) 
         {
+#if APT_PKG_ABI >= 413
+           if (strcmp(Ver.SourcePkgName(),Ver.ParentPkg().Name()) != 0)
+              Src = Ver.SourcePkgName();
+           if (VerTag.empty() == true && strcmp(Ver.SourceVerStr(),Ver.VerStr()) != 0)
+              VerTag = Ver.SourceVerStr();
+#else
            pkgRecords::Parser &Parse = Recs.Lookup(Ver.FileList());
            Src = Parse.SourcePkg();
            if (VerTag.empty() == true)
               VerTag = Parse.SourceVer();
+#endif
         }
       }
    }
@@ -540,7 +531,7 @@ static bool DoDSelectUpgrade(CommandLine &)
    }
 
    // Now upgrade everything
-   if (pkgAllUpgrade(Cache) == false)
+   if (APT::Upgrade::Upgrade(Cache, APT::Upgrade::FORBID_REMOVE_PACKAGES | APT::Upgrade::FORBID_INSTALL_NEW_PACKAGES) == false)
    {
       ShowBroken(c1out,Cache,false);
       return _error->Error(_("Internal error, problem resolver broke stuff"));
@@ -555,30 +546,26 @@ static bool DoDSelectUpgrade(CommandLine &)
 static bool DoClean(CommandLine &)
 {
    std::string const archivedir = _config->FindDir("Dir::Cache::archives");
-   std::string const pkgcache = _config->FindFile("Dir::cache::pkgcache");
-   std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
+   std::string const listsdir = _config->FindDir("Dir::state::lists");
 
    if (_config->FindB("APT::Get::Simulate") == true)
    {
+      std::string const pkgcache = _config->FindFile("Dir::cache::pkgcache");
+      std::string const srcpkgcache = _config->FindFile("Dir::cache::srcpkgcache");
       cout << "Del " << archivedir << "* " << archivedir << "partial/*"<< endl
+          << "Del " << listsdir << "partial/*" << endl
           << "Del " << pkgcache << " " << srcpkgcache << endl;
       return true;
    }
-   
-   // Lock the archive directory
-   FileFd Lock;
-   if (_config->FindB("Debug::NoLocking",false) == false)
-   {
-      int lock_fd = GetLock(archivedir + "lock");
-      if (lock_fd < 0)
-        return _error->Error(_("Unable to lock the download directory"));
-      Lock.Fd(lock_fd);
-   }
-   
+
    pkgAcquire Fetcher;
+   Fetcher.GetLock(archivedir);
    Fetcher.Clean(archivedir);
    Fetcher.Clean(archivedir + "partial/");
 
+   Fetcher.GetLock(listsdir);
+   Fetcher.Clean(listsdir + "partial/");
+
    pkgCacheFile::RemoveCaches();
 
    return true;
@@ -632,15 +619,13 @@ static bool DoDownload(CommandLine &CmdL)
 
    APT::CacheSetHelper helper(c0out);
    APT::VersionSet verset = APT::VersionSet::FromCommandLine(Cache,
-               CmdL.FileList + 1, APT::VersionSet::CANDIDATE, helper);
+               CmdL.FileList + 1, APT::CacheSetHelper::CANDIDATE, helper);
 
    if (verset.empty() == true)
       return false;
 
    AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet", 0));
-   pkgAcquire Fetcher;
-   if (Fetcher.Setup(&Stat) == false)
-      return false;
+   pkgAcquire Fetcher(&Stat);
 
    pkgRecords Recs(Cache);
    pkgSourceList *SrcList = Cache.GetSourceList();
@@ -655,6 +640,8 @@ static bool DoDownload(CommandLine &CmdL)
         Ver != verset.end(); ++Ver, ++i)
    {
       pkgAcquire::Item *I = new pkgAcqArchive(&Fetcher, SrcList, &Recs, *Ver, storefile[i]);
+      if (storefile[i].empty())
+        continue;
       std::string const filename = cwd + flNotDir(storefile[i]);
       storefile[i].assign(filename);
       I->DestFile.assign(filename);
@@ -670,6 +657,9 @@ static bool DoDownload(CommandLine &CmdL)
       return true;
    }
 
+   // Disable drop-privs if "_apt" can not write to the target dir
+   CheckDropPrivsMustBeDisabled(Fetcher);
+
    if (_error->PendingError() == true || CheckAuth(Fetcher, false) == false)
       return false;
 
@@ -731,15 +721,16 @@ static bool DoSource(CommandLine &CmdL)
    pkgSourceList *List = Cache.GetSourceList();
    
    // Create the text record parsers
+#if APT_PKG_ABI < 413
    pkgRecords Recs(Cache);
+#endif
    pkgSrcRecords SrcRecs(*List);
    if (_error->PendingError() == true)
       return false;
 
    // Create the download object
-   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));   
-   pkgAcquire Fetcher;
-   Fetcher.SetLog(&Stat);
+   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
+   pkgAcquire Fetcher(&Stat);
 
    SPtrArray<DscFile> Dsc = new DscFile[CmdL.FileSize()];
    
@@ -760,8 +751,11 @@ static bool DoSource(CommandLine &CmdL)
    for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
    {
       string Src;
+#if APT_PKG_ABI >= 413
+      pkgSrcRecords::Parser *Last = FindSrc(*I,SrcRecs,Src,Cache);
+#else
       pkgSrcRecords::Parser *Last = FindSrc(*I,Recs,SrcRecs,Src,Cache);
-      
+#endif
       if (Last == 0) {
         return _error->Error(_("Unable to find a source package for %s"),Src.c_str());
       }
@@ -842,8 +836,7 @@ static bool DoSource(CommandLine &CmdL)
            }
 
         // see if we have a hash (Acquire::ForceHash is the only way to have none)
-        HashString const * const hs = I->Hashes.find(NULL);
-        if (hs == NULL && _config->FindB("APT::Get::AllowUnauthenticated",false) == false)
+        if (I->Hashes.usable() == false && _config->FindB("APT::Get::AllowUnauthenticated",false) == false)
         {
            ioprintf(c1out, "Skipping download of file '%s' as requested hashsum is not available for authentication\n",
                     localFile.c_str());
@@ -851,43 +844,18 @@ static bool DoSource(CommandLine &CmdL)
         }
 
         new pkgAcqFile(&Fetcher,Last->Index().ArchiveURI(I->Path),
-                       hs != NULL ? hs->toStr() : "", I->FileSize,
-                       Last->Index().SourceInfo(*Last,*I),Src);
+                       I->Hashes, I->FileSize, Last->Index().SourceInfo(*Last,*I), Src);
       }
    }
 
-   // check authentication status of the source as well
-   if (UntrustedList != "" && !AuthPrompt(UntrustedList, false))
-      return false;
-   
    // Display statistics
    unsigned long long FetchBytes = Fetcher.FetchNeeded();
    unsigned long long FetchPBytes = Fetcher.PartialPresent();
    unsigned long long DebBytes = Fetcher.TotalNeeded();
 
-   // Check for enough free space
-   struct statvfs Buf;
-   string OutputDir = ".";
-   if (statvfs(OutputDir.c_str(),&Buf) != 0) {
-      if (errno == EOVERFLOW)
-        return _error->WarningE("statvfs",_("Couldn't determine free space in %s"),
-                               OutputDir.c_str());
-      else
-        return _error->Errno("statvfs",_("Couldn't determine free space in %s"),
-                               OutputDir.c_str());
-   } else if (unsigned(Buf.f_bfree) < (FetchBytes - FetchPBytes)/Buf.f_bsize)
-     {
-       struct statfs Stat;
-       if (statfs(OutputDir.c_str(),&Stat) != 0
-#if HAVE_STRUCT_STATFS_F_TYPE
-           || unsigned(Stat.f_type) != RAMFS_MAGIC
-#endif
-           )  {
-          return _error->Error(_("You don't have enough free space in %s"),
-              OutputDir.c_str());
-       }
-     }
-   
+   if (CheckFreeSpaceBeforeDownload(".", (FetchBytes - FetchPBytes)) == false)
+      return false;
+
    // Number of bytes
    if (DebBytes != FetchBytes)
       //TRANSLATOR: The required space between number and unit is already included
@@ -906,7 +874,7 @@ static bool DoSource(CommandLine &CmdL)
         ioprintf(cout,_("Fetch source %s\n"),Dsc[I].Package.c_str());
       return true;
    }
-   
+
    // Just print out the uris an exit if the --print-uris flag was used
    if (_config->FindB("APT::Get::Print-URIs") == true)
    {
@@ -917,6 +885,13 @@ static bool DoSource(CommandLine &CmdL)
       return true;
    }
 
+   // Disable drop-privs if "_apt" can not write to the target dir
+   CheckDropPrivsMustBeDisabled(Fetcher);
+
+   // check authentication status of the source as well
+   if (UntrustedList != "" && !AuthPrompt(UntrustedList, false))
+      return false;
+
    // Run it
    bool Failed = false;
    if (AcquireRun(Fetcher, 0, &Failed, NULL) == false || Failed == true)
@@ -1039,17 +1014,13 @@ static bool DoBuildDep(CommandLine &CmdL)
    pkgSourceList *List = Cache.GetSourceList();
    
    // Create the text record parsers
+#if APT_PKG_ABI < 413
    pkgRecords Recs(Cache);
+#endif
    pkgSrcRecords SrcRecs(*List);
    if (_error->PendingError() == true)
       return false;
 
-   // Create the download object
-   AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));   
-   pkgAcquire Fetcher;
-   if (Fetcher.Setup(&Stat) == false)
-      return false;
-
    bool StripMultiArch;
    string hostArch = _config->Find("APT::Get::Host-Architecture");
    if (hostArch.empty() == false)
@@ -1066,7 +1037,39 @@ static bool DoBuildDep(CommandLine &CmdL)
    for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
    {
       string Src;
-      pkgSrcRecords::Parser *Last = FindSrc(*I,Recs,SrcRecs,Src,Cache);
+      pkgSrcRecords::Parser *Last = 0;
+
+      // an unpacked debian source tree
+      using APT::String::Startswith;
+      if ((Startswith(*I, "./") || Startswith(*I, "/")) &&
+          DirectoryExists(*I))
+      {
+         ioprintf(c1out, _("Note, using directory '%s' to get the build dependencies\n"), *I);
+         // FIXME: how can we make this more elegant?
+         std::string TypeName = "debian/control File Source Index";
+         pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(TypeName.c_str());
+         if(Type != NULL)
+            Last = Type->CreateSrcPkgParser(*I);
+      }
+      // if its a local file (e.g. .dsc) use this
+      else if (FileExists(*I))
+      {
+         ioprintf(c1out, _("Note, using file '%s' to get the build dependencies\n"), *I);
+
+         // see if we can get a parser for this pkgIndexFile type
+         string TypeName = flExtension(*I) + " File Source Index";
+         pkgIndexFile::Type *Type = pkgIndexFile::Type::GetType(TypeName.c_str());
+         if(Type != NULL)
+            Last = Type->CreateSrcPkgParser(*I);
+      } else {
+         // normal case, search the cache for the source file
+#if APT_PKG_ABI >= 413
+        Last = FindSrc(*I,SrcRecs,Src,Cache);
+#else
+        Last = FindSrc(*I,Recs,SrcRecs,Src,Cache);
+#endif
+      }
+
       if (Last == 0)
         return _error->Error(_("Unable to find a source package for %s"),Src.c_str());
             
@@ -1084,7 +1087,7 @@ static bool DoBuildDep(CommandLine &CmdL)
       }
       else if (Last->BuildDepends(BuildDeps, _config->FindB("APT::Get::Arch-Only", false), StripMultiArch) == false)
            return _error->Error(_("Unable to get build-dependency information for %s"),Src.c_str());
-   
+
       // Also ensure that build-essential packages are present
       Configuration::Item const *Opts = _config->Tree("APT::Build-Essential");
       if (Opts) 
@@ -1415,21 +1418,24 @@ static bool DoBuildDep(CommandLine &CmdL)
  * pool/ next to the deb itself)
  * Example return: "pool/main/a/apt/apt_0.8.8ubuntu3" 
  */
-static string GetChangelogPath(CacheFile &Cache, 
-                        pkgCache::PkgIterator Pkg,
+static string GetChangelogPath(CacheFile &Cache,
                         pkgCache::VerIterator Ver)
 {
-   string path;
-
    pkgRecords Recs(Cache);
    pkgRecords::Parser &rec=Recs.Lookup(Ver.FileList());
-   string srcpkg = rec.SourcePkg().empty() ? Pkg.Name() : rec.SourcePkg();
+   string path = flNotFile(rec.FileName());
+#if APT_PKG_ABI >= 413
+   path.append(Ver.SourcePkgName());
+   path.append("_");
+   path.append(StripEpoch(Ver.SourceVerStr()));
+#else
+   string srcpkg = rec.SourcePkg().empty() ? Ver.ParentPkg().Name() : rec.SourcePkg();
    string ver = Ver.VerStr();
    // if there is a source version it always wins
    if (rec.SourceVer() != "")
       ver = rec.SourceVer();
-   path = flNotFile(rec.FileName());
    path += srcpkg + "_" + StripEpoch(ver);
+#endif
    return path;
 }
                                                                        /*}}}*/
@@ -1443,7 +1449,6 @@ static string GetChangelogPath(CacheFile &Cache,
  *  http://packages.medibuntu.org/pool/non-free/m/mplayer/mplayer_1.0~rc4~try1.dsfg1-1ubuntu1+medibuntu1.changelog
  */
 static bool GuessThirdPartyChangelogUri(CacheFile &Cache, 
-                                 pkgCache::PkgIterator Pkg,
                                  pkgCache::VerIterator Ver,
                                  string &out_uri)
 {
@@ -1458,7 +1463,7 @@ static bool GuessThirdPartyChangelogUri(CacheFile &Cache,
       return false;
 
    // get archive uri for the binary deb
-   string path_without_dot_changelog = GetChangelogPath(Cache, Pkg, Ver);
+   string path_without_dot_changelog = GetChangelogPath(Cache, Ver);
    out_uri = index->ArchiveURI(path_without_dot_changelog + ".changelog");
 
    // now strip away the filename and add srcpkg_srcver.changelog
@@ -1476,44 +1481,45 @@ static bool DownloadChangelog(CacheFile &CacheFile, pkgAcquire &Fetcher,
  * GuessThirdPartyChangelogUri for details how)
  */
 {
-   string path;
-   string descr;
-   string server;
-   string changelog_uri;
-
-   // data structures we need
-   pkgCache::PkgIterator Pkg = Ver.ParentPkg();
-
    // make the server root configurable
-   server = _config->Find("Apt::Changelogs::Server",
+   string const server = _config->Find("Apt::Changelogs::Server",
                           "http://packages.debian.org/changelogs");
-   path = GetChangelogPath(CacheFile, Pkg, Ver);
-   strprintf(changelog_uri, "%s/%s/changelog", server.c_str(), path.c_str());
+   string const path = GetChangelogPath(CacheFile, Ver);
+   string changelog_uri;
+   if (APT::String::Endswith(server, "/") == true)
+      strprintf(changelog_uri, "%s%s/changelog", server.c_str(), path.c_str());
+   else
+      strprintf(changelog_uri, "%s/%s/changelog", server.c_str(), path.c_str());
    if (_config->FindB("APT::Get::Print-URIs", false) == true)
    {
       std::cout << '\'' << changelog_uri << '\'' << std::endl;
       return true;
    }
+   pkgCache::PkgIterator const Pkg = Ver.ParentPkg();
 
+   string descr;
    strprintf(descr, _("Changelog for %s (%s)"), Pkg.Name(), changelog_uri.c_str());
    // queue it
-   new pkgAcqFile(&Fetcher, changelog_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile);
+   pkgAcquire::Item const * itm = new pkgAcqFile(&Fetcher, changelog_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile);
+
+   // Disable drop-privs if "_apt" can not write to the target dir
+   CheckDropPrivsMustBeDisabled(Fetcher);
 
    // try downloading it, if that fails, try third-party-changelogs location
    // FIXME: Fetcher.Run() is "Continue" even if I get a 404?!?
    Fetcher.Run();
-   if (!FileExists(targetfile))
+   if (itm->Status != pkgAcquire::Item::StatDone)
    {
       string third_party_uri;
-      if (GuessThirdPartyChangelogUri(CacheFile, Pkg, Ver, third_party_uri))
+      if (GuessThirdPartyChangelogUri(CacheFile, Ver, third_party_uri))
       {
          strprintf(descr, _("Changelog for %s (%s)"), Pkg.Name(), third_party_uri.c_str());
-         new pkgAcqFile(&Fetcher, third_party_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile);
+         itm = new pkgAcqFile(&Fetcher, third_party_uri, "", 0, descr, Pkg.Name(), "ignored", targetfile);
          Fetcher.Run();
       }
    }
 
-   if (FileExists(targetfile))
+   if (itm->Status == pkgAcquire::Item::StatDone)
       return true;
 
    // error
@@ -1530,7 +1536,7 @@ static bool DoChangelog(CommandLine &CmdL)
    
    APT::CacheSetHelper helper(c0out);
    APT::VersionList verset = APT::VersionList::FromCommandLine(Cache,
-               CmdL.FileList + 1, APT::VersionList::CANDIDATE, helper);
+               CmdL.FileList + 1, APT::CacheSetHelper::CANDIDATE, helper);
    if (verset.empty() == true)
       return false;
    pkgAcquire Fetcher;
@@ -1545,7 +1551,7 @@ static bool DoChangelog(CommandLine &CmdL)
    }
 
    AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet",0));
-   Fetcher.Setup(&Stat);
+   Fetcher.SetLog(&Stat);
 
    bool const downOnly = _config->FindB("APT::Get::Download-Only", false);
 
@@ -1559,6 +1565,19 @@ static bool DoChangelog(CommandLine &CmdL)
       tmpdir = mkdtemp(tmpname);
       if (tmpdir == NULL)
         return _error->Errno("mkdtemp", "mkdtemp failed");
+
+      std::string const SandboxUser = _config->Find("APT::Sandbox::User");
+      if (getuid() == 0 && SandboxUser.empty() == false) // if we aren't root, we can't chown, so don't try it
+      {
+        struct passwd const * const pw = getpwnam(SandboxUser.c_str());
+        struct group const * const gr = getgrnam("root");
+        if (pw != NULL && gr != NULL)
+        {
+           // chown the tmp dir directory we use to the sandbox user
+           if(chown(tmpdir, pw->pw_uid, gr->gr_gid) != 0)
+              _error->WarningE("DoChangelog", "chown to %s:%s of directory %s failed", SandboxUser.c_str(), "root", tmpdir);
+        }
+      }
    }
 
    for (APT::VersionList::const_iterator Ver = verset.begin(); 
@@ -1574,7 +1593,7 @@ static bool DoChangelog(CommandLine &CmdL)
       {
          DisplayFileInPager(changelogfile);
          // cleanup temp file
-         unlink(changelogfile.c_str());
+        unlink(changelogfile.c_str());
       }
    }
    // clenaup tmp dir
@@ -1709,26 +1728,8 @@ int main(int argc,const char *argv[])                                    /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      if (_config->FindB("version") == true)
-        ShowHelp(CmdL);
-        
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    // see if we are in simulate mode
    CheckSimulateMode(CmdL);
index 63f70983cc9846dc9d8428fa0961973964d5afbf..a05ae90a28c1449906d83293ddf83575e10ba9c9 100644 (file)
@@ -48,9 +48,8 @@ static bool DoDownloadFile(CommandLine &CmdL)
    if (CmdL.FileSize() <= 2)
       return _error->Error(_("Must specify at least one pair url/filename"));
 
-   pkgAcquire Fetcher;
    AcqTextStatus Stat(ScreenWidth, _config->FindI("quiet",0));
-   Fetcher.Setup(&Stat);
+   pkgAcquire Fetcher(&Stat);
 
    size_t fileind = 0;
    std::vector<std::string> targetfiles;
@@ -68,6 +67,9 @@ static bool DoDownloadFile(CommandLine &CmdL)
       fileind += 3;
    }
 
+   // Disable drop-privs if "_apt" can not write to the target dir
+   CheckDropPrivsMustBeDisabled(Fetcher);
+
    bool Failed = false;
    if (AcquireRun(Fetcher, 0, &Failed, NULL) == false || Failed == true)
       return _error->Error(_("Download Failed"));
@@ -117,25 +119,8 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      if (_config->FindB("version") == true)
-        ShowHelp(CmdL);
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    InitOutput();
 
index 5fda7b6a0af4d393626967a4ecec12e5cd20b7d8..4fabeb02fc683f5a3d70d1c477dc8b3f5f041c91 100644 (file)
@@ -24,7 +24,9 @@
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+
 #include <apt-private/private-output.h>
+#include <apt-private/private-cmndline.h>
 
 #include <string.h>
 #include <iostream>
@@ -76,19 +78,11 @@ int main(int argc,const char *argv[])                                       /*{{{*/
                {'o',"option",0,CommandLine::ArbItem},
                {0,0,0,0}};
 
-       CommandLine CmdL(Args,_config);
-       if (pkgInitConfig(*_config) == false ||
-           CmdL.Parse(argc,argv) == false) {
-               _error->DumpErrors();
-               return 2;
-       }
+        // we really don't need anything
+        DropPrivileges();
 
-       // See if the help should be shown
-       if (_config->FindB("help") == true ||
-           _config->FindB("version") == true) {
-               ShowHelp(CmdL);
-               return 1;
-       }
+       CommandLine CmdL;
+       ParseCommandLine(CmdL, NULL, Args, &_config, NULL, argc, argv, ShowHelp);
 
        if (CmdL.FileList[0] != 0 && strcmp(CmdL.FileList[0], "scenario") == 0)
        {
@@ -172,10 +166,10 @@ int main(int argc,const char *argv[])                                     /*{{{*/
 
        std::string failure;
        if (upgrade == true) {
-               if (pkgAllUpgrade(CacheFile) == false)
+               if (APT::Upgrade::Upgrade(CacheFile, APT::Upgrade::FORBID_REMOVE_PACKAGES | APT::Upgrade::FORBID_INSTALL_NEW_PACKAGES) == false)
                        failure = "ERR_UNSOLVABLE_UPGRADE";
        } else if (distUpgrade == true) {
-               if (pkgDistUpgrade(CacheFile) == false)
+               if (APT::Upgrade::Upgrade(CacheFile, APT::Upgrade::ALLOW_EVERYTHING) == false)
                        failure = "ERR_UNSOLVABLE_DIST_UPGRADE";
        } else if (Fix.Resolve() == false)
                failure = "ERR_UNSOLVABLE";
index b4e0710006882c72c968dd604f22a6efa4001005..cf0b9a96f75960081d8a8bc2afb8dc5d08a2bca0 100644 (file)
@@ -3,29 +3,6 @@
 set -e
 unset GREP_OPTIONS
 
-GPG_CMD="gpg --ignore-time-conflict --no-options --no-default-keyring"
-
-# gpg needs (in different versions more or less) files to function correctly,
-# so we give it its own homedir and generate some valid content for it
-GPGHOMEDIR="$(mktemp -d)"
-CURRENTTRAP="${CURRENTTRAP} rm -rf '${GPGHOMEDIR}';"
-trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
-chmod 700 "$GPGHOMEDIR"
-# We don't use a secret keyring, of course, but gpg panics and
-# implodes if there isn't one available - and writeable for imports
-SECRETKEYRING="${GPGHOMEDIR}/secring.gpg"
-touch $SECRETKEYRING
-GPG_CMD="$GPG_CMD --homedir $GPGHOMEDIR"
-# create the trustdb with an (empty) dummy keyring
-# older gpgs required it, newer gpgs even warn that it isn't needed,
-# but require it nonetheless for some commands, so we just play safe
-# here for the foreseeable future and create a dummy one
-$GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING >/dev/null 2>&1
-# tell gpg that it shouldn't try to maintain a trustdb file
-GPG_CMD="$GPG_CMD --no-auto-check-trustdb --trust-model always"
-
-GPG="$GPG_CMD"
-
 APT_DIR="/"
 eval $(apt-config shell APT_DIR Dir)
 
@@ -37,22 +14,26 @@ REMOVED_KEYS='&keyring-removed-filename;'
 eval $(apt-config shell REMOVED_KEYS APT::Key::RemovedKeys)
 ARCHIVE_KEYRING_URI='&keyring-uri;'
 eval $(apt-config shell ARCHIVE_KEYRING_URI APT::Key::ArchiveKeyringURI)
-TMP_KEYRING=${APT_DIR}/var/lib/apt/keyrings/maybe-import-keyring.gpg
+
+aptkey_echo() { echo "$@"; }
 
 requires_root() {
        if [ "$(id -u)" -ne 0 ]; then
-               echo >&1 "ERROR: This command can only be used by root."
+               echo >&2 "ERROR: This command can only be used by root."
                exit 1
        fi
 }
 
-# gpg defaults to mode 0600 for new keyrings. Create one with 0644 instead.
-init_keyring() {
-    for path; do
-        if ! [ -e "$path" ]; then
-            touch -- "$path"
-            chmod 0644 -- "$path"
-        fi
+get_fingerprints_of_keyring() {
+    $GPG_CMD --keyring "$1" --with-colons --fingerprint | while read publine; do
+       # search for a public key
+       if [ "${publine%%:*}" != 'pub' ]; then continue; fi
+       # search for the associated fingerprint (should be the very next line)
+       while read fprline; do
+          if [ "${fprline%%:*}" = 'sub' ]; then break; # should never happen
+          elif [ "${fprline%%:*}" != 'fpr' ]; then continue; fi
+          echo "$fprline" | cut -d':' -f 10
+       done
     done
 }
 
@@ -61,11 +42,11 @@ add_keys_with_verify_against_master_keyring() {
     MASTER=$2
 
     if [ ! -f "$ADD_KEYRING" ]; then
-       echo "ERROR: '$ADD_KEYRING' not found"
+       echo >&2 "ERROR: '$ADD_KEYRING' not found"
        return
-    fi 
+    fi
     if [ ! -f "$MASTER" ]; then
-       echo "ERROR: '$MASTER' not found"
+       echo >&2 "ERROR: '$MASTER' not found"
        return
     fi
 
@@ -73,7 +54,7 @@ add_keys_with_verify_against_master_keyring() {
     # is honored. so:
     #   all keys that are exported must have a valid signature
     #   from a key in the $distro-master-keyring
-    add_keys=`$GPG_CMD --keyring $ADD_KEYRING --with-colons --list-keys | grep ^pub | cut -d: -f5`
+    add_keys="$(get_fingerprints_of_keyring "$ADD_KEYRING")"
     all_add_keys=`$GPG_CMD --keyring $ADD_KEYRING --with-colons --list-keys | grep ^[ps]ub | cut -d: -f5`
     master_keys=`$GPG_CMD --keyring $MASTER --with-colons --list-keys | grep ^pub | cut -d: -f5`
 
@@ -86,24 +67,28 @@ add_keys_with_verify_against_master_keyring() {
             fi
         done
     done
-    
+
     for add_key in $add_keys; do
         # export the add keyring one-by-one
-        rm -f $TMP_KEYRING
-        $GPG_CMD --keyring $ADD_KEYRING --output $TMP_KEYRING --export $add_key 
-        # check if signed with the master key and only add in this case
-        ADDED=0
+       local TMP_KEYRING="${GPGHOMEDIR}/tmp-keyring.gpg"
+       $GPG_CMD --batch --yes --keyring "$ADD_KEYRING" --output "$TMP_KEYRING" --export "$add_key"
+       if ! $GPG_CMD --batch --yes --keyring "$TMP_KEYRING" --import "$MASTER" > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then
+           cat "${GPGHOMEDIR}/gpgoutput.log"
+           false
+       fi
+       # check if signed with the master key and only add in this case
+       ADDED=0
        for master_key in $master_keys; do
-           if $GPG_CMD --keyring $MASTER --keyring $TMP_KEYRING --check-sigs --with-colons $add_key | grep '^sig:!:' | cut -d: -f5 | grep -q $master_key; then
-               $GPG --import $TMP_KEYRING
+           if $GPG_CMD --keyring $TMP_KEYRING --check-sigs --with-colons $add_key | grep '^sig:!:' | cut -d: -f5 | grep -q $master_key; then
+               $GPG_CMD --batch --yes --keyring "$ADD_KEYRING" --export "$add_key" | $GPG --batch --yes --import
                ADDED=1
            fi
        done
        if [ $ADDED = 0 ]; then
            echo >&2 "Key '$add_key' not added. It is not signed with a master key"
        fi
+       rm -f "${TMP_KEYRING}"
     done
-    rm -f $TMP_KEYRING
 }
 
 # update the current archive signing keyring from a network URI
@@ -121,7 +106,6 @@ net_update() {
        echo >&2 "ERROR: Your distribution is not supported in net-update as no uri for the archive-keyring is set"
        exit 1
     fi
-    requires_root
     # in theory we would need to depend on wget for this, but this feature
     # isn't useable in debian anyway as we have no keyring uri nor a master key
     if ! which wget >/dev/null 2>&1; then
@@ -142,7 +126,7 @@ net_update() {
     fi
     new_mtime=$(stat -c %Y $keyring)
     if [ $new_mtime -ne $old_mtime ]; then
-       echo "Checking for new archive signing keys now"
+       aptkey_echo "Checking for new archive signing keys now"
        add_keys_with_verify_against_master_keyring $keyring $MASTER_KEYRING
     fi
 }
@@ -153,7 +137,6 @@ update() {
        echo >&2 "Is the &keyring-package; package installed?"
        exit 1
     fi
-    requires_root
 
     # add new keys from the package;
 
@@ -166,71 +149,159 @@ update() {
 
     if [ -r "$REMOVED_KEYS" ]; then
        # remove no-longer supported/used keys
-       keys=`$GPG_CMD --keyring $REMOVED_KEYS --with-colons --list-keys | grep ^pub | cut -d: -f5`
-       for key in $keys; do
-           if $GPG --list-keys --with-colons | grep ^pub | cut -d: -f5 | grep -q $key; then
-               $GPG --quiet --batch --delete-key --yes ${key}
-           fi
+       get_fingerprints_of_keyring "$REMOVED_KEYS" | while read key; do
+           foreach_keyring_do 'remove_key_from_keyring' "$key"
        done
     else
-       echo "Warning: removed keys keyring  $REMOVED_KEYS missing or not readable" >&2
+       echo >&2 "Warning: removed keys keyring  $REMOVED_KEYS missing or not readable"
     fi
 }
 
 remove_key_from_keyring() {
-    local GPG="$GPG_CMD --keyring $1"
-    # check if the key is in this keyring: the key id is in the 5 column at the end
-    if ! $GPG --with-colons --list-keys 2>&1 | grep -q "^pub:[^:]*:[^:]*:[^:]*:[0-9A-F]*$2:"; then
-       return
-    fi
-    if [ ! -w "$1" ]; then
-       echo >&2 "Key ${2} is in keyring ${1}, but can't be removed as it is read only."
-       return
+    local KEYRINGFILE="$1"
+    shift
+    # non-existent keyrings have by definition no keys
+    if [ ! -e "$KEYRINGFILE" ]; then
+       return
     fi
-    # check if it is the only key in the keyring and if so remove the keyring altogether
-    if [ '1' = "$($GPG --with-colons --list-keys | grep "^pub:[^:]*:[^:]*:[^:]*:[0-9A-F]\+:" | wc -l)" ]; then
-       mv -f "$1" "${1}~" # behave like gpg
-       return
-    fi
-    # we can't just modify pointed to files as these might be in /usr or something
-    local REALTARGET
-    if [ -L "$1" ]; then
-       REALTARGET="$(readlink -f "$1")"
-       mv -f "$1" "${1}.dpkg-tmp"
-       cp -a "$REALTARGET" "$1"
-       ls "$(dirname $1)"
-    fi
-    # delete the key from the keyring
-    $GPG --batch --delete-key --yes "$2"
-    if [ -n "$REALTARGET" ]; then
-       # the real backup is the old link, not the copy we made
-       mv -f "${1}.dpkg-tmp" "${1}~"
-    fi
-}
 
-remove_key() {
-    requires_root
+    local GPG="$GPG_CMD --keyring $KEYRINGFILE"
+    for KEY in "$@"; do
+       # check if the key is in this keyring: the key id is in the 5 column at the end
+       if ! get_fingerprints_of_keyring "$KEYRINGFILE" | grep -q "^[0-9A-F]*${KEY}$"; then
+           continue
+       fi
+       if [ ! -w "$KEYRINGFILE" ]; then
+           echo >&2 "Key ${KEY} is in keyring ${KEYRINGFILE}, but can't be removed as it is read only."
+           continue
+       fi
+       # check if it is the only key in the keyring and if so remove the keyring altogether
+       if [ '1' = "$(get_fingerprints_of_keyring "$KEYRINGFILE" | wc -l)" ]; then
+           mv -f "$KEYRINGFILE" "${KEYRINGFILE}~" # behave like gpg
+           return
+       fi
+       # we can't just modify pointed to files as these might be in /usr or something
+       local REALTARGET
+       if [ -L "$KEYRINGFILE" ]; then
+           REALTARGET="$(readlink -f "$KEYRINGFILE")"
+           mv -f "$KEYRINGFILE" "${KEYRINGFILE}.dpkg-tmp"
+           cp -a "$REALTARGET" "$KEYRINGFILE"
+       fi
+       # delete the key from the keyring
+       $GPG --batch --delete-key --yes "$KEY"
+       if [ -n "$REALTARGET" ]; then
+           # the real backup is the old link, not the copy we made
+           mv -f "${KEYRINGFILE}.dpkg-tmp" "${KEYRINGFILE}~"
+       fi
+    done
+}
 
-    # if a --keyring was given, just remove from there
-    if [ -n "$FORCED_KEYRING" ]; then
-       remove_key_from_keyring "$FORCED_KEYRING" "$1"
-    else
+foreach_keyring_do() {
+   local ACTION="$1"
+   shift
+   # if a --keyring was given, just remove from there
+   if [ -n "$FORCED_KEYRING" ]; then
+       $ACTION "$FORCED_KEYRING" "$@"
+   else
        # otherwise all known keyrings are up for inspection
-       local TRUSTEDFILE="/etc/apt/trusted.gpg"
-       eval $(apt-config shell TRUSTEDFILE Apt::GPGV::TrustedKeyring)
-       eval $(apt-config shell TRUSTEDFILE Dir::Etc::Trusted/f)
-       remove_key_from_keyring "$TRUSTEDFILE" "$1"
-       TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
+       if [ -s "$TRUSTEDFILE" ]; then
+           $ACTION "$TRUSTEDFILE" "$@"
+       fi
+       local TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
        eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d)
        if [ -d "$TRUSTEDPARTS" ]; then
+           # strip / suffix as gpg will double-slash in that case (#665411)
+           local STRIPPED_TRUSTEDPARTS="${TRUSTEDPARTS%/}"
+           if [ "${STRIPPED_TRUSTEDPARTS}/" = "$TRUSTEDPARTS" ]; then
+               TRUSTEDPARTS="$STRIPPED_TRUSTEDPARTS"
+           fi
            for trusted in $(run-parts --list "$TRUSTEDPARTS" --regex '^.*\.gpg$'); do
-               remove_key_from_keyring "$trusted" "$1"
+               if [ -s "$trusted" ]; then
+                   $ACTION "$trusted" "$@"
+               fi
            done
        fi
+   fi
+}
+
+run_cmd_on_keyring() {
+    local KEYRINGFILE="$1"
+    shift
+    # fingerprint and co will fail if key isn't in this keyring
+    $GPG_CMD --keyring "$KEYRINGFILE" --batch "$@" 2>/dev/null || true
+}
+
+import_keys_from_keyring() {
+    local IMPORT="$1"
+    local KEYRINGFILE="$2"
+    if ! $GPG_CMD --keyring "$KEYRINGFILE" --batch --import "$IMPORT" > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then
+       cat "${GPGHOMEDIR}/gpgoutput.log"
+       false
+    fi
+}
+
+merge_keys_into_keyrings() {
+    local KEYRINGFILE="$1"
+    local IMPORT="$2"
+    if ! $GPG_CMD --keyring "$KEYRINGFILE" --batch --import --import-options 'merge-only' "$IMPORT" > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then
+       cat "${GPGHOMEDIR}/gpgoutput.log"
+       false
+    fi
+}
+
+merge_back_changes() {
+    if [ -n "$FORCED_KEYRING" ]; then
+       # if the keyring was forced merge is already done
+       return
+    fi
+    if [ -s "${GPGHOMEDIR}/pubring.gpg" ]; then
+       # merge all updated keys
+       foreach_keyring_do 'merge_keys_into_keyrings' "${GPGHOMEDIR}/pubring.gpg"
+    fi
+    # look for keys which were added or removed
+    get_fingerprints_of_keyring "${GPGHOMEDIR}/pubring.orig.gpg" > "${GPGHOMEDIR}/pubring.orig.keylst"
+    get_fingerprints_of_keyring "${GPGHOMEDIR}/pubring.gpg" > "${GPGHOMEDIR}/pubring.keylst"
+    sort "${GPGHOMEDIR}/pubring.keylst" "${GPGHOMEDIR}/pubring.orig.keylst" | uniq --unique | while read key; do
+       if grep -q "^${key}$" "${GPGHOMEDIR}/pubring.orig.keylst"; then
+           # key isn't part of new keyring, so remove
+           foreach_keyring_do 'remove_key_from_keyring' "$key"
+       elif grep -q "^${key}$" "${GPGHOMEDIR}/pubring.keylst"; then
+           # key is part of new keyring, so we need to import it
+           create_new_keyring "$TRUSTEDFILE"
+           if ! $GPG --batch --yes --export "$key" | $GPG_CMD --keyring "$TRUSTEDFILE" --batch --yes --import > "${GPGHOMEDIR}/gpgoutput.log" 2>&1; then
+              cat "${GPGHOMEDIR}/gpgoutput.log"
+              false
+           fi
+       else
+           echo >&2 "Errror: Key ${key} (dis)appeared out of nowhere"
+       fi
+    done
+}
+
+setup_merged_keyring() {
+    if [ -z "$FORCED_KEYRING" ]; then
+       foreach_keyring_do 'import_keys_from_keyring' "${GPGHOMEDIR}/pubring.gpg"
+       if [ -r "${GPGHOMEDIR}/pubring.gpg" ]; then
+           cp -a "${GPGHOMEDIR}/pubring.gpg" "${GPGHOMEDIR}/pubring.orig.gpg"
+       else
+          touch "${GPGHOMEDIR}/pubring.gpg" "${GPGHOMEDIR}/pubring.orig.gpg"
+       fi
+       GPG="$GPG --keyring ${GPGHOMEDIR}/pubring.gpg"
+    else
+       GPG="$GPG --keyring $TRUSTEDFILE"
+       create_new_keyring "$TRUSTEDFILE"
     fi
-    echo "OK"
 }
 
+create_new_keyring() {
+    # gpg defaults to mode 0600 for new keyrings. Create one with 0644 instead.
+    if ! [ -e "$TRUSTEDFILE" ]; then
+       if [ -w "$(dirname "$TRUSTEDFILE")" ]; then
+           touch -- "$TRUSTEDFILE"
+           chmod 0644 -- "$TRUSTEDFILE"
+       fi
+    fi
+}
 
 usage() {
     echo "Usage: apt-key [--keyring file] [command] [arguments]"
@@ -256,17 +327,19 @@ while [ -n "$1" ]; do
         shift
         TRUSTEDFILE="$1"
         FORCED_KEYRING="$1"
-        if [ -r "$TRUSTEDFILE" ] || [ "$2" = 'add' ] || [ "$2" = 'adv' ]; then
-           GPG="$GPG --keyring $TRUSTEDFILE --primary-keyring $TRUSTEDFILE"
-        else
-           echo >&2 "Error: The specified keyring »$TRUSTEDFILE« is missing or not readable"
-           exit 1
-        fi
+        ;;
+      --secret-keyring)
         shift
+        FORCED_SECRET_KEYRING="$1"
+        ;;
+      --readonly)
+        merge_back_changes() { true; }
         ;;
       --fakeroot)
         requires_root() { true; }
-        shift
+        ;;
+      --quiet)
+        aptkey_echo() { true; }
         ;;
       --*)
         echo >&2 "Unknown option: $1"
@@ -275,28 +348,13 @@ while [ -n "$1" ]; do
       *)
         break;;
    esac
+   shift
 done
 
 if [ -z "$TRUSTEDFILE" ]; then
    TRUSTEDFILE="/etc/apt/trusted.gpg"
    eval $(apt-config shell TRUSTEDFILE Apt::GPGV::TrustedKeyring)
    eval $(apt-config shell TRUSTEDFILE Dir::Etc::Trusted/f)
-   if [ -r "$TRUSTEDFILE" ]; then
-      GPG="$GPG --keyring $TRUSTEDFILE"
-   fi
-   GPG="$GPG --primary-keyring $TRUSTEDFILE"
-   TRUSTEDPARTS="/etc/apt/trusted.gpg.d"
-   eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d)
-   if [ -d "$TRUSTEDPARTS" ]; then
-      # strip / suffix as gpg will double-slash in that case (#665411)
-      STRIPPED_TRUSTEDPARTS="${TRUSTEDPARTS%/}"
-      if [ "${STRIPPED_TRUSTEDPARTS}/" = "$TRUSTEDPARTS" ]; then
-        TRUSTEDPARTS="$STRIPPED_TRUSTEDPARTS"
-      fi
-      for trusted in $(run-parts --list "$TRUSTEDPARTS" --regex '^.*\.gpg$'); do
-        GPG="$GPG --keyring $trusted"
-      done
-   fi
 fi
 
 command="$1"
@@ -306,52 +364,107 @@ if [ -z "$command" ]; then
 fi
 shift
 
-if [ "$command" != "help" ] && ! which gpg >/dev/null 2>&1; then
-    echo >&2 "Warning: gnupg does not seem to be installed."
-    echo >&2 "Warning: apt-key requires gnupg for most operations."
-    echo >&2
+if [ "$command" != "help" ]; then
+    eval $(apt-config shell GPG_EXE Apt::Key::gpgcommand)
+
+    if [ -n "$GPG_EXE" ] && which "$GPG_EXE" >/dev/null 2>&1; then
+       true
+    elif which gpg >/dev/null 2>&1; then
+       GPG_EXE="gpg"
+    elif which gpg2 >/dev/null 2>&1; then
+       GPG_EXE="gpg2"
+    else
+       echo >&2 "Error: gnupg or gnupg2 do not seem to be installed,"
+       echo >&2 "Error: but apt-key requires gnupg or gnupg2 for operation."
+       echo >&2
+       exit 255
+    fi
+
+    GPG_CMD="$GPG_EXE --ignore-time-conflict --no-options --no-default-keyring"
+
+    # gpg needs (in different versions more or less) files to function correctly,
+    # so we give it its own homedir and generate some valid content for it
+    if [ -n "$TMPDIR" ]; then
+       # tmpdir is a directory and current user has rwx access to it
+       # same tests as in apt-pkg/contrib/fileutl.cc GetTempDir()
+       if [ ! -d "$TMPDIR" ] || [ ! -r "$TMPDIR" ] || [ ! -w "$TMPDIR" ] || [ ! -x "$TMPDIR" ]; then
+         unset TMPDIR
+       fi
+    fi
+    GPGHOMEDIR="$(mktemp -d)"
+    CURRENTTRAP="${CURRENTTRAP} rm -rf '${GPGHOMEDIR}';"
+    trap "${CURRENTTRAP}" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
+    chmod 700 "$GPGHOMEDIR"
+    # We don't use a secret keyring, of course, but gpg panics and
+    # implodes if there isn't one available - and writeable for imports
+    SECRETKEYRING="${GPGHOMEDIR}/secring.gpg"
+    touch $SECRETKEYRING
+    GPG_CMD="$GPG_CMD --homedir $GPGHOMEDIR"
+    # create the trustdb with an (empty) dummy keyring
+    # older gpgs required it, newer gpgs even warn that it isn't needed,
+    # but require it nonetheless for some commands, so we just play safe
+    # here for the foreseeable future and create a dummy one
+    $GPG_CMD --quiet --check-trustdb --keyring $SECRETKEYRING >/dev/null 2>&1
+    # tell gpg that it shouldn't try to maintain a trustdb file
+    GPG_CMD="$GPG_CMD --no-auto-check-trustdb --trust-model always"
+    GPG="$GPG_CMD"
+
+    # for advanced operations, we might really need a secret keyring after all
+    if [ -n "$FORCED_SECRET_KEYRING" ] && [ -r "$FORCED_SECRET_KEYRING" ]; then
+       rm -f "$SECRETKEYRING"
+       cp -a "$FORCED_SECRET_KEYRING" "$SECRETKEYRING"
+    fi
 fi
 
 case "$command" in
     add)
-        requires_root
-        init_keyring "$TRUSTEDFILE"
-        $GPG --quiet --batch --import "$1"
-        echo "OK"
+       requires_root
+       setup_merged_keyring
+       $GPG --quiet --batch --import "$@"
+       merge_back_changes
+       aptkey_echo "OK"
         ;;
     del|rm|remove)
-        init_keyring "$TRUSTEDFILE"
-       remove_key "$1"
+       requires_root
+       foreach_keyring_do 'remove_key_from_keyring' "$@"
+       aptkey_echo "OK"
         ;;
     update)
-        init_keyring "$TRUSTEDFILE"
+       requires_root
+       setup_merged_keyring
        update
+       merge_back_changes
        ;;
     net-update)
-        init_keyring "$TRUSTEDFILE"
+       requires_root
+       setup_merged_keyring
        net_update
+       merge_back_changes
        ;;
     list)
-        init_keyring "$TRUSTEDFILE"
-        $GPG --batch --list-keys
-        ;;
+       foreach_keyring_do 'run_cmd_on_keyring' --list-keys "$@"
+       ;;
     finger*)
-        init_keyring "$TRUSTEDFILE"
-        $GPG --batch --fingerprint
-        ;;
-    export)
-        init_keyring "$TRUSTEDFILE"
-        $GPG --armor --export "$1"
-        ;;
-    exportall)
-        init_keyring "$TRUSTEDFILE"
-        $GPG --armor --export
-        ;;
+       foreach_keyring_do 'run_cmd_on_keyring' --fingerprint "$@"
+       ;;
+    export|exportall)
+       foreach_keyring_do 'import_keys_from_keyring' "${GPGHOMEDIR}/pubring.gpg"
+       $GPG_CMD --keyring "${GPGHOMEDIR}/pubring.gpg" --armor --export "$@"
+       ;;
     adv*)
-        init_keyring "$TRUSTEDFILE"
-        echo "Executing: $GPG $*"
-        $GPG $*
-        ;;
+       setup_merged_keyring
+       aptkey_echo "Executing: $GPG $*"
+       $GPG "$@"
+       merge_back_changes
+       ;;
+    verify)
+       setup_merged_keyring
+       if which gpgv >/dev/null 2>&1; then
+           gpgv --homedir "${GPGHOMEDIR}" --keyring "${GPGHOMEDIR}/pubring.gpg" --ignore-time-conflict "$@"
+       else
+           $GPG --verify "$@"
+       fi
+       ;;
     help)
         usage
         ;;
index ed348358aad0b6a3d870bc6ac73025ac76595a29..8974397c94e61f21add4fcef477302bbe6b8355b 100644 (file)
@@ -22,6 +22,7 @@
 #include <apt-pkg/pkgcache.h>
 
 #include <apt-private/private-cmndline.h>
+#include <apt-private/private-output.h>
 
 #include <errno.h>
 #include <fcntl.h>
                                                                        /*}}}*/
 using namespace std;
 
-ostream c0out(0);
-ostream c1out(0);
-ostream c2out(0);
-ofstream devnull("/dev/null");
 /* DoAuto - mark packages as automatically/manually installed          {{{*/
 static bool DoAuto(CommandLine &CmdL)
 {
@@ -277,6 +274,70 @@ static bool DoHold(CommandLine &CmdL)
       return true;
    }
 
+   APT::PackageList keepoffset;
+   for (APT::PackageList::iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg)
+   {
+      if (Pkg->CurrentVer != 0)
+        continue;
+      keepoffset.insert(Pkg);
+   }
+
+   if (keepoffset.empty() == false)
+   {
+      Args.erase(Args.begin() + BaseArgs, Args.end());
+      Args.push_back("--merge-avail");
+      // FIXME: supported only since 1.17.7 in dpkg
+      Args.push_back("-");
+      Args.push_back(NULL);
+
+      int external[2] = {-1, -1};
+      if (pipe(external) != 0)
+        return _error->WarningE("DoHold", "Can't create IPC pipe for dpkg --merge-avail");
+
+      pid_t dpkgMergeAvail = ExecFork();
+      if (dpkgMergeAvail == 0)
+      {
+        close(external[1]);
+        std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory");
+        if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0 && chdir("/") != 0)
+           _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --merge-avail", chrootDir.c_str());
+        dup2(external[0], STDIN_FILENO);
+        int const nullfd = open("/dev/null", O_RDONLY);
+        dup2(nullfd, STDOUT_FILENO);
+        execvp(Args[0], (char**) &Args[0]);
+        _error->WarningE("dpkgGo", "Can't get dpkg --merge-avail running!");
+        _exit(2);
+      }
+
+      FILE* dpkg = fdopen(external[1], "w");
+      for (APT::PackageList::iterator Pkg = keepoffset.begin(); Pkg != keepoffset.end(); ++Pkg)
+      {
+        char const * Arch;
+        if (Pkg->VersionList != 0)
+           Arch = Pkg.VersionList().Arch();
+        else
+           Arch = Pkg.Arch();
+        fprintf(dpkg, "Package: %s\nVersion: 0~\nArchitecture: %s\nMaintainer: Dummy Example <dummy@example.org>\n"
+              "Description: dummy package record\n A record is needed to put a package on hold, so here it is.\n\n", Pkg.Name(), Arch);
+      }
+      fclose(dpkg);
+      keepoffset.clear();
+
+      if (dpkgMergeAvail > 0)
+      {
+        int Status = 0;
+        while (waitpid(dpkgMergeAvail, &Status, 0) != dpkgMergeAvail)
+        {
+           if (errno == EINTR)
+              continue;
+           _error->WarningE("dpkgGo", _("Waited for %s but it wasn't there"), "dpkg --merge-avail");
+           break;
+        }
+        if (WIFEXITED(Status) == false || WEXITSTATUS(Status) != 0)
+           return _error->Error(_("Executing dpkg failed. Are you root?"));
+      }
+   }
+
    Args.erase(Args.begin() + BaseArgs, Args.end());
    Args.push_back("--set-selections");
    Args.push_back(NULL);
@@ -292,12 +353,9 @@ static bool DoHold(CommandLine &CmdL)
       std::string const chrootDir = _config->FindDir("DPkg::Chroot-Directory");
       if (chrootDir != "/" && chroot(chrootDir.c_str()) != 0 && chdir("/") != 0)
         _error->WarningE("getArchitecture", "Couldn't chroot into %s for dpkg --set-selections", chrootDir.c_str());
-      int const nullfd = open("/dev/null", O_RDONLY);
       dup2(external[0], STDIN_FILENO);
-      dup2(nullfd, STDOUT_FILENO);
-      dup2(nullfd, STDERR_FILENO);
       execvp(Args[0], (char**) &Args[0]);
-      _error->WarningE("dpkgGo", "Can't detect if dpkg supports multi-arch!");
+      _error->WarningE("dpkgGo", "Can't get dpkg --set-selections running!");
       _exit(2);
    }
 
@@ -441,39 +499,10 @@ int main(int argc,const char *argv[])                                     /*{{{*/
    setlocale(LC_ALL,"");
    textdomain(PACKAGE);
 
-   // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      if (_config->FindB("version") == true)
-        ShowHelp(CmdL);
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-
-   // Deal with stdout not being a tty
-   if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
-      _config->Set("quiet","1");
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
-   // Setup the output streams
-   c0out.rdbuf(cout.rdbuf());
-   c1out.rdbuf(cout.rdbuf());
-   c2out.rdbuf(cout.rdbuf());
-   if (_config->FindI("quiet",0) > 0)
-      c0out.rdbuf(devnull.rdbuf());
-   if (_config->FindI("quiet",0) > 1)
-      c1out.rdbuf(devnull.rdbuf());
+   InitOutput();
 
    // Match the operation
    CmdL.DispatchArg(Cmds);
index c2b11890a1453a0a186e37a3d56036cf438f3118..9b66ad4db1e6da4c1660d00388722b1ace0ac97f 100644 (file)
@@ -23,6 +23,8 @@
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/pkgsystem.h>
 
+#include <apt-private/private-cmndline.h>
+
 #include <vector>
 #include <algorithm>
 #include <stdio.h>
@@ -142,12 +144,12 @@ static bool DoIt(string InFile)
 // ShowHelp - Show the help text                                       /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-static int ShowHelp()
+static bool ShowHelp(CommandLine &)
 {
    ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
            COMMON_ARCH,__DATE__,__TIME__);
    if (_config->FindB("version") == true)
-      return 0;
+      return true;
    
    cout <<
     _("Usage: apt-sortpkgs [options] file1 [file2 ...]\n"
@@ -161,7 +163,7 @@ static int ShowHelp()
       "  -c=? Read this configuration file\n"
       "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n");
 
-   return 0;
+   return true;
 }
                                                                        /*}}}*/
 int main(int argc,const char *argv[])                                  /*{{{*/
@@ -179,19 +181,9 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args,_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       CmdL.FileSize() == 0)
-      return ShowHelp();
+   CommandLine::Dispatch Cmds[] = {{NULL, NULL}};
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args, &_config, &_system, argc, argv, ShowHelp);
 
    // Match the operation
    for (unsigned int I = 0; I != CmdL.FileSize(); I++)
index 2cfdf8e8e4e046da431f911bc14fb1ee3567cddf..056cd213f44800e07f72b6254325f02772f8fd4d 100644 (file)
@@ -119,15 +119,10 @@ int main(int argc, const char *argv[])                                    /*{{{*/
    _config->CndSet("APT::Cmd::Show-Update-Stats", true);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(), _config);
-   if (CmdL.Parse(argc, argv) == false ||
-       pkgInitSystem(*_config, _system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), NULL, &_system, argc, argv, ShowHelp);
 
-   if(!isatty(STDOUT_FILENO) && 
+   if(!isatty(STDOUT_FILENO) &&
       _config->FindB("Apt::Cmd::Disable-Script-Warning", false) == false)
    {
       std::cerr << std::endl
@@ -138,15 +133,6 @@ int main(int argc, const char *argv[])                                     /*{{{*/
                 << std::endl;
    }
 
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-
    // see if we are in simulate mode
    CheckSimulateMode(CmdL);
 
index b7c35ddd1c04086c1fc5669a4dc741dd9b6a3a1c..816038c3b381045148fff4c0c814568a7768a0c0 100644 (file)
@@ -67,15 +67,15 @@ APT_DOMAIN:=apt-utils
 
 # The apt-sortpkgs program
 PROGRAM=apt-sortpkgs
-SLIBS = -lapt-pkg $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-sortpkgs.cc
 include $(PROGRAM_H)
 
 # The apt-extracttemplates program
 PROGRAM=apt-extracttemplates
-SLIBS = -lapt-pkg -lapt-inst $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile apt-inst/makefile
+SLIBS = -lapt-pkg -lapt-inst -lapt-private $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile
 SOURCE = apt-extracttemplates.cc 
 include $(PROGRAM_H)
 
index d728e5e6cbbb26d1b67fef7ab1be90e7ef309067..06879f8390195f5b8c60c7d7b6805a306e7f8cc4 100644 (file)
@@ -18,7 +18,7 @@ AC_CONFIG_AUX_DIR(buildlib)
 AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
 
 PACKAGE="apt"
-PACKAGE_VERSION="1.0.9.6"
+PACKAGE_VERSION="1.0.9.7"
 PACKAGE_MAIL="APT Development Team <deity@lists.debian.org>"
 AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
 AC_DEFINE_UNQUOTED(PACKAGE_VERSION,"$PACKAGE_VERSION")
@@ -172,6 +172,12 @@ AC_EGREP_HEADER(h_errno, netdb.h, [AC_MSG_RESULT(normal)],
        [AC_MSG_ERROR("not found.")])
    ])
 
+
+dnl check for setuid checking function
+AC_CHECK_FUNCS(getresuid getresgid)
+AC_SUBST(HAVE_GETRESUID)
+AC_SUBST(HAVE_GETRESGID)
+
 dnl Check for doxygen
 AC_PATH_PROG(DOXYGEN, doxygen)
 
old mode 100644 (file)
new mode 100755 (executable)
index fd3e273..b0a5da7
@@ -15,6 +15,19 @@ set -e
 
 case "$1" in
     configure)
+       if dpkg --compare-versions "$2" lt 1.1~exp4; then
+           # apt-key before 0.9.10 could leave empty keyrings around
+           find /etc/apt/trusted.gpg.d/ -name '*.gpg' | while read keyring; do
+               if ! test -s "$keyring"; then
+                   rm -f "$keyring"
+               fi
+           done
+           # apt-key before 0.9.8.2 could create 0600 trusted.gpg file
+           if test -e /etc/apt/trusted.gpg ; then
+               chmod -f 0644 /etc/apt/trusted.gpg || true
+           fi
+       fi
+
        if dpkg --compare-versions "$2" lt-nl 0.9.9.5; then
            # we are using tmpfiles for both
            rm -f /etc/apt/trustdb.gpg
@@ -26,6 +39,16 @@ case "$1" in
            fi
        fi
 
+       # add unprivileged user for the apt methods
+       adduser --force-badname --system -home /var/empty \
+           --no-create-home --quiet _apt || true
+
+       # deal with upgrades from experimental
+       if dpkg --compare-versions "$2" 'eq' '1.1~exp3'; then
+           # libapt will setup partial/ at runtime
+           chown -R root:root /var/lib/apt/lists /var/cache/apt/archives || true
+       fi
+
         # ensure tighter permissons on the logs, see LP: #975199
         if dpkg --compare-versions "$2" lt-nl 0.9.7.7; then
             # ensure permissions are right
diff --git a/debian/apt.postrm b/debian/apt.postrm
new file mode 100755 (executable)
index 0000000..ae1e18d
--- /dev/null
@@ -0,0 +1,22 @@
+#! /bin/sh
+
+# apt postrm
+# Copyright (C) 1998, Ben Gertzfield <che@debian.org>
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+set -e
+
+#DEBHELPER#
+
+case "$1" in
+       remove)
+               ;;
+       purge)
+               rm -rf /var/cache/apt
+               rm -rf /var/lib/apt
+esac
+
index 4b38ba8bad40e3f27c2c3f0a157468dad6cd1b2d..b8954102ef2ab966929fd934c015ae4f22cfafb6 100644 (file)
@@ -1,3 +1,239 @@
+apt (1.1~exp8) experimental; urgency=medium
+
+  [ Michael Vogt ]
+  * merge unstable upload version 1.0.9.3
+  * Ensure /etc/apt/auth.conf has _apt:root owner
+  * Use sysconf(_SC_ARG_MAX) to find the size of Dpkg::MaxArgBytes
+  * Only support Translation-* that are listed in the {In,}Release file
+  * Call "Dequeue()" for items in AbortTransaction() to fix race
+  * prepare ABI for feature/socketpair
+  * Bump ABI to 4.15
+
+  [ David Kalnischkies ]
+  * reenable support for -s (and co) in apt-get source (Closes: 742578)
+  * run acquire transactions only once
+  * aborted reverify restores file owner and permission
+  * test if TMPDIR is accessible before using (Closes: 765951)
+  * chown finished partial files earlier
+  * promote filesize to a hashstring
+
+ -- Michael Vogt <mvo@debian.org>  Thu, 06 Nov 2014 10:01:21 +0100
+
+apt (1.1~exp7) experimental; urgency=medium
+
+  [ David Kalnischkies ]
+  * don't cleanup cdrom files in apt-get update (Closes: 765458)
+  * ignore Acquire::GzipIndexes for cdrom sources
+
+ -- David Kalnischkies <david@kalnischkies.de>  Wed, 15 Oct 2014 20:12:15 +0200
+
+apt (1.1~exp6) experimental; urgency=medium
+
+  [ josch ]
+  * implement the updated build profile spec
+
+  [ Michael Vogt ]
+  * methods/rsh.cc: replace strcat with std::string (Closes: #76442)
+  * Add new configallowinsecurerepositories to the test framework
+
+  [ Guillem Jover ]
+  * Update Status field values handling
+
+  [ David Kalnischkies ]
+  * don't drop privileges if _apt has not enough rights
+  * check for available space, excluding root reserved blocks
+
+ -- Michael Vogt <mvo@debian.org>  Wed, 15 Oct 2014 07:47:36 +0200
+
+apt (1.1~exp5) experimental; urgency=medium
+
+  [ Michael Vogt ]
+  * Only rename StatError files in AbortTransaction()
+  * Document Acquire{MaxReleaseFileSize,AllowInsecureRepositories,
+    AllowDowngradeToInsecureRepositories} and
+    --no-allow-insecure-repositories
+  * Fix backward compatiblity of the new pkgAcquireMethod::DropPrivsOrDie()
+  * Change default of Acquire::AllowInsecureRepositories to "true"
+    so that this change is less disruptive, this will be switched
+    to "false" again after jessie
+
+  [ David Kalnischkies ]
+  * remove useless pdiff filename output (Closes: 764737)
+  * make --allow-insecure-repositories message an error
+  * display a warning for unsigned repos
+  * trusted=yes sources are secure, we just don't know why
+
+ -- Michael Vogt <mvo@debian.org>  Mon, 13 Oct 2014 16:15:22 +0200
+
+apt (1.1~exp4) experimental; urgency=medium
+
+  [ Michael Vogt ]
+  * Merge sid version 1.0.9.2
+  * feature/acq-trans:
+    - Make apt-get update more transactional by keeping all data from
+      a sources.list line in partial/ until all data is good and only
+      then move it into lists/ in one step
+    - add new -o Debug::Acquire::Transaction=1 debug option
+  * feature/expected-size:
+    Do not download more data in the mehotds than expected if we know
+    the size. For the InRelease/Release/Release.gpg add new 
+    Acquire::MaxReleaseFileSize that defaults to 10Mb for now
+  * Verify the the hashes of the downloaded compressed files early
+  * Only load unauthenticated data into our parsers when the user
+    explicitly asked for it via --allow-insecure-repositories
+    (Acquire::AllowInsecureRepositories)
+  * Print warning when trying to use unauthenticated repositories
+  * Use /var/empty as the homedir for _apt
+  * Revert making pkgAcquire::Item::DescURI() "const" to not break
+    API
+  * Do not allow going from a authenticated to unauthenticated repository
+  * Add missing "adduser" dependency (for the new _apt user)
+    Thanks to Russ Allbery (Closes: #763004)
+  * Test if TMPDIR is a directory in apt-key and if not unset it
+  * add early verification for the .diff/Index download
+  * Bump library version to libapt-pkg4.14
+  * Rework pkgAcqMeta{Index,Sig,ClearSig}::{Done,Failed]() for readability
+  * Ignore EINVAL from prctl(PR_SET_NO_NEW_PRIVS) (closes: 764066)
+
+  [ David Kalnischkies ]
+  * deprecate Pkg->Name in favor of Grp->Name
+  * drop stored StringItems in favor of in-memory mappings
+  * de-duplicate version strings in the cache
+  * fix progress output for (dist-)upgrade calculation
+  * move PCI::From* methods into CacheSetHelper class (Closes: 686221)
+  * add a (hidden) --quiet option for apt-key
+  * only create new trusted.gpg if directory is writeable
+  * support (multiple) arguments properly in apt-key
+  * set a primary-keyring only if we have access to it
+  * merge fragment keyrings in apt-key to avoid hitting gpg limits
+    (Closes: 733028)
+  * use apt-key adv (+ gnupg) instead of gpgv for verify
+  * support gnupg2 as drop-in replacement for gnupg
+  * allow to specify fingerprints in 'apt-key del'
+  * use only one --keyring in gpg interactions
+  * add and use 'apt-key verify' which prefers gpgv over gpg
+  * remove empty keyrings in trusted.gpg.d on upgrade
+  * store source name and version in binary cache
+  * allow fetcher setup without directory creation (Closes: 762898)
+  * cleanup partial directory of lists in apt-get clean (Closes: #762889)
+  * allow options between command and -- on commandline
+  * update symbols file
+  * support parsing of all hashes for pdiff
+  * ensure world-readability for trusted.gpg in postinst (Closes: 647001)
+  * ensure partial dirs are 0700 and owned by _apt:root
+  * use _apt:root only for partial directories
+  * display errortext for all Err
+  * set PR_SET_NO_NEW_PRIVS also if run as non-root
+
+  [ James McCoy ]
+  * ensure apt-key del handles 16-byte key ids (Closes: 754436)
+
+  [ Kenshi Muto ]
+  * Japanese program translation update (Closes: 763033)
+
+  [ Trần Ngọc Quân ]
+  * Set STRIP_FROM_PATH for doxygen
+
+  [ Mert Dirik ]
+  * Turkish program translation update (Closes: 763379)
+
+  [ Guillem Jover ]
+  * apt-get: Create the temporary downloaded changelog inside tmpdir
+
+  [ Miroslav Kure ]
+  * [l10n] Updated Czech translation of apt (Closes: #764055)
+
+ -- Michael Vogt <mvo@ubuntu.com>  Wed, 08 Oct 2014 09:37:35 +0200
+
+apt (1.1~exp3) experimental; urgency=medium
+
+  [ Michael Vogt ]
+  * merged changes from debian/sid up to 1.0.9.1
+  * Make /var/lib/apt/lists and /var/cache/apt/archives owned
+    by the new _apt user
+  * Drop Privileges in the following acquire methods:
+     copy, http, https, ftp, gpgv, gzip/bzip2/lzma/xz 
+  * DropPrivs: Improvements based on feedback from error@debian.org
+
+  [ Julian Andres Klode ]
+  * DropPriv: Really call seteuid and not setuid, and add more checks
+  * Use _apt as our unprivileged user name
+  * DropPrivs: Also check for saved set-user-ID and set-group-ID
+  * methods: Fail if we cannot drop privileges
+  * DropPrivs: Also check for saved set-user-ID and set-group-ID
+
+ -- Michael Vogt <mvo@debian.org>  Wed, 24 Sep 2014 22:30:09 +0200
+
+apt (1.1~exp2) experimental; urgency=medium
+
+  [ Guillem Jover ]
+  * Add new Base256ToNum long long overload function
+  * Fix ar and tar code to be LFS-safe (Closes: #742882)
+
+  [ Michael Vogt ]
+  * increase libapt-inst to version 1.6
+  * Only allow "apt-get build-dep path" when path starts with ./ or /
+  * Allow passing a full path to apt-get install /foo/bar.deb (CLoses: #752327)
+  * merge changes from the 1.0.6 upload
+
+ -- Michael Vogt <mvo@debian.org>  Thu, 10 Jul 2014 13:18:08 +0200
+
+apt (1.1~exp1) experimental; urgency=low
+
+  [ David Kalnischkies ]
+  * [API Break] change "std::string pkgAcquire::Item::DescURI()" to
+                       "std::string pkgAcquire::Item::DescURI() const"
+  * [ABI-Break] increase hashtable size for packages/groups by factor 5
+  * [ABI-Break] cleanup datatypes mix used in binary cache
+  * [internal API-Break] remove the Section member from package struct
+  * use 'best' hash for source authentication (LP: 1098738)
+  * use HashStringList in the acquire system
+  * deal with hashes in ftparchive more dynamic as well
+  * reenable pipelining via hashsum reordering support
+  * parse and retrieve multiple Descriptions in one record
+  * improve pkgTagSection scanning and parsing
+  * invalid cache if architecture set doesn't match (Closes: 745036)
+
+  [ Michael Vogt ]
+  * add support for "apt-get build-dep foo.dsc"
+  * add support for "apt-get build-dep unpacked-source-dir"
+  * add support for "apt-get install foo_1.0_all.deb"
+  * make "apt-get update" progress much more accurate by loading the
+    sizes of the targets into the fetcher early
+  * Implement simple by-hash for apt update to improve reliability of
+    the update. Apt will try to fetch the Packages file via
+    /by-hash/$hash_type/$hash_value if the repo supports that.
+    - add APT::Acquire::$(host)::By-Hash=1 knob
+    - add Acquire-By-Hash=1 to Release file
+  * add Debug::Acquire::Progress debug option
+  * [ABI-Break] lp:~mvo/apt/source-hashes:
+    - use sha{512,256,1} for deb-src when available LP: #1098738
+  * [ABI-Break] stop exporting the accidently exported parsenetrc() symbol
+  * [ABI-Break] remove the PACKAGE_MATCHER_ABI_COMPAT defines
+  * [ABI BREAK] apt-pkg/pkgcache.h:
+    - adjust pkgCache::State::VerPriority enum, to match reality
+  * test/integration/test-debsrc-hashes:
+    - add integration test, thanks to Daniel Hartwig
+  * [ABI-Break] remove the PACKAGE_MATCHER_ABI_COMPAT defines
+  * [ABI-Break] Pass struct IndexTarget/indexRecords to
+    pkgAcqIndex{,Merge}Diffs
+  * [internal API-Break] rename pkgCache::Package::NextPackage to
+    pkgCache::Package::Next
+  * Calculate Percent as part of pkgAcquireStatus to provide a weighted
+    percent for both items and bytes
+  * apt-pkg/contrib/macros.h: bump library version to 4.13
+  * apt-private/acqprogress.cc: do not show file size on IMSHit, it wasn't
+    fetched
+  * Fix warnings from clang -Wall/clang -fsanitize=address
+  * add DropPrivs() and drop privileges to nobody when running the
+    the buildin apt and dump solvers
+  * lp:~mvo/apt/webserver-simulate-broken-with-fix346386:
+    - fix invalid InRelease file download checking and add regression
+      test to server broken files to the buildin test webserver
+    - add regression test for LP: #34638
+
+ -- Michael Vogt <mvo@debian.org>  Thu, 19 Jun 2014 12:01:48 +0200
+
 apt (1.0.9.7) unstable; urgency=medium
 
   [ Tomasz Buchert ]
index 0437aa73761e8e4df939f4637ef402086fd8da02..8c3eea3f1133e98ffb750d61f6ba15b8a79af31d 100644 (file)
@@ -18,7 +18,7 @@ XS-Testsuite: autopkgtest
 
 Package: apt
 Architecture: any
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${apt:keyring}, gnupg
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${apt:keyring}, gnupg | gnupg2, adduser
 Replaces: manpages-pl (<< 20060617-3~), manpages-it (<< 2.80-4~), sun-java6-jdk (>> 0), sun-java5-jdk (>> 0), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~)
 Breaks: manpages-pl (<< 20060617-3~), manpages-it (<< 2.80-4~), sun-java6-jdk (>> 0), sun-java5-jdk (>> 0), openjdk-6-jdk (<< 6b24-1.11-0ubuntu1~)
 Conflicts: python-apt (<< 0.7.93.2~)
@@ -38,12 +38,12 @@ Description: commandline package manager
   * apt-config as an interface to the configuration settings
   * apt-key as an interface to manage authentication keys
 
-Package: libapt-pkg4.12
+Package: libapt-pkg4.15
 Architecture: any
 Multi-Arch: same
 Pre-Depends: ${misc:Pre-Depends}
 Depends: ${shlibs:Depends}, ${misc:Depends}
-Breaks: apt (<< 0.9.4~), libapt-inst1.5 (<< 0.9.9~)
+Breaks: apt (<< 1.1~exp4), libapt-inst1.5 (<< 0.9.9~)
 Section: libs
 Description: package management runtime library
  This library provides the common functionality for searching and
@@ -61,7 +61,7 @@ Description: package management runtime library
     http, rsh as well as an interface to add more transports like
     https (apt-transport-https) and debtorrent (apt-transport-debtorrent).
 
-Package: libapt-inst1.5
+Package: libapt-inst1.6
 Architecture: any
 Multi-Arch: same
 Pre-Depends: ${misc:Pre-Depends}
index ec6d9894e7331bef7cade62a154ab6f32f910c81..135522d4036a29f432d6b3eab5bf3e39e5e3f6da 100644 (file)
@@ -1,7 +1,7 @@
 [DEFAULT]
 prebuild = ./prepare-release pre-export
 postbuild = ./prepare-release post-build
-debian-branch = debian/sid
+debian-branch = debian/experimental
 debian-tag = %(version)s
 export-dir = ../build-area
 sign-tags = True
\ No newline at end of file
diff --git a/debian/libapt-inst1.5.install.in b/debian/libapt-inst1.5.install.in
deleted file mode 100644 (file)
index 8bcce2c..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-bin/libapt-inst*.so.* usr/lib/@DEB_HOST_MULTIARCH@/
-usr/share/locale/*/*/libapt-inst*.mo
diff --git a/debian/libapt-inst1.5.symbols b/debian/libapt-inst1.5.symbols
deleted file mode 100644 (file)
index 8ce7072..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-libapt-inst.so.1.5 libapt-inst1.5 #MINVER#
-* Build-Depends-Package: libapt-pkg-dev
- (c++)"ExtractTar::Done(bool)@Base" 0.8.0
- (c++)"ExtractTar::Go(pkgDirStream&)@Base" 0.8.0
- (c++)"ExtractTar::StartGzip()@Base" 0.8.0
- (c++)"ExtractTar::ExtractTar(FileFd&, unsigned long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"ExtractTar::~ExtractTar()@Base" 0.8.0
- (c++)"debDebFile::GotoMember(char const*)@Base" 0.8.0
- (c++)"debDebFile::CheckMember(char const*)@Base" 0.8.0
- (c++)"debDebFile::ControlExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
- (c++)"debDebFile::ControlExtract::~ControlExtract()@Base" 0.8.0
- (c++)"debDebFile::ExtractTarMember(pkgDirStream&, char const*)@Base" 0.9.15.4
- (c++)"debDebFile::ExtractArchive(pkgDirStream&)@Base" 0.8.0
- (c++)"debDebFile::MemControlExtract::TakeControl(void const*, unsigned long)@Base" 0.8.0
- (c++)"debDebFile::MemControlExtract::Read(debDebFile&)@Base" 0.8.0
- (c++)"debDebFile::MemControlExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
- (c++)"debDebFile::MemControlExtract::Process(pkgDirStream::Item&, unsigned char const*, unsigned long, unsigned long)@Base" 0.8.0
- (c++)"debDebFile::MemControlExtract::~MemControlExtract()@Base" 0.8.0
- (c++)"debDebFile::debDebFile(FileFd&)@Base" 0.8.0
- (c++)"pkgExtract::FinishedFile(pkgDirStream::Item&, int)@Base" 0.8.0
- (c++)"pkgExtract::CheckDirReplace(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)@Base" 0.8.0
- (c++)"pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator, bool)@Base" 0.8.0
- (c++)"pkgExtract::Fail(pkgDirStream::Item&, int)@Base" 0.8.0
- (c++)"pkgExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
- (c++)"pkgExtract::Aborted()@Base" 0.8.0
- (c++)"pkgExtract::Finished()@Base" 0.8.0
- (c++)"pkgExtract::pkgExtract(pkgFLCache&, pkgCache::VerIterator)@Base" 0.8.0
- (c++)"pkgExtract::~pkgExtract()@Base" 0.8.0
- (c++)"pkgFLCache::TreeLookup(unsigned int*, char const*, char const*, unsigned long, unsigned int*, bool)@Base" 0.8.0
- (c++)"pkgFLCache::AddConfFile(char const*, char const*, pkgFLCache::PkgIterator const&, unsigned char const*)@Base" 0.8.0
- (c++)"pkgFLCache::AddDiversion(pkgFLCache::PkgIterator const&, char const*, char const*)@Base" 0.8.0
- (c++)"pkgFLCache::BeginDiverLoad()@Base" 0.8.0
- (c++)"pkgFLCache::FinishDiverLoad()@Base" 0.8.0
- (c++)"pkgFLCache::GetPkg(char const*, char const*, bool)@Base" 0.8.0
- (c++)"pkgFLCache::Header::Header()@Base" 0.8.0
- (c++)"pkgFLCache::GetNode(char const*, char const*, unsigned int, bool, bool)@Base" 0.8.0
- (c++)"pkgFLCache::DropNode(unsigned int)@Base" 0.8.0
- (c++)"pkgFLCache::HashNode(pkgFLCache::NodeIterator const&)@Base" 0.8.0
- (c++)"pkgFLCache::PrintTree(unsigned int, unsigned long)@Base" 0.8.0
- (c++)"pkgFLCache::pkgFLCache(DynamicMMap&)@Base" 0.8.0
- (c++)"pkgDirStream::FinishedFile(pkgDirStream::Item&, int)@Base" 0.8.0
- (c++)"pkgDirStream::Fail(pkgDirStream::Item&, int)@Base" 0.8.0
- (c++)"pkgDirStream::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
- (c++)"pkgDirStream::Process(pkgDirStream::Item&, unsigned char const*, unsigned long, unsigned long)@Base" 0.8.0
- (c++)"pkgDirStream::~pkgDirStream()@Base" 0.8.0
- (c++|optional)"pkgCache::DepIterator::operator++(int)@Base" 0.8.0
- (c++|optional)"pkgCache::DepIterator::operator++()@Base" 0.8.0
- (c++|optional)"pkgCache::VerIterator::operator++(int)@Base" 0.8.0
- (c++|optional)"pkgCache::VerIterator::operator++()@Base" 0.8.0
- (c++)"ARArchive::LoadHeaders()@Base" 0.8.0
- (c++)"ARArchive::ARArchive(FileFd&)@Base" 0.8.0
- (c++)"ARArchive::~ARArchive()@Base" 0.8.0
- (c++)"pkgFLCache::NodeIterator::RealPackage() const@Base" 0.8.0
- (c++)"pkgFLCache::Header::CheckSizes(pkgFLCache::Header&) const@Base" 0.8.0
- (c++|optional)"pkgCache::DepIterator::OwnerPointer() const@Base" 0.8.0
- (c++|optional)"pkgCache::VerIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"ARArchive::FindMember(char const*) const@Base" 0.8.0
- (c++)"typeinfo for ExtractTar@Base" 0.8.0
- (c++)"typeinfo for pkgExtract@Base" 0.8.0
- (c++)"typeinfo for pkgDirStream@Base" 0.8.0
- (c++)"typeinfo for debDebFile::ControlExtract@Base" 0.8.0
- (c++)"typeinfo for debDebFile::MemControlExtract@Base" 0.8.0
- (c++|optional)"typeinfo for pkgCache::DepIterator@Base" 0.8.0
- (c++|optional)"typeinfo for pkgCache::VerIterator@Base" 0.8.0
- (c++|optional)"typeinfo for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
- (c++|optional)"typeinfo for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
- (c++)"typeinfo name for ExtractTar@Base" 0.8.0
- (c++)"typeinfo name for pkgExtract@Base" 0.8.0
- (c++)"typeinfo name for pkgDirStream@Base" 0.8.0
- (c++)"typeinfo name for debDebFile::ControlExtract@Base" 0.8.0
- (c++)"typeinfo name for debDebFile::MemControlExtract@Base" 0.8.0
- (c++|optional)"typeinfo name for pkgCache::DepIterator@Base" 0.8.0
- (c++|optional)"typeinfo name for pkgCache::VerIterator@Base" 0.8.0
- (c++|optional)"typeinfo name for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
- (c++|optional)"typeinfo name for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
- (c++)"vtable for ExtractTar@Base" 0.8.0
- (c++)"vtable for pkgExtract@Base" 0.8.0
- (c++)"vtable for pkgDirStream@Base" 0.8.0
- (c++)"vtable for debDebFile::ControlExtract@Base" 0.8.0
- (c++)"vtable for debDebFile::MemControlExtract@Base" 0.8.0
- (c++|optional)"vtable for pkgCache::DepIterator@Base" 0.8.0
- (c++|optional)"vtable for pkgCache::VerIterator@Base" 0.8.0
- (c++|optional)"vtable for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
- (c++|optional)"vtable for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
-### gcc artefacts
- (c++|optional=std)"std::vector<APT::Configuration::Compressor, std::allocator<APT::Configuration::Compressor> >::~vector()@Base" 0.8.12
-### try to ignore std:: template instances
- (c++|regex|optional=std)"^std::basic_string<.+ >\(.+\)@Base$" 0.8.0
- (c++|regex|optional=std)"^typeinfo name for std::iterator<.*>@Base$" 0.8.0
- (c++|regex|optional=std)"^typeinfo for std::iterator<.*>@Base$" 0.8.0
- (c++|optional=std)"std::ctype<char>::do_widen(char) const@Base" 1.0.3
diff --git a/debian/libapt-inst1.6.install.in b/debian/libapt-inst1.6.install.in
new file mode 100644 (file)
index 0000000..8bcce2c
--- /dev/null
@@ -0,0 +1,2 @@
+bin/libapt-inst*.so.* usr/lib/@DEB_HOST_MULTIARCH@/
+usr/share/locale/*/*/libapt-inst*.mo
diff --git a/debian/libapt-inst1.6.symbols b/debian/libapt-inst1.6.symbols
new file mode 100644 (file)
index 0000000..74c4665
--- /dev/null
@@ -0,0 +1,91 @@
+libapt-inst.so.1.6 libapt-inst1.6 #MINVER#
+* Build-Depends-Package: libapt-pkg-dev
+ (c++)"ExtractTar::Done(bool)@Base" 0.8.0
+ (c++)"ExtractTar::Go(pkgDirStream&)@Base" 0.8.0
+ (c++)"ExtractTar::StartGzip()@Base" 0.8.0
+ (c++)"ExtractTar::ExtractTar(FileFd&, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.0.5
+ (c++)"ExtractTar::~ExtractTar()@Base" 0.8.0
+ (c++)"debDebFile::GotoMember(char const*)@Base" 0.8.0
+ (c++)"debDebFile::CheckMember(char const*)@Base" 0.8.0
+ (c++)"debDebFile::ControlExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
+ (c++)"debDebFile::ControlExtract::~ControlExtract()@Base" 0.8.0
+ (c++)"debDebFile::ExtractTarMember(pkgDirStream&, char const*)@Base" 0.9.15.4
+ (c++)"debDebFile::ExtractArchive(pkgDirStream&)@Base" 0.8.0
+ (c++)"debDebFile::MemControlExtract::TakeControl(void const*, unsigned long long)@Base" 1.0.5
+ (c++)"debDebFile::MemControlExtract::Read(debDebFile&)@Base" 0.8.0
+ (c++)"debDebFile::MemControlExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
+ (c++)"debDebFile::MemControlExtract::Process(pkgDirStream::Item&, unsigned char const*, unsigned long long, unsigned long long)@Base" 1.0.5
+ (c++)"debDebFile::MemControlExtract::~MemControlExtract()@Base" 0.8.0
+ (c++)"debDebFile::debDebFile(FileFd&)@Base" 0.8.0
+ (c++)"pkgExtract::FinishedFile(pkgDirStream::Item&, int)@Base" 0.8.0
+ (c++)"pkgExtract::CheckDirReplace(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)@Base" 0.8.0
+ (c++)"pkgExtract::HandleOverwrites(pkgFLCache::NodeIterator, bool)@Base" 0.8.0
+ (c++)"pkgExtract::Fail(pkgDirStream::Item&, int)@Base" 0.8.0
+ (c++)"pkgExtract::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
+ (c++)"pkgExtract::Aborted()@Base" 0.8.0
+ (c++)"pkgExtract::Finished()@Base" 0.8.0
+ (c++)"pkgExtract::pkgExtract(pkgFLCache&, pkgCache::VerIterator)@Base" 0.8.0
+ (c++)"pkgExtract::~pkgExtract()@Base" 0.8.0
+ (c++)"pkgFLCache::TreeLookup(unsigned int*, char const*, char const*, unsigned long, unsigned int*, bool)@Base" 0.8.0
+ (c++)"pkgFLCache::AddConfFile(char const*, char const*, pkgFLCache::PkgIterator const&, unsigned char const*)@Base" 0.8.0
+ (c++)"pkgFLCache::AddDiversion(pkgFLCache::PkgIterator const&, char const*, char const*)@Base" 0.8.0
+ (c++)"pkgFLCache::BeginDiverLoad()@Base" 0.8.0
+ (c++)"pkgFLCache::FinishDiverLoad()@Base" 0.8.0
+ (c++)"pkgFLCache::GetPkg(char const*, char const*, bool)@Base" 0.8.0
+ (c++)"pkgFLCache::Header::Header()@Base" 0.8.0
+ (c++)"pkgFLCache::GetNode(char const*, char const*, unsigned int, bool, bool)@Base" 0.8.0
+ (c++)"pkgFLCache::DropNode(unsigned int)@Base" 0.8.0
+ (c++)"pkgFLCache::HashNode(pkgFLCache::NodeIterator const&)@Base" 0.8.0
+ (c++)"pkgFLCache::PrintTree(unsigned int, unsigned long)@Base" 0.8.0
+ (c++)"pkgFLCache::pkgFLCache(DynamicMMap&)@Base" 0.8.0
+ (c++)"pkgDirStream::FinishedFile(pkgDirStream::Item&, int)@Base" 0.8.0
+ (c++)"pkgDirStream::Fail(pkgDirStream::Item&, int)@Base" 0.8.0
+ (c++)"pkgDirStream::DoItem(pkgDirStream::Item&, int&)@Base" 0.8.0
+ (c++)"pkgDirStream::Process(pkgDirStream::Item&, unsigned char const*, unsigned long long, unsigned long long)@Base" 1.0.5
+ (c++)"pkgDirStream::~pkgDirStream()@Base" 0.8.0
+ (c++|optional)"pkgCache::DepIterator::operator++(int)@Base" 0.8.0
+ (c++|optional)"pkgCache::DepIterator::operator++()@Base" 0.8.0
+ (c++|optional)"pkgCache::VerIterator::operator++(int)@Base" 0.8.0
+ (c++|optional)"pkgCache::VerIterator::operator++()@Base" 0.8.0
+ (c++)"ARArchive::LoadHeaders()@Base" 0.8.0
+ (c++)"ARArchive::ARArchive(FileFd&)@Base" 0.8.0
+ (c++)"ARArchive::~ARArchive()@Base" 0.8.0
+ (c++)"pkgFLCache::NodeIterator::RealPackage() const@Base" 0.8.0
+ (c++)"pkgFLCache::Header::CheckSizes(pkgFLCache::Header&) const@Base" 0.8.0
+ (c++|optional)"pkgCache::DepIterator::OwnerPointer() const@Base" 0.8.0
+ (c++|optional)"pkgCache::VerIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"ARArchive::FindMember(char const*) const@Base" 0.8.0
+ (c++)"typeinfo for ExtractTar@Base" 0.8.0
+ (c++)"typeinfo for pkgExtract@Base" 0.8.0
+ (c++)"typeinfo for pkgDirStream@Base" 0.8.0
+ (c++)"typeinfo for debDebFile::ControlExtract@Base" 0.8.0
+ (c++)"typeinfo for debDebFile::MemControlExtract@Base" 0.8.0
+ (c++|optional)"typeinfo for pkgCache::DepIterator@Base" 0.8.0
+ (c++|optional)"typeinfo for pkgCache::VerIterator@Base" 0.8.0
+ (c++|optional)"typeinfo for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
+ (c++|optional)"typeinfo for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
+ (c++)"typeinfo name for ExtractTar@Base" 0.8.0
+ (c++)"typeinfo name for pkgExtract@Base" 0.8.0
+ (c++)"typeinfo name for pkgDirStream@Base" 0.8.0
+ (c++)"typeinfo name for debDebFile::ControlExtract@Base" 0.8.0
+ (c++)"typeinfo name for debDebFile::MemControlExtract@Base" 0.8.0
+ (c++|optional)"typeinfo name for pkgCache::DepIterator@Base" 0.8.0
+ (c++|optional)"typeinfo name for pkgCache::VerIterator@Base" 0.8.0
+ (c++|optional)"typeinfo name for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
+ (c++|optional)"typeinfo name for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
+ (c++)"vtable for ExtractTar@Base" 0.8.0
+ (c++)"vtable for pkgExtract@Base" 0.8.0
+ (c++)"vtable for pkgDirStream@Base" 0.8.0
+ (c++)"vtable for debDebFile::ControlExtract@Base" 0.8.0
+ (c++)"vtable for debDebFile::MemControlExtract@Base" 0.8.0
+ (c++|optional)"vtable for pkgCache::DepIterator@Base" 0.8.0
+ (c++|optional)"vtable for pkgCache::VerIterator@Base" 0.8.0
+ (c++|optional)"vtable for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
+ (c++|optional)"vtable for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
+### gcc artefacts
+ (c++|optional=std)"std::vector<APT::Configuration::Compressor, std::allocator<APT::Configuration::Compressor> >::~vector()@Base" 0.8.12
+### try to ignore std:: template instances
+ (c++|regex|optional=std)"^std::basic_string<.+ >\(.+\)@Base$" 0.8.0
+ (c++|regex|optional=std)"^typeinfo name for std::iterator<.*>@Base$" 0.8.0
+ (c++|regex|optional=std)"^typeinfo for std::iterator<.*>@Base$" 0.8.0
+ (c++|optional=std)"std::ctype<char>::do_widen(char) const@Base" 1.0.3
diff --git a/debian/libapt-pkg4.12.install.in b/debian/libapt-pkg4.12.install.in
deleted file mode 100644 (file)
index 56bed39..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-bin/libapt-pkg*.so.* usr/lib/@DEB_HOST_MULTIARCH@/
-usr/share/locale/*/*/libapt-pkg*.mo
diff --git a/debian/libapt-pkg4.12.symbols b/debian/libapt-pkg4.12.symbols
deleted file mode 100644 (file)
index d481e51..0000000
+++ /dev/null
@@ -1,1629 +0,0 @@
-libapt-pkg.so.4.12 libapt-pkg4.12 #MINVER#
-* Build-Depends-Package: libapt-pkg-dev
- TFRewritePackageOrder@Base 0.8.0
- TFRewriteSourceOrder@Base 0.8.0
- (c++)"FileExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"IdentCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int)@Base" 0.8.0
- (c++)"ListUpdate(pkgAcquireStatus&, pkgSourceList&, int)@Base" 0.8.0
- (c++)"MountCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"ParseCWord(char const*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
- (c++)"ReadPinDir(pkgPolicy&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"RunScripts(char const*)@Base" 0.8.0
- (c++)"SafeGetCWD()@Base" 0.8.0
- (c++)"parsenetrc(char*, char*, char*, char*)@Base" 0.8.0
- (c++)"QuoteString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0
- (c++)"ReadPinFile(pkgPolicy&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"RegexChoice(RxChoiceList*, char const**, char const**)@Base" 0.8.0
- (c++)"SetNonBlock(int, bool)@Base" 0.8.0
- (c++)"flExtension(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"Base64Encode(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"ReadMessages(int, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.8.0
- (c++)"SetCloseExec(int, bool)@Base" 0.8.0
- (c++)"StringToBool(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 0.8.0
- (c++)"UnmountCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"_GetErrorObj()@Base" 0.8.0
- (c++)"pkgFixBroken(pkgDepCache&)@Base" 0.8.0
- (c++)"DeQuoteString(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)@Base" 0.8.0
- (c++)"DeQuoteString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"OutputInDepth(unsigned long, char const*)@Base" 0.8.0
- (c++)"ReadConfigDir(Configuration&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, unsigned int const&)@Base" 0.8.0
- (c++)"URItoFileName(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"UTF8ToCodeset(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)@Base" 0.8.0
- (c++)"pkgAllUpgrade(pkgDepCache&)@Base" 0.8.0
- (c++)"pkgInitConfig(Configuration&)@Base" 0.8.0
- (c++)"pkgInitSystem(Configuration&, pkgSystem*&)@Base" 0.8.0
- (c++)"safe_snprintf(char*, char*, char const*, ...)@Base" 0.8.0
- (c++)"stringcasecmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char const*, char const*)@Base" 0.8.0
- (c++)"stringcasecmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)@Base" 0.8.0
- (c++)"stringcasecmp(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0
- (c++)"stringcasecmp(char const*, char const*, char const*, char const*)@Base" 0.8.0
- (c++)"tolower_ascii(int)@Base" 0.8.0
- (c++)"ParseQuoteWord(char const*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
- (c++)"ReadConfigFile(Configuration&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, unsigned int const&)@Base" 0.8.0
- (c++)"TokSplitString(char, char*, char**, unsigned long)@Base" 0.8.0
- (c++)"maybe_add_auth(URI&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgApplyStatus(pkgDepCache&)@Base" 0.8.0
- (c++)"pkgDistUpgrade(pkgDepCache&)@Base" 0.8.0
- (c++)"CheckDomainList(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"CreateDirectory(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"DirectoryExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"VectorizeString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const&)@Base" 0.8.0
- (c++)"pkgPrioSortList(pkgCache&, pkgCache::Version**)@Base" 0.8.0
- (c++)"pkgMakeStatusCache(pkgSourceList&, OpProgress&, MMap**, bool)@Base" 0.8.0
- (c++)"pkgMinimizeUpgrade(pkgDepCache&)@Base" 0.8.0
- (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool const&)@Base" 0.8.0
- (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&)@Base" 0.8.0
- (c++)"pkgMakeOnlyStatusCache(OpProgress&, DynamicMMap**)@Base" 0.8.0
- (c++)"WaitFd(int, bool, unsigned long)@Base" 0.8.0
- (c++)"GetLock(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
- (c++)"Hex2Num(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char*, unsigned int)@Base" 0.8.0
- (c++)"CopyFile(FileFd&, FileFd&)@Base" 0.8.0
- (c++)"ExecFork()@Base" 0.8.0
- (c++)"ExecWait(int, char const*, bool)@Base" 0.8.0
- (c++)"StrToNum(char const*, unsigned long&, unsigned int, unsigned int)@Base" 0.8.0
- (c++)"SubstVar(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"SubstVar(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, SubstVar const*)@Base" 0.8.0
- (c++)"flNoLink(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"flNotDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"ioprintf(std::basic_ostream<char, std::char_traits<char> >&, char const*, ...)@Base" 0.8.0
- (c++)"IsMounted(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
- (c++)"LookupTag(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*, char const*)@Base" 0.8.0
- (c++)"SizeToStr(double)@Base" 0.8.0
- (c++)"TFRewrite(_IO_FILE*, pkgTagSection const&, char const**, TFRewriteData*)@Base" 0.8.0
- (c++)"TimeToStr(unsigned long)@Base" 0.8.0
- (c++)"_strstrip(char*)@Base" 0.8.0
- (c++)"flCombine(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"flNotFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"stringcmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char const*, char const*)@Base" 0.8.0
- (c++)"stringcmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)@Base" 0.8.0
- (c++)"stringcmp(char const*, char const*, char const*, char const*)@Base" 0.8.0
- (c++)"strprintf(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char const*, ...)@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::DepIterator>::toReMap@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::GrpIterator>::toReMap@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::PkgIterator>::toReMap@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::PrvIterator>::toReMap@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::VerIterator>::toReMap@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::DescIterator>::toReMap@Base" 0.8.0
- (c++)"guard variable for pkgCacheGenerator::Dynamic<pkgCache::PkgFileIterator>::toReMap@Base" 0.8.0
- (c++)"HashString::SupportedHashes()@Base" 0.8.0
- (c++)"HashString::_SupportedHashes@Base" 0.8.0
- (c++)"HashString::HashString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"HashString::HashString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"HashString::HashString()@Base" 0.8.0
- (c++)"HashString::~HashString()@Base" 0.8.0
- (c++)"OpProgress::CheckChange(float)@Base" 0.8.0
- (c++)"OpProgress::Done()@Base" 0.8.0
- (c++)"OpProgress::Update()@Base" 0.8.0
- (c++)"OpProgress::OpProgress()@Base" 0.8.0
- (c++)"OpProgress::~OpProgress()@Base" 0.8.0
- (c++)"SourceCopy::GetFileName()@Base" 0.8.0
- (c++)"SourceCopy::RewriteEntry(_IO_FILE*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"SourceCopy::Type()@Base" 0.8.0
- (c++)"SourceCopy::~SourceCopy()@Base" 0.8.0
- (c++)"pkgAcqFile::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcqFile::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqFile::DescURI()@Base" 0.8.0
- (c++)"pkgAcqFile::HashSum()@Base" 0.8.0
- (c++)"pkgAcqFile::~pkgAcqFile()@Base" 0.8.0
- (c++)"pkgAcquire::WorkerStep(pkgAcquire::Worker*)@Base" 0.8.0
- (c++)"pkgAcquire::FetchNeeded()@Base" 0.8.0
- (c++)"pkgAcquire::TotalNeeded()@Base" 0.8.0
- (c++)"pkgAcquire::MethodConfig::MethodConfig()@Base" 0.8.0
- (c++)"pkgAcquire::PartialPresent()@Base" 0.8.0
- (c++)"pkgAcquire::Add(pkgAcquire::Item*)@Base" 0.8.0
- (c++)"pkgAcquire::Add(pkgAcquire::Worker*)@Base" 0.8.0
- (c++)"pkgAcquire::Run(int)@Base" 0.8.0
- (c++)"pkgAcquire::Bump()@Base" 0.8.0
- (c++)"pkgAcquire::Item::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcquire::Item::ReportMirrorFailure(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcquire::Item::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcquire::Item::Rename(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcquire::Item::HashSum()@Base" 0.8.0
- (c++)"pkgAcquire::Item::Finished()@Base" 0.8.0
- (c++)"pkgAcquire::Item::IsTrusted()@Base" 0.8.0
- (c++)"pkgAcquire::Item::ShortDesc()@Base" 0.8.0
- (c++)"pkgAcquire::Item::Item(pkgAcquire*)@Base" 0.8.0
- (c++)"pkgAcquire::Item::~Item()@Base" 0.8.0
- (c++)"pkgAcquire::Clean(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Bump()@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Cycle()@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Dequeue(pkgAcquire::Item*)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Enqueue(pkgAcquire::ItemDesc&)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Startup()@Base" 0.8.0
- (c++)"pkgAcquire::Queue::FindItem(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::Worker*)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::ItemDone(pkgAcquire::Queue::QItem*)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Shutdown(bool)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::Queue(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire*)@Base" 0.8.0
- (c++)"pkgAcquire::Queue::~Queue()@Base" 0.8.0
- (c++)"pkgAcquire::Setup(pkgAcquireStatus*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgAcquire::Remove(pkgAcquire::Item*)@Base" 0.8.0
- (c++)"pkgAcquire::Remove(pkgAcquire::Worker*)@Base" 0.8.0
- (c++)"pkgAcquire::RunFds(fd_set*, fd_set*)@Base" 0.8.0
- (c++)"pkgAcquire::SetFds(int&, fd_set*, fd_set*)@Base" 0.8.0
- (c++)"pkgAcquire::UriEnd()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::OutFdReady()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::MediaChange(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcquire::Worker::RunMessages()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::Capabilities(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcquire::Worker::ReadMessages()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::MethodFailure()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::SendConfiguration()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::Pulse()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::Start()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::ItemDone()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::Construct()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::InFdReady()@Base" 0.8.0
- (c++)"pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem*)@Base" 0.8.0
- (c++)"pkgAcquire::Worker::Worker(pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcquire::Worker::Worker(pkgAcquire::Queue*, pkgAcquire::MethodConfig*, pkgAcquireStatus*)@Base" 0.8.0
- (c++)"pkgAcquire::Worker::~Worker()@Base" 0.8.0
- (c++)"pkgAcquire::Dequeue(pkgAcquire::Item*)@Base" 0.8.0
- (c++)"pkgAcquire::Enqueue(pkgAcquire::ItemDesc&)@Base" 0.8.0
- (c++)"pkgAcquire::ItemDesc::~ItemDesc()@Base" 0.8.0
- (c++)"pkgAcquire::Shutdown()@Base" 0.8.0
- (c++)"pkgAcquire::UriBegin()@Base" 0.8.0
- (c++)"pkgAcquire::GetConfig(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcquire::QueueName(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig const*&)@Base" 0.8.0
- (c++)"pkgAcquire::pkgAcquire(pkgAcquireStatus*)@Base" 0.8.0
- (c++)"pkgAcquire::pkgAcquire()@Base" 0.8.0
- (c++)"pkgAcquire::~pkgAcquire()@Base" 0.8.0
- (c++)"pkgRecords::Lookup(pkgCache::VerFileIterator const&)@Base" 0.8.0
- (c++)"pkgRecords::Lookup(pkgCache::DescFileIterator const&)@Base" 0.8.0
- (c++)"pkgRecords::Parser::Maintainer()@Base" 0.8.0
- (c++)"pkgRecords::Parser::SHA256Hash()@Base" 0.8.0
- (c++)"pkgRecords::Parser::Name()@Base" 0.8.0
- (c++)"pkgRecords::Parser::GetRec(char const*&, char const*&)@Base" 0.8.0
- (c++)"pkgRecords::Parser::MD5Hash()@Base" 0.8.0
- (c++)"pkgRecords::Parser::FileName()@Base" 0.8.0
- (c++)"pkgRecords::Parser::Homepage()@Base" 0.8.0
- (c++)"pkgRecords::Parser::LongDesc()@Base" 0.8.0
- (c++)"pkgRecords::Parser::SHA1Hash()@Base" 0.8.0
- (c++)"pkgRecords::Parser::ShortDesc()@Base" 0.8.0
- (c++)"pkgRecords::Parser::SourcePkg()@Base" 0.8.0
- (c++)"pkgRecords::Parser::SourceVer()@Base" 0.8.0
- (c++)"pkgRecords::pkgRecords(pkgCache&)@Base" 0.8.0
- (c++)"pkgRecords::~pkgRecords()@Base" 0.8.0
- (c++)"pkgTagFile::Step(pkgTagSection&)@Base" 0.8.0
- (c++)"pkgTagFile::~pkgTagFile()@Base" 0.8.0
- (c++)"CdromDevice::~CdromDevice()@Base" 0.8.0
- (c++)"CommandLine::DispatchArg(CommandLine::Dispatch*, bool)@Base" 0.8.0
- (c++)"CommandLine::SaveInConfig(unsigned int const&, char const* const*)@Base" 0.8.0
- (c++)"CommandLine::Parse(int, char const**)@Base" 0.8.0
- (c++)"CommandLine::HandleOpt(int&, int, char const**, char const*&, CommandLine::Args*, bool)@Base" 0.8.0
- (c++)"CommandLine::CommandLine(CommandLine::Args*, Configuration*)@Base" 0.8.0
- (c++)"CommandLine::~CommandLine()@Base" 0.8.0
- (c++)"DynamicMMap::WriteString(char const*, unsigned long)@Base" 0.8.0
- (c++)"DynamicMMap::Grow()@Base" 0.8.0
- (c++)"DynamicMMap::Allocate(unsigned long)@Base" 0.8.0
- (c++)"DynamicMMap::DynamicMMap(FileFd&, unsigned long, unsigned long const&, unsigned long const&, unsigned long const&)@Base" 0.8.0
- (c++)"DynamicMMap::DynamicMMap(unsigned long, unsigned long const&, unsigned long const&, unsigned long const&)@Base" 0.8.0
- (c++)"DynamicMMap::~DynamicMMap()@Base" 0.8.0
- (c++)"GlobalError::DumpErrors(std::basic_ostream<char, std::char_traits<char> >&, GlobalError::MsgType const&, bool const&)@Base" 0.8.0
- (c++)"GlobalError::PopMessage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
- (c++)"GlobalError::InsertErrno(GlobalError::MsgType const&, char const*, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::PushToStack()@Base" 0.8.0
- (c++)"GlobalError::RevertToStack()@Base" 0.8.0
- (c++)"GlobalError::MergeWithStack()@Base" 0.8.0
- (c++)"GlobalError::Debug(char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Errno(char const*, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Error(char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Fatal(char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::DebugE(char const*, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::FatalE(char const*, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Insert(GlobalError::MsgType const&, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Notice(char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Discard()@Base" 0.8.0
- (c++)"GlobalError::NoticeE(char const*, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::Warning(char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::WarningE(char const*, char const*, ...)@Base" 0.8.0
- (c++)"GlobalError::GlobalError()@Base" 0.8.0
- (c++)"PackageCopy::GetFileName()@Base" 0.8.0
- (c++)"PackageCopy::RewriteEntry(_IO_FILE*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"PackageCopy::Type()@Base" 0.8.0
- (c++)"PackageCopy::~PackageCopy()@Base" 0.8.0
- (c++)"pkgAcqIndex::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcqIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqIndex::DescURI()@Base" 0.8.0
- (c++)"pkgAcqIndex::HashSum()@Base" 0.8.0
- (c++)"pkgAcqIndex::pkgAcqIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashString, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqIndex::~pkgAcqIndex()@Base" 0.8.0
- (c++)"pkgDepCache::IsDeleteOk(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0
- (c++)"pkgDepCache::MarkDelete(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0
- (c++)"pkgDepCache::StateCache::StripEpoch(char const*)@Base" 0.8.0
- (c++)"pkgDepCache::StateCache::Update(pkgCache::PkgIterator, pkgCache&)@Base" 0.8.0
- (c++)"pkgDepCache::ActionGroup::release()@Base" 0.8.0
- (c++)"pkgDepCache::ActionGroup::ActionGroup(pkgDepCache&)@Base" 0.8.0
- (c++)"pkgDepCache::ActionGroup::~ActionGroup()@Base" 0.8.0
- (c++)"pkgDepCache::IsInstallOk(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0
- (c++)"pkgDepCache::MarkInstall(pkgCache::PkgIterator const&, bool, unsigned long, bool, bool)@Base" 0.8.0
- (c++)"pkgDepCache::MarkPackage(pkgCache::PkgIterator const&, pkgCache::VerIterator const&, bool const&, bool const&)@Base" 0.8.0
- (c++)"pkgDepCache::MarkRequired(pkgDepCache::InRootSetFunc&)@Base" 0.8.0
- (c++)"pkgDepCache::SetReInstall(pkgCache::PkgIterator const&, bool)@Base" 0.8.0
- (c++)"pkgDepCache::VersionState(pkgCache::DepIterator, unsigned char, unsigned char, unsigned char)@Base" 0.8.0
- (c++)"pkgDepCache::BuildGroupOrs(pkgCache::VerIterator const&)@Base" 0.8.0
- (c++)"pkgDepCache::InRootSetFunc::InRootSet(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgDepCache::InRootSetFunc::~InRootSetFunc()@Base" 0.8.0
- (c++)"pkgDepCache::readStateFile(OpProgress*)@Base" 0.8.0
- (c++)"pkgDepCache::GetRootSetFunc()@Base" 0.8.0
- (c++)"pkgDepCache::UpdateVerState(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgDepCache::writeStateFile(OpProgress*, bool)@Base" 0.8.0
- (c++)"pkgDepCache::DependencyState(pkgCache::DepIterator&)@Base" 0.8.0
- (c++)"pkgDepCache::DefaultRootSetFunc::InRootSet(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0
- (c++)"pkgDepCache::MarkFollowsSuggests()@Base" 0.8.0
- (c++)"pkgDepCache::MarkFollowsRecommends()@Base" 0.8.0
- (c++)"pkgDepCache::Init(OpProgress*)@Base" 0.8.0
- (c++)"pkgDepCache::Sweep()@Base" 0.8.0
- (c++)"pkgDepCache::Policy::IsImportantDep(pkgCache::DepIterator const&)@Base" 0.8.0
- (c++)"pkgDepCache::Policy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgDepCache::Policy::~Policy()@Base" 0.8.0
- (c++)"pkgDepCache::Update(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgDepCache::Update(OpProgress*)@Base" 0.8.0
- (c++)"pkgDepCache::Update(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgDepCache::CheckDep(pkgCache::DepIterator, int, pkgCache::PkgIterator&)@Base" 0.8.0
- (c++)"pkgDepCache::MarkAuto(pkgCache::PkgIterator const&, bool)@Base" 0.8.0
- (c++)"pkgDepCache::MarkKeep(pkgCache::PkgIterator const&, bool, bool, unsigned long)@Base" 0.8.0
- (c++)"pkgDepCache::pkgDepCache(pkgCache*, pkgDepCache::Policy*)@Base" 0.8.0
- (c++)"pkgDepCache::~pkgDepCache()@Base" 0.8.0
- (c++)"pkgSimulate::ShortBreaks()@Base" 0.8.0
- (c++)"pkgSimulate::Policy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgSimulate::Policy::~Policy()@Base" 0.8.0
- (c++)"pkgSimulate::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0
- (c++)"pkgSimulate::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgSimulate::Describe(pkgCache::PkgIterator, std::basic_ostream<char, std::char_traits<char> >&, bool, bool)@Base" 0.8.0
- (c++)"pkgSimulate::Configure(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgSimulate::pkgSimulate(pkgDepCache*)@Base" 0.8.0
- (c++)"pkgSimulate::~pkgSimulate()@Base" 0.8.0
- (c++)"debIFTypePkg::~debIFTypePkg()@Base" 0.8.0
- (c++)"debIFTypeSrc::~debIFTypeSrc()@Base" 0.8.0
- (c++)"debSLTypeDeb::~debSLTypeDeb()@Base" 0.8.0
- (c++)"indexRecords::Load(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"indexRecords::Lookup(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"indexRecords::MetaKeys()@Base" 0.8.0
- (c++)"indexRecords::indexRecords(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"indexRecords::indexRecords()@Base" 0.8.0
- (c++)"indexRecords::~indexRecords()@Base" 0.8.0
- (c++)"pkgAcqMethod::FetchResult::TakeHashes(Hashes&)@Base" 0.8.0
- (c++)"pkgAcqMethod::FetchResult::FetchResult()@Base" 0.8.0
- (c++)"pkgAcqMethod::Configuration(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqMethod::Log(char const*, ...)@Base" 0.8.0
- (c++)"pkgAcqMethod::Run(bool)@Base" 0.8.0
- (c++)"pkgAcqMethod::Exit()@Base" 0.8.0
- (c++)"pkgAcqMethod::Fail(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
- (c++)"pkgAcqMethod::Fail(bool)@Base" 0.8.0
- (c++)"pkgAcqMethod::Fetch(pkgAcqMethod::FetchItem*)@Base" 0.8.0
- (c++)"pkgAcqMethod::Status(char const*, ...)@Base" 0.8.0
- (c++)"pkgAcqMethod::URIDone(pkgAcqMethod::FetchResult&, pkgAcqMethod::FetchResult*)@Base" 0.8.0
- (c++)"pkgAcqMethod::Redirect(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgAcqMethod::URIStart(pkgAcqMethod::FetchResult&)@Base" 0.8.0
- (c++)"pkgAcqMethod::MediaFail(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqMethod::pkgAcqMethod(char const*, unsigned long)@Base" 0.8.0
- (c++)"pkgAcqMethod::~pkgAcqMethod()@Base" 0.8.0
- (c++)"pkgCacheFile::BuildCaches(OpProgress*, bool)@Base" 0.8.0
- (c++)"pkgCacheFile::BuildPolicy(OpProgress*)@Base" 0.8.0
- (c++)"pkgCacheFile::BuildDepCache(OpProgress*)@Base" 0.8.0
- (c++)"pkgCacheFile::BuildSourceList(OpProgress*)@Base" 0.8.0
- (c++)"pkgCacheFile::Open(OpProgress*, bool)@Base" 0.8.0
- (c++)"pkgCacheFile::Close()@Base" 0.8.0
- (c++)"pkgCacheFile::pkgCacheFile()@Base" 0.8.0
- (c++)"pkgCacheFile::~pkgCacheFile()@Base" 0.8.0
- (c++)"pkgIndexFile::LanguageCode()@Base" 0.8.0
- (c++)"pkgIndexFile::CheckLanguageCode(char const*)@Base" 0.8.0
- (c++)"pkgIndexFile::TranslationsAvailable()@Base" 0.8.0
- (c++)"pkgIndexFile::Type::GlobalList@Base" 0.8.0
- (c++)"pkgIndexFile::Type::GlobalListLen@Base" 0.8.0
- (c++)"pkgIndexFile::Type::GetType(char const*)@Base" 0.8.0
- (c++)"pkgIndexFile::Type::Type()@Base" 0.8.0
- (c++)"pkgOrderList::VisitRDeps(bool (pkgOrderList::*)(pkgCache::DepIterator), pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgOrderList::OrderUnpack(std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)@Base" 0.8.0
- (c++)"pkgOrderList::DepConfigure(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::DepUnPackDep(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::DepUnPackPre(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::DepUnPackCrit(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::DepUnPackPreD(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::OrderCompareA(void const*, void const*)@Base" 0.8.0
- (c++)"pkgOrderList::OrderCompareB(void const*, void const*)@Base" 0.8.0
- (c++)"pkgOrderList::OrderCritical()@Base" 0.8.0
- (c++)"pkgOrderList::VisitProvides(pkgCache::DepIterator, bool)@Base" 0.8.0
- (c++)"pkgOrderList::OrderConfigure()@Base" 0.8.0
- (c++)"pkgOrderList::VisitRProvides(bool (pkgOrderList::*)(pkgCache::DepIterator), pkgCache::VerIterator)@Base" 0.8.0
- (c++)"pkgOrderList::Me@Base" 0.8.0
- (c++)"pkgOrderList::DoRun()@Base" 0.8.0
- (c++)"pkgOrderList::Score(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgOrderList::AddLoop(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::FileCmp(pkgCache::PkgIterator, pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgOrderList::CheckDep(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::DepRemove(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgOrderList::IsMissing(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgOrderList::VisitDeps(bool (pkgOrderList::*)(pkgCache::DepIterator), pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgOrderList::WipeFlags(unsigned long)@Base" 0.8.0
- (c++)"pkgOrderList::pkgOrderList(pkgDepCache*)@Base" 0.8.0
- (c++)"pkgOrderList::~pkgOrderList()@Base" 0.8.0
- (c++)"Configuration::MatchAgainstConfig::MatchAgainstConfig(char const*)@Base" 0.8.0
- (c++)"Configuration::MatchAgainstConfig::~MatchAgainstConfig()@Base" 0.8.0
- (c++)"Configuration::Set(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"Configuration::Set(char const*, int const&)@Base" 0.8.0
- (c++)"Configuration::Dump(std::basic_ostream<char, std::char_traits<char> >&)@Base" 0.8.0
- (c++)"Configuration::Clear(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"Configuration::Clear(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)@Base" 0.8.0
- (c++)"Configuration::Clear(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"Configuration::CndSet(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"Configuration::Lookup(char const*, bool const&)@Base" 0.8.0
- (c++)"Configuration::Lookup(Configuration::Item*, char const*, unsigned long const&, bool const&)@Base" 0.8.0
- (c++)"Configuration::Configuration(Configuration::Item const*)@Base" 0.8.0
- (c++)"Configuration::Configuration()@Base" 0.8.0
- (c++)"Configuration::~Configuration()@Base" 0.8.0
- (c++)"WeakPointable::~WeakPointable()@Base" 0.8.0
- (c++)"debListParser::NewVersion(pkgCache::VerIterator&)@Base" 0.8.0
- (c++)"debListParser::UsePackage(pkgCache::PkgIterator&, pkgCache::VerIterator&)@Base" 0.8.0
- (c++)"debListParser::Description()@Base" 0.8.0
- (c++)"debListParser::ParseStatus(pkgCache::PkgIterator&, pkgCache::VerIterator&)@Base" 0.8.0
- (c++)"debListParser::VersionHash()@Base" 0.8.0
- (c++)"debListParser::Architecture()@Base" 0.8.0
- (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&)@Base" 0.8.0
- (c++)"debListParser::ParseDepends(pkgCache::VerIterator&, char const*, unsigned int)@Base" 0.8.0
- (c++)"debListParser::ParseProvides(pkgCache::VerIterator&)@Base" 0.8.0
- (c++)"debListParser::ArchitectureAll()@Base" 0.8.0
- (c++)"debListParser::ConvertRelation(char const*, unsigned int&)@Base" 0.8.0
- (c++)"debListParser::Description_md5()@Base" 0.8.0
- (c++)"debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator&, FileFd&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"debListParser::UniqFindTagWrite(char const*)@Base" 0.8.0
- (c++)"debListParser::DescriptionLanguage()@Base" 0.8.0
- (c++)"debListParser::Size()@Base" 0.8.0
- (c++)"debListParser::Step()@Base" 0.8.0
- (c++)"debListParser::Offset()@Base" 0.8.0
- (c++)"debListParser::GetPrio(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"debListParser::Package()@Base" 0.8.0
- (c++)"debListParser::Version()@Base" 0.8.0
- (c++)"debListParser::GrabWord(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, debListParser::WordList*, unsigned char&)@Base" 0.8.0
- (c++)"debListParser::debListParser(FileFd*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"debListParser::~debListParser()@Base" 0.8.0
- (c++)"pkgAcqArchive::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqArchive::DescURI()@Base" 0.8.0
- (c++)"pkgAcqArchive::HashSum()@Base" 0.8.0
- (c++)"pkgAcqArchive::Finished()@Base" 0.8.0
- (c++)"pkgAcqArchive::IsTrusted()@Base" 0.8.0
- (c++)"pkgAcqArchive::QueueNext()@Base" 0.8.0
- (c++)"pkgAcqArchive::ShortDesc()@Base" 0.8.0
- (c++)"pkgAcqArchive::pkgAcqArchive(pkgAcquire*, pkgSourceList*, pkgRecords*, pkgCache::VerIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
- (c++)"pkgAcqArchive::~pkgAcqArchive()@Base" 0.8.0
- (c++)"pkgAcqMetaSig::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcqMetaSig::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqMetaSig::DescURI()@Base" 0.8.0
- (c++)"pkgAcqMetaSig::~pkgAcqMetaSig()@Base" 0.8.0
- (c++)"pkgSourceList::ReadAppend(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgSourceList::ReadMainList()@Base" 0.8.0
- (c++)"pkgSourceList::ReadSourceDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgSourceList::Read(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgSourceList::Type::GlobalList@Base" 0.8.0
- (c++)"pkgSourceList::Type::GlobalListLen@Base" 0.8.0
- (c++)"pkgSourceList::Type::GetType(char const*)@Base" 0.8.0
- (c++)"pkgSourceList::Type::Type()@Base" 0.8.0
- (c++)"pkgSourceList::Reset()@Base" 0.8.0
- (c++)"pkgSourceList::pkgSourceList(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgSourceList::pkgSourceList()@Base" 0.8.0
- (c++)"pkgSourceList::~pkgSourceList()@Base" 0.8.0
- (c++)"pkgSrcRecords::File::~File()@Base" 0.8.0
- (c++)"pkgSrcRecords::Find(char const*, bool const&)@Base" 0.8.0
- (c++)"pkgSrcRecords::Parser::BuildDepRec::~BuildDepRec()@Base" 0.8.0
- (c++)"pkgSrcRecords::Parser::BuildDepType(unsigned char const&)@Base" 0.8.0
- (c++)"pkgSrcRecords::Restart()@Base" 0.8.0
- (c++)"pkgSrcRecords::pkgSrcRecords(pkgSourceList&)@Base" 0.8.0
- (c++)"pkgSrcRecords::~pkgSrcRecords()@Base" 0.8.0
- (c++)"pkgTagSection::TrimRecord(bool, char const*&)@Base" 0.8.0
- (c++)"pkgTagSection::Scan(char const*, unsigned long)@Base" 0.8.0
- (c++)"pkgTagSection::Trim()@Base" 0.8.0
- (c++)"pkgVendorList::CreateList(Configuration&)@Base" 0.8.0
- (c++)"pkgVendorList::FindVendor(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)@Base" 0.8.0
- (c++)"pkgVendorList::ReadMainList()@Base" 0.8.0
- (c++)"pkgVendorList::LookupFingerprint(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgVendorList::Read(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgVendorList::~pkgVendorList()@Base" 0.8.0
- (c++)"OpTextProgress::Done()@Base" 0.8.0
- (c++)"OpTextProgress::Write(char const*)@Base" 0.8.0
- (c++)"OpTextProgress::Update()@Base" 0.8.0
- (c++)"OpTextProgress::OpTextProgress(Configuration&)@Base" 0.8.0
- (c++)"OpTextProgress::~OpTextProgress()@Base" 0.8.0
- (c++)"debIFTypeTrans::~debIFTypeTrans()@Base" 0.8.0
- (c++)"debStatusIndex::debStatusIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"debStatusIndex::~debStatusIndex()@Base" 0.8.0
- (c++)"debIFTypeStatus::~debIFTypeStatus()@Base" 0.8.0
- (c++)"debRecordParser::Maintainer()@Base" 0.8.0
- (c++)"debRecordParser::SHA256Hash()@Base" 0.8.0
- (c++)"debRecordParser::Jump(pkgCache::VerFileIterator const&)@Base" 0.8.0
- (c++)"debRecordParser::Jump(pkgCache::DescFileIterator const&)@Base" 0.8.0
- (c++)"debRecordParser::Name()@Base" 0.8.0
- (c++)"debRecordParser::GetRec(char const*&, char const*&)@Base" 0.8.0
- (c++)"debRecordParser::MD5Hash()@Base" 0.8.0
- (c++)"debRecordParser::FileName()@Base" 0.8.0
- (c++)"debRecordParser::Homepage()@Base" 0.8.0
- (c++)"debRecordParser::LongDesc()@Base" 0.8.0
- (c++)"debRecordParser::SHA1Hash()@Base" 0.8.0
- (c++)"debRecordParser::ShortDesc()@Base" 0.8.0
- (c++)"debRecordParser::SourcePkg()@Base" 0.8.0
- (c++)"debRecordParser::SourceVer()@Base" 0.8.0
- (c++)"debRecordParser::debRecordParser(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgCache&)@Base" 0.8.0
- (c++)"debRecordParser::~debRecordParser()@Base" 0.8.0
- (c++)"debReleaseIndex::GetIndexFiles()@Base" 0.8.0
- (c++)"debReleaseIndex::debSectionEntry::debSectionEntry(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&)@Base" 0.8.0
- (c++)"debReleaseIndex::PushSectionEntry(debReleaseIndex::debSectionEntry const*)@Base" 0.8.0
- (c++)"debReleaseIndex::PushSectionEntry(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, debReleaseIndex::debSectionEntry const*)@Base" 0.8.0
- (c++)"debReleaseIndex::PushSectionEntry(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, debReleaseIndex::debSectionEntry const*)@Base" 0.8.0
- (c++)"debReleaseIndex::debReleaseIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"debReleaseIndex::~debReleaseIndex()@Base" 0.8.0
- (c++)"debSLTypeDebSrc::~debSLTypeDebSrc()@Base" 0.8.0
- (c++)"debSourcesIndex::debSourcesIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
- (c++)"debSourcesIndex::~debSourcesIndex()@Base" 0.8.0
- (c++)"pkgAcqDiffIndex::ParseDiffIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqDiffIndex::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcqDiffIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqDiffIndex::DescURI()@Base" 0.8.0
- (c++)"pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashString)@Base" 0.8.0
- (c++)"pkgAcqDiffIndex::~pkgAcqDiffIndex()@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::QueueIndexes(bool)@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::VerifyVendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::RetrievalDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::DescURI()@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::AuthDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.0
- (c++)"pkgAcqMetaIndex::~pkgAcqMetaIndex()@Base" 0.8.0
- (c++)"pkgVersionMatch::ExpressionMatches(char const*, char const*)@Base" 0.8.0
- (c++)"pkgVersionMatch::ExpressionMatches(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0
- (c++)"pkgVersionMatch::Find(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgVersionMatch::MatchVer(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
- (c++)"pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator)@Base" 0.8.0
- (c++)"pkgVersionMatch::pkgVersionMatch(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgVersionMatch::MatchType)@Base" 0.8.0
- (c++)"pkgVersionMatch::~pkgVersionMatch()@Base" 0.8.0
- (c++)"TranslationsCopy::CopyTranslations(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, pkgCdromStatus*)@Base" 0.8.0
- (c++)"debPackagesIndex::debPackagesIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"debPackagesIndex::~debPackagesIndex()@Base" 0.8.0
- (c++)"pkgAcqIndexDiffs::QueueNextDiff()@Base" 0.8.0
- (c++)"pkgAcqIndexDiffs::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqIndexDiffs::Finish(bool)@Base" 0.8.0
- (c++)"pkgAcqIndexDiffs::DescURI()@Base" 0.8.0
- (c++)"pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashString, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<DiffInfo, std::allocator<DiffInfo> >)@Base" 0.8.0
- (c++)"pkgAcqIndexDiffs::~pkgAcqIndexDiffs()@Base" 0.8.0
- (c++)"pkgAcqIndexTrans::Custom600Headers()@Base" 0.8.0
- (c++)"pkgAcqIndexTrans::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
- (c++)"pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgAcqIndexTrans::~pkgAcqIndexTrans()@Base" 0.8.0
- (c++)"pkgAcquireStatus::Done(pkgAcquire::ItemDesc&)@Base" 0.8.0
- (c++)"pkgAcquireStatus::Fail(pkgAcquire::ItemDesc&)@Base" 0.8.0
- (c++)"pkgAcquireStatus::Stop()@Base" 0.8.0
- (c++)"pkgAcquireStatus::Fetch(pkgAcquire::ItemDesc&)@Base" 0.8.0
- (c++)"pkgAcquireStatus::Pulse(pkgAcquire*)@Base" 0.8.0
- (c++)"pkgAcquireStatus::Start()@Base" 0.8.0
- (c++)"pkgAcquireStatus::IMSHit(pkgAcquire::ItemDesc&)@Base" 0.8.0
- (c++)"pkgAcquireStatus::pkgAcquireStatus()@Base" 0.8.0
- (c++)"PreferenceSection::TrimRecord(bool, char const*&)@Base" 0.8.0
- (c++)"pkgArchiveCleaner::Go(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgCache&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::ListParser::NewDepends(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned int)@Base" 0.8.0
- (c++)"pkgCacheGenerator::ListParser::NewProvides(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::ListParser::CollectFileProvides(pkgCache&, pkgCache::VerIterator&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::NewFileVer(pkgCache::VerIterator&, pkgCacheGenerator::ListParser&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::NewPackage(pkgCache::PkgIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::SelectFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pkgIndexFile const&, unsigned long)@Base" 0.8.0
- (c++)"pkgCacheGenerator::FinishCache(OpProgress*)@Base" 0.8.0
- (c++)"pkgCacheGenerator::NewFileDesc(pkgCache::DescIterator&, pkgCacheGenerator::ListParser&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::MakeStatusCache(pkgSourceList&, OpProgress*, MMap**, bool)@Base" 0.8.0
- (c++)"pkgCacheGenerator::WriteUniqString(char const*, unsigned int)@Base" 0.8.0
- (c++)"pkgCacheGenerator::CreateDynamicMMap(FileFd*, unsigned long)@Base" 0.8.0
- (c++)"pkgCacheGenerator::MergeFileProvides(pkgCacheGenerator::ListParser&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::MakeOnlyStatusCache(OpProgress*, DynamicMMap**)@Base" 0.8.0
- (c++)"pkgCacheGenerator::ReMap(void const*, void const*)@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::DepIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::GrpIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::PkgIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::PrvIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::VerIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::DescIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::Dynamic<pkgCache::PkgFileIterator>::toReMap@Base" 0.8.0
- (c++)"pkgCacheGenerator::NewGroup(pkgCache::GrpIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCacheGenerator::MergeList(pkgCacheGenerator::ListParser&, pkgCache::VerIterator*)@Base" 0.8.0
- (c++)"pkgCacheGenerator::pkgCacheGenerator(DynamicMMap*, OpProgress*)@Base" 0.8.0
- (c++)"pkgCacheGenerator::~pkgCacheGenerator()@Base" 0.8.0
- (c++)"pkgPackageManager::FixMissing()@Base" 0.8.0
- (c++)"pkgPackageManager::EarlyRemove(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgPackageManager::GetArchives(pkgAcquire*, pkgSourceList*, pkgRecords*)@Base" 0.8.0
- (c++)"pkgPackageManager::SmartRemove(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgPackageManager::SmartUnPack(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgPackageManager::ConfigureAll()@Base" 0.8.0
- (c++)"pkgPackageManager::ImmediateAdd(pkgCache::PkgIterator, bool, unsigned int const&)@Base" 0.8.0
- (c++)"pkgPackageManager::OrderInstall()@Base" 0.8.0
- (c++)"pkgPackageManager::DepAlwaysTrue(pkgCache::DepIterator)@Base" 0.8.0
- (c++)"pkgPackageManager::CheckRConflicts(pkgCache::PkgIterator, pkgCache::DepIterator, char const*)@Base" 0.8.0
- (c++)"pkgPackageManager::CreateOrderList()@Base" 0.8.0
- (c++)"pkgPackageManager::DoInstallPostFork(int)@Base" 0.8.0
- (c++)"pkgPackageManager::Go(int)@Base" 0.8.0
- (c++)"pkgPackageManager::Reset()@Base" 0.8.0
- (c++)"pkgPackageManager::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0
- (c++)"pkgPackageManager::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgPackageManager::Configure(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgPackageManager::DoInstall(int)@Base" 0.8.0
- (c++)"pkgPackageManager::pkgPackageManager(pkgDepCache*)@Base" 0.8.0
- (c++)"pkgPackageManager::~pkgPackageManager()@Base" 0.8.0
- (c++)"debSrcRecordParser::BuildDepends(std::vector<pkgSrcRecords::Parser::BuildDepRec, std::allocator<pkgSrcRecords::Parser::BuildDepRec> >&, bool const&, bool const&)@Base" 0.8.0
- (c++)"debSrcRecordParser::Jump(unsigned long const&)@Base" 0.8.0
- (c++)"debSrcRecordParser::Step()@Base" 0.8.0
- (c++)"debSrcRecordParser::AsStr()@Base" 0.8.0
- (c++)"debSrcRecordParser::Files(std::vector<pkgSrcRecords::File, std::allocator<pkgSrcRecords::File> >&)@Base" 0.8.0
- (c++)"debSrcRecordParser::Offset()@Base" 0.8.0
- (c++)"debSrcRecordParser::Restart()@Base" 0.8.0
- (c++)"debSrcRecordParser::Binaries()@Base" 0.8.0
- (c++)"debSrcRecordParser::~debSrcRecordParser()@Base" 0.8.0
- (c++)"pkgProblemResolver::MakeScores()@Base" 0.8.0
- (c++)"pkgProblemResolver::ResolveByKeep()@Base" 0.8.0
- (c++)"pkgProblemResolver::InstallProtect()@Base" 0.8.0
- (c++)"pkgProblemResolver::This@Base" 0.8.0
- (c++)"pkgProblemResolver::Resolve(bool)@Base" 0.8.0
- (c++)"pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgProblemResolver::ScoreSort(void const*, void const*)@Base" 0.8.0
- (c++)"pkgProblemResolver::pkgProblemResolver(pkgDepCache*)@Base" 0.8.0
- (c++)"pkgProblemResolver::~pkgProblemResolver()@Base" 0.8.0
- (c++)"debVersioningSystem::CmpFragment(char const*, char const*, char const*, char const*)@Base" 0.8.0
- (c++)"debVersioningSystem::DoCmpVersion(char const*, char const*, char const*, char const*)@Base" 0.8.0
- (c++)"debVersioningSystem::DoCmpReleaseVer(char const*, char const*, char const*, char const*)@Base" 0.8.0
- (c++)"debVersioningSystem::UpstreamVersion(char const*)@Base" 0.8.0
- (c++)"debVersioningSystem::CheckDep(char const*, int, char const*)@Base" 0.8.0
- (c++)"debVersioningSystem::debVersioningSystem()@Base" 0.8.0
- (c++)"debVersioningSystem::~debVersioningSystem()@Base" 0.8.0
- (c++)"pkgUdevCdromDevices::Scan()@Base" 0.8.0
- (c++)"pkgUdevCdromDevices::Dlopen()@Base" 0.8.0
- (c++)"pkgUdevCdromDevices::pkgUdevCdromDevices()@Base" 0.8.0
- (c++)"pkgUdevCdromDevices::~pkgUdevCdromDevices()@Base" 0.8.0
- (c++)"pkgVersioningSystem::GlobalList@Base" 0.8.0
- (c++)"pkgVersioningSystem::GlobalListLen@Base" 0.8.0
- (c++)"pkgVersioningSystem::TestCompatibility(pkgVersioningSystem const&)@Base" 0.8.0
- (c++)"pkgVersioningSystem::GetVS(char const*)@Base" 0.8.0
- (c++)"pkgVersioningSystem::pkgVersioningSystem()@Base" 0.8.0
- (c++)"debTranslationsIndex::debTranslationsIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, char const*)@Base" 0.8.0
- (c++)"debTranslationsIndex::~debTranslationsIndex()@Base" 0.8.0
- (c++)"APT::CacheFilter::PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"APT::CacheFilter::PackageNameMatchesRegEx::~PackageNameMatchesRegEx()@Base" 0.8.0
- (c++)"APT::CacheFilter::PackageNameMatchesRegEx::operator()(pkgCache::GrpIterator const&)@Base" 0.8.0
- (c++)"APT::CacheFilter::PackageNameMatchesRegEx::operator()(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"APT::Configuration::getLanguages(bool const&, bool const&, char const**)@Base" 0.8.0
- (c++)"APT::Configuration::getArchitectures(bool const&)@Base" 0.8.0
- (c++)"APT::Configuration::checkArchitecture(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"APT::Configuration::getCompressionTypes(bool const&)@Base" 0.8.0
- (c++)"APT::CacheSetHelper::canNotFindPkgName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"APT::CacheSetHelper::canNotFindNewestVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"APT::CacheSetHelper::canNotFindCandidateVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"APT::CacheSetHelper::canNotFindInstalledVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"APT::CacheSetHelper::~CacheSetHelper()@Base" 0.8.0
- (c++)"URI::NoUserPassword(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"URI::CopyFrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"URI::SiteOnly(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"URI::~URI()@Base" 0.8.0
- (c++)"URI::operator std::basic_string<char, std::char_traits<char>, std::allocator<char> >()@Base" 0.8.0
- (c++)"MMap::Map(FileFd&)@Base" 0.8.0
- (c++)"MMap::Sync(unsigned long, unsigned long)@Base" 0.8.0
- (c++)"MMap::Sync()@Base" 0.8.0
- (c++)"MMap::Close(bool)@Base" 0.8.0
- (c++)"MMap::MMap(FileFd&, unsigned long)@Base" 0.8.0
- (c++)"MMap::MMap(unsigned long)@Base" 0.8.0
- (c++)"MMap::~MMap()@Base" 0.8.0
- (c++)"FileFd::Size()@Base" 0.8.0
- (c++)"FileFd::Sync()@Base" 0.8.0
- (c++)"FileFd::Tell()@Base" 0.8.0
- (c++)"FileFd::Close()@Base" 0.8.0
- (c++)"FileFd::~FileFd()@Base" 0.8.0
- (c++)"Vendor::CheckDist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"Vendor::Vendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Vendor::Fingerprint*, std::allocator<Vendor::Fingerprint*> >*)@Base" 0.8.0
- (c++)"Vendor::~Vendor()@Base" 0.8.0
- (c++)"DiffInfo::~DiffInfo()@Base" 0.8.0
- (c++)"pkgCache::CompTypeDeb(unsigned char)@Base" 0.8.0
- (c++)"pkgCache::DepIterator::GlobOr(pkgCache::DepIterator&, pkgCache::DepIterator&)@Base" 0.8.0
- (c++)"pkgCache::DepIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::DepIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::GrpIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::GrpIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::PrvIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::PrvIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::VerIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::VerIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::DescIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::DescIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::PkgFileIterator::IsOk()@Base" 0.8.0
- (c++)"pkgCache::PkgFileIterator::RelStr()@Base" 0.8.0
- (c++)"pkgCache::PkgFileIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::PkgFileIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::VerFileIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::VerFileIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::DescFileIterator::operator++(int)@Base" 0.8.0
- (c++)"pkgCache::DescFileIterator::operator++()@Base" 0.8.0
- (c++)"pkgCache::SingleArchFindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCache::ReMap(bool const&)@Base" 0.8.0
- (c++)"pkgCache::Header::Header()@Base" 0.8.0
- (c++)"pkgCache::DepType(unsigned char)@Base" 0.8.0
- (c++)"pkgCache::FindGrp(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCache::FindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCache::FindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgCache::CompType(unsigned char)@Base" 0.8.0
- (c++)"pkgCache::Priority(unsigned char)@Base" 0.8.0
- (c++)"pkgCache::pkgCache(MMap*, bool)@Base" 0.8.0
- (c++)"pkgCache::~pkgCache()@Base" 0.8.0
- (c++)"pkgCdrom::DropRepeats(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, char const*)@Base" 0.8.0
- (c++)"pkgCdrom::FindPackages(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, pkgCdromStatus*, unsigned int)@Base" 0.8.0
- (c++)"pkgCdrom::WriteDatabase(Configuration&)@Base" 0.8.0
- (c++)"pkgCdrom::DropBinaryArch(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.8.0
- (c++)"pkgCdrom::WriteSourceList(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, bool)@Base" 0.8.0
- (c++)"pkgCdrom::ReduceSourcelist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.8.0
- (c++)"pkgCdrom::Add(pkgCdromStatus*)@Base" 0.8.0
- (c++)"pkgCdrom::Ident(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, pkgCdromStatus*)@Base" 0.8.0
- (c++)"pkgCdrom::Score(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"IndexCopy::CopyPackages(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, pkgCdromStatus*)@Base" 0.8.0
- (c++)"IndexCopy::ReconstructChop(unsigned long&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"IndexCopy::ReconstructPrefix(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"IndexCopy::ConvertToSourceList(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
- (c++)"IndexCopy::ChopDirs(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)@Base" 0.8.0
- (c++)"IndexCopy::GrabFirst(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int)@Base" 0.8.0
- (c++)"SigVerify::CopyAndVerify(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)@Base" 0.8.0
- (c++)"SigVerify::CopyMetaIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"SigVerify::Verify(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, indexRecords*)@Base" 0.8.0
- (c++)"SigVerify::RunGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, int*)@Base" 0.8.0
- (c++)"debSystem::Initialize(Configuration&)@Base" 0.8.0
- (c++)"debSystem::CheckUpdates()@Base" 0.8.0
- (c++)"debSystem::AddStatusFiles(std::vector<pkgIndexFile*, std::allocator<pkgIndexFile*> >&)@Base" 0.8.0
- (c++)"debSystem::ArchiveSupported(char const*)@Base" 0.8.0
- (c++)"debSystem::Lock()@Base" 0.8.0
- (c++)"debSystem::Score(Configuration const&)@Base" 0.8.0
- (c++)"debSystem::UnLock(bool)@Base" 0.8.0
- (c++)"debSystem::debSystem()@Base" 0.8.0
- (c++)"debSystem::~debSystem()@Base" 0.8.0
- (c++)"pkgDPkgPM::SendV2Pkgs(_IO_FILE*)@Base" 0.8.0
- (c++)"pkgDPkgPM::DoTerminalPty(int)@Base" 0.8.0
- (c++)"pkgDPkgPM::WriteHistoryTag(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgDPkgPM::WriteApportReport(char const*, char const*)@Base" 0.8.0
- (c++)"pkgDPkgPM::RunScriptsWithPkgs(char const*)@Base" 0.8.0
- (c++)"pkgDPkgPM::handleDisappearAction(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
- (c++)"pkgDPkgPM::Go(int)@Base" 0.8.0
- (c++)"pkgDPkgPM::Reset()@Base" 0.8.0
- (c++)"pkgDPkgPM::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0
- (c++)"pkgDPkgPM::DoStdin(int)@Base" 0.8.0
- (c++)"pkgDPkgPM::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
- (c++)"pkgDPkgPM::OpenLog()@Base" 0.8.0
- (c++)"pkgDPkgPM::CloseLog()@Base" 0.8.0
- (c++)"pkgDPkgPM::Configure(pkgCache::PkgIterator)@Base" 0.8.0
- (c++)"pkgDPkgPM::pkgDPkgPM(pkgDepCache*)@Base" 0.8.0
- (c++)"pkgDPkgPM::~pkgDPkgPM()@Base" 0.8.0
- (c++)"pkgPolicy::GetPriority(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgPolicy::InitDefaults()@Base" 0.8.0
- (c++)"pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgPolicy::PkgPin::~PkgPin()@Base" 0.8.0
- (c++)"pkgPolicy::GetMatch(pkgCache::PkgIterator const&)@Base" 0.8.0
- (c++)"pkgPolicy::CreatePin(pkgVersionMatch::MatchType, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, short)@Base" 0.8.0
- (c++)"pkgPolicy::pkgPolicy(pkgCache*)@Base" 0.8.0
- (c++)"pkgPolicy::~pkgPolicy()@Base" 0.8.0
- (c++)"pkgSystem::GlobalList@Base" 0.8.0
- (c++)"pkgSystem::Initialize(Configuration&)@Base" 0.8.0
- (c++)"pkgSystem::GlobalListLen@Base" 0.8.0
- (c++)"pkgSystem::Score(Configuration const&)@Base" 0.8.0
- (c++)"pkgSystem::GetSystem(char const*)@Base" 0.8.0
- (c++)"pkgSystem::pkgSystem()@Base" 0.8.0
- (c++)"HashString::VerifyFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"HashString::empty() const@Base" 0.8.0
- (c++)"HashString::toStr() const@Base" 0.8.0
- (c++)"CommandLine::FileSize() const@Base" 0.8.0
- (c++)"GlobalError::empty(GlobalError::MsgType const&) const@Base" 0.8.0
- (c++)"debIFTypePkg::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0
- (c++)"debSLTypeDeb::CreateItem(std::vector<metaIndex*, std::allocator<metaIndex*> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const@Base" 0.8.0
- (c++)"indexRecords::GetValidUntil() const@Base" 0.8.0
- (c++)"indexRecords::GetExpectedDist() const@Base" 0.8.0
- (c++)"indexRecords::Exists(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"indexRecords::GetDist() const@Base" 0.8.0
- (c++)"indexRecords::CheckDist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"pkgIndexFile::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const&, pkgSrcRecords::File const&) const@Base" 0.8.0
- (c++)"pkgIndexFile::ArchiveInfo(pkgCache::VerIterator) const@Base" 0.8.0
- (c++)"pkgIndexFile::FindInCache(pkgCache&) const@Base" 0.8.0
- (c++)"pkgIndexFile::CreateSrcParser() const@Base" 0.8.0
- (c++)"pkgIndexFile::MergeFileProvides(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0
- (c++)"pkgIndexFile::MergeFileProvides(pkgCacheGenerator&, OpProgress&) const@Base" 0.8.0
- (c++)"pkgIndexFile::Type::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0
- (c++)"pkgIndexFile::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0
- (c++)"pkgIndexFile::Merge(pkgCacheGenerator&, OpProgress&) const@Base" 0.8.0
- (c++)"Configuration::FindVector(char const*) const@Base" 0.8.0
- (c++)"Configuration::MatchAgainstConfig::Match(char const*) const@Base" 0.8.0
- (c++)"Configuration::Find(char const*, char const*) const@Base" 0.8.0
- (c++)"Configuration::Item::FullTag(Configuration::Item const*) const@Base" 0.8.0
- (c++)"Configuration::FindB(char const*, bool const&) const@Base" 0.8.0
- (c++)"Configuration::FindI(char const*, int const&) const@Base" 0.8.0
- (c++)"Configuration::Exists(char const*) const@Base" 0.8.0
- (c++)"Configuration::FindAny(char const*, char const*) const@Base" 0.8.0
- (c++)"Configuration::FindDir(char const*, char const*) const@Base" 0.8.0
- (c++)"Configuration::FindFile(char const*, char const*) const@Base" 0.8.0
- (c++)"Configuration::ExistsAny(char const*) const@Base" 0.8.0
- (c++)"pkgSourceList::GetIndexes(pkgAcquire*, bool) const@Base" 0.8.0
- (c++)"pkgSourceList::Type::FixupURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const@Base" 0.8.0
- (c++)"pkgSourceList::Type::ParseLine(std::vector<metaIndex*, std::allocator<metaIndex*> >&, char const*, unsigned long const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"pkgSourceList::FindIndex(pkgCache::PkgFileIterator, pkgIndexFile*&) const@Base" 0.8.0
- (c++)"pkgTagSection::Find(char const*, char const*&, char const*&) const@Base" 0.8.0
- (c++)"pkgTagSection::Find(char const*, unsigned int&) const@Base" 0.8.0
- (c++)"pkgTagSection::FindI(char const*, long) const@Base" 0.8.0
- (c++)"pkgTagSection::FindS(char const*) const@Base" 0.8.0
- (c++)"pkgTagSection::FindULL(char const*, unsigned long long const&) const@Base" 0.8.0
- (c++)"pkgTagSection::FindFlag(char const*, unsigned long&, unsigned long) const@Base" 0.8.0
- (c++)"debStatusIndex::FindInCache(pkgCache&) const@Base" 0.8.0
- (c++)"debStatusIndex::HasPackages() const@Base" 0.8.0
- (c++)"debStatusIndex::Size() const@Base" 0.8.0
- (c++)"debStatusIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0
- (c++)"debStatusIndex::Exists() const@Base" 0.8.0
- (c++)"debStatusIndex::GetType() const@Base" 0.8.0
- (c++)"debStatusIndex::Describe(bool) const@Base" 0.8.0
- (c++)"debIFTypeStatus::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0
- (c++)"debReleaseIndex::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::GetIndexes(pkgAcquire*, bool const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::MetaIndexURI(char const*) const@Base" 0.8.0
- (c++)"debReleaseIndex::MetaIndexFile(char const*) const@Base" 0.8.0
- (c++)"debReleaseIndex::MetaIndexInfo(char const*) const@Base" 0.8.0
- (c++)"debReleaseIndex::IndexURISuffix(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::SourceIndexURI(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::ComputeIndexTargets() const@Base" 0.8.0
- (c++)"debReleaseIndex::SourceIndexURISuffix(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::Info(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::IndexURI(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"debReleaseIndex::IsTrusted() const@Base" 0.8.0
- (c++)"debSLTypeDebSrc::CreateItem(std::vector<metaIndex*, std::allocator<metaIndex*> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const@Base" 0.8.0
- (c++)"debSLTypeDebian::CreateItemInternal(std::vector<metaIndex*, std::allocator<metaIndex*> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> > const, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > const&) const@Base" 0.8.0
- (c++)"debSourcesIndex::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"debSourcesIndex::SourceInfo(pkgSrcRecords::Parser const&, pkgSrcRecords::File const&) const@Base" 0.8.0
- (c++)"debSourcesIndex::HasPackages() const@Base" 0.8.0
- (c++)"debSourcesIndex::CreateSrcParser() const@Base" 0.8.0
- (c++)"debSourcesIndex::Info(char const*) const@Base" 0.8.0
- (c++)"debSourcesIndex::Size() const@Base" 0.8.0
- (c++)"debSourcesIndex::Exists() const@Base" 0.8.0
- (c++)"debSourcesIndex::GetType() const@Base" 0.8.0
- (c++)"debSourcesIndex::Describe(bool) const@Base" 0.8.0
- (c++)"debSourcesIndex::IndexURI(char const*) const@Base" 0.8.0
- (c++)"debPackagesIndex::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"debPackagesIndex::ArchiveInfo(pkgCache::VerIterator) const@Base" 0.8.0
- (c++)"debPackagesIndex::FindInCache(pkgCache&) const@Base" 0.8.0
- (c++)"debPackagesIndex::HasPackages() const@Base" 0.8.0
- (c++)"debPackagesIndex::Info(char const*) const@Base" 0.8.0
- (c++)"debPackagesIndex::Size() const@Base" 0.8.0
- (c++)"debPackagesIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0
- (c++)"debPackagesIndex::Exists() const@Base" 0.8.0
- (c++)"debPackagesIndex::GetType() const@Base" 0.8.0
- (c++)"debPackagesIndex::Describe(bool) const@Base" 0.8.0
- (c++)"debPackagesIndex::IndexURI(char const*) const@Base" 0.8.0
- (c++)"debSrcRecordParser::Maintainer() const@Base" 0.8.0
- (c++)"debSrcRecordParser::Package() const@Base" 0.8.0
- (c++)"debSrcRecordParser::Section() const@Base" 0.8.0
- (c++)"debSrcRecordParser::Version() const@Base" 0.8.0
- (c++)"debTranslationsIndex::GetIndexes(pkgAcquire*) const@Base" 0.8.0
- (c++)"debTranslationsIndex::FindInCache(pkgCache&) const@Base" 0.8.0
- (c++)"debTranslationsIndex::HasPackages() const@Base" 0.8.0
- (c++)"debTranslationsIndex::Info(char const*) const@Base" 0.8.0
- (c++)"debTranslationsIndex::Size() const@Base" 0.8.0
- (c++)"debTranslationsIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.0
- (c++)"debTranslationsIndex::Exists() const@Base" 0.8.0
- (c++)"debTranslationsIndex::GetType() const@Base" 0.8.0
- (c++)"debTranslationsIndex::Describe(bool) const@Base" 0.8.0
- (c++)"debTranslationsIndex::IndexURI(char const*) const@Base" 0.8.0
- (c++)"Vendor::GetVendorID() const@Base" 0.8.0
- (c++)"Vendor::LookupFingerprint(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"pkgCache::DepIterator::AllTargets() const@Base" 0.8.0
- (c++)"pkgCache::DepIterator::IsCritical() const@Base" 0.8.0
- (c++)"pkgCache::DepIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::DepIterator::SmartTargetPkg(pkgCache::PkgIterator&) const@Base" 0.8.0
- (c++)"pkgCache::GrpIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::GrpIterator::FindPreferredPkg(bool const&) const@Base" 0.8.0
- (c++)"pkgCache::GrpIterator::FindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
- (c++)"pkgCache::GrpIterator::NextPkg(pkgCache::PkgIterator const&) const@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::CurVersion() const@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::CandVersion() const@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::State() const@Base" 0.8.0
- (c++)"pkgCache::PkgIterator::FullName(bool const&) const@Base" 0.8.0
- (c++)"pkgCache::PrvIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::CompareVer(pkgCache::VerIterator const&) const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::NewestFile() const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::Downloadable() const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::TranslatedDescription() const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::RelStr() const@Base" 0.8.0
- (c++)"pkgCache::VerIterator::Automatic() const@Base" 0.8.0
- (c++)"pkgCache::DescIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::PkgFileIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::VerFileIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::DescFileIterator::OwnerPointer() const@Base" 0.8.0
- (c++)"pkgCache::sHash(char const*) const@Base" 0.8.0
- (c++)"pkgCache::sHash(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
- (c++)"pkgCache::Header::CheckSizes(pkgCache::Header&) const@Base" 0.8.0
- (c++)"debSystem::CreatePM(pkgDepCache*) const@Base" 0.8.0
- (c++)"debSystem::FindIndex(pkgCache::PkgFileIterator, pkgIndexFile*&) const@Base" 0.8.0
- (c++)"metaIndex::GetURI() const@Base" 0.8.0
- (c++)"metaIndex::GetDist() const@Base" 0.8.0
- (c++)"metaIndex::GetType() const@Base" 0.8.0
- (c++)"typeinfo for OpProgress@Base" 0.8.0
- (c++)"typeinfo for SourceCopy@Base" 0.8.0
- (c++)"typeinfo for pkgAcqFile@Base" 0.8.0
- (c++)"typeinfo for pkgAcquire@Base" 0.8.0
- (c++)"typeinfo for DynamicMMap@Base" 0.8.0
- (c++)"typeinfo for PackageCopy@Base" 0.8.0
- (c++)"typeinfo for pkgAcqIndex@Base" 0.8.0
- (c++)"typeinfo for pkgDepCache@Base" 0.8.0
- (c++)"typeinfo for pkgSimulate@Base" 0.8.0
- (c++)"typeinfo for debIFTypePkg@Base" 0.8.0
- (c++)"typeinfo for debIFTypeSrc@Base" 0.8.0
- (c++)"typeinfo for debSLTypeDeb@Base" 0.8.0
- (c++)"typeinfo for indexRecords@Base" 0.8.0
- (c++)"typeinfo for pkgAcqMethod@Base" 0.8.0
- (c++)"typeinfo for pkgCacheFile@Base" 0.8.0
- (c++)"typeinfo for pkgIndexFile@Base" 0.8.0
- (c++)"typeinfo for WeakPointable@Base" 0.8.0
- (c++)"typeinfo for debListParser@Base" 0.8.0
- (c++)"typeinfo for pkgAcqArchive@Base" 0.8.0
- (c++)"typeinfo for pkgAcqMetaSig@Base" 0.8.0
- (c++)"typeinfo for pkgTagSection@Base" 0.8.0
- (c++)"typeinfo for OpTextProgress@Base" 0.8.0
- (c++)"typeinfo for debIFTypeTrans@Base" 0.8.0
- (c++)"typeinfo for debStatusIndex@Base" 0.8.0
- (c++)"typeinfo for debIFTypeStatus@Base" 0.8.0
- (c++)"typeinfo for debRecordParser@Base" 0.8.0
- (c++)"typeinfo for debReleaseIndex@Base" 0.8.0
- (c++)"typeinfo for debSLTypeDebSrc@Base" 0.8.0
- (c++)"typeinfo for debSLTypeDebian@Base" 0.8.0
- (c++)"typeinfo for debSourcesIndex@Base" 0.8.0
- (c++)"typeinfo for pkgAcqDiffIndex@Base" 0.8.0
- (c++)"typeinfo for pkgAcqMetaIndex@Base" 0.8.0
- (c++)"typeinfo for debPackagesIndex@Base" 0.8.0
- (c++)"typeinfo for pkgAcqIndexDiffs@Base" 0.8.0
- (c++)"typeinfo for pkgAcqIndexTrans@Base" 0.8.0
- (c++)"typeinfo for pkgAcquireStatus@Base" 0.8.0
- (c++)"typeinfo for PreferenceSection@Base" 0.8.0
- (c++)"typeinfo for pkgPackageManager@Base" 0.8.0
- (c++)"typeinfo for debSrcRecordParser@Base" 0.8.0
- (c++)"typeinfo for debVersioningSystem@Base" 0.8.0
- (c++)"typeinfo for pkgUdevCdromDevices@Base" 0.8.0
- (c++)"typeinfo for pkgVersioningSystem@Base" 0.8.0
- (c++)"typeinfo for debTranslationsIndex@Base" 0.8.0
- (c++)"typeinfo for MMap@Base" 0.8.0
- (c++)"typeinfo for FileFd@Base" 0.8.0
- (c++)"typeinfo for Vendor@Base" 0.8.0
- (c++)"typeinfo for pkgCache@Base" 0.8.0
- (c++)"typeinfo for IndexCopy@Base" 0.8.0
- (c++)"typeinfo for debSystem@Base" 0.8.0
- (c++)"typeinfo for metaIndex@Base" 0.8.0
- (c++)"typeinfo for pkgDPkgPM@Base" 0.8.0
- (c++)"typeinfo for pkgPolicy@Base" 0.8.0
- (c++)"typeinfo for pkgSystem@Base" 0.8.0
- (c++)"typeinfo for pkgAcquire::Item@Base" 0.8.0
- (c++)"typeinfo for pkgRecords::Parser@Base" 0.8.0
- (c++)"typeinfo for pkgDepCache::InRootSetFunc@Base" 0.8.0
- (c++)"typeinfo for pkgDepCache::DefaultRootSetFunc@Base" 0.8.0
- (c++)"typeinfo for pkgDepCache::Policy@Base" 0.8.0
- (c++)"typeinfo for pkgSimulate::Policy@Base" 0.8.0
- (c++)"typeinfo for pkgIndexFile::Type@Base" 0.8.0
- (c++)"typeinfo for Configuration::MatchAgainstConfig@Base" 0.8.0
- (c++)"typeinfo for pkgSourceList::Type@Base" 0.8.0
- (c++)"typeinfo for pkgSrcRecords::Parser@Base" 0.8.0
- (c++)"typeinfo for pkgCacheGenerator::ListParser@Base" 0.8.0
- (c++)"typeinfo for APT::CacheSetHelper@Base" 0.8.0
- (c++)"typeinfo for pkgCache::DepIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::GrpIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::PkgIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::PrvIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::VerIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::DescIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::PkgFileIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::VerFileIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::DescFileIterator@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::Description, pkgCache::DescIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::PackageFile, pkgCache::PkgFileIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::Group, pkgCache::GrpIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::Package, pkgCache::PkgIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::VerFile, pkgCache::VerFileIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::DescFile, pkgCache::DescFileIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Iterator<pkgCache::Provides, pkgCache::PrvIterator>@Base" 0.8.0
- (c++)"typeinfo for pkgCache::Namespace@Base" 0.8.0
- (c++)"typeinfo name for OpProgress@Base" 0.8.0
- (c++)"typeinfo name for SourceCopy@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqFile@Base" 0.8.0
- (c++)"typeinfo name for pkgAcquire@Base" 0.8.0
- (c++)"typeinfo name for DynamicMMap@Base" 0.8.0
- (c++)"typeinfo name for PackageCopy@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqIndex@Base" 0.8.0
- (c++)"typeinfo name for pkgDepCache@Base" 0.8.0
- (c++)"typeinfo name for pkgSimulate@Base" 0.8.0
- (c++)"typeinfo name for debIFTypePkg@Base" 0.8.0
- (c++)"typeinfo name for debIFTypeSrc@Base" 0.8.0
- (c++)"typeinfo name for debSLTypeDeb@Base" 0.8.0
- (c++)"typeinfo name for indexRecords@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqMethod@Base" 0.8.0
- (c++)"typeinfo name for pkgCacheFile@Base" 0.8.0
- (c++)"typeinfo name for pkgIndexFile@Base" 0.8.0
- (c++)"typeinfo name for WeakPointable@Base" 0.8.0
- (c++)"typeinfo name for debListParser@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqArchive@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqMetaSig@Base" 0.8.0
- (c++)"typeinfo name for pkgTagSection@Base" 0.8.0
- (c++)"typeinfo name for OpTextProgress@Base" 0.8.0
- (c++)"typeinfo name for debIFTypeTrans@Base" 0.8.0
- (c++)"typeinfo name for debStatusIndex@Base" 0.8.0
- (c++)"typeinfo name for debIFTypeStatus@Base" 0.8.0
- (c++)"typeinfo name for debRecordParser@Base" 0.8.0
- (c++)"typeinfo name for debReleaseIndex@Base" 0.8.0
- (c++)"typeinfo name for debSLTypeDebSrc@Base" 0.8.0
- (c++)"typeinfo name for debSLTypeDebian@Base" 0.8.0
- (c++)"typeinfo name for debSourcesIndex@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqDiffIndex@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqMetaIndex@Base" 0.8.0
- (c++)"typeinfo name for debPackagesIndex@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqIndexDiffs@Base" 0.8.0
- (c++)"typeinfo name for pkgAcqIndexTrans@Base" 0.8.0
- (c++)"typeinfo name for pkgAcquireStatus@Base" 0.8.0
- (c++)"typeinfo name for PreferenceSection@Base" 0.8.0
- (c++)"typeinfo name for pkgPackageManager@Base" 0.8.0
- (c++)"typeinfo name for debSrcRecordParser@Base" 0.8.0
- (c++)"typeinfo name for debVersioningSystem@Base" 0.8.0
- (c++)"typeinfo name for pkgUdevCdromDevices@Base" 0.8.0
- (c++)"typeinfo name for pkgVersioningSystem@Base" 0.8.0
- (c++)"typeinfo name for debTranslationsIndex@Base" 0.8.0
- (c++)"typeinfo name for MMap@Base" 0.8.0
- (c++)"typeinfo name for FileFd@Base" 0.8.0
- (c++)"typeinfo name for Vendor@Base" 0.8.0
- (c++)"typeinfo name for pkgCache@Base" 0.8.0
- (c++)"typeinfo name for IndexCopy@Base" 0.8.0
- (c++)"typeinfo name for debSystem@Base" 0.8.0
- (c++)"typeinfo name for metaIndex@Base" 0.8.0
- (c++)"typeinfo name for pkgDPkgPM@Base" 0.8.0
- (c++)"typeinfo name for pkgPolicy@Base" 0.8.0
- (c++)"typeinfo name for pkgSystem@Base" 0.8.0
- (c++)"typeinfo name for pkgAcquire::Item@Base" 0.8.0
- (c++)"typeinfo name for pkgRecords::Parser@Base" 0.8.0
- (c++)"typeinfo name for pkgDepCache::InRootSetFunc@Base" 0.8.0
- (c++)"typeinfo name for pkgDepCache::DefaultRootSetFunc@Base" 0.8.0
- (c++)"typeinfo name for pkgDepCache::Policy@Base" 0.8.0
- (c++)"typeinfo name for pkgSimulate::Policy@Base" 0.8.0
- (c++)"typeinfo name for pkgIndexFile::Type@Base" 0.8.0
- (c++)"typeinfo name for Configuration::MatchAgainstConfig@Base" 0.8.0
- (c++)"typeinfo name for pkgSourceList::Type@Base" 0.8.0
- (c++)"typeinfo name for pkgSrcRecords::Parser@Base" 0.8.0
- (c++)"typeinfo name for pkgCacheGenerator::ListParser@Base" 0.8.0
- (c++)"typeinfo name for APT::CacheSetHelper@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::DepIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::GrpIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::PkgIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::PrvIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::VerIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::DescIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::PkgFileIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::VerFileIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::DescFileIterator@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Description, pkgCache::DescIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::PackageFile, pkgCache::PkgFileIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Group, pkgCache::GrpIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Package, pkgCache::PkgIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::VerFile, pkgCache::VerFileIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::DescFile, pkgCache::DescFileIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Provides, pkgCache::PrvIterator>@Base" 0.8.0
- (c++)"typeinfo name for pkgCache::Namespace@Base" 0.8.0
- (c++)"vtable for OpProgress@Base" 0.8.0
- (c++)"vtable for SourceCopy@Base" 0.8.0
- (c++)"vtable for pkgAcqFile@Base" 0.8.0
- (c++)"vtable for pkgAcquire@Base" 0.8.0
- (c++)"vtable for DynamicMMap@Base" 0.8.0
- (c++)"vtable for PackageCopy@Base" 0.8.0
- (c++)"vtable for pkgAcqIndex@Base" 0.8.0
- (c++)"vtable for pkgDepCache@Base" 0.8.0
- (c++)"vtable for pkgSimulate@Base" 0.8.0
- (c++)"vtable for debIFTypePkg@Base" 0.8.0
- (c++)"vtable for debIFTypeSrc@Base" 0.8.0
- (c++)"vtable for debSLTypeDeb@Base" 0.8.0
- (c++)"vtable for indexRecords@Base" 0.8.0
- (c++)"vtable for pkgAcqMethod@Base" 0.8.0
- (c++)"vtable for pkgCacheFile@Base" 0.8.0
- (c++)"vtable for pkgIndexFile@Base" 0.8.0
- (c++)"vtable for debListParser@Base" 0.8.0
- (c++)"vtable for pkgAcqArchive@Base" 0.8.0
- (c++)"vtable for pkgAcqMetaSig@Base" 0.8.0
- (c++)"vtable for pkgTagSection@Base" 0.8.0
- (c++)"vtable for OpTextProgress@Base" 0.8.0
- (c++)"vtable for debIFTypeTrans@Base" 0.8.0
- (c++)"vtable for debStatusIndex@Base" 0.8.0
- (c++)"vtable for debIFTypeStatus@Base" 0.8.0
- (c++)"vtable for debRecordParser@Base" 0.8.0
- (c++)"vtable for debReleaseIndex@Base" 0.8.0
- (c++)"vtable for debSLTypeDebSrc@Base" 0.8.0
- (c++)"vtable for debSLTypeDebian@Base" 0.8.0
- (c++)"vtable for debSourcesIndex@Base" 0.8.0
- (c++)"vtable for pkgAcqDiffIndex@Base" 0.8.0
- (c++)"vtable for pkgAcqMetaIndex@Base" 0.8.0
- (c++)"vtable for debPackagesIndex@Base" 0.8.0
- (c++)"vtable for pkgAcqIndexDiffs@Base" 0.8.0
- (c++)"vtable for pkgAcqIndexTrans@Base" 0.8.0
- (c++)"vtable for pkgAcquireStatus@Base" 0.8.0
- (c++)"vtable for PreferenceSection@Base" 0.8.0
- (c++)"vtable for pkgPackageManager@Base" 0.8.0
- (c++)"vtable for debSrcRecordParser@Base" 0.8.0
- (c++)"vtable for debVersioningSystem@Base" 0.8.0
- (c++)"vtable for pkgUdevCdromDevices@Base" 0.8.0
- (c++)"vtable for pkgVersioningSystem@Base" 0.8.0
- (c++)"vtable for debTranslationsIndex@Base" 0.8.0
- (c++)"vtable for MMap@Base" 0.8.0
- (c++)"vtable for FileFd@Base" 0.8.0
- (c++)"vtable for Vendor@Base" 0.8.0
- (c++)"vtable for pkgCache@Base" 0.8.0
- (c++)"vtable for IndexCopy@Base" 0.8.0
- (c++)"vtable for debSystem@Base" 0.8.0
- (c++)"vtable for metaIndex@Base" 0.8.0
- (c++)"vtable for pkgDPkgPM@Base" 0.8.0
- (c++)"vtable for pkgPolicy@Base" 0.8.0
- (c++)"vtable for pkgSystem@Base" 0.8.0
- (c++)"vtable for pkgAcquire::Item@Base" 0.8.0
- (c++)"vtable for pkgRecords::Parser@Base" 0.8.0
- (c++)"vtable for pkgDepCache::InRootSetFunc@Base" 0.8.0
- (c++)"vtable for pkgDepCache::DefaultRootSetFunc@Base" 0.8.0
- (c++)"vtable for pkgDepCache::Policy@Base" 0.8.0
- (c++)"vtable for pkgSimulate::Policy@Base" 0.8.0
- (c++)"vtable for pkgIndexFile::Type@Base" 0.8.0
- (c++)"vtable for Configuration::MatchAgainstConfig@Base" 0.8.0
- (c++)"vtable for pkgSourceList::Type@Base" 0.8.0
- (c++)"vtable for pkgSrcRecords::Parser@Base" 0.8.0
- (c++)"vtable for pkgCacheGenerator::ListParser@Base" 0.8.0
- (c++)"vtable for APT::CacheSetHelper@Base" 0.8.0
- (c++)"vtable for pkgCache::DepIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::GrpIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::PkgIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::PrvIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::VerIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::DescIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::PkgFileIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::VerFileIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::DescFileIterator@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::Description, pkgCache::DescIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::PackageFile, pkgCache::PkgFileIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::Group, pkgCache::GrpIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::Package, pkgCache::PkgIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::VerFile, pkgCache::VerFileIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::DescFile, pkgCache::DescFileIterator>@Base" 0.8.0
- (c++)"vtable for pkgCache::Iterator<pkgCache::Provides, pkgCache::PrvIterator>@Base" 0.8.0
- (c++)"non-virtual thunk to pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0
- (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, pkgCache::DepIterator)@Base" 0.8.0
- (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, pkgCache::PkgIterator)@Base" 0.8.0
- _apt_DebSrcType@Base 0.8.0
- _apt_DebType@Base 0.8.0
- _config@Base 0.8.0
- _system@Base 0.8.0
- debSys@Base 0.8.0
- debVS@Base 0.8.0
- pkgLibVersion@Base 0.8.0
- pkgVersion@Base 0.8.0
-### architecture specific: va_list
- (arch=armel armhf|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, std::__va_list&) const@Base" 0.8.15~exp1
- (arch=i386 hurd-i386 kfreebsd-i386 ppc64|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, char*&) const@Base" 0.8.15~exp1
- (arch=hppa ia64 mips mipsel sparc sparc64|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, void*&) const@Base" 0.8.15~exp1
- (arch=amd64 kfreebsd-amd64 powerpc powerpcspe s390 s390x x32|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, __va_list_tag (&) [1]) const@Base" 0.8.15~exp1
- (arch=sh4|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, __builtin_va_list&) const@Base" 0.8.15~exp1
- (arch=alpha|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, __va_list_tag&) const@Base" 0.8.15~exp1
-### architecture specific: va_list & size_t
- (arch=i386 hurd-i386 kfreebsd-i386|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, char*&, unsigned int&)@Base" 0.8.11.4
- (arch=armel armhf|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, std::__va_list&, unsigned int&)@Base" 0.8.11.4
- (arch=alpha|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __va_list_tag&, unsigned long&)@Base" 0.8.11.4
- (arch=powerpc powerpcspe x32|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __va_list_tag (&) [1], unsigned int&)@Base" 0.8.11.4
- (arch=amd64 kfreebsd-amd64 s390 s390x|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __va_list_tag (&) [1], unsigned long&)@Base" 0.8.11.4
- (arch=hppa mips mipsel sparc|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, void*&, unsigned int&)@Base" 0.8.11.4
- (arch=ia64 sparc64|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, void*&, unsigned long&)@Base" 0.8.11.4
- (arch=sh4|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __builtin_va_list&, unsigned int&)@Base" 0.8.11.4
- (arch=ppc64|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, char*&, unsigned long&)@Base" 0.8.11.4
- (arch=i386 hurd-i386 kfreebsd-i386|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, char*&, int, unsigned int&)@Base" 0.8.11.4
- (arch=armel armhf|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, std::__va_list&, int, unsigned int&)@Base" 0.8.11.4
- (arch=alpha|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag&, int, unsigned long&)@Base" 0.8.11.4
- (arch=powerpc powerpcspe x32|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag (&) [1], int, unsigned int&)@Base" 0.8.11.4
- (arch=amd64 kfreebsd-amd64 s390 s390x|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag (&) [1], int, unsigned long&)@Base" 0.8.11.4
- (arch=hppa mips mipsel sparc|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, void*&, int, unsigned int&)@Base" 0.8.11.4
- (arch=ia64 sparc64|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, void*&, int, unsigned long&)@Base" 0.8.11.4 1
- (arch=sh4|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __builtin_va_list&, int, unsigned int&)@Base" 0.8.11.4
- (arch=ppc64|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, char*&, int, unsigned long&)@Base" 0.8.11.4
-### architecture specific: size_t
- (arch=i386 armel armhf hppa hurd-i386 kfreebsd-i386 mips mipsel powerpc powerpcspe sh4 sparc x32|c++)"_strtabexpand(char*, unsigned int)@Base" 0.8.0
- (arch=alpha amd64 ia64 kfreebsd-amd64 s390 s390x sparc64 ppc64|c++)"_strtabexpand(char*, unsigned long)@Base" 0.8.0
-### architecture specific: time_t
- (arch=!x32|c++)"TimeRFC1123(long)@Base" 0.8.0
- (arch=x32|c++)"TimeRFC1123(long long)@Base" 0.8.0
- (arch=!x32|c++)"FTPMDTMStrToTime(char const*, long&)@Base" 0.8.0
- (arch=x32|c++)"FTPMDTMStrToTime(char const*, long long&)@Base" 0.8.0
- (arch=!x32|c++)"StrToTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, long&)@Base" 0.8.0
- (arch=x32|c++)"StrToTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, long long&)@Base" 0.8.0
- (arch=!x32|c++)"RFC1123StrToTime(char const*, long&)@Base" 0.8.0
- (arch=x32|c++)"RFC1123StrToTime(char const*, long long&)@Base" 0.8.0
-###
- (c++)"Configuration::MatchAgainstConfig::clearPatterns()@Base" 0.8.1
- (c++)"CreateAPTDirectoryIfNeeded(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.2
- (c++)"FileFd::FileSize()@Base" 0.8.8
- (c++)"Base256ToNum(char const*, unsigned long&, unsigned int)@Base" 0.8.11
- (c++)"pkgDepCache::SetCandidateRelease(pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator>, std::allocator<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > >&)@Base" 0.8.11
- (c++)"pkgDepCache::SetCandidateRelease(pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11
- (c++)"RealFileExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.11
- (c++)"StripEpoch(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11
- (c++)"pkgAcqIndex::Init(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11
- (c++)"pkgAcqIndex::pkgAcqIndex(pkgAcquire*, IndexTarget const*, HashString const&, indexRecords const*)@Base" 0.8.11
- (c++)"pkgTagSection::FindFlag(unsigned long&, unsigned long, char const*, char const*)@Base" 0.8.11
- (c++)"pkgAcqSubIndex::ParseIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11
- (c++)"pkgAcqSubIndex::Custom600Headers()@Base" 0.8.11
- (c++)"pkgAcqSubIndex::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.11
- (c++)"pkgAcqSubIndex::DescURI()@Base" 0.8.11
- (c++)"pkgAcqSubIndex::pkgAcqSubIndex(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, HashString const&)@Base" 0.8.11
- (c++)"pkgAcqSubIndex::~pkgAcqSubIndex()@Base" 0.8.11
- (c++)"pkgAcqMetaClearSig::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.11
- (c++)"pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.11
- (c++)"pkgAcqMetaClearSig::~pkgAcqMetaClearSig()@Base" 0.8.11
- (c++)"pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire*, IndexTarget const*, HashString const&, indexRecords const*)@Base" 0.8.11
- (c++)"IndexTarget::IsOptional() const@Base" 0.8.11
- (c++)"IndexTarget::IsSubIndex() const@Base" 0.8.11
- (c++)"debReleaseIndex::TranslationIndexURI(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.11
- (c++)"debReleaseIndex::TranslationIndexURISuffix(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.11
- (c++)"typeinfo for pkgAcqSubIndex@Base" 0.8.11
- (c++)"typeinfo for pkgAcqMetaClearSig@Base" 0.8.11
- (c++)"typeinfo name for pkgAcqSubIndex@Base" 0.8.11
- (c++)"typeinfo name for pkgAcqMetaClearSig@Base" 0.8.11
- (c++)"vtable for pkgAcqSubIndex@Base" 0.8.11
- (c++)"vtable for pkgAcqMetaClearSig@Base" 0.8.11
- (c++)"FindMountPointForDevice(char const*)@Base" 0.8.12
- (c++)"pkgUdevCdromDevices::ScanForRemovable(bool)@Base" 0.8.12
- (c++)"APT::Configuration::Compressor::Compressor(char const*, char const*, char const*, char const*, char const*, unsigned short)@Base" 0.8.12
- (c++)"APT::Configuration::Compressor::~Compressor()@Base" 0.8.12
- (c++)"APT::Configuration::getCompressors(bool)@Base" 0.8.12
- (c++)"APT::Configuration::getCompressorExtensions()@Base" 0.8.12
- (c++)"APT::Configuration::setDefaultConfigurationForCompressors()@Base" 0.8.12
- (c++)"pkgAcqMetaClearSig::Custom600Headers()@Base" 0.8.13
- (c++)"debListParser::NewProvidesAllArch(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.13.2
- (c++)"pkgDepCache::IsModeChangeOk(pkgDepCache::ModeList, pkgCache::PkgIterator const&, unsigned long, bool)@Base" 0.8.13.2
- (c++)"pkgCache::DepIterator::IsNegative() const@Base" 0.8.15~exp1
- (c++)"Configuration::CndSet(char const*, int)@Base" 0.8.15.3
- (c++)"pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator)@Base" 0.8.15.3
- (c++)"DeEscapeString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.15.4
- (c++)"GetModificationTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.15.6
- (c++)"pkgSourceList::GetLastModifiedTime()@Base" 0.8.15.6
- (c++)"pkgCacheGenerator::NewDepends(pkgCache::PkgIterator&, pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int const&, unsigned int const&, unsigned int*&)@Base" 0.8.15.6
- (c++)"pkgCacheFile::RemoveCaches()@Base" 0.8.15.7
- (c++)"pkgOrderList::VisitNode(pkgCache::PkgIterator, char const*)@Base" 0.8.15.7
-### external dependency resolver ###
- (c++)"edspIFType::~edspIFType()@Base" 0.8.16~exp2
- (c++)"edspSystem::Initialize(Configuration&)@Base" 0.8.16~exp2
- (c++)"edspSystem::AddStatusFiles(std::vector<pkgIndexFile*, std::allocator<pkgIndexFile*> >&)@Base" 0.8.16~exp2
- (c++)"edspSystem::ArchiveSupported(char const*)@Base" 0.8.16~exp2
- (c++)"edspSystem::Lock()@Base" 0.8.16~exp2
- (c++)"edspSystem::Score(Configuration const&)@Base" 0.8.16~exp2
- (c++)"edspSystem::UnLock(bool)@Base" 0.8.16~exp2
- (c++)"edspSystem::edspSystem()@Base" 0.8.16~exp2
- (c++)"edspSystem::~edspSystem()@Base" 0.8.16~exp2
- (c++)"edspListParser::NewVersion(pkgCache::VerIterator&)@Base" 0.8.16~exp2
- (c++)"edspListParser::Description()@Base" 0.8.16~exp2
- (c++)"edspListParser::ParseStatus(pkgCache::PkgIterator&, pkgCache::VerIterator&)@Base" 0.8.16~exp2
- (c++)"edspListParser::VersionHash()@Base" 0.8.16~exp2
- (c++)"edspListParser::Description_md5()@Base" 0.8.16~exp2
- (c++)"edspListParser::LoadReleaseInfo(pkgCache::PkgFileIterator&, FileFd&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp2
- (c++)"edspListParser::DescriptionLanguage()@Base" 0.8.16~exp2
- (c++)"edspListParser::edspListParser(FileFd*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp2
- (c++)"edspListParser::~edspListParser()@Base" 0.8.16~exp2
- (c++)"edspIndex::edspIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp2
- (c++)"edspIndex::~edspIndex()@Base" 0.8.16~exp2
- (c++)"edspIFType::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.16~exp2
- (c++)"edspSystem::CreatePM(pkgDepCache*) const@Base" 0.8.16~exp2
- (c++)"edspSystem::FindIndex(pkgCache::PkgFileIterator, pkgIndexFile*&) const@Base" 0.8.16~exp2
- (c++)"edspIndex::Merge(pkgCacheGenerator&, OpProgress*) const@Base" 0.8.16~exp2
- (c++)"edspIndex::GetType() const@Base" 0.8.16~exp2
- (c++)"EDSP::WriteError(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, _IO_FILE*)@Base" 0.8.16~exp2
- (c++)"EDSP::ReadRequest(int, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, bool&, bool&, bool&)@Base" 0.8.16~exp2
- (c++)"EDSP::ApplyRequest(std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, pkgDepCache&)@Base" 0.8.16~exp2
- (c++)"EDSP::ReadResponse(int, pkgDepCache&, OpProgress*)@Base" 0.8.16~exp2
- (c++)"EDSP::WriteRequest(pkgDepCache&, _IO_FILE*, bool, bool, bool, OpProgress*)@Base" 0.8.16~exp2
- (c++)"EDSP::ExecuteSolver(char const*, int*, int*)@Base" 0.8.16~exp2
- (c++)"EDSP::WriteProgress(unsigned short, char const*, _IO_FILE*)@Base" 0.8.16~exp2
- (c++)"EDSP::WriteScenario(pkgDepCache&, _IO_FILE*, OpProgress*)@Base" 0.8.16~exp2
- (c++)"EDSP::WriteSolution(pkgDepCache&, _IO_FILE*)@Base" 0.8.16~exp2
- (c++)"EDSP::ResolveExternal(char const*, pkgDepCache&, bool, bool, bool, OpProgress*)@Base" 0.8.16~exp2
- (c++)"EDSP::DepMap@Base" 0.8.16~exp2
- (c++)"EDSP::PrioMap@Base" 0.8.16~exp2
- (c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgIterator const&)@Base" 0.8.16~exp6
- (c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgFileIterator const&)@Base" 0.8.16~exp6
- (c++)"typeinfo for edspIFType@Base" 0.8.16~exp2
- (c++)"typeinfo for edspSystem@Base" 0.8.16~exp2
- (c++)"typeinfo for edspListParser@Base" 0.8.16~exp2
- (c++)"typeinfo for edspIndex@Base" 0.8.16~exp2
- (c++)"typeinfo name for edspIFType@Base" 0.8.16~exp2
- (c++)"typeinfo name for edspSystem@Base" 0.8.16~exp2
- (c++)"typeinfo name for edspListParser@Base" 0.8.16~exp2
- (c++)"typeinfo name for edspIndex@Base" 0.8.16~exp2
- (c++)"vtable for edspIFType@Base" 0.8.16~exp2
- (c++)"vtable for edspSystem@Base" 0.8.16~exp2
- (c++)"vtable for edspListParser@Base" 0.8.16~exp2
- (c++)"vtable for edspIndex@Base" 0.8.16~exp2
- edspSys@Base 0.8.16~exp2
-### generalisation of checksums (with lfs) -- mostly api-compatible available (without sha512 in previous versions)
- (c++)"AddCRC16(unsigned short, void const*, unsigned long long)@Base" 0.8.16~exp2
- (c++)"MD5Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
- (c++)"MD5Summation::Result()@Base" 0.8.16~exp2
- (c++)"MD5Summation::MD5Summation()@Base" 0.8.16~exp2
- (c++)"SHA1Summation::SHA1Summation()@Base" 0.8.16~exp2
- (c++)"SHA1Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
- (c++)"SHA1Summation::Result()@Base" 0.8.16~exp2
- (c++)"SHA256Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
- (c++)"SHA512Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
- (c++)"debRecordParser::SHA512Hash()@Base" 0.8.16~exp2
- (c++)"pkgRecords::Parser::SHA512Hash()@Base" 0.8.16~exp6
- (c++)"Hashes::AddFD(int, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp6
- (c++)"SummationImplementation::AddFD(int, unsigned long long)@Base" 0.8.16~exp6
- (c++)"typeinfo for MD5Summation@Base" 0.8.16~exp6
- (c++)"typeinfo for SHA1Summation@Base" 0.8.16~exp6
- (c++)"typeinfo for SHA256Summation@Base" 0.8.16~exp6
- (c++)"typeinfo for SHA512Summation@Base" 0.8.16~exp6
- (c++)"typeinfo for SHA2SummationBase@Base" 0.8.16~exp6
- (c++)"typeinfo for SummationImplementation@Base" 0.8.16~exp6
- (c++)"typeinfo name for MD5Summation@Base" 0.8.16~exp6
- (c++)"typeinfo name for SHA1Summation@Base" 0.8.16~exp6
- (c++)"typeinfo name for SHA256Summation@Base" 0.8.16~exp6
- (c++)"typeinfo name for SHA512Summation@Base" 0.8.16~exp6
- (c++)"typeinfo name for SHA2SummationBase@Base" 0.8.16~exp6
- (c++)"typeinfo name for SummationImplementation@Base" 0.8.16~exp6
- (c++)"vtable for MD5Summation@Base" 0.8.16~exp6
- (c++)"vtable for SHA1Summation@Base" 0.8.16~exp6
- (c++)"vtable for SHA256Summation@Base" 0.8.16~exp6
- (c++)"vtable for SHA512Summation@Base" 0.8.16~exp6
- (c++)"vtable for SHA2SummationBase@Base" 0.8.16~exp6
- (c++)"vtable for SummationImplementation@Base" 0.8.16~exp6
-### large file support - available in older api-compatible versions without lfs ###
- (c++)"StrToNum(char const*, unsigned long long&, unsigned int, unsigned int)@Base" 0.8.16~exp6
- (c++)"OpProgress::SubProgress(unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, float)@Base" 0.8.16~exp6
- (c++)"OpProgress::OverallProgress(unsigned long long, unsigned long long, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp6
- (c++)"OpProgress::Progress(unsigned long long)@Base" 0.8.16~exp6
- (c++)"SourceCopy::GetFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6
- (c++)"pkgAcqFile::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgAcqFile::pkgAcqFile(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp6
- (c++)"pkgAcquire::UriIterator::~UriIterator()@Base" 0.8.16~exp6
- (c++)"pkgAcquire::MethodConfig::~MethodConfig()@Base" 0.8.16~exp6
- (c++)"pkgAcquire::Item::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgAcquire::Item::Start(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long)@Base" 0.8.16~exp6
- (c++)"pkgRecords::Parser::RecordField(char const*)@Base" 0.8.16~exp6
- (c++)"pkgTagFile::Jump(pkgTagSection&, unsigned long long)@Base" 0.8.16~exp6
- (c++)"pkgTagFile::Offset()@Base" 0.8.16~exp6
- (c++)"pkgTagFile::pkgTagFile(FileFd*, unsigned long long)@Base" 0.8.16~exp6
- (c++)"DynamicMMap::RawAllocate(unsigned long long, unsigned long)@Base" 0.8.16~exp6
- (c++)"PackageCopy::GetFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6
- (c++)"pkgAcqIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"indexRecords::parseSumData(char const*&, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6
- (c++)"pkgAcqArchive::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgTagSection::~pkgTagSection()@Base" 0.8.16~exp6
- (c++)"pkgAcqSubIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"debRecordParser::RecordField(char const*)@Base" 0.8.16~exp6
- (c++)"debReleaseIndex::SetTrusted(bool)@Base" 0.8.16~exp6
- (c++)"debReleaseIndex::debReleaseIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp6
- (c++)"pkgAcqMetaIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgAcqIndexDiffs::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgAcqMetaSig::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgAcqDiffIndex::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.16~exp6
- (c++)"pkgAcquireStatus::Fetched(unsigned long long, unsigned long long)@Base" 0.8.16~exp6
- (c++)"PreferenceSection::~PreferenceSection()@Base" 0.8.16~exp6
- (c++)"pkgCacheGenerator::NewDescription(pkgCache::DescIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, HashSumValue<128> const&, unsigned int)@Base" 0.8.16~exp6
- (c++)"pkgProblemResolver::ResolveInternal(bool)@Base" 0.8.16~exp6
- (c++)"pkgProblemResolver::ResolveByKeepInternal()@Base" 0.8.16~exp6
- (c++)"FileFd::Read(void*, unsigned long long, unsigned long long*)@Base" 0.8.16~exp6
- (c++)"FileFd::Seek(unsigned long long)@Base" 0.8.16~exp6
- (c++)"FileFd::Skip(unsigned long long)@Base" 0.8.16~exp6
- (c++)"FileFd::Write(void const*, unsigned long long)@Base" 0.8.16~exp6
- (c++)"FileFd::Truncate(unsigned long long)@Base" 0.8.16~exp6
- (c++)"pkgPolicy::GetPriority(pkgCache::PkgFileIterator const&)@Base" 0.8.16~exp6
- (c++)"OptionalIndexTarget::IsOptional() const@Base" 0.8.16~exp6
- (c++)"typeinfo for pkgTagFile@Base" 0.8.16~exp6
- (c++)"typeinfo for IndexTarget@Base" 0.8.16~exp6
- (c++)"typeinfo for pkgSrcRecords@Base" 0.8.16~exp6
- (c++)"typeinfo for OptionalIndexTarget@Base" 0.8.16~exp6
- (c++)"typeinfo for pkgAcquire::UriIterator@Base" 0.8.16~exp6
- (c++)"typeinfo for pkgAcquire::MethodConfig@Base" 0.8.16~exp6
- (c++)"typeinfo for pkgAcquire::Queue@Base" 0.8.16~exp6
- (c++)"typeinfo for pkgAcquire::Worker@Base" 0.8.16~exp6
- (c++)"typeinfo name for pkgTagFile@Base" 0.8.16~exp6
- (c++)"typeinfo name for IndexTarget@Base" 0.8.16~exp6
- (c++)"typeinfo name for pkgSrcRecords@Base" 0.8.16~exp6
- (c++)"typeinfo name for OptionalIndexTarget@Base" 0.8.16~exp6
- (c++)"typeinfo name for pkgAcquire::UriIterator@Base" 0.8.16~exp6
- (c++)"typeinfo name for pkgAcquire::MethodConfig@Base" 0.8.16~exp6
- (c++)"typeinfo name for pkgAcquire::Queue@Base" 0.8.16~exp6
- (c++)"typeinfo name for pkgAcquire::Worker@Base" 0.8.16~exp6
- (c++)"vtable for pkgTagFile@Base" 0.8.16~exp6
- (c++)"vtable for IndexTarget@Base" 0.8.16~exp6
- (c++)"vtable for pkgSrcRecords@Base" 0.8.16~exp6
- (c++)"vtable for OptionalIndexTarget@Base" 0.8.16~exp6
- (c++)"vtable for pkgAcquire::UriIterator@Base" 0.8.16~exp6
- (c++)"vtable for pkgAcquire::MethodConfig@Base" 0.8.16~exp6
- (c++)"vtable for pkgAcquire::Queue@Base" 0.8.16~exp6
- (c++)"vtable for pkgAcquire::Worker@Base" 0.8.16~exp6
-### remove deprecated parameter
- (c++)"pkgDepCache::SetCandidateVersion(pkgCache::VerIterator)@Base" 0.8.16~exp6
- (c++)"pkgDepCache::AddSizes(pkgCache::PkgIterator const&, bool)@Base" 0.8.16~exp6
- (c++)"pkgDepCache::AddStates(pkgCache::PkgIterator const&, bool)@Base" 0.8.16~exp6
-### used internally by public interfaces - if you use them directly, you can keep the pieces
- (c++|optional=internal|regex)"^SHA256_.*@Base$" 0.8.16~exp2
- (c++|optional=internal|regex)"^SHA384_.*@Base$" 0.8.16~exp2
- (c++|optional=internal|regex)"^SHA512_.*@Base$" 0.8.16~exp2
-### orderlist rework: the touched methods are protected
- (c++)"SigINT(int)@Base" 0.8.16~exp14
- (c++)"pkgPackageManager::SigINTStop@Base" 0.8.16~exp14
- (c++)"pkgPackageManager::SmartUnPack(pkgCache::PkgIterator, bool, int)@Base" 0.8.16~exp14
- (c++)"pkgPackageManager::SmartConfigure(pkgCache::PkgIterator, int)@Base" 0.8.16~exp14
-### FileFd rework: supporting different on-the-fly (de)compressing needs more parameter (abi), but the api is stable
- (c++)"FileFd::OpenDescriptor(int, unsigned int, FileFd::CompressMode, bool)@Base" 0.8.16~exp9
- (c++)"FileFd::OpenDescriptor(int, unsigned int, APT::Configuration::Compressor const&, bool)@Base" 0.8.16~exp9
- (c++)"FileFd::ModificationTime()@Base" 0.8.16~exp9
- (c++)"FileFd::Open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, FileFd::CompressMode, unsigned long)@Base" 0.8.16~exp9
- (c++)"FileFd::Open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, APT::Configuration::Compressor const&, unsigned long)@Base" 0.8.16~exp9
- (c++)"FileFd::ReadLine(char*, unsigned long long)@Base" 0.8.16~exp9
- (c++)"SummationImplementation::AddFD(FileFd&, unsigned long long)@Base" 0.8.16~exp9
- (c++)"Hashes::AddFD(FileFd&, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp9
- (c++|optional=deprecated,previous-inline)"FileFd::gzFd()@Base" 0.8.0
-### CacheSet rework: making them real containers breaks bigtime the API (for the CacheSetHelper)
- (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator::getPkg() const@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::getConstructor() const@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::empty() const@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator::getPkg() const@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::getConstructor() const@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::empty() const@Base" 0.8.16~exp9
- (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::empty() const@Base" 0.8.16~exp9
- (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator::getVer() const@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::canNotFindTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::canNotFindRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::canNotFindAllVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::canNotFindPackage(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::showTaskSelection(pkgCache::PkgIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::showRegExSelection(pkgCache::PkgIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator const&, pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::canNotFindCandInstVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
- (c++)"APT::CacheSetHelper::canNotFindInstCandVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::setConstructor(APT::PackageContainerInterface::Constructor const&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::clear()@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::insert(pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::setConstructor(APT::PackageContainerInterface::Constructor const&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::clear()@Base" 0.8.16~exp9
- (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::insert(pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::clear()@Base" 0.8.16~exp9
- (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::insert(pkgCache::VerIterator const&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainerInterface::FromString(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainerInterface::FromCommandLine(APT::PackageContainerInterface*, pkgCacheFile&, char const**, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainerInterface::FromModifierCommandLine(unsigned short&, APT::PackageContainerInterface*, pkgCacheFile&, char const*, std::list<APT::PackageContainerInterface::Modifier, std::allocator<APT::PackageContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainerInterface::FromName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainerInterface::FromTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::PackageContainerInterface::FromRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainerInterface::FromString(APT::VersionContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&, bool)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainerInterface::FromPackage(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainerInterface::FromCommandLine(APT::VersionContainerInterface*, pkgCacheFile&, char const**, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainerInterface::getCandidateVer(pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainerInterface::getInstalledVer(pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"APT::VersionContainerInterface::FromModifierCommandLine(unsigned short&, APT::VersionContainerInterface*, pkgCacheFile&, char const*, std::list<APT::VersionContainerInterface::Modifier, std::allocator<APT::VersionContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
- (c++)"EDSP::WriteLimitedScenario(pkgDepCache&, _IO_FILE*, APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > > const&, OpProgress*)@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::PackageContainerInterface::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::PackageContainerInterface@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::VersionContainerInterface::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo for APT::VersionContainerInterface@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::PackageContainerInterface::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::PackageContainerInterface@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::VersionContainerInterface::const_iterator@Base" 0.8.16~exp9
- (c++)"typeinfo name for APT::VersionContainerInterface@Base" 0.8.16~exp9
- (c++)"vtable for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
- (c++)"vtable for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
- (c++)"vtable for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
- (c++)"vtable for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
- (c++)"vtable for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator@Base" 0.8.16~exp9
- (c++)"vtable for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >@Base" 0.8.16~exp9
- (c++)"vtable for APT::PackageContainerInterface::const_iterator@Base" 0.8.16~exp9
- (c++)"vtable for APT::PackageContainerInterface@Base" 0.8.16~exp9
- (c++)"vtable for APT::VersionContainerInterface::const_iterator@Base" 0.8.16~exp9
- (c++)"vtable for APT::VersionContainerInterface@Base" 0.8.16~exp9
-### rework of the packagemanager rework
- (c++)"APT::Progress::PackageManager::ConffilePrompt(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::HandleSIGWINCH(int)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::~PackageManagerFancy()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::PackageManagerFancy()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::SetupTerminalScrollArea(int)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::Stop()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::fork()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::GetPulseInterval()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::~PackageManager()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::ConffilePrompt(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::~PackageManagerProgressDeb822Fd()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::PackageManagerProgressDeb822Fd(int)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::StartDpkg()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::Stop()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressDeb822Fd::WriteToStatusFd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFactory()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::ConffilePrompt(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::~PackageManagerProgressFd()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::PackageManagerProgressFd(int)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::StartDpkg()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::Stop()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerProgressFd::WriteToStatusFd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::Pulse()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::StartDpkg()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManager::Stop()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerText::~PackageManagerText()@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerText::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
- (c++)"APT::String::Strip(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.9.13~exp1
- (c++)"APT::Upgrade::Upgrade(pkgDepCache&, int)@Base" 0.9.13~exp1
- (c++)"pkgDPkgPM::BuildPackagesProgressMap()@Base" 0.9.13~exp1
- (c++)"pkgDPkgPM::DoDpkgStatusFd(int)@Base" 0.9.13~exp1
- (c++)"pkgDPkgPM::GoNoABIBreak(APT::Progress::PackageManager*)@Base" 0.9.13~exp1
- (c++)"pkgDPkgPM::ProcessDpkgStatusLine(char*)@Base" 0.9.13~exp1
- (c++)"pkgDPkgPM::StartPtyMagic()@Base" 0.9.13~exp1
- (c++)"pkgDPkgPM::StopPtyMagic()@Base" 0.9.13~exp1
- (c++)"typeinfo for APT::Progress::PackageManager@Base" 0.9.13~exp1
- (c++)"typeinfo for APT::Progress::PackageManagerFancy@Base" 0.9.13~exp1
- (c++)"typeinfo for APT::Progress::PackageManagerProgressDeb822Fd@Base" 0.9.13~exp1
- (c++)"typeinfo for APT::Progress::PackageManagerProgressFd@Base" 0.9.13~exp1
- (c++)"typeinfo for APT::Progress::PackageManagerText@Base" 0.9.13~exp1
- (c++)"typeinfo name for APT::Progress::PackageManager@Base" 0.9.13~exp1
- (c++)"typeinfo name for APT::Progress::PackageManagerFancy@Base" 0.9.13~exp1
- (c++)"typeinfo name for APT::Progress::PackageManagerProgressDeb822Fd@Base" 0.9.13~exp1
- (c++)"typeinfo name for APT::Progress::PackageManagerProgressFd@Base" 0.9.13~exp1
- (c++)"typeinfo name for APT::Progress::PackageManagerText@Base" 0.9.13~exp1
- (c++)"vtable for APT::Progress::PackageManager@Base" 0.9.13~exp1
- (c++)"vtable for APT::Progress::PackageManagerFancy@Base" 0.9.13~exp1
- (c++)"vtable for APT::Progress::PackageManagerProgressDeb822Fd@Base" 0.9.13~exp1
- (c++)"vtable for APT::Progress::PackageManagerProgressFd@Base" 0.9.13~exp1
- (c++)"vtable for APT::Progress::PackageManagerText@Base" 0.9.13~exp1
- (c++)"APT::Progress::PackageManagerFancy::instances@Base" 0.9.14.2
- (c++)"APT::Progress::PackageManagerFancy::Start(int)@Base" 0.9.14.2
- (c++)"APT::Progress::PackageManagerFancy::staticSIGWINCH(int)@Base" 0.9.14.2
- (c++)"APT::Progress::PackageManager::Start(int)@Base" 0.9.14.2
-### client-side merged pdiffs
- (c++)"pkgAcqIndexMergeDiffs::DescURI()@Base" 0.9.14.3~exp1
- (c++)"pkgAcqIndexMergeDiffs::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.9.14.3~exp1
- (c++)"pkgAcqIndexMergeDiffs::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.9.14.3~exp1
- (c++)"pkgAcqIndexMergeDiffs::~pkgAcqIndexMergeDiffs()@Base" 0.9.14.3~exp1
- (c++)"pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, HashString const&, DiffInfo const&, std::vector<pkgAcqIndexMergeDiffs*, std::allocator<pkgAcqIndexMergeDiffs*> > const*)@Base" 0.9.14.3~exp1
- (c++)"typeinfo for pkgAcqIndexMergeDiffs@Base" 0.9.14.3~exp1
- (c++)"typeinfo name for pkgAcqIndexMergeDiffs@Base" 0.9.14.3~exp1
- (c++)"vtable for pkgAcqIndexMergeDiffs@Base" 0.9.14.3~exp1
-### deb822 sources.list format
- (c++)"pkgSourceList::ParseFileDeb822(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.14.3~exp1
- (c++)"pkgSourceList::ParseFileOldStyle(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.14.3~exp1
- (c++)"pkgSourceList::Type::ParseStanza(std::vector<metaIndex*, std::allocator<metaIndex*> >&, pkgTagSection&, int, FileFd&)@Base" 0.9.14.3~exp1
-### mixed stuff
- (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp13
- (c++)"pkgCache::DepIterator::IsIgnorable(pkgCache::PkgIterator const&) const@Base" 0.8.16~exp10
- (c++)"pkgCache::DepIterator::IsIgnorable(pkgCache::PrvIterator const&) const@Base" 0.8.16~exp10
- (c++)"FileFd::Write(int, void const*, unsigned long long)@Base" 0.8.16~exp14
- (c++)"pkgTagSection::Exists(char const*)@Base" 0.9.7.9~exp1
- (c++)"_strrstrip(char*)@Base" 0.9.7.9~exp2
- (c++)"SplitClearSignedFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, FileFd*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, FileFd*)@Base" 0.9.7.9~exp2
- (c++)"OpenMaybeClearSignedFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, FileFd&)@Base" 0.9.7.9~exp2
- (c++)"ExecGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, int*)@Base" 0.9.7.9~exp2
- (c++)"SigVerify::RunGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)@Base" 0.9.7.9~exp2
- (c++)"Configuration::Dump(std::basic_ostream<char, std::char_traits<char> >&, char const*, char const*, bool)@Base" 0.9.3
- (c++)"AcquireUpdate(pkgAcquire&, int, bool, bool)@Base" 0.9.3
- (c++)"pkgCache::DepIterator::IsMultiArchImplicit() const@Base" 0.9.6
- (c++)"pkgCache::PrvIterator::IsMultiArchImplicit() const@Base" 0.9.6
- (c++)"APT::PackageContainerInterface::FromGroup(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.7
- (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.9.7
- (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification()@Base" 0.9.7
- (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(pkgCache::PkgIterator const&)@Base" 0.9.7
- (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(pkgCache::VerIterator const&)@Base" 0.9.7
- (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(char const* const&)@Base" 0.9.7
- (c++)"APT::Configuration::checkLanguage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.9.7.5
- (c++)"pkgCdrom::DropTranslation(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.9.7.5
- (c++)"pkgCache::DepIterator::IsSatisfied(pkgCache::PrvIterator const&) const@Base" 0.9.8
- (c++)"pkgCache::DepIterator::IsSatisfied(pkgCache::VerIterator const&) const@Base" 0.9.8
- (c++)"pkgCacheGenerator::NewDepends(pkgCache::PkgIterator&, pkgCache::VerIterator&, unsigned int, unsigned int const&, unsigned int const&, unsigned int*&)@Base" 0.9.8
- (c++)"pkgCacheGenerator::NewVersion(pkgCache::VerIterator&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int, unsigned long, unsigned long)@Base" 0.9.8
- (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, GlobalError::Item)@Base" 0.9.9
- (c++)"pkgDepCache::IsDeleteOkProtectInstallRequests(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.9.9.1
- (c++)"pkgDepCache::IsInstallOkMultiArchSameVersionSynced(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.9.9.1
- (c++)"pkgDPkgPM::SendPkgsInfo(_IO_FILE*, unsigned int const&)@Base" 0.9.9.1
- (c++)"pkgCache::VerIterator::MultiArchType() const@Base" 0.9.9.1
- (c++)"CommandLine::GetCommand(CommandLine::Dispatch const*, unsigned int, char const* const*)@Base" 0.9.11
- (c++)"CommandLine::MakeArgs(char, char const*, char const*, unsigned long)@Base" 0.9.11
- (c++)"Configuration::Clear()@Base" 0.9.11
- (c++)"Glob(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 0.9.11
- (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::operator()(pkgCache::GrpIterator const&)@Base" 0.9.11
- (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::operator()(pkgCache::PkgIterator const&)@Base" 0.9.11
- (c++)"APT::PackageContainerInterface::FromFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.11
- (c++)"pkgTagSection::pkgTagSection()@Base" 0.9.11
- (c++)"strv_length(char const**)@Base" 0.9.11
- (c++)"StringSplit(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)@Base" 0.9.11.3
- (c++)"pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState)@Base" 0.9.12
- (c++)"APT::String::Endswith(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.9.13.1
- (c++)"ExecFork(std::set<int, std::less<int>, std::allocator<int> >)@Base" 0.9.13.1
- (c++)"MergeKeepFdsFromConfiguration(std::set<int, std::less<int>, std::allocator<int> >&)@Base" 0.9.13.1
- (c++)"HashString::FromFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13.1
- (c++)"HashString::GetHashForFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.9.13.1
- (c++)"indexRecords::GetSuite() const@Base" 0.9.13.2
- (c++)"GetTempDir()@Base" 0.9.14.2
- (c++)"APT::Configuration::getBuildProfiles()@Base" 0.9.16
- (c++)"APT::Configuration::getBuildProfilesString()@Base" 0.9.16
- (c++)"Configuration::FindVector(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.9.16
- (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&)@Base" 0.9.16
- (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&)@Base" 0.9.16
- (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&, bool const&)@Base" 0.9.16
- (c++)"pkgCacheGenerator::ListParser::SameVersion(unsigned short, pkgCache::VerIterator const&)@Base" 0.9.16
- (c++)"Rename(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.16
- (c++)"pkgDepCache::IsInstallOkDependenciesSatisfiableByCandidates(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 1.0
- (c++)"APT::Progress::PackageManagerFancy::GetTerminalSize()@Base" 1.0
- (c++)"APT::Progress::PackageManagerFancy::GetTextProgressStr(float, int)@Base" 1.0
- (c++)"pkgCdromStatus::GetOpProgress()@Base" 1.0
- (c++)"pkgCdromStatus::SetTotal(int)@Base" 1.0
- (c++)"EDSP::ExecuteSolver(char const*, int*, int*, bool)@Base" 1.0.4
- (c++)"pkgPackageManager::EarlyRemove(pkgCache::PkgIterator, pkgCache::DepIterator const*)@Base" 1.0.4
- (c++)"debTranslationsParser::Architecture()@Base" 1.0.4
- (c++)"debTranslationsParser::~debTranslationsParser()@Base" 1.0.4
- (c++)"debTranslationsParser::Version()@Base" 1.0.4
- (c++)"typeinfo for debTranslationsParser@Base" 1.0.4
- (c++)"typeinfo name for debTranslationsParser@Base" 1.0.4
- (c++)"vtable for debTranslationsParser@Base" 1.0.4
- (c++)"HashStringList::find(char const*) const@Base" 1.0.9.4
- (c++)"HashStringList::operator==(HashStringList const&) const@Base" 1.0.9.4
- (c++)"HashStringList::operator!=(HashStringList const&) const@Base" 1.0.9.4
- (c++)"HashStringList::push_back(HashString const&)@Base" 1.0.9.4
- (c++)"HashStringList::supported(char const*)@Base" 1.0.9.4
- (c++)"HashStringList::VerifyFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 1.0.9.4
- (c++)"HashString::operator==(HashString const&) const@Base" 1.0.9.4
- (c++)"HashString::operator!=(HashString const&) const@Base" 1.0.9.4
- (c++)"pkgSrcRecords::Parser::Files2(std::vector<pkgSrcRecords::File2, std::allocator<pkgSrcRecords::File2> >&)@Base" 1.0.9.4
- (c++)"debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2, std::allocator<pkgSrcRecords::File2> >&)@Base" 1.0.9.4
-### demangle strangeness - buildd report it as MISSING and as new…
- (c++)"pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.0
-### gcc-4.6 artefacts
-# (c++|optional=implicit)"HashString::operator=(HashString const&)@Base" 0.8.0
-# (c++|optional=implicit)"HashString::HashString(HashString const&)@Base" 0.8.0
-# (c++|optional=inline)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator std::max_element<APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, CompareProviders>(APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, CompareProviders)@Base" 0.8.0
-# (c++|optional=inline)"pkgCache::VerIterator::ParentPkg() const@Base" 0.8.0
-### gcc-4.8 artefacts
-# (c++|optional=implicit)"debSLTypeDebian::~debSLTypeDebian()@Base" 0.8.0
-### empty destructors included in the .h file
-# (c++|optional=inline)"pkgVersioningSystem::~pkgVersioningSystem()@Base" 0.8.0
-# (c++|optional=inline)"pkgSystem::~pkgSystem()@Base" 0.8.0
-# (c++|optional=inline)"pkgRecords::Parser::~Parser()@Base" 0.8.0
-# (c++|optional=inline)"pkgSrcRecords::Parser::~Parser()@Base" 0.8.0
-# (c++|optional=inline)"pkgIndexFile::Type::~Type()@Base" 0.8.0
-# (c++|optional=inline)"pkgSourceList::Type::~Type()@Base" 0.8.0
-# (c++|optional=inline)"pkgIndexFile::~pkgIndexFile()@Base" 0.8.0
-# (c++|optional=inline)"pkgCacheGenerator::ListParser::~ListParser()@Base" 0.8.0
-# (c++|optional=inline)"pkgAcquireStatus::~pkgAcquireStatus()@Base" 0.8.0
-# (c++|optional=inline)"metaIndex::~metaIndex()@Base" 0.8.0
-# (c++|optional=inline)"IndexCopy::~IndexCopy()@Base" 0.8.0
-### std library artefacts
- (c++|regex|optional=std)"^std::vector<DiffInfo, .+@Base$" 0.8.0
- (c++|regex|optional=std)"^std::vector<.+ >::(vector|push_back|erase|_[^ ]+)\(.+\)( const|)@Base$" 0.8.0
- (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
- (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
- (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
- (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
-### try to ignore std:: template instances
- (c++|regex|optional=std)"^(void |)std::[^ ]+<.+ >::(_|~).+\(.*\)@Base$" 0.8.0
- (c++|regex|optional=std)"^std::[^ ]+<.+ >::(append|insert|reserve|operator[^ ]+)\(.*\)@Base$" 0.8.0
- (c++|regex|optional=std)"^(void |DiffInfo\* |)std::_.*@Base$" 0.8.0
- (c++|regex|optional=std)"^std::reverse_iterator<.+ > std::__.+@Base$" 0.8.0
- (c++|regex|optional=std)"^std::basic_string<.+ >\(.+\)@Base$" 0.8.0
- (c++|regex|optional=std)"^__gnu_cxx::__[^ ]+<.*@Base$" 0.8.0
- (c++|regex|optional=std)"^typeinfo name for std::iterator<.*>@Base$" 0.8.0
- (c++|regex|optional=std)"^typeinfo for std::iterator<.*>@Base$" 0.8.0
- (c++|optional=std)"std::ctype<char>::do_widen(char) const@Base" 1.0.3
diff --git a/debian/libapt-pkg4.15.install.in b/debian/libapt-pkg4.15.install.in
new file mode 100644 (file)
index 0000000..56bed39
--- /dev/null
@@ -0,0 +1,2 @@
+bin/libapt-pkg*.so.* usr/lib/@DEB_HOST_MULTIARCH@/
+usr/share/locale/*/*/libapt-pkg*.mo
diff --git a/debian/libapt-pkg4.15.symbols b/debian/libapt-pkg4.15.symbols
new file mode 100644 (file)
index 0000000..ee7f7a6
--- /dev/null
@@ -0,0 +1,1431 @@
+libapt-pkg.so.4.15 libapt-pkg4.15 #MINVER#
+* Build-Depends-Package: libapt-pkg-dev
+ TFRewritePackageOrder@Base 0.8.0
+ TFRewriteSourceOrder@Base 0.8.0
+ (c++)"FileExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"IdentCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int)@Base" 0.8.0
+ (c++)"ListUpdate(pkgAcquireStatus&, pkgSourceList&, int)@Base" 0.8.0
+ (c++)"MountCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"ParseCWord(char const*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
+ (c++)"ReadPinDir(pkgPolicy&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"RunScripts(char const*)@Base" 0.8.0
+ (c++)"SafeGetCWD()@Base" 0.8.0
+ (c++)"QuoteString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0
+ (c++)"ReadPinFile(pkgPolicy&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"RegexChoice(RxChoiceList*, char const**, char const**)@Base" 0.8.0
+ (c++)"SetNonBlock(int, bool)@Base" 0.8.0
+ (c++)"flExtension(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"Base64Encode(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"ReadMessages(int, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.8.0
+ (c++)"SetCloseExec(int, bool)@Base" 0.8.0
+ (c++)"StringToBool(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 0.8.0
+ (c++)"UnmountCdrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"_GetErrorObj()@Base" 0.8.0
+ (c++)"Base256ToNum(char const*, unsigned long long&, unsigned int)@Base" 1.0.5
+ (c++)"pkgFixBroken(pkgDepCache&)@Base" 0.8.0
+ (c++)"DeQuoteString(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > const&)@Base" 0.8.0
+ (c++)"DeQuoteString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"OutputInDepth(unsigned long, char const*)@Base" 0.8.0
+ (c++)"ReadConfigDir(Configuration&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, unsigned int const&)@Base" 0.8.0
+ (c++)"URItoFileName(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"UTF8ToCodeset(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)@Base" 0.8.0
+ (c++)"pkgInitConfig(Configuration&)@Base" 0.8.0
+ (c++)"pkgInitSystem(Configuration&, pkgSystem*&)@Base" 0.8.0
+ (c++)"safe_snprintf(char*, char*, char const*, ...)@Base" 0.8.0
+ (c++)"stringcasecmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char const*, char const*)@Base" 0.8.0
+ (c++)"stringcasecmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)@Base" 0.8.0
+# (c++|optional=inline)"stringcasecmp(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0
+ (c++)"stringcasecmp(char const*, char const*, char const*, char const*)@Base" 0.8.0
+ (c++)"tolower_ascii(int)@Base" 0.8.0
+ (c++)"ParseQuoteWord(char const*&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
+ (c++)"ReadConfigFile(Configuration&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, unsigned int const&)@Base" 0.8.0
+ (c++)"TokSplitString(char, char*, char**, unsigned long)@Base" 0.8.0
+ (c++)"maybe_add_auth(URI&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgApplyStatus(pkgDepCache&)@Base" 0.8.0
+ (c++)"CheckDomainList(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"CreateDirectory(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"DirectoryExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"VectorizeString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const&)@Base" 0.8.0
+ (c++)"pkgPrioSortList(pkgCache&, pkgCache::Version**)@Base" 0.8.0
+ (c++)"pkgMakeStatusCache(pkgSourceList&, OpProgress&, MMap**, bool)@Base" 0.8.0
+ (c++)"pkgMinimizeUpgrade(pkgDepCache&)@Base" 0.8.0
+ (c++)"pkgAllUpgrade(pkgDepCache&)@Base" 0.8.0
+ (c++)"pkgDistUpgrade(pkgDepCache&)@Base" 0.8.0
+ (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, bool const&)@Base" 0.8.0
+ (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool const&, bool const&)@Base" 0.8.0
+ (c++)"pkgMakeOnlyStatusCache(OpProgress&, DynamicMMap**)@Base" 0.8.0
+ (c++)"WaitFd(int, bool, unsigned long)@Base" 0.8.0
+ (c++)"GetLock(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
+ (c++)"Hex2Num(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned char*, unsigned int)@Base" 0.8.0
+ (c++)"CopyFile(FileFd&, FileFd&)@Base" 0.8.0
+ (c++)"ExecFork()@Base" 0.8.0
+ (c++)"ExecWait(int, char const*, bool)@Base" 0.8.0
+ (c++)"StrToNum(char const*, unsigned long&, unsigned int, unsigned int)@Base" 0.8.0
+ (c++)"SubstVar(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"SubstVar(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, SubstVar const*)@Base" 0.8.0
+ (c++)"flNoLink(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"flNotDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"ioprintf(std::basic_ostream<char, std::char_traits<char> >&, char const*, ...)@Base" 0.8.0
+ (c++)"IsMounted(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
+ (c++)"LookupTag(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*, char const*)@Base" 0.8.0
+ (c++)"SizeToStr(double)@Base" 0.8.0
+ (c++)"TFRewrite(_IO_FILE*, pkgTagSection const&, char const**, TFRewriteData*)@Base" 0.8.0
+ (c++)"TimeToStr(unsigned long)@Base" 0.8.0
+ (c++)"_strstrip(char*)@Base" 0.8.0
+ (c++)"flCombine(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"flNotFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"stringcmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, char const*, char const*)@Base" 0.8.0
+ (c++)"stringcmp(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >)@Base" 0.8.0
+ (c++)"stringcmp(char const*, char const*, char const*, char const*)@Base" 0.8.0
+ (c++)"strprintf(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, char const*, ...)@Base" 0.8.0
+ (c++)"HashString::SupportedHashes()@Base" 0.8.0
+ (c++)"HashString::_SupportedHashes@Base" 0.8.0
+ (c++)"HashString::HashString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"HashString::HashString(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"HashString::HashString()@Base" 0.8.0
+ (c++)"HashString::~HashString()@Base" 0.8.0
+ (c++)"OpProgress::CheckChange(float)@Base" 0.8.0
+ (c++)"OpProgress::Done()@Base" 0.8.0
+ (c++)"OpProgress::Update()@Base" 0.8.0
+ (c++)"OpProgress::OpProgress()@Base" 0.8.0
+ (c++)"OpProgress::~OpProgress()@Base" 0.8.0
+ (c++)"SourceCopy::GetFileName()@Base" 0.8.0
+ (c++)"SourceCopy::RewriteEntry(_IO_FILE*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"SourceCopy::Type()@Base" 0.8.0
+ (c++)"SourceCopy::~SourceCopy()@Base" 0.8.0
+ (c++)"pkgAcqFile::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
+ (c++)"pkgAcqFile::DescURI()@Base" 0.8.0
+ (c++)"pkgAcqFile::~pkgAcqFile()@Base" 0.8.0
+ (c++)"pkgAcquire::WorkerStep(pkgAcquire::Worker*)@Base" 0.8.0
+ (c++)"pkgAcquire::FetchNeeded()@Base" 0.8.0
+ (c++)"pkgAcquire::TotalNeeded()@Base" 0.8.0
+ (c++)"pkgAcquire::MethodConfig::MethodConfig()@Base" 0.8.0
+ (c++)"pkgAcquire::PartialPresent()@Base" 0.8.0
+ (c++)"pkgAcquire::Add(pkgAcquire::Item*)@Base" 0.8.0
+ (c++)"pkgAcquire::Add(pkgAcquire::Worker*)@Base" 0.8.0
+ (c++)"pkgAcquire::Run(int)@Base" 0.8.0
+ (c++)"pkgAcquire::Bump()@Base" 0.8.0
+ (c++)"pkgAcquire::Item::ReportMirrorFailure(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcquire::Item::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
+ (c++)"pkgAcquire::Item::Rename(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcquire::Item::Finished()@Base" 0.8.0
+ (c++)"pkgAcquire::Item::ShortDesc()@Base" 0.8.0
+ (c++)"pkgAcquire::Item::~Item()@Base" 0.8.0
+ (c++)"pkgAcquire::Clean(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Bump()@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Cycle()@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Dequeue(pkgAcquire::Item*)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Enqueue(pkgAcquire::ItemDesc&)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Startup()@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::FindItem(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::Worker*)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::ItemDone(pkgAcquire::Queue::QItem*)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Shutdown(bool)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::Queue(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire*)@Base" 0.8.0
+ (c++)"pkgAcquire::Queue::~Queue()@Base" 0.8.0
+ (c++)"pkgAcquire::Remove(pkgAcquire::Item*)@Base" 0.8.0
+ (c++)"pkgAcquire::Remove(pkgAcquire::Worker*)@Base" 0.8.0
+ (c++)"pkgAcquire::RunFds(fd_set*, fd_set*)@Base" 0.8.0
+ (c++)"pkgAcquire::SetFds(int&, fd_set*, fd_set*)@Base" 0.8.0
+ (c++)"pkgAcquire::UriEnd()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::OutFdReady()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::MediaChange(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::RunMessages()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::Capabilities(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::ReadMessages()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::MethodFailure()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::SendConfiguration()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::Pulse()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::Start()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::ItemDone()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::Construct()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::InFdReady()@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::QueueItem(pkgAcquire::Queue::QItem*)@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::Worker(pkgAcquire::MethodConfig*)@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::Worker(pkgAcquire::Queue*, pkgAcquire::MethodConfig*, pkgAcquireStatus*)@Base" 0.8.0
+ (c++)"pkgAcquire::Worker::~Worker()@Base" 0.8.0
+ (c++)"pkgAcquire::Dequeue(pkgAcquire::Item*)@Base" 0.8.0
+ (c++)"pkgAcquire::Enqueue(pkgAcquire::ItemDesc&)@Base" 0.8.0
+ (c++)"pkgAcquire::ItemDesc::~ItemDesc()@Base" 0.8.0
+ (c++)"pkgAcquire::Shutdown()@Base" 0.8.0
+ (c++)"pkgAcquire::UriBegin()@Base" 0.8.0
+ (c++)"pkgAcquire::GetConfig(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcquire::QueueName(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig const*&)@Base" 0.8.0
+ (c++)"pkgAcquire::pkgAcquire(pkgAcquireStatus*)@Base" 0.8.0
+ (c++)"pkgAcquire::pkgAcquire()@Base" 0.8.0
+ (c++)"pkgAcquire::~pkgAcquire()@Base" 0.8.0
+ (c++)"pkgRecords::Lookup(pkgCache::VerFileIterator const&)@Base" 0.8.0
+ (c++)"pkgRecords::Lookup(pkgCache::DescFileIterator const&)@Base" 0.8.0
+ (c++)"pkgRecords::Parser::Maintainer()@Base" 0.8.0
+ (c++)"pkgRecords::Parser::Name()@Base" 0.8.0
+ (c++)"pkgRecords::Parser::GetRec(char const*&, char const*&)@Base" 0.8.0
+ (c++)"pkgRecords::Parser::FileName()@Base" 0.8.0
+ (c++)"pkgRecords::Parser::Homepage()@Base" 0.8.0
+ (c++)"pkgRecords::Parser::SourcePkg()@Base" 0.8.0
+ (c++)"pkgRecords::Parser::SourceVer()@Base" 0.8.0
+ (c++)"pkgRecords::pkgRecords(pkgCache&)@Base" 0.8.0
+ (c++)"pkgRecords::~pkgRecords()@Base" 0.8.0
+ (c++)"pkgTagFile::Step(pkgTagSection&)@Base" 0.8.0
+ (c++)"pkgTagFile::~pkgTagFile()@Base" 0.8.0
+ (c++)"CdromDevice::~CdromDevice()@Base" 0.8.0
+ (c++)"CommandLine::DispatchArg(CommandLine::Dispatch*, bool)@Base" 0.8.0
+ (c++)"CommandLine::SaveInConfig(unsigned int const&, char const* const*)@Base" 0.8.0
+ (c++)"CommandLine::Parse(int, char const**)@Base" 0.8.0
+ (c++)"CommandLine::HandleOpt(int&, int, char const**, char const*&, CommandLine::Args*, bool)@Base" 0.8.0
+ (c++)"CommandLine::CommandLine(CommandLine::Args*, Configuration*)@Base" 0.8.0
+ (c++)"CommandLine::~CommandLine()@Base" 0.8.0
+ (c++)"DynamicMMap::WriteString(char const*, unsigned long)@Base" 0.8.0
+ (c++)"DynamicMMap::Grow()@Base" 0.8.0
+ (c++)"DynamicMMap::Allocate(unsigned long)@Base" 0.8.0
+ (c++)"DynamicMMap::DynamicMMap(FileFd&, unsigned long, unsigned long const&, unsigned long const&, unsigned long const&)@Base" 0.8.0
+ (c++)"DynamicMMap::DynamicMMap(unsigned long, unsigned long const&, unsigned long const&, unsigned long const&)@Base" 0.8.0
+ (c++)"DynamicMMap::~DynamicMMap()@Base" 0.8.0
+ (c++)"GlobalError::DumpErrors(std::basic_ostream<char, std::char_traits<char> >&, GlobalError::MsgType const&, bool const&)@Base" 0.8.0
+ (c++)"GlobalError::PopMessage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
+ (c++)"GlobalError::InsertErrno(GlobalError::MsgType const&, char const*, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::PushToStack()@Base" 0.8.0
+ (c++)"GlobalError::RevertToStack()@Base" 0.8.0
+ (c++)"GlobalError::MergeWithStack()@Base" 0.8.0
+ (c++)"GlobalError::Debug(char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Errno(char const*, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Error(char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Fatal(char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::DebugE(char const*, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::FatalE(char const*, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Insert(GlobalError::MsgType const&, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Notice(char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Discard()@Base" 0.8.0
+ (c++)"GlobalError::NoticeE(char const*, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::Warning(char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::WarningE(char const*, char const*, ...)@Base" 0.8.0
+ (c++)"GlobalError::GlobalError()@Base" 0.8.0
+ (c++)"PackageCopy::GetFileName()@Base" 0.8.0
+ (c++)"PackageCopy::RewriteEntry(_IO_FILE*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"PackageCopy::Type()@Base" 0.8.0
+ (c++)"PackageCopy::~PackageCopy()@Base" 0.8.0
+ (c++)"pkgDepCache::IsDeleteOk(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::MarkDelete(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::StateCache::StripEpoch(char const*)@Base" 0.8.0
+ (c++)"pkgDepCache::StateCache::Update(pkgCache::PkgIterator, pkgCache&)@Base" 0.8.0
+ (c++)"pkgDepCache::ActionGroup::release()@Base" 0.8.0
+ (c++)"pkgDepCache::ActionGroup::ActionGroup(pkgDepCache&)@Base" 0.8.0
+ (c++)"pkgDepCache::ActionGroup::~ActionGroup()@Base" 0.8.0
+ (c++)"pkgDepCache::IsInstallOk(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::MarkInstall(pkgCache::PkgIterator const&, bool, unsigned long, bool, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::SetReInstall(pkgCache::PkgIterator const&, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::VersionState(pkgCache::DepIterator, unsigned char, unsigned char, unsigned char)@Base" 0.8.0
+ (c++)"pkgDepCache::BuildGroupOrs(pkgCache::VerIterator const&)@Base" 0.8.0
+ (c++)"pkgDepCache::InRootSetFunc::InRootSet(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgDepCache::InRootSetFunc::~InRootSetFunc()@Base" 0.8.0
+ (c++)"pkgDepCache::readStateFile(OpProgress*)@Base" 0.8.0
+ (c++)"pkgDepCache::GetRootSetFunc()@Base" 0.8.0
+ (c++)"pkgDepCache::UpdateVerState(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgDepCache::writeStateFile(OpProgress*, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::DependencyState(pkgCache::DepIterator&)@Base" 0.8.0
+ (c++)"pkgDepCache::DefaultRootSetFunc::InRootSet(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0
+ (c++)"pkgDepCache::MarkFollowsSuggests()@Base" 0.8.0
+ (c++)"pkgDepCache::MarkFollowsRecommends()@Base" 0.8.0
+ (c++)"pkgDepCache::Init(OpProgress*)@Base" 0.8.0
+ (c++)"pkgDepCache::Policy::IsImportantDep(pkgCache::DepIterator const&)@Base" 0.8.0
+ (c++)"pkgDepCache::Policy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgDepCache::Policy::~Policy()@Base" 0.8.0
+ (c++)"pkgDepCache::Update(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgDepCache::Update(OpProgress*)@Base" 0.8.0
+ (c++)"pkgDepCache::Update(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgDepCache::CheckDep(pkgCache::DepIterator, int, pkgCache::PkgIterator&)@Base" 0.8.0
+ (c++)"pkgDepCache::MarkAuto(pkgCache::PkgIterator const&, bool)@Base" 0.8.0
+ (c++)"pkgDepCache::MarkKeep(pkgCache::PkgIterator const&, bool, bool, unsigned long)@Base" 0.8.0
+ (c++)"pkgDepCache::MarkRequired(pkgDepCache::InRootSetFunc&)@Base" 0.8.0
+ (c++)"pkgDepCache::Sweep()@Base" 0.8.0
+ (c++)"pkgDepCache::pkgDepCache(pkgCache*, pkgDepCache::Policy*)@Base" 0.8.0
+ (c++)"pkgDepCache::~pkgDepCache()@Base" 0.8.0
+ (c++)"pkgSimulate::Policy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgSimulate::Policy::~Policy()@Base" 0.8.0
+ (c++)"pkgSimulate::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0
+ (c++)"pkgSimulate::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgSimulate::Configure(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgSimulate::pkgSimulate(pkgDepCache*)@Base" 0.8.0
+ (c++)"pkgSimulate::~pkgSimulate()@Base" 0.8.0
+ (c++)"indexRecords::Load(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"indexRecords::Lookup(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"indexRecords::MetaKeys()@Base" 0.8.0
+ (c++)"indexRecords::~indexRecords()@Base" 0.8.0
+ (c++)"pkgAcqMethod::FetchResult::TakeHashes(Hashes&)@Base" 0.8.0
+ (c++)"pkgAcqMethod::FetchResult::FetchResult()@Base" 0.8.0
+ (c++)"pkgAcqMethod::Configuration(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Log(char const*, ...)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Run(bool)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Exit()@Base" 0.8.0
+ (c++)"pkgAcqMethod::Fail(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Fail(bool)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Fetch(pkgAcqMethod::FetchItem*)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Status(char const*, ...)@Base" 0.8.0
+ (c++)"pkgAcqMethod::URIDone(pkgAcqMethod::FetchResult&, pkgAcqMethod::FetchResult*)@Base" 0.8.0
+ (c++)"pkgAcqMethod::Redirect(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"pkgAcqMethod::URIStart(pkgAcqMethod::FetchResult&)@Base" 0.8.0
+ (c++)"pkgAcqMethod::MediaFail(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcqMethod::pkgAcqMethod(char const*, unsigned long)@Base" 0.8.0
+ (c++)"pkgAcqMethod::~pkgAcqMethod()@Base" 0.8.0
+ (c++)"pkgCacheFile::BuildCaches(OpProgress*, bool)@Base" 0.8.0
+ (c++)"pkgCacheFile::BuildPolicy(OpProgress*)@Base" 0.8.0
+ (c++)"pkgCacheFile::BuildDepCache(OpProgress*)@Base" 0.8.0
+ (c++)"pkgCacheFile::BuildSourceList(OpProgress*)@Base" 0.8.0
+ (c++)"pkgCacheFile::Open(OpProgress*, bool)@Base" 0.8.0
+ (c++)"pkgCacheFile::Close()@Base" 0.8.0
+ (c++)"pkgCacheFile::pkgCacheFile()@Base" 0.8.0
+ (c++)"pkgCacheFile::~pkgCacheFile()@Base" 0.8.0
+ (c++)"pkgIndexFile::LanguageCode()@Base" 0.8.0
+ (c++)"pkgIndexFile::CheckLanguageCode(char const*)@Base" 0.8.0
+ (c++)"pkgIndexFile::TranslationsAvailable()@Base" 0.8.0
+ (c++)"pkgIndexFile::Type::GlobalList@Base" 0.8.0
+ (c++)"pkgIndexFile::Type::GlobalListLen@Base" 0.8.0
+ (c++)"pkgIndexFile::Type::GetType(char const*)@Base" 0.8.0
+ (c++)"pkgIndexFile::Type::Type()@Base" 0.8.0
+ (c++)"pkgOrderList::VisitRDeps(bool (pkgOrderList::*)(pkgCache::DepIterator), pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::OrderUnpack(std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)@Base" 0.8.0
+ (c++)"pkgOrderList::DepConfigure(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::DepUnPackDep(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::DepUnPackPre(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::DepUnPackCrit(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::DepUnPackPreD(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::OrderCompareA(void const*, void const*)@Base" 0.8.0
+ (c++)"pkgOrderList::OrderCompareB(void const*, void const*)@Base" 0.8.0
+ (c++)"pkgOrderList::OrderCritical()@Base" 0.8.0
+ (c++)"pkgOrderList::VisitProvides(pkgCache::DepIterator, bool)@Base" 0.8.0
+ (c++)"pkgOrderList::OrderConfigure()@Base" 0.8.0
+ (c++)"pkgOrderList::VisitRProvides(bool (pkgOrderList::*)(pkgCache::DepIterator), pkgCache::VerIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::Me@Base" 0.8.0
+ (c++)"pkgOrderList::DoRun()@Base" 0.8.0
+ (c++)"pkgOrderList::Score(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::AddLoop(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::FileCmp(pkgCache::PkgIterator, pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::CheckDep(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::DepRemove(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::IsMissing(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::VisitDeps(bool (pkgOrderList::*)(pkgCache::DepIterator), pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgOrderList::WipeFlags(unsigned long)@Base" 0.8.0
+ (c++)"pkgOrderList::pkgOrderList(pkgDepCache*)@Base" 0.8.0
+ (c++)"pkgOrderList::~pkgOrderList()@Base" 0.8.0
+ (c++)"Configuration::MatchAgainstConfig::MatchAgainstConfig(char const*)@Base" 0.8.0
+ (c++)"Configuration::MatchAgainstConfig::~MatchAgainstConfig()@Base" 0.8.0
+ (c++)"Configuration::Set(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"Configuration::Set(char const*, int const&)@Base" 0.8.0
+ (c++)"Configuration::Dump(std::basic_ostream<char, std::char_traits<char> >&)@Base" 0.8.0
+ (c++)"Configuration::Clear(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"Configuration::Clear(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)@Base" 0.8.0
+ (c++)"Configuration::Clear(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"Configuration::CndSet(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"Configuration::Lookup(char const*, bool const&)@Base" 0.8.0
+ (c++)"Configuration::Lookup(Configuration::Item*, char const*, unsigned long const&, bool const&)@Base" 0.8.0
+ (c++)"Configuration::Configuration(Configuration::Item const*)@Base" 0.8.0
+ (c++)"Configuration::Configuration()@Base" 0.8.0
+ (c++)"Configuration::~Configuration()@Base" 0.8.0
+ (c++)"WeakPointable::~WeakPointable()@Base" 0.8.0
+ (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&)@Base" 0.8.0
+ (c++)"debListParser::ConvertRelation(char const*, unsigned int&)@Base" 0.8.0
+ (c++)"debListParser::GetPrio(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgAcqArchive::Failed(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgAcquire::MethodConfig*)@Base" 0.8.0
+ (c++)"pkgAcqArchive::DescURI()@Base" 0.8.0
+ (c++)"pkgAcqArchive::Finished()@Base" 0.8.0
+ (c++)"pkgAcqArchive::QueueNext()@Base" 0.8.0
+ (c++)"pkgAcqArchive::ShortDesc()@Base" 0.8.0
+ (c++)"pkgAcqArchive::pkgAcqArchive(pkgAcquire*, pkgSourceList*, pkgRecords*, pkgCache::VerIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
+ (c++)"pkgAcqArchive::~pkgAcqArchive()@Base" 0.8.0
+ (c++)"pkgSourceList::ReadAppend(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgSourceList::ReadMainList()@Base" 0.8.0
+ (c++)"pkgSourceList::ReadSourceDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgSourceList::Read(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgSourceList::Type::GlobalList@Base" 0.8.0
+ (c++)"pkgSourceList::Type::GlobalListLen@Base" 0.8.0
+ (c++)"pkgSourceList::Type::GetType(char const*)@Base" 0.8.0
+ (c++)"pkgSourceList::Type::Type()@Base" 0.8.0
+ (c++)"pkgSourceList::Reset()@Base" 0.8.0
+ (c++)"pkgSourceList::pkgSourceList(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgSourceList::pkgSourceList()@Base" 0.8.0
+ (c++)"pkgSourceList::~pkgSourceList()@Base" 0.8.0
+ (c++)"pkgSrcRecords::File::~File()@Base" 0.8.0
+ (c++)"pkgSrcRecords::Find(char const*, bool const&)@Base" 0.8.0
+ (c++)"pkgSrcRecords::Parser::BuildDepRec::~BuildDepRec()@Base" 0.8.0
+ (c++)"pkgSrcRecords::Parser::BuildDepType(unsigned char const&)@Base" 0.8.0
+ (c++)"pkgSrcRecords::Restart()@Base" 0.8.0
+ (c++)"pkgSrcRecords::pkgSrcRecords(pkgSourceList&)@Base" 0.8.0
+ (c++)"pkgSrcRecords::~pkgSrcRecords()@Base" 0.8.0
+ (c++)"pkgTagSection::TrimRecord(bool, char const*&)@Base" 0.8.0
+ (c++)"pkgTagSection::Trim()@Base" 0.8.0
+ (c++)"pkgVendorList::CreateList(Configuration&)@Base" 0.8.0
+ (c++)"pkgVendorList::FindVendor(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)@Base" 0.8.0
+ (c++)"pkgVendorList::ReadMainList()@Base" 0.8.0
+ (c++)"pkgVendorList::LookupFingerprint(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgVendorList::Read(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgVendorList::~pkgVendorList()@Base" 0.8.0
+ (c++)"OpTextProgress::Done()@Base" 0.8.0
+ (c++)"OpTextProgress::Write(char const*)@Base" 0.8.0
+ (c++)"OpTextProgress::Update()@Base" 0.8.0
+ (c++)"OpTextProgress::OpTextProgress(Configuration&)@Base" 0.8.0
+ (c++)"OpTextProgress::~OpTextProgress()@Base" 0.8.0
+ (c++)"pkgVersionMatch::ExpressionMatches(char const*, char const*)@Base" 0.8.0
+ (c++)"pkgVersionMatch::ExpressionMatches(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 0.8.0
+ (c++)"pkgVersionMatch::Find(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgVersionMatch::MatchVer(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.8.0
+ (c++)"pkgVersionMatch::FileMatch(pkgCache::PkgFileIterator)@Base" 0.8.0
+ (c++)"pkgVersionMatch::pkgVersionMatch(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgVersionMatch::MatchType)@Base" 0.8.0
+ (c++)"pkgVersionMatch::~pkgVersionMatch()@Base" 0.8.0
+ (c++)"TranslationsCopy::CopyTranslations(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, pkgCdromStatus*)@Base" 0.8.0
+ (c++)"pkgAcquireStatus::Done(pkgAcquire::ItemDesc&)@Base" 0.8.0
+ (c++)"pkgAcquireStatus::Fail(pkgAcquire::ItemDesc&)@Base" 0.8.0
+ (c++)"pkgAcquireStatus::Stop()@Base" 0.8.0
+ (c++)"pkgAcquireStatus::Fetch(pkgAcquire::ItemDesc&)@Base" 0.8.0
+ (c++)"pkgAcquireStatus::Pulse(pkgAcquire*)@Base" 0.8.0
+ (c++)"pkgAcquireStatus::Start()@Base" 0.8.0
+ (c++)"pkgAcquireStatus::IMSHit(pkgAcquire::ItemDesc&)@Base" 0.8.0
+ (c++)"pkgAcquireStatus::pkgAcquireStatus()@Base" 0.8.0
+ (c++)"PreferenceSection::TrimRecord(bool, char const*&)@Base" 0.8.0
+ (c++)"pkgArchiveCleaner::Go(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, pkgCache&)@Base" 0.8.0
+ (c++)"pkgCacheGenerator::MakeStatusCache(pkgSourceList&, OpProgress*, MMap**, bool)@Base" 0.8.0
+ (c++)"pkgCacheGenerator::CreateDynamicMMap(FileFd*, unsigned long)@Base" 0.8.0
+ (c++)"pkgCacheGenerator::MakeOnlyStatusCache(OpProgress*, DynamicMMap**)@Base" 0.8.0
+ (c++)"pkgPackageManager::FixMissing()@Base" 0.8.0
+ (c++)"pkgPackageManager::EarlyRemove(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgPackageManager::GetArchives(pkgAcquire*, pkgSourceList*, pkgRecords*)@Base" 0.8.0
+ (c++)"pkgPackageManager::SmartRemove(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgPackageManager::SmartUnPack(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgPackageManager::ConfigureAll()@Base" 0.8.0
+ (c++)"pkgPackageManager::ImmediateAdd(pkgCache::PkgIterator, bool, unsigned int const&)@Base" 0.8.0
+ (c++)"pkgPackageManager::OrderInstall()@Base" 0.8.0
+ (c++)"pkgPackageManager::DepAlwaysTrue(pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"pkgPackageManager::CheckRConflicts(pkgCache::PkgIterator, pkgCache::DepIterator, char const*)@Base" 0.8.0
+ (c++)"pkgPackageManager::CreateOrderList()@Base" 0.8.0
+ (c++)"pkgPackageManager::DoInstallPostFork(int)@Base" 0.8.0
+ (c++)"pkgPackageManager::Go(int)@Base" 0.8.0
+ (c++)"pkgPackageManager::Reset()@Base" 0.8.0
+ (c++)"pkgPackageManager::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0
+ (c++)"pkgPackageManager::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgPackageManager::Configure(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgPackageManager::DoInstall(int)@Base" 0.8.0
+ (c++)"pkgPackageManager::pkgPackageManager(pkgDepCache*)@Base" 0.8.0
+ (c++)"pkgPackageManager::~pkgPackageManager()@Base" 0.8.0
+ (c++)"pkgProblemResolver::InstallProtect()@Base" 0.8.0
+ (c++)"pkgProblemResolver::This@Base" 0.8.0
+ (c++)"pkgProblemResolver::pkgProblemResolver(pkgDepCache*)@Base" 0.8.0
+ (c++)"pkgProblemResolver::~pkgProblemResolver()@Base" 0.8.0
+ (c++)"debVersioningSystem::CmpFragment(char const*, char const*, char const*, char const*)@Base" 0.8.0
+ (c++)"debVersioningSystem::DoCmpVersion(char const*, char const*, char const*, char const*)@Base" 0.8.0
+ (c++)"debVersioningSystem::DoCmpReleaseVer(char const*, char const*, char const*, char const*)@Base" 0.8.0
+ (c++)"debVersioningSystem::UpstreamVersion(char const*)@Base" 0.8.0
+ (c++)"debVersioningSystem::CheckDep(char const*, int, char const*)@Base" 0.8.0
+ (c++)"debVersioningSystem::debVersioningSystem()@Base" 0.8.0
+ (c++)"debVersioningSystem::~debVersioningSystem()@Base" 0.8.0
+ (c++)"pkgUdevCdromDevices::Scan()@Base" 0.8.0
+ (c++)"pkgUdevCdromDevices::Dlopen()@Base" 0.8.0
+ (c++)"pkgUdevCdromDevices::pkgUdevCdromDevices()@Base" 0.8.0
+ (c++)"pkgUdevCdromDevices::~pkgUdevCdromDevices()@Base" 0.8.0
+ (c++)"pkgVersioningSystem::GlobalList@Base" 0.8.0
+ (c++)"pkgVersioningSystem::GlobalListLen@Base" 0.8.0
+ (c++)"pkgVersioningSystem::TestCompatibility(pkgVersioningSystem const&)@Base" 0.8.0
+ (c++)"pkgVersioningSystem::GetVS(char const*)@Base" 0.8.0
+ (c++)"pkgVersioningSystem::pkgVersioningSystem()@Base" 0.8.0
+ (c++)"APT::CacheFilter::PackageNameMatchesRegEx::PackageNameMatchesRegEx(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"APT::CacheFilter::PackageNameMatchesRegEx::~PackageNameMatchesRegEx()@Base" 0.8.0
+ (c++)"APT::CacheFilter::PackageNameMatchesRegEx::operator()(pkgCache::GrpIterator const&)@Base" 0.8.0
+ (c++)"APT::CacheFilter::PackageNameMatchesRegEx::operator()(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"APT::Configuration::getLanguages(bool const&, bool const&, char const**)@Base" 0.8.0
+ (c++)"APT::Configuration::getArchitectures(bool const&)@Base" 0.8.0
+ (c++)"APT::Configuration::checkArchitecture(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"APT::Configuration::getCompressionTypes(bool const&)@Base" 0.8.0
+ (c++)"APT::CacheSetHelper::canNotFindPkgName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"APT::CacheSetHelper::canNotFindNewestVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"APT::CacheSetHelper::canNotFindCandidateVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"APT::CacheSetHelper::canNotFindInstalledVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"APT::CacheSetHelper::~CacheSetHelper()@Base" 0.8.0
+ (c++)"URI::NoUserPassword(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"URI::CopyFrom(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"URI::SiteOnly(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"URI::~URI()@Base" 0.8.0
+ (c++)"URI::operator std::basic_string<char, std::char_traits<char>, std::allocator<char> >()@Base" 0.8.0
+ (c++)"MMap::Map(FileFd&)@Base" 0.8.0
+ (c++)"MMap::Sync(unsigned long, unsigned long)@Base" 0.8.0
+ (c++)"MMap::Sync()@Base" 0.8.0
+ (c++)"MMap::Close(bool)@Base" 0.8.0
+ (c++)"MMap::MMap(FileFd&, unsigned long)@Base" 0.8.0
+ (c++)"MMap::MMap(unsigned long)@Base" 0.8.0
+ (c++)"MMap::~MMap()@Base" 0.8.0
+ (c++)"FileFd::Size()@Base" 0.8.0
+ (c++)"FileFd::Sync()@Base" 0.8.0
+ (c++)"FileFd::Tell()@Base" 0.8.0
+ (c++)"FileFd::Close()@Base" 0.8.0
+ (c++)"FileFd::~FileFd()@Base" 0.8.0
+ (c++)"Vendor::CheckDist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"Vendor::Vendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<Vendor::Fingerprint*, std::allocator<Vendor::Fingerprint*> >*)@Base" 0.8.0
+ (c++)"Vendor::~Vendor()@Base" 0.8.0
+ (c++)"pkgCache::CompTypeDeb(unsigned char)@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::GlobOr(pkgCache::DepIterator&, pkgCache::DepIterator&)@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::GrpIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::GrpIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::PrvIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::PrvIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::DescIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::DescIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::PkgFileIterator::IsOk()@Base" 0.8.0
+ (c++)"pkgCache::PkgFileIterator::RelStr()@Base" 0.8.0
+ (c++)"pkgCache::PkgFileIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::PkgFileIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::VerFileIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::VerFileIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::DescFileIterator::operator++(int)@Base" 0.8.0
+ (c++)"pkgCache::DescFileIterator::operator++()@Base" 0.8.0
+ (c++)"pkgCache::ReMap(bool const&)@Base" 0.8.0
+ (c++)"pkgCache::Header::Header()@Base" 0.8.0
+ (c++)"pkgCache::DepType(unsigned char)@Base" 0.8.0
+ (c++)"pkgCache::FindGrp(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"pkgCache::FindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"pkgCache::FindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.0
+ (c++)"pkgCache::CompType(unsigned char)@Base" 0.8.0
+ (c++)"pkgCache::Priority(unsigned char)@Base" 0.8.0
+ (c++)"pkgCache::pkgCache(MMap*, bool)@Base" 0.8.0
+ (c++)"pkgCache::~pkgCache()@Base" 0.8.0
+ (c++)"pkgCdrom::DropRepeats(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, char const*)@Base" 0.8.0
+ (c++)"pkgCdrom::FindPackages(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, pkgCdromStatus*, unsigned int)@Base" 0.8.0
+ (c++)"pkgCdrom::WriteDatabase(Configuration&)@Base" 0.8.0
+ (c++)"pkgCdrom::DropBinaryArch(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.8.0
+ (c++)"pkgCdrom::WriteSourceList(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, bool)@Base" 0.8.0
+ (c++)"pkgCdrom::ReduceSourcelist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.8.0
+ (c++)"pkgCdrom::Add(pkgCdromStatus*)@Base" 0.8.0
+ (c++)"pkgCdrom::Ident(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, pkgCdromStatus*)@Base" 0.8.0
+ (c++)"pkgCdrom::Score(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"IndexCopy::CopyPackages(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, pkgCdromStatus*)@Base" 0.8.0
+ (c++)"IndexCopy::ReconstructChop(unsigned long&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"IndexCopy::ReconstructPrefix(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"IndexCopy::ConvertToSourceList(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)@Base" 0.8.0
+ (c++)"IndexCopy::ChopDirs(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int)@Base" 0.8.0
+ (c++)"IndexCopy::GrabFirst(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int)@Base" 0.8.0
+ (c++)"SigVerify::CopyAndVerify(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >)@Base" 0.8.0
+ (c++)"SigVerify::RunGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, int*)@Base" 0.8.0
+ (c++)"debSystem::Initialize(Configuration&)@Base" 0.8.0
+ (c++)"debSystem::AddStatusFiles(std::vector<pkgIndexFile*, std::allocator<pkgIndexFile*> >&)@Base" 0.8.0
+ (c++)"debSystem::ArchiveSupported(char const*)@Base" 0.8.0
+ (c++)"debSystem::Lock()@Base" 0.8.0
+ (c++)"debSystem::Score(Configuration const&)@Base" 0.8.0
+ (c++)"debSystem::UnLock(bool)@Base" 0.8.0
+ (c++)"debSystem::debSystem()@Base" 0.8.0
+ (c++)"debSystem::~debSystem()@Base" 0.8.0
+ (c++)"pkgDPkgPM::SendV2Pkgs(_IO_FILE*)@Base" 0.8.0
+ (c++)"pkgDPkgPM::DoTerminalPty(int)@Base" 0.8.0
+ (c++)"pkgDPkgPM::WriteHistoryTag(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgDPkgPM::WriteApportReport(char const*, char const*)@Base" 0.8.0
+ (c++)"pkgDPkgPM::RunScriptsWithPkgs(char const*)@Base" 0.8.0
+ (c++)"pkgDPkgPM::Go(int)@Base" 0.8.0
+ (c++)"pkgDPkgPM::Reset()@Base" 0.8.0
+ (c++)"pkgDPkgPM::Remove(pkgCache::PkgIterator, bool)@Base" 0.8.0
+ (c++)"pkgDPkgPM::DoStdin(int)@Base" 0.8.0
+ (c++)"pkgDPkgPM::Install(pkgCache::PkgIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.0
+ (c++)"pkgDPkgPM::OpenLog()@Base" 0.8.0
+ (c++)"pkgDPkgPM::CloseLog()@Base" 0.8.0
+ (c++)"pkgDPkgPM::Configure(pkgCache::PkgIterator)@Base" 0.8.0
+ (c++)"pkgDPkgPM::pkgDPkgPM(pkgDepCache*)@Base" 0.8.0
+ (c++)"pkgDPkgPM::~pkgDPkgPM()@Base" 0.8.0
+ (c++)"pkgPolicy::GetPriority(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgPolicy::InitDefaults()@Base" 0.8.0
+ (c++)"pkgPolicy::GetCandidateVer(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgPolicy::PkgPin::~PkgPin()@Base" 0.8.0
+ (c++)"pkgPolicy::GetMatch(pkgCache::PkgIterator const&)@Base" 0.8.0
+ (c++)"pkgPolicy::CreatePin(pkgVersionMatch::MatchType, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, short)@Base" 0.8.0
+ (c++)"pkgPolicy::pkgPolicy(pkgCache*)@Base" 0.8.0
+ (c++)"pkgPolicy::~pkgPolicy()@Base" 0.8.0
+ (c++)"pkgSystem::GlobalList@Base" 0.8.0
+ (c++)"pkgSystem::Initialize(Configuration&)@Base" 0.8.0
+ (c++)"pkgSystem::GlobalListLen@Base" 0.8.0
+ (c++)"pkgSystem::Score(Configuration const&)@Base" 0.8.0
+ (c++)"pkgSystem::GetSystem(char const*)@Base" 0.8.0
+ (c++)"pkgSystem::pkgSystem()@Base" 0.8.0
+ (c++)"HashString::VerifyFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
+ (c++)"HashString::empty() const@Base" 0.8.0
+ (c++)"HashString::toStr() const@Base" 0.8.0
+ (c++)"CommandLine::FileSize() const@Base" 0.8.0
+ (c++)"GlobalError::empty(GlobalError::MsgType const&) const@Base" 0.8.0
+ (c++)"indexRecords::GetValidUntil() const@Base" 0.8.0
+ (c++)"indexRecords::GetExpectedDist() const@Base" 0.8.0
+ (c++)"indexRecords::Exists(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
+ (c++)"indexRecords::GetDist() const@Base" 0.8.0
+ (c++)"indexRecords::CheckDist(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
+ (c++)"pkgIndexFile::ArchiveURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
+ (c++)"pkgIndexFile::SourceInfo(pkgSrcRecords::Parser const&, pkgSrcRecords::File const&) const@Base" 0.8.0
+ (c++)"pkgIndexFile::ArchiveInfo(pkgCache::VerIterator) const@Base" 0.8.0
+ (c++)"pkgIndexFile::FindInCache(pkgCache&) const@Base" 0.8.0
+ (c++)"pkgIndexFile::CreateSrcParser() const@Base" 0.8.0
+ (c++)"pkgIndexFile::MergeFileProvides(pkgCacheGenerator&, OpProgress&) const@Base" 0.8.0
+ (c++)"pkgIndexFile::Type::CreatePkgParser(pkgCache::PkgFileIterator) const@Base" 0.8.0
+ (c++)"pkgIndexFile::Merge(pkgCacheGenerator&, OpProgress&) const@Base" 0.8.0
+ (c++)"Configuration::MatchAgainstConfig::Match(char const*) const@Base" 0.8.0
+ (c++)"Configuration::Find(char const*, char const*) const@Base" 0.8.0
+ (c++)"Configuration::Item::FullTag(Configuration::Item const*) const@Base" 0.8.0
+ (c++)"Configuration::FindB(char const*, bool const&) const@Base" 0.8.0
+ (c++)"Configuration::FindI(char const*, int const&) const@Base" 0.8.0
+ (c++)"Configuration::Exists(char const*) const@Base" 0.8.0
+ (c++)"Configuration::FindAny(char const*, char const*) const@Base" 0.8.0
+ (c++)"Configuration::FindDir(char const*, char const*) const@Base" 0.8.0
+ (c++)"Configuration::FindFile(char const*, char const*) const@Base" 0.8.0
+ (c++)"Configuration::ExistsAny(char const*) const@Base" 0.8.0
+ (c++)"pkgSourceList::GetIndexes(pkgAcquire*, bool) const@Base" 0.8.0
+ (c++)"pkgSourceList::Type::FixupURI(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const@Base" 0.8.0
+ (c++)"pkgSourceList::Type::ParseLine(std::vector<metaIndex*, std::allocator<metaIndex*> >&, char const*, unsigned long const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
+ (c++)"pkgSourceList::FindIndex(pkgCache::PkgFileIterator, pkgIndexFile*&) const@Base" 0.8.0
+ (c++)"pkgTagSection::Find(char const*, char const*&, char const*&) const@Base" 0.8.0
+ (c++)"pkgTagSection::Find(char const*, unsigned int&) const@Base" 0.8.0
+ (c++)"pkgTagSection::FindI(char const*, long) const@Base" 0.8.0
+ (c++)"pkgTagSection::FindS(char const*) const@Base" 0.8.0
+ (c++)"pkgTagSection::FindULL(char const*, unsigned long long const&) const@Base" 0.8.0
+ (c++)"pkgTagSection::FindFlag(char const*, unsigned long&, unsigned long) const@Base" 0.8.0
+ (c++)"Vendor::GetVendorID() const@Base" 0.8.0
+ (c++)"Vendor::LookupFingerprint(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::AllTargets() const@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::IsCritical() const@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::DepIterator::SmartTargetPkg(pkgCache::PkgIterator&) const@Base" 0.8.0
+ (c++)"pkgCache::GrpIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::GrpIterator::FindPreferredPkg(bool const&) const@Base" 0.8.0
+ (c++)"pkgCache::GrpIterator::FindPkg(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.8.0
+ (c++)"pkgCache::GrpIterator::NextPkg(pkgCache::PkgIterator const&) const@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::CurVersion() const@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::CandVersion() const@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::State() const@Base" 0.8.0
+ (c++)"pkgCache::PkgIterator::FullName(bool const&) const@Base" 0.8.0
+ (c++)"pkgCache::PrvIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::CompareVer(pkgCache::VerIterator const&) const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::NewestFile() const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::Downloadable() const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::TranslatedDescription() const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::RelStr() const@Base" 0.8.0
+ (c++)"pkgCache::VerIterator::Automatic() const@Base" 0.8.0
+ (c++)"pkgCache::DescIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::PkgFileIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::VerFileIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::DescFileIterator::OwnerPointer() const@Base" 0.8.0
+ (c++)"pkgCache::sHash(char const*) const@Base" 0.8.0
+ (c++)"pkgCache::sHash(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.8.0
+ (c++)"pkgCache::Header::CheckSizes(pkgCache::Header&) const@Base" 0.8.0
+ (c++)"debSystem::CreatePM(pkgDepCache*) const@Base" 0.8.0
+ (c++)"debSystem::FindIndex(pkgCache::PkgFileIterator, pkgIndexFile*&) const@Base" 0.8.0
+ (c++)"metaIndex::GetURI() const@Base" 0.8.0
+ (c++)"metaIndex::GetDist() const@Base" 0.8.0
+ (c++)"metaIndex::GetType() const@Base" 0.8.0
+ (c++)"typeinfo for OpProgress@Base" 0.8.0
+ (c++)"typeinfo for SourceCopy@Base" 0.8.0
+ (c++)"typeinfo for pkgAcqFile@Base" 0.8.0
+ (c++)"typeinfo for pkgAcquire@Base" 0.8.0
+ (c++)"typeinfo for DynamicMMap@Base" 0.8.0
+ (c++)"typeinfo for PackageCopy@Base" 0.8.0
+ (c++)"typeinfo for pkgDepCache@Base" 0.8.0
+ (c++)"typeinfo for pkgSimulate@Base" 0.8.0
+ (c++)"typeinfo for indexRecords@Base" 0.8.0
+ (c++)"typeinfo for pkgAcqMethod@Base" 0.8.0
+ (c++)"typeinfo for pkgCacheFile@Base" 0.8.0
+ (c++)"typeinfo for pkgIndexFile@Base" 0.8.0
+ (c++)"typeinfo for WeakPointable@Base" 0.8.0
+ (c++)"typeinfo for pkgAcqArchive@Base" 0.8.0
+ (c++)"typeinfo for pkgTagSection@Base" 0.8.0
+ (c++)"typeinfo for OpTextProgress@Base" 0.8.0
+ (c++)"typeinfo for pkgAcquireStatus@Base" 0.8.0
+ (c++)"typeinfo for PreferenceSection@Base" 0.8.0
+ (c++)"typeinfo for pkgPackageManager@Base" 0.8.0
+ (c++)"typeinfo for debVersioningSystem@Base" 0.8.0
+ (c++)"typeinfo for pkgUdevCdromDevices@Base" 0.8.0
+ (c++)"typeinfo for pkgVersioningSystem@Base" 0.8.0
+ (c++)"typeinfo for MMap@Base" 0.8.0
+ (c++)"typeinfo for FileFd@Base" 0.8.0
+ (c++)"typeinfo for Vendor@Base" 0.8.0
+ (c++)"typeinfo for pkgCache@Base" 0.8.0
+ (c++)"typeinfo for IndexCopy@Base" 0.8.0
+ (c++)"typeinfo for debSystem@Base" 0.8.0
+ (c++)"typeinfo for metaIndex@Base" 0.8.0
+ (c++)"typeinfo for pkgDPkgPM@Base" 0.8.0
+ (c++)"typeinfo for pkgPolicy@Base" 0.8.0
+ (c++)"typeinfo for pkgSystem@Base" 0.8.0
+ (c++)"typeinfo for pkgAcquire::Item@Base" 0.8.0
+ (c++)"typeinfo for pkgRecords::Parser@Base" 0.8.0
+ (c++)"typeinfo for pkgDepCache::InRootSetFunc@Base" 0.8.0
+ (c++)"typeinfo for pkgDepCache::DefaultRootSetFunc@Base" 0.8.0
+ (c++)"typeinfo for pkgDepCache::Policy@Base" 0.8.0
+ (c++)"typeinfo for pkgSimulate::Policy@Base" 0.8.0
+ (c++)"typeinfo for pkgIndexFile::Type@Base" 0.8.0
+ (c++)"typeinfo for Configuration::MatchAgainstConfig@Base" 0.8.0
+ (c++)"typeinfo for pkgSourceList::Type@Base" 0.8.0
+ (c++)"typeinfo for pkgSrcRecords::Parser@Base" 0.8.0
+ (c++)"typeinfo for APT::CacheSetHelper@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::DepIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::GrpIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::PkgIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::PrvIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::VerIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::DescIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::PkgFileIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::VerFileIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::DescFileIterator@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::Description, pkgCache::DescIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::PackageFile, pkgCache::PkgFileIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::Group, pkgCache::GrpIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::Package, pkgCache::PkgIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::VerFile, pkgCache::VerFileIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::DescFile, pkgCache::DescFileIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Iterator<pkgCache::Provides, pkgCache::PrvIterator>@Base" 0.8.0
+ (c++)"typeinfo for pkgCache::Namespace@Base" 0.8.0
+ (c++)"typeinfo name for OpProgress@Base" 0.8.0
+ (c++)"typeinfo name for SourceCopy@Base" 0.8.0
+ (c++)"typeinfo name for pkgAcqFile@Base" 0.8.0
+ (c++)"typeinfo name for pkgAcquire@Base" 0.8.0
+ (c++)"typeinfo name for DynamicMMap@Base" 0.8.0
+ (c++)"typeinfo name for PackageCopy@Base" 0.8.0
+ (c++)"typeinfo name for pkgDepCache@Base" 0.8.0
+ (c++)"typeinfo name for pkgSimulate@Base" 0.8.0
+ (c++)"typeinfo name for indexRecords@Base" 0.8.0
+ (c++)"typeinfo name for pkgAcqMethod@Base" 0.8.0
+ (c++)"typeinfo name for pkgCacheFile@Base" 0.8.0
+ (c++)"typeinfo name for pkgIndexFile@Base" 0.8.0
+ (c++)"typeinfo name for WeakPointable@Base" 0.8.0
+ (c++)"typeinfo name for pkgAcqArchive@Base" 0.8.0
+ (c++)"typeinfo name for pkgTagSection@Base" 0.8.0
+ (c++)"typeinfo name for OpTextProgress@Base" 0.8.0
+ (c++)"typeinfo name for pkgAcquireStatus@Base" 0.8.0
+ (c++)"typeinfo name for PreferenceSection@Base" 0.8.0
+ (c++)"typeinfo name for pkgPackageManager@Base" 0.8.0
+ (c++)"typeinfo name for debVersioningSystem@Base" 0.8.0
+ (c++)"typeinfo name for pkgUdevCdromDevices@Base" 0.8.0
+ (c++)"typeinfo name for pkgVersioningSystem@Base" 0.8.0
+ (c++)"typeinfo name for MMap@Base" 0.8.0
+ (c++)"typeinfo name for FileFd@Base" 0.8.0
+ (c++)"typeinfo name for Vendor@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache@Base" 0.8.0
+ (c++)"typeinfo name for IndexCopy@Base" 0.8.0
+ (c++)"typeinfo name for debSystem@Base" 0.8.0
+ (c++)"typeinfo name for metaIndex@Base" 0.8.0
+ (c++)"typeinfo name for pkgDPkgPM@Base" 0.8.0
+ (c++)"typeinfo name for pkgPolicy@Base" 0.8.0
+ (c++)"typeinfo name for pkgSystem@Base" 0.8.0
+ (c++)"typeinfo name for pkgAcquire::Item@Base" 0.8.0
+ (c++)"typeinfo name for pkgRecords::Parser@Base" 0.8.0
+ (c++)"typeinfo name for pkgDepCache::InRootSetFunc@Base" 0.8.0
+ (c++)"typeinfo name for pkgDepCache::DefaultRootSetFunc@Base" 0.8.0
+ (c++)"typeinfo name for pkgDepCache::Policy@Base" 0.8.0
+ (c++)"typeinfo name for pkgSimulate::Policy@Base" 0.8.0
+ (c++)"typeinfo name for pkgIndexFile::Type@Base" 0.8.0
+ (c++)"typeinfo name for Configuration::MatchAgainstConfig@Base" 0.8.0
+ (c++)"typeinfo name for pkgSourceList::Type@Base" 0.8.0
+ (c++)"typeinfo name for pkgSrcRecords::Parser@Base" 0.8.0
+ (c++)"typeinfo name for APT::CacheSetHelper@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::DepIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::GrpIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::PkgIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::PrvIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::VerIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::DescIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::PkgFileIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::VerFileIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::DescFileIterator@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Description, pkgCache::DescIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::PackageFile, pkgCache::PkgFileIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Group, pkgCache::GrpIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Package, pkgCache::PkgIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::VerFile, pkgCache::VerFileIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::DescFile, pkgCache::DescFileIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Iterator<pkgCache::Provides, pkgCache::PrvIterator>@Base" 0.8.0
+ (c++)"typeinfo name for pkgCache::Namespace@Base" 0.8.0
+ (c++)"vtable for OpProgress@Base" 0.8.0
+ (c++)"vtable for SourceCopy@Base" 0.8.0
+ (c++)"vtable for pkgAcqFile@Base" 0.8.0
+ (c++)"vtable for pkgAcquire@Base" 0.8.0
+ (c++)"vtable for DynamicMMap@Base" 0.8.0
+ (c++)"vtable for PackageCopy@Base" 0.8.0
+ (c++)"vtable for pkgDepCache@Base" 0.8.0
+ (c++)"vtable for pkgSimulate@Base" 0.8.0
+ (c++)"vtable for indexRecords@Base" 0.8.0
+ (c++)"vtable for pkgAcqMethod@Base" 0.8.0
+ (c++)"vtable for pkgCacheFile@Base" 0.8.0
+ (c++)"vtable for pkgIndexFile@Base" 0.8.0
+ (c++)"vtable for pkgAcqArchive@Base" 0.8.0
+ (c++)"vtable for pkgTagSection@Base" 0.8.0
+ (c++)"vtable for OpTextProgress@Base" 0.8.0
+ (c++)"vtable for pkgAcquireStatus@Base" 0.8.0
+ (c++)"vtable for PreferenceSection@Base" 0.8.0
+ (c++)"vtable for pkgPackageManager@Base" 0.8.0
+ (c++)"vtable for debVersioningSystem@Base" 0.8.0
+ (c++)"vtable for pkgUdevCdromDevices@Base" 0.8.0
+ (c++)"vtable for pkgVersioningSystem@Base" 0.8.0
+ (c++)"vtable for MMap@Base" 0.8.0
+ (c++)"vtable for FileFd@Base" 0.8.0
+ (c++)"vtable for Vendor@Base" 0.8.0
+ (c++)"vtable for pkgCache@Base" 0.8.0
+ (c++)"vtable for IndexCopy@Base" 0.8.0
+ (c++)"vtable for debSystem@Base" 0.8.0
+ (c++)"vtable for metaIndex@Base" 0.8.0
+ (c++)"vtable for pkgDPkgPM@Base" 0.8.0
+ (c++)"vtable for pkgPolicy@Base" 0.8.0
+ (c++)"vtable for pkgSystem@Base" 0.8.0
+ (c++)"vtable for pkgAcquire::Item@Base" 0.8.0
+ (c++)"vtable for pkgRecords::Parser@Base" 0.8.0
+ (c++)"vtable for pkgDepCache::InRootSetFunc@Base" 0.8.0
+ (c++)"vtable for pkgDepCache::DefaultRootSetFunc@Base" 0.8.0
+ (c++)"vtable for pkgDepCache::Policy@Base" 0.8.0
+ (c++)"vtable for pkgSimulate::Policy@Base" 0.8.0
+ (c++)"vtable for pkgIndexFile::Type@Base" 0.8.0
+ (c++)"vtable for Configuration::MatchAgainstConfig@Base" 0.8.0
+ (c++)"vtable for pkgSourceList::Type@Base" 0.8.0
+ (c++)"vtable for pkgSrcRecords::Parser@Base" 0.8.0
+ (c++)"vtable for APT::CacheSetHelper@Base" 0.8.0
+ (c++)"vtable for pkgCache::DepIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::GrpIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::PkgIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::PrvIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::VerIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::DescIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::PkgFileIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::VerFileIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::DescFileIterator@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::Dependency, pkgCache::DepIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::Description, pkgCache::DescIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::PackageFile, pkgCache::PkgFileIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::Group, pkgCache::GrpIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::Package, pkgCache::PkgIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::VerFile, pkgCache::VerFileIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::Version, pkgCache::VerIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::DescFile, pkgCache::DescFileIterator>@Base" 0.8.0
+ (c++)"vtable for pkgCache::Iterator<pkgCache::Provides, pkgCache::PrvIterator>@Base" 0.8.0
+ (c++)"non-virtual thunk to pkgDepCache::DefaultRootSetFunc::~DefaultRootSetFunc()@Base" 0.8.0
+ (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, pkgCache::DepIterator)@Base" 0.8.0
+ (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, pkgCache::PkgIterator)@Base" 0.8.0
+ _config@Base 0.8.0
+ _system@Base 0.8.0
+ debSys@Base 0.8.0
+ debVS@Base 0.8.0
+ pkgLibVersion@Base 0.8.0
+ pkgVersion@Base 0.8.0
+ (c++)"pkgAcquireStatus::~pkgAcquireStatus()@Base" 0.8.0
+ (c++)"IndexCopy::~IndexCopy()@Base" 0.8.0
+ (c++)"pkgIndexFile::Type::~Type()@Base" 0.8.0
+ (c++)"pkgAcqBaseIndex::~pkgAcqBaseIndex()@Base" 0.8.0
+ (c++)"pkgArchiveCleaner::~pkgArchiveCleaner()@Base" 0.8.0
+ (c++)"typeinfo for pkgArchiveCleaner@Base" 0.8.0
+ (c++)"typeinfo name for pkgArchiveCleaner@Base" 0.8.0
+ (c++)"vtable for pkgArchiveCleaner@Base" 0.8.0
+### architecture specific: va_list
+ (arch=armel armhf|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, std::__va_list&) const@Base" 0.8.15~exp1
+ (arch=i386 hurd-i386 kfreebsd-i386 ppc64|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, char*&) const@Base" 0.8.15~exp1
+ (arch=hppa ia64 mips mipsel sparc sparc64|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, void*&) const@Base" 0.8.15~exp1
+ (arch=amd64 kfreebsd-amd64 powerpc powerpcspe s390 s390x x32|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, __va_list_tag (&) [1]) const@Base" 0.8.15~exp1
+ (arch=sh4|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, __builtin_va_list&) const@Base" 0.8.15~exp1
+ (arch=alpha|c++)"pkgAcqMethod::PrintStatus(char const*, char const*, __va_list_tag&) const@Base" 0.8.15~exp1
+### architecture specific: va_list & size_t
+ (arch=i386 hurd-i386 kfreebsd-i386|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, char*&, unsigned int&)@Base" 0.8.11.4
+ (arch=armel armhf|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, std::__va_list&, unsigned int&)@Base" 0.8.11.4
+ (arch=alpha|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __va_list_tag&, unsigned long&)@Base" 0.8.11.4
+ (arch=powerpc powerpcspe x32|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __va_list_tag (&) [1], unsigned int&)@Base" 0.8.11.4
+ (arch=amd64 kfreebsd-amd64 s390 s390x|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __va_list_tag (&) [1], unsigned long&)@Base" 0.8.11.4
+ (arch=hppa mips mipsel sparc|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, void*&, unsigned int&)@Base" 0.8.11.4
+ (arch=ia64 sparc64|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, void*&, unsigned long&)@Base" 0.8.11.4
+ (arch=sh4|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, __builtin_va_list&, unsigned int&)@Base" 0.8.11.4
+ (arch=ppc64|c++)"GlobalError::Insert(GlobalError::MsgType, char const*, char*&, unsigned long&)@Base" 0.8.11.4
+ (arch=i386 hurd-i386 kfreebsd-i386|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, char*&, int, unsigned int&)@Base" 0.8.11.4
+ (arch=armel armhf|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, std::__va_list&, int, unsigned int&)@Base" 0.8.11.4
+ (arch=alpha|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag&, int, unsigned long&)@Base" 0.8.11.4
+ (arch=powerpc powerpcspe x32|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag (&) [1], int, unsigned int&)@Base" 0.8.11.4
+ (arch=amd64 kfreebsd-amd64 s390 s390x|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __va_list_tag (&) [1], int, unsigned long&)@Base" 0.8.11.4
+ (arch=hppa mips mipsel sparc|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, void*&, int, unsigned int&)@Base" 0.8.11.4
+ (arch=ia64 sparc64|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, void*&, int, unsigned long&)@Base" 0.8.11.4 1
+ (arch=sh4|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, __builtin_va_list&, int, unsigned int&)@Base" 0.8.11.4
+ (arch=ppc64|c++)"GlobalError::InsertErrno(GlobalError::MsgType, char const*, char const*, char*&, int, unsigned long&)@Base" 0.8.11.4
+### architecture specific: size_t
+ (arch=i386 armel armhf hppa hurd-i386 kfreebsd-i386 mips mipsel powerpc powerpcspe sh4 sparc x32|c++)"_strtabexpand(char*, unsigned int)@Base" 0.8.0
+ (arch=alpha amd64 ia64 kfreebsd-amd64 s390 s390x sparc64 ppc64|c++)"_strtabexpand(char*, unsigned long)@Base" 0.8.0
+### architecture specific: time_t
+ (arch=!x32|c++)"TimeRFC1123(long)@Base" 0.8.0
+ (arch=x32|c++)"TimeRFC1123(long long)@Base" 0.8.0
+ (arch=!x32|c++)"FTPMDTMStrToTime(char const*, long&)@Base" 0.8.0
+ (arch=x32|c++)"FTPMDTMStrToTime(char const*, long long&)@Base" 0.8.0
+ (arch=!x32|c++)"StrToTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, long&)@Base" 0.8.0
+ (arch=x32|c++)"StrToTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, long long&)@Base" 0.8.0
+ (arch=!x32|c++)"RFC1123StrToTime(char const*, long&)@Base" 0.8.0
+ (arch=x32|c++)"RFC1123StrToTime(char const*, long long&)@Base" 0.8.0
+###
+ (c++)"CreateAPTDirectoryIfNeeded(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.2
+ (c++)"FileFd::FileSize()@Base" 0.8.8
+ (c++)"Base256ToNum(char const*, unsigned long&, unsigned int)@Base" 0.8.11
+ (c++)"pkgDepCache::SetCandidateRelease(pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::list<std::pair<pkgCache::VerIterator, pkgCache::VerIterator>, std::allocator<std::pair<pkgCache::VerIterator, pkgCache::VerIterator> > >&)@Base" 0.8.11
+ (c++)"pkgDepCache::SetCandidateRelease(pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11
+ (c++)"RealFileExists(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.11
+ (c++)"StripEpoch(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.11
+ (c++)"pkgTagSection::FindFlag(unsigned long&, unsigned long, char const*, char const*)@Base" 0.8.11
+ (c++)"FindMountPointForDevice(char const*)@Base" 0.8.12
+ (c++)"pkgUdevCdromDevices::ScanForRemovable(bool)@Base" 0.8.12
+ (c++)"APT::Configuration::Compressor::Compressor(char const*, char const*, char const*, char const*, char const*, unsigned short)@Base" 0.8.12
+ (c++)"APT::Configuration::Compressor::~Compressor()@Base" 0.8.12
+ (c++)"APT::Configuration::getCompressors(bool)@Base" 0.8.12
+ (c++)"APT::Configuration::getCompressorExtensions()@Base" 0.8.12
+ (c++)"pkgCache::DepIterator::IsNegative() const@Base" 0.8.15~exp1
+ (c++)"Configuration::CndSet(char const*, int)@Base" 0.8.15.3
+ (c++)"pkgProblemResolver::InstOrNewPolicyBroken(pkgCache::PkgIterator)@Base" 0.8.15.3
+ (c++)"DeEscapeString(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.15.4
+ (c++)"GetModificationTime(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.15.6
+ (c++)"pkgSourceList::GetLastModifiedTime()@Base" 0.8.15.6
+ (c++)"pkgCacheFile::RemoveCaches()@Base" 0.8.15.7
+ (c++)"pkgOrderList::VisitNode(pkgCache::PkgIterator, char const*)@Base" 0.8.15.7
+### external dependency resolver ###
+ (c++)"EDSP::WriteError(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, _IO_FILE*)@Base" 0.8.16~exp2
+ (c++)"EDSP::ReadRequest(int, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&, bool&, bool&, bool&)@Base" 0.8.16~exp2
+ (c++)"EDSP::ApplyRequest(std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, std::list<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > const&, pkgDepCache&)@Base" 0.8.16~exp2
+ (c++)"EDSP::ReadResponse(int, pkgDepCache&, OpProgress*)@Base" 0.8.16~exp2
+ (c++)"EDSP::WriteRequest(pkgDepCache&, _IO_FILE*, bool, bool, bool, OpProgress*)@Base" 0.8.16~exp2
+ (c++)"EDSP::ExecuteSolver(char const*, int*, int*)@Base" 0.8.16~exp2
+ (c++)"EDSP::WriteProgress(unsigned short, char const*, _IO_FILE*)@Base" 0.8.16~exp2
+ (c++)"EDSP::WriteScenario(pkgDepCache&, _IO_FILE*, OpProgress*)@Base" 0.8.16~exp2
+ (c++)"EDSP::WriteSolution(pkgDepCache&, _IO_FILE*)@Base" 0.8.16~exp2
+ (c++)"EDSP::ResolveExternal(char const*, pkgDepCache&, bool, bool, bool, OpProgress*)@Base" 0.8.16~exp2
+ (c++)"EDSP::DepMap@Base" 0.8.16~exp2
+ (c++)"EDSP::PrioMap@Base" 0.8.16~exp2
+ (c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgIterator const&)@Base" 0.8.16~exp6
+ (c++)"pkgDepCache::Policy::GetPriority(pkgCache::PkgFileIterator const&)@Base" 0.8.16~exp6
+### generalisation of checksums (with lfs) -- mostly api-compatible available (without sha512 in previous versions)
+ (c++)"AddCRC16(unsigned short, void const*, unsigned long long)@Base" 0.8.16~exp2
+ (c++)"MD5Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"MD5Summation::Result()@Base" 0.8.16~exp2
+ (c++)"MD5Summation::MD5Summation()@Base" 0.8.16~exp2
+ (c++)"SHA1Summation::SHA1Summation()@Base" 0.8.16~exp2
+ (c++)"SHA1Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"SHA1Summation::Result()@Base" 0.8.16~exp2
+ (c++)"SHA256Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"SHA512Summation::Add(unsigned char const*, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"SummationImplementation::AddFD(int, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"typeinfo for MD5Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo for SHA1Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo for SHA256Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo for SHA512Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo for SHA2SummationBase@Base" 0.8.16~exp6
+ (c++)"typeinfo for SummationImplementation@Base" 0.8.16~exp6
+ (c++)"typeinfo name for MD5Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo name for SHA1Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo name for SHA256Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo name for SHA512Summation@Base" 0.8.16~exp6
+ (c++)"typeinfo name for SHA2SummationBase@Base" 0.8.16~exp6
+ (c++)"typeinfo name for SummationImplementation@Base" 0.8.16~exp6
+ (c++)"vtable for MD5Summation@Base" 0.8.16~exp6
+ (c++)"vtable for SHA1Summation@Base" 0.8.16~exp6
+ (c++)"vtable for SHA256Summation@Base" 0.8.16~exp6
+ (c++)"vtable for SHA512Summation@Base" 0.8.16~exp6
+ (c++)"vtable for SHA2SummationBase@Base" 0.8.16~exp6
+ (c++)"vtable for SummationImplementation@Base" 0.8.16~exp6
+### large file support - available in older api-compatible versions without lfs ###
+ (c++)"StrToNum(char const*, unsigned long long&, unsigned int, unsigned int)@Base" 0.8.16~exp6
+ (c++)"OpProgress::SubProgress(unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, float)@Base" 0.8.16~exp6
+ (c++)"OpProgress::OverallProgress(unsigned long long, unsigned long long, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp6
+ (c++)"OpProgress::Progress(unsigned long long)@Base" 0.8.16~exp6
+ (c++)"SourceCopy::GetFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6
+ (c++)"pkgAcquire::UriIterator::~UriIterator()@Base" 0.8.16~exp6
+ (c++)"pkgAcquire::MethodConfig::~MethodConfig()@Base" 0.8.16~exp6
+ (c++)"pkgAcquire::Item::Start(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"pkgRecords::Parser::RecordField(char const*)@Base" 0.8.16~exp6
+ (c++)"pkgTagFile::Jump(pkgTagSection&, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"pkgTagFile::Offset()@Base" 0.8.16~exp6
+ (c++)"pkgTagFile::pkgTagFile(FileFd*, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"DynamicMMap::RawAllocate(unsigned long long, unsigned long)@Base" 0.8.16~exp6
+ (c++)"PackageCopy::GetFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned long long&)@Base" 0.8.16~exp6
+ (c++)"pkgTagSection::~pkgTagSection()@Base" 0.8.16~exp6
+ (c++)"pkgAcquireStatus::Fetched(unsigned long long, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"PreferenceSection::~PreferenceSection()@Base" 0.8.16~exp6
+ (c++)"FileFd::Read(void*, unsigned long long, unsigned long long*)@Base" 0.8.16~exp6
+ (c++)"FileFd::Seek(unsigned long long)@Base" 0.8.16~exp6
+ (c++)"FileFd::Skip(unsigned long long)@Base" 0.8.16~exp6
+ (c++)"FileFd::Write(void const*, unsigned long long)@Base" 0.8.16~exp6
+ (c++)"FileFd::Truncate(unsigned long long)@Base" 0.8.16~exp6
+ (c++)"pkgPolicy::GetPriority(pkgCache::PkgFileIterator const&)@Base" 0.8.16~exp6
+ (c++)"typeinfo for pkgTagFile@Base" 0.8.16~exp6
+ (c++)"typeinfo for pkgSrcRecords@Base" 0.8.16~exp6
+ (c++)"typeinfo for pkgAcquire::UriIterator@Base" 0.8.16~exp6
+ (c++)"typeinfo for pkgAcquire::MethodConfig@Base" 0.8.16~exp6
+ (c++)"typeinfo for pkgAcquire::Queue@Base" 0.8.16~exp6
+ (c++)"typeinfo for pkgAcquire::Worker@Base" 0.8.16~exp6
+ (c++)"typeinfo name for pkgTagFile@Base" 0.8.16~exp6
+ (c++)"typeinfo name for pkgSrcRecords@Base" 0.8.16~exp6
+ (c++)"typeinfo name for pkgAcquire::UriIterator@Base" 0.8.16~exp6
+ (c++)"typeinfo name for pkgAcquire::MethodConfig@Base" 0.8.16~exp6
+ (c++)"typeinfo name for pkgAcquire::Queue@Base" 0.8.16~exp6
+ (c++)"typeinfo name for pkgAcquire::Worker@Base" 0.8.16~exp6
+ (c++)"vtable for pkgTagFile@Base" 0.8.16~exp6
+ (c++)"vtable for pkgSrcRecords@Base" 0.8.16~exp6
+ (c++)"vtable for pkgAcquire::UriIterator@Base" 0.8.16~exp6
+ (c++)"vtable for pkgAcquire::MethodConfig@Base" 0.8.16~exp6
+ (c++)"vtable for pkgAcquire::Queue@Base" 0.8.16~exp6
+ (c++)"vtable for pkgAcquire::Worker@Base" 0.8.16~exp6
+### remove deprecated parameter
+ (c++)"pkgDepCache::SetCandidateVersion(pkgCache::VerIterator)@Base" 0.8.16~exp6
+ (c++)"pkgDepCache::AddSizes(pkgCache::PkgIterator const&, bool)@Base" 0.8.16~exp6
+ (c++)"pkgDepCache::AddStates(pkgCache::PkgIterator const&, bool)@Base" 0.8.16~exp6
+### used internally by public interfaces - if you use them directly, you can keep the pieces
+ (c++|optional=internal|regex)"^SHA256_.*@Base$" 0.8.16~exp2
+ (c++|optional=internal|regex)"^SHA384_.*@Base$" 0.8.16~exp2
+ (c++|optional=internal|regex)"^SHA512_.*@Base$" 0.8.16~exp2
+### orderlist rework: the touched methods are protected
+ (c++)"SigINT(int)@Base" 0.8.16~exp14
+ (c++)"pkgPackageManager::SigINTStop@Base" 0.8.16~exp14
+ (c++)"pkgPackageManager::SmartUnPack(pkgCache::PkgIterator, bool, int)@Base" 0.8.16~exp14
+ (c++)"pkgPackageManager::SmartConfigure(pkgCache::PkgIterator, int)@Base" 0.8.16~exp14
+### FileFd rework: supporting different on-the-fly (de)compressing needs more parameter (abi), but the api is stable
+ (c++)"FileFd::OpenDescriptor(int, unsigned int, FileFd::CompressMode, bool)@Base" 0.8.16~exp9
+ (c++)"FileFd::OpenDescriptor(int, unsigned int, APT::Configuration::Compressor const&, bool)@Base" 0.8.16~exp9
+ (c++)"FileFd::ModificationTime()@Base" 0.8.16~exp9
+ (c++)"FileFd::Open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, FileFd::CompressMode, unsigned long)@Base" 0.8.16~exp9
+ (c++)"FileFd::Open(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, APT::Configuration::Compressor const&, unsigned long)@Base" 0.8.16~exp9
+ (c++)"FileFd::ReadLine(char*, unsigned long long)@Base" 0.8.16~exp9
+ (c++)"SummationImplementation::AddFD(FileFd&, unsigned long long)@Base" 0.8.16~exp9
+ (c++|optional=deprecated,previous-inline)"FileFd::gzFd()@Base" 0.8.0
+### CacheSet rework: making them real containers breaks bigtime the API (for the CacheSetHelper)
+ (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator::getPkg() const@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::empty() const@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator::getPkg() const@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::empty() const@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::empty() const@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator::getVer() const@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::canNotFindTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::canNotFindRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::canNotFindAllVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::canNotFindPackage(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::showTaskSelection(pkgCache::PkgIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::showRegExSelection(pkgCache::PkgIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::showSelectedVersion(pkgCache::PkgIterator const&, pkgCache::VerIterator, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::canNotFindCandInstVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
+ (c++)"APT::CacheSetHelper::canNotFindInstCandVer(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::clear()@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::insert(pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::clear()@Base" 0.8.16~exp9
+ (c++)"APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::insert(pkgCache::PkgIterator const&)@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::clear()@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::insert(pkgCache::VerIterator const&)@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainerInterface::getCandidateVer(pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainerInterface::getInstalledVer(pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+ (c++)"APT::VersionContainerInterface::FromModifierCommandLine(unsigned short&, APT::VersionContainerInterface*, pkgCacheFile&, char const*, std::list<APT::VersionContainerInterface::Modifier, std::allocator<APT::VersionContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+ (c++)"EDSP::WriteLimitedScenario(pkgDepCache&, _IO_FILE*, APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > > const&, OpProgress*)@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::PackageContainerInterface::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::PackageContainerInterface@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::VersionContainerInterface::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo for APT::VersionContainerInterface@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::PackageContainerInterface::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::PackageContainerInterface@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::VersionContainerInterface::const_iterator@Base" 0.8.16~exp9
+ (c++)"typeinfo name for APT::VersionContainerInterface@Base" 0.8.16~exp9
+ (c++)"vtable for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
+ (c++)"vtable for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
+ (c++)"vtable for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >::const_iterator@Base" 0.8.16~exp9
+ (c++)"vtable for APT::PackageContainer<std::list<pkgCache::PkgIterator, std::allocator<pkgCache::PkgIterator> > >@Base" 0.8.16~exp9
+ (c++)"vtable for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator@Base" 0.8.16~exp9
+ (c++)"vtable for APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >@Base" 0.8.16~exp9
+ (c++)"vtable for APT::PackageContainerInterface::const_iterator@Base" 0.8.16~exp9
+ (c++)"vtable for APT::PackageContainerInterface@Base" 0.8.16~exp9
+ (c++)"vtable for APT::VersionContainerInterface::const_iterator@Base" 0.8.16~exp9
+ (c++)"vtable for APT::VersionContainerInterface@Base" 0.8.16~exp9
+### rework of the packagemanager rework
+ (c++)"APT::Progress::PackageManager::ConffilePrompt(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::HandleSIGWINCH(int)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::~PackageManagerFancy()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::PackageManagerFancy()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::SetupTerminalScrollArea(int)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::Stop()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::fork()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::GetPulseInterval()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::~PackageManager()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::ConffilePrompt(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::~PackageManagerProgressDeb822Fd()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::PackageManagerProgressDeb822Fd(int)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::StartDpkg()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::Stop()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressDeb822Fd::WriteToStatusFd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFactory()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::ConffilePrompt(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::Error(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::~PackageManagerProgressFd()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::PackageManagerProgressFd(int)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::StartDpkg()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::Stop()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerProgressFd::WriteToStatusFd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::Pulse()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::StartDpkg()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManager::Stop()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerText::~PackageManagerText()@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerText::StatusChanged(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13~exp1
+ (c++)"APT::String::Strip(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.9.13~exp1
+ (c++)"pkgDPkgPM::BuildPackagesProgressMap()@Base" 0.9.13~exp1
+ (c++)"pkgDPkgPM::DoDpkgStatusFd(int)@Base" 0.9.13~exp1
+ (c++)"pkgDPkgPM::ProcessDpkgStatusLine(char*)@Base" 0.9.13~exp1
+ (c++)"pkgDPkgPM::StartPtyMagic()@Base" 0.9.13~exp1
+ (c++)"pkgDPkgPM::StopPtyMagic()@Base" 0.9.13~exp1
+ (c++)"typeinfo for APT::Progress::PackageManager@Base" 0.9.13~exp1
+ (c++)"typeinfo for APT::Progress::PackageManagerFancy@Base" 0.9.13~exp1
+ (c++)"typeinfo for APT::Progress::PackageManagerProgressDeb822Fd@Base" 0.9.13~exp1
+ (c++)"typeinfo for APT::Progress::PackageManagerProgressFd@Base" 0.9.13~exp1
+ (c++)"typeinfo for APT::Progress::PackageManagerText@Base" 0.9.13~exp1
+ (c++)"typeinfo name for APT::Progress::PackageManager@Base" 0.9.13~exp1
+ (c++)"typeinfo name for APT::Progress::PackageManagerFancy@Base" 0.9.13~exp1
+ (c++)"typeinfo name for APT::Progress::PackageManagerProgressDeb822Fd@Base" 0.9.13~exp1
+ (c++)"typeinfo name for APT::Progress::PackageManagerProgressFd@Base" 0.9.13~exp1
+ (c++)"typeinfo name for APT::Progress::PackageManagerText@Base" 0.9.13~exp1
+ (c++)"vtable for APT::Progress::PackageManager@Base" 0.9.13~exp1
+ (c++)"vtable for APT::Progress::PackageManagerFancy@Base" 0.9.13~exp1
+ (c++)"vtable for APT::Progress::PackageManagerProgressDeb822Fd@Base" 0.9.13~exp1
+ (c++)"vtable for APT::Progress::PackageManagerProgressFd@Base" 0.9.13~exp1
+ (c++)"vtable for APT::Progress::PackageManagerText@Base" 0.9.13~exp1
+ (c++)"APT::Progress::PackageManagerFancy::instances@Base" 0.9.14.2
+ (c++)"APT::Progress::PackageManagerFancy::Start(int)@Base" 0.9.14.2
+ (c++)"APT::Progress::PackageManager::Start(int)@Base" 0.9.14.2
+### deb822 sources.list format
+ (c++)"pkgSourceList::ParseFileDeb822(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.14.3~exp1
+ (c++)"pkgSourceList::ParseFileOldStyle(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.14.3~exp1
+ (c++)"pkgSourceList::Type::ParseStanza(std::vector<metaIndex*, std::allocator<metaIndex*> >&, pkgTagSection&, int, FileFd&)@Base" 0.9.14.3~exp1
+### install foo.deb support
+ (c++)"flAbsPath(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp1
+ (c++)"GetTempFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 1.1~exp1
+ (c++)"pkgIndexFile::Type::CreateSrcPkgParser(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 1.1~exp1
+ (c++)"metaIndex::LocalFileName() const@Base" 1.1~exp1
+ (c++)"metaIndex::~metaIndex()@Base" 1.1~exp1
+### CacheFilter functors
+ (c++)"APT::CacheFilter::ANDMatcher::AND(APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher(APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::ANDMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::~ANDMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ANDMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::FalseMatcher::~FalseMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::FalseMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::FalseMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::FalseMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::Matcher::~Matcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::NOTMatcher::NOTMatcher(APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::NOTMatcher::~NOTMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::NOTMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::NOTMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::NOTMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::OR(APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*, APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::ORMatcher(APT::CacheFilter::Matcher*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::~ORMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::ORMatcher::ORMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageIsNewInstall::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageIsNewInstall::~PackageIsNewInstall()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageIsNewInstall::PackageIsNewInstall(pkgCacheFile*)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageMatcher::~PackageMatcher()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::~PackageNameMatchesFnmatch()@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::PackageNameMatchesFnmatch(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::TrueMatcher::operator()(pkgCache::GrpIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::TrueMatcher::operator()(pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::TrueMatcher::operator()(pkgCache::VerIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheFilter::TrueMatcher::~TrueMatcher()@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::ANDMatcher@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::FalseMatcher@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::Matcher@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::NOTMatcher@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::ORMatcher@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::PackageArchitectureMatchesSpecification@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::PackageIsNewInstall@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::PackageMatcher@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::PackageNameMatchesFnmatch@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::PackageNameMatchesRegEx@Base" 1.1~exp4
+ (c++)"typeinfo for APT::CacheFilter::TrueMatcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::ANDMatcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::FalseMatcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::Matcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::NOTMatcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::ORMatcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::PackageArchitectureMatchesSpecification@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::PackageIsNewInstall@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::PackageMatcher@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::PackageNameMatchesFnmatch@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::PackageNameMatchesRegEx@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::CacheFilter::TrueMatcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::ANDMatcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::FalseMatcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::Matcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::NOTMatcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::ORMatcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::PackageArchitectureMatchesSpecification@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::PackageIsNewInstall@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::PackageMatcher@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::PackageNameMatchesFnmatch@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::PackageNameMatchesRegEx@Base" 1.1~exp4
+ (c++)"vtable for APT::CacheFilter::TrueMatcher@Base" 1.1~exp4
+### cacheset redesign (API, but not ABI compatible)
+# (c++|optional=inline)"APT::PackageContainerInterface::FromCommandLine(APT::PackageContainerInterface*, pkgCacheFile&, char const**, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::PackageContainerInterface::FromModifierCommandLine(unsigned short&, APT::PackageContainerInterface*, pkgCacheFile&, char const*, std::list<APT::PackageContainerInterface::Modifier, std::allocator<APT::PackageContainerInterface::Modifier> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::PackageContainerInterface::FromName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::PackageContainerInterface::FromTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::PackageContainerInterface::FromRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::VersionContainerInterface::FromString(APT::VersionContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&, bool)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::VersionContainerInterface::FromPackage(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++|optional=inline)"APT::VersionContainerInterface::FromCommandLine(APT::VersionContainerInterface*, pkgCacheFile&, char const**, APT::VersionContainerInterface::Version const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++)"APT::PackageContainerInterface::FromString(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, APT::CacheSetHelper&)@Base" 0.8.16~exp9
+# (c++)"APT::PackageContainerInterface::FromGroup(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.7
+# (c++)"APT::PackageContainerInterface::FromFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper&)@Base" 0.9.11
+ (c++)"APT::CacheSetHelper::canNotFindFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::canNotFindPackage(APT::CacheSetHelper::PkgSelector, APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::canNotFindVersion(APT::CacheSetHelper::VerSelector, APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::canNotGetCandInstVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::canNotGetInstCandVer(pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::canNotGetVersion(APT::CacheSetHelper::VerSelector, pkgCacheFile&, pkgCache::PkgIterator const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFrom(APT::CacheSetHelper::PkgSelector, APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromCommandLine(APT::PackageContainerInterface*, pkgCacheFile&, char const**)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromFnmatch(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromModifierCommandLine(unsigned short&, APT::PackageContainerInterface*, pkgCacheFile&, char const*, std::list<APT::CacheSetHelper::PkgModifier, std::allocator<APT::CacheSetHelper::PkgModifier> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromName(pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromPackageName(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromRegEx(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromString(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::PackageFromTask(APT::PackageContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::showFnmatchSelection(pkgCache::PkgIterator const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::showPackageSelection(pkgCache::PkgIterator const&, APT::CacheSetHelper::PkgSelector, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::CacheSetHelper::showVersionSelection(pkgCache::PkgIterator const&, pkgCache::VerIterator const&, APT::CacheSetHelper::VerSelector, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"APT::VersionContainerInterface::FromCommandLine(APT::VersionContainerInterface*, pkgCacheFile&, char const**, APT::CacheSetHelper::VerSelector, APT::CacheSetHelper&)@Base" 1.1~exp4
+ (c++)"APT::VersionContainerInterface::FromPackage(APT::VersionContainerInterface*, pkgCacheFile&, pkgCache::PkgIterator const&, APT::CacheSetHelper::VerSelector, APT::CacheSetHelper&)@Base" 1.1~exp4
+ (c++)"APT::VersionContainerInterface::FromString(APT::VersionContainerInterface*, pkgCacheFile&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, APT::CacheSetHelper::VerSelector, APT::CacheSetHelper&, bool)@Base" 1.1~exp4
+### all the hashes are belong to us
+# (c++|optional=inline)"Hashes::AddFD(int, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp6
+# (c++|optional=inline)"Hashes::AddFD(FileFd&, unsigned long long, bool, bool, bool, bool)@Base" 0.8.16~exp9
+# (c++|optional=inline)"pkgRecords::Parser::MD5Hash()@Base" 0.8.0
+# (c++|optional=inline)"pkgRecords::Parser::SHA1Hash()@Base" 0.8.0
+# (c++|optional=inline)"pkgRecords::Parser::SHA256Hash()@Base" 0.8.0
+# (c++|optional=inline)"pkgRecords::Parser::SHA512Hash()@Base" 0.8.16~exp6
+ (c++)"Hashes::AddFD(FileFd&, unsigned long long, unsigned int)@Base" 1.1~exp1
+ (c++)"Hashes::AddFD(int, unsigned long long, unsigned int)@Base" 1.1~exp1
+ (c++)"Hashes::Add(unsigned char const*, unsigned long long, unsigned int)@Base" 1.1~exp1
+ (c++)"Hashes::GetHashStringList()@Base" 1.1~exp1
+ (c++)"Hashes::Hashes()@Base" 1.1~exp1
+ (c++)"Hashes::~Hashes()@Base" 1.1~exp1
+ (c++)"HashStringList::find(char const*) const@Base" 1.1~exp1
+ (c++)"HashStringList::operator==(HashStringList const&) const@Base" 1.1~exp1
+ (c++)"HashStringList::operator!=(HashStringList const&) const@Base" 1.1~exp1
+ (c++)"HashStringList::push_back(HashString const&)@Base" 1.1~exp1
+ (c++)"HashStringList::supported(char const*)@Base" 1.1~exp1
+ (c++)"HashStringList::usable() const@Base" 1.1~exp1
+ (c++)"HashStringList::VerifyFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 1.1~exp1
+ (c++)"HashString::operator==(HashString const&) const@Base" 1.1~exp1
+ (c++)"HashString::operator!=(HashString const&) const@Base" 1.1~exp1
+ (c++)"indexRecords::GetSupportsAcquireByHash() const@Base" 1.1~exp1
+ (c++)"pkgAcqArchive::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, HashStringList const&, pkgAcquire::MethodConfig*)@Base" 1.1~exp1
+ (c++)"pkgAcqArchive::IsTrusted() const@Base" 1.1~exp1
+ (c++)"pkgAcqFile::Custom600Headers() const@Base" 1.1~exp1
+ (c++)"pkgAcqFile::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, HashStringList const&, pkgAcquire::MethodConfig*)@Base" 1.1~exp1
+ (c++)"pkgAcqFile::pkgAcqFile(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, HashStringList const&, unsigned long long, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 1.1~exp1
+ (c++)"pkgAcqMethod::DropPrivsOrDie()@Base" 1.1~exp1
+ (c++)"pkgAcquire::Item::Custom600Headers() const@Base" 1.1~exp1
+ (c++)"pkgAcquire::Item::Done(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned long long, HashStringList const&, pkgAcquire::MethodConfig*)@Base" 1.1~exp1
+ (c++)"pkgAcquire::Item::IsTrusted() const@Base" 1.1~exp1
+ (c++)"pkgRecords::Parser::Hashes() const@Base" 1.1~exp1
+ (c++)"pkgRecords::Parser::LongDesc(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp1
+ (c++)"pkgRecords::Parser::ShortDesc(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp1
+ (c++)"typeinfo for Hashes@Base" 1.1~exp1
+ (c++)"typeinfo name for Hashes@Base" 1.1~exp1
+ (c++)"vtable for Hashes@Base" 1.1~exp1
+ (c++)"typeinfo for pkgAcqBaseIndex@Base" 1.1~exp1
+ (c++)"typeinfo name for pkgAcqBaseIndex@Base" 1.1~exp1
+ (c++)"vtable for pkgAcqBaseIndex@Base" 1.1~exp1
+### more transactional update
+ (c++)"pkgAcqBaseIndex::VerifyHashByMetaKey(HashStringList const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::AbortTransaction()@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::Add(pkgAcquire::Item*)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::CheckAuthDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::CheckDownloadDone(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::CheckStopAuthentication(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::CommitTransaction()@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::GetCustom600Headers(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::QueueForSignatureVerify(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::QueueIndexes(bool)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::TransactionHasError()@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::TransactionStageCopy(pkgAcquire::Item*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::TransactionStageRemoval(pkgAcquire::Item*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::VerifyVendor(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcquire::GetLock(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcquire::Item::Dequeue()@Base" 1.1~exp4
+ (c++)"pkgAcquire::Item::Item(pkgAcquire*, HashStringList const&, pkgAcqMetaBase*)@Base" 1.1~exp4
+ (c++)"pkgAcquire::Item::QueueURI(pkgAcquire::ItemDesc&)@Base" 1.1~exp4
+ (c++)"pkgAcquire::Item::SetActiveSubprocess(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgAcquire::Setup(pkgAcquireStatus*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp4
+ (c++)"pkgArchiveCleaner::Erase(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, stat&)@Base" 1.1~exp4
+ (c++)"pkgDepCache::MarkAndSweep()@Base" 1.1~exp4
+ (c++)"pkgDepCache::MarkAndSweep(pkgDepCache::InRootSetFunc&)@Base" 1.1~exp4
+ (c++)"pkgAcqMetaBase::~pkgAcqMetaBase()@Base" 1.1~exp4
+ (c++)"typeinfo for pkgAcqMetaBase@Base" 1.1~exp4
+ (c++)"typeinfo name for pkgAcqMetaBase@Base" 1.1~exp4
+ (c++)"vtable for pkgAcqMetaBase@Base" 1.1~exp4
+### mixed stuff
+ (c++)"GetListOfFilesInDir(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.8.16~exp13
+ (c++)"pkgCache::DepIterator::IsIgnorable(pkgCache::PkgIterator const&) const@Base" 0.8.16~exp10
+ (c++)"pkgCache::DepIterator::IsIgnorable(pkgCache::PrvIterator const&) const@Base" 0.8.16~exp10
+ (c++)"FileFd::Write(int, void const*, unsigned long long)@Base" 0.8.16~exp14
+ (c++)"_strrstrip(char*)@Base" 0.9.7.9~exp2
+ (c++)"SplitClearSignedFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, FileFd*, std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*, FileFd*)@Base" 0.9.7.9~exp2
+ (c++)"OpenMaybeClearSignedFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, FileFd&)@Base" 0.9.7.9~exp2
+ (c++)"ExecGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&, int*)@Base" 0.9.7.9~exp2
+ (c++)"SigVerify::RunGPGV(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int const&)@Base" 0.9.7.9~exp2
+ (c++)"Configuration::Dump(std::basic_ostream<char, std::char_traits<char> >&, char const*, char const*, bool)@Base" 0.9.3
+ (c++)"AcquireUpdate(pkgAcquire&, int, bool, bool)@Base" 0.9.3
+ (c++)"pkgCache::DepIterator::IsMultiArchImplicit() const@Base" 0.9.6
+ (c++)"pkgCache::PrvIterator::IsMultiArchImplicit() const@Base" 0.9.6
+ (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::PackageArchitectureMatchesSpecification(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, bool)@Base" 0.9.7
+ (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::~PackageArchitectureMatchesSpecification()@Base" 0.9.7
+ (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(pkgCache::PkgIterator const&)@Base" 0.9.7
+ (c++)"APT::CacheFilter::PackageArchitectureMatchesSpecification::operator()(char const* const&)@Base" 0.9.7
+ (c++)"APT::Configuration::checkLanguage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)@Base" 0.9.7.5
+ (c++)"pkgCdrom::DropTranslation(std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >&)@Base" 0.9.7.5
+ (c++)"pkgCache::DepIterator::IsSatisfied(pkgCache::PrvIterator const&) const@Base" 0.9.8
+ (c++)"pkgCache::DepIterator::IsSatisfied(pkgCache::VerIterator const&) const@Base" 0.9.8
+ (c++)"operator<<(std::basic_ostream<char, std::char_traits<char> >&, GlobalError::Item)@Base" 0.9.9
+ (c++)"pkgDepCache::IsDeleteOkProtectInstallRequests(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.9.9.1
+ (c++)"pkgDepCache::IsInstallOkMultiArchSameVersionSynced(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 0.9.9.1
+ (c++)"pkgDPkgPM::SendPkgsInfo(_IO_FILE*, unsigned int const&)@Base" 0.9.9.1
+ (c++)"pkgCache::VerIterator::MultiArchType() const@Base" 0.9.9.1
+ (c++)"AutoDetectProxy(URI&)@Base" 0.9.10
+ (c++)"CommandLine::GetCommand(CommandLine::Dispatch const*, unsigned int, char const* const*)@Base" 0.9.11
+ (c++)"CommandLine::MakeArgs(char, char const*, char const*, unsigned long)@Base" 0.9.11
+ (c++)"Configuration::Clear()@Base" 0.9.11
+ (c++)"Glob(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)@Base" 0.9.11
+ (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::operator()(pkgCache::GrpIterator const&)@Base" 0.9.11
+ (c++)"APT::CacheFilter::PackageNameMatchesFnmatch::operator()(pkgCache::PkgIterator const&)@Base" 0.9.11
+ (c++)"pkgTagSection::pkgTagSection()@Base" 0.9.11
+ (c++)"strv_length(char const**)@Base" 0.9.11
+ (c++)"StringSplit(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, unsigned int)@Base" 0.9.11.3
+ (c++)"pkgAcquire::Item::RenameOnError(pkgAcquire::Item::RenameOnErrorState)@Base" 0.9.12
+ (c++)"APT::String::Endswith(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 0.9.13.1
+ (c++)"ExecFork(std::set<int, std::less<int>, std::allocator<int> >)@Base" 0.9.13.1
+ (c++)"MergeKeepFdsFromConfiguration(std::set<int, std::less<int>, std::allocator<int> >&)@Base" 0.9.13.1
+ (c++)"HashString::FromFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.13.1
+ (c++)"HashString::GetHashForFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 0.9.13.1
+ (c++)"indexRecords::GetSuite() const@Base" 0.9.13.2
+ (c++)"GetTempDir()@Base" 0.9.14.2
+ (c++)"APT::Configuration::getBuildProfiles()@Base" 0.9.16
+ (c++)"APT::Configuration::getBuildProfilesString()@Base" 0.9.16
+ (c++)"Configuration::FindVector(char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) const@Base" 0.9.16
+ (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&)@Base" 0.9.16
+ (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&)@Base" 0.9.16
+ (c++)"debListParser::ParseDepends(char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, unsigned int&, bool const&, bool const&, bool const&)@Base" 0.9.16
+ (c++)"Rename(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >)@Base" 0.9.16
+ (c++)"pkgDepCache::IsInstallOkDependenciesSatisfiableByCandidates(pkgCache::PkgIterator const&, bool, unsigned long, bool)@Base" 1.0
+ (c++)"APT::Progress::PackageManagerFancy::GetTerminalSize()@Base" 1.0
+ (c++)"APT::Progress::PackageManagerFancy::GetTextProgressStr(float, int)@Base" 1.0
+ (c++)"pkgCdromStatus::GetOpProgress()@Base" 1.0
+ (c++)"pkgCdromStatus::SetTotal(int)@Base" 1.0
+ (c++)"EDSP::ExecuteSolver(char const*, int*, int*, bool)@Base" 1.0.4
+ (c++)"pkgPackageManager::EarlyRemove(pkgCache::PkgIterator, pkgCache::DepIterator const*)@Base" 1.0.4
+ (c++)"pkgSrcRecords::Step()@Base" 1.0.4
+ (c++)"debTranslationsParser::Architecture()@Base" 1.0.4
+ (c++)"debTranslationsParser::~debTranslationsParser()@Base" 1.0.4
+ (c++)"debTranslationsParser::Version()@Base" 1.0.4
+ (c++)"typeinfo for debTranslationsParser@Base" 1.0.4
+ (c++)"typeinfo name for debTranslationsParser@Base" 1.0.4
+ (c++)"vtable for debTranslationsParser@Base" 1.0.4
+ (c++)"pkgDPkgPM::SetupSlavePtyMagic()@Base" 1.0.8
+ (c++)"HashStringList::find(char const*) const@Base" 1.0.9.4
+ (c++)"HashStringList::operator==(HashStringList const&) const@Base" 1.0.9.4
+ (c++)"HashStringList::operator!=(HashStringList const&) const@Base" 1.0.9.4
+ (c++)"HashStringList::push_back(HashString const&)@Base" 1.0.9.4
+ (c++)"HashStringList::supported(char const*)@Base" 1.0.9.4
+ (c++)"HashStringList::VerifyFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> >) const@Base" 1.0.9.4
+ (c++)"HashString::operator==(HashString const&) const@Base" 1.0.9.4
+ (c++)"HashString::operator!=(HashString const&) const@Base" 1.0.9.4
+ (c++)"pkgSrcRecords::Parser::Files2(std::vector<pkgSrcRecords::File2, std::allocator<pkgSrcRecords::File2> >&)@Base" 1.0.9.4
+ (c++)"debSrcRecordParser::Files2(std::vector<pkgSrcRecords::File2, std::allocator<pkgSrcRecords::File2> >&)@Base" 1.0.9.4
+ (c++)"APT::Progress::PackageManager::PackageManager()@Base" 1.1~exp1
+ (c++)"pkgDPkgPM::Go(APT::Progress::PackageManager*)@Base" 1.1~exp1
+ (c++)"pkgPackageManager::DoInstall(APT::Progress::PackageManager*)@Base" 1.1~exp1
+ (c++)"pkgPackageManager::DoInstallPostFork(APT::Progress::PackageManager*)@Base" 1.1~exp1
+ (c++)"pkgPackageManager::Go(APT::Progress::PackageManager*)@Base" 1.1~exp1
+ (c++)"pkgTagFile::Init(FileFd*, unsigned long long)@Base" 1.1~exp1
+ (c++)"pkgTagSection::Count() const@Base" 1.1~exp1
+ (c++)"pkgTagSection::Exists(char const*) const@Base" 1.1~exp1
+ (c++)"pkgTagSection::FindB(char const*, bool const&) const@Base" 1.1~exp1
+ (c++)"pkgTagSection::Scan(char const*, unsigned long, bool)@Base" 1.1~exp1
+ (c++)"StartsWithGPGClearTextSignature(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp1
+ (c++)"Popen(char const**, FileFd&, int&, FileFd::OpenMode)@Base" 1.1~exp1
+ (c++)"APT::String::Startswith(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp2
+ (c++)"APT::Upgrade::Upgrade(pkgDepCache&, int, OpProgress*)@Base" 1.1~exp4
+ (c++)"pkgProblemResolver::Resolve(bool, OpProgress*)@Base" 1.1~exp4
+ (c++)"pkgProblemResolver::ResolveByKeep(OpProgress*)@Base" 1.1~exp4
+ (c++)"pkgCache::PkgIterator::Section() const@Base" 1.1~exp4
+ (c++)"APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator::getPkg() const@Base" 1.1~exp4
+ (c++)"typeinfo for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator@Base" 1.1~exp4
+ (c++)"typeinfo name for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator@Base" 1.1~exp4
+ (c++)"vtable for APT::PackageContainer<std::set<pkgCache::PkgIterator, std::less<pkgCache::PkgIterator>, std::allocator<pkgCache::PkgIterator> > >::iterator@Base" 1.1~exp4
+ (c++)"DropPrivileges()@Base" 1.1~exp4
+ (c++)"FileFd::FileFd(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, unsigned int, unsigned long)@Base" 1.1~exp4
+ (c++)"indexRecords::indexRecords(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)@Base" 1.1~exp5
+ (c++)"indexRecords::IsAlwaysTrusted() const@Base" 1.1~exp5
+ (c++)"indexRecords::IsNeverTrusted() const@Base" 1.1~exp5
+ (c++)"indexRecords::SetTrusted(bool)@Base" 1.1~exp5
+ (c++)"metaIndex::metaIndex(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)@Base" 1.1~exp9
+ (c++)"pkgTagSection::Get(char const*&, char const*&, unsigned int) const@Base" 1.1~exp9
+### demangle strangeness - buildd report it as MISSING and as new…
+ (c++)"pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::vector<IndexTarget*, std::allocator<IndexTarget*> > const*, indexRecords*)@Base" 0.8.0
+### gcc-4.6 artefacts
+# (c++|optional=implicit)"HashString::operator=(HashString const&)@Base" 0.8.0
+# (c++|optional=implicit)"HashString::HashString(HashString const&)@Base" 0.8.0
+# (c++|optional=inline)"APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator std::max_element<APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, CompareProviders>(APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, APT::VersionContainer<std::list<pkgCache::VerIterator, std::allocator<pkgCache::VerIterator> > >::iterator, CompareProviders)@Base" 0.8.0
+# (c++|optional=inline)"pkgCache::VerIterator::ParentPkg() const@Base" 0.8.0
+### empty destructors included in the .h file
+# (c++|optional=inline)"pkgVersioningSystem::~pkgVersioningSystem()@Base" 0.8.0
+# (c++|optional=inline)"pkgSystem::~pkgSystem()@Base" 0.8.0
+# (c++|optional=inline)"pkgRecords::Parser::~Parser()@Base" 0.8.0
+# (c++|optional=inline)"pkgSrcRecords::Parser::~Parser()@Base" 0.8.0
+# (c++|optional=inline)"pkgIndexFile::Type::~Type()@Base" 0.8.0
+# (c++|optional=inline)"pkgSourceList::Type::~Type()@Base" 0.8.0
+# (c++|optional=inline)"pkgIndexFile::~pkgIndexFile()@Base" 0.8.0
+# (c++|optional=inline)"metaIndex::~metaIndex()@Base" 0.8.0
+### std library artefacts
+ (c++|regex|optional=std)"^std::vector<.+ >::(vector|push_back|erase|_[^ ]+)\(.+\)( const|)@Base$" 0.8.0
+ (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
+ (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
+ (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<char const*>(char const*, char const*, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
+ (c++|optional=std)"char* std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_S_construct<char*>(char*, char*, std::allocator<char> const&, std::forward_iterator_tag)@Base" 0.8.0
+### try to ignore std:: template instances
+ (c++|regex|optional=std)"^(void |)std::[^ ]+<.+ >::(_|~).+\(.*\)@Base$" 0.8.0
+ (c++|regex|optional=std)"^std::[^ ]+<.+ >::(append|insert|reserve|operator[^ ]+)\(.*\)@Base$" 0.8.0
+ (c++|regex|optional=std)"^(void |DiffInfo\* |)std::_.*@Base$" 0.8.0
+ (c++|regex|optional=std)"^std::reverse_iterator<.+ > std::__.+@Base$" 0.8.0
+ (c++|regex|optional=std)"^std::basic_string<.+ >\(.+\)@Base$" 0.8.0
+ (c++|regex|optional=std)"^__gnu_cxx::__[^ ]+<.*@Base$" 0.8.0
+ (c++|regex|optional=std)"^typeinfo name for std::iterator<.*>@Base$" 0.8.0
+ (c++|regex|optional=std)"^typeinfo for std::iterator<.*>@Base$" 0.8.0
+ (c++|optional=std)"std::ctype<char>::do_widen(char) const@Base" 1.0.3
diff --git a/debian/postinst b/debian/postinst
deleted file mode 100755 (executable)
index 1588f52..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-#! /bin/sh
-
-# apt postinst, based liberally on James Troup's gpm postinst
-# Copyright (C) 1998, Ben Gertzfield <che@debian.org>
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-set -e
-
-create_apt_conf ()
-{
- EXAMPLE_SOURCE=/usr/share/doc/apt/examples/sources.list
- if [ -f $EXAMPLE_SOURCE ]; then
-     cp $EXAMPLE_SOURCE /etc/apt/sources.list
- fi
-}
-check_apt_conf ()
-{
- true
- # this is for future expansion
-}
-
-#DEBHELPER#
-
-case "$1" in
-       configure)
-              #
-               # If there is no /etc/apt/sources.list then create a default
-              #
-              if [ ! -f /etc/apt/sources.list ]; then
-                create_apt_conf
-              else
-                check_apt_conf
-              fi
-esac
diff --git a/debian/postrm b/debian/postrm
deleted file mode 100755 (executable)
index ae1e18d..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-#! /bin/sh
-
-# apt postrm
-# Copyright (C) 1998, Ben Gertzfield <che@debian.org>
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-
-set -e
-
-#DEBHELPER#
-
-case "$1" in
-       remove)
-               ;;
-       purge)
-               rm -rf /var/cache/apt
-               rm -rf /var/lib/apt
-esac
-
index f7e47c5f31ca47fe5e60fe31e75b27a7334d2e47..0e774d4cac716bf5d2ef5c99bc247c6ef3b2c034 100644 (file)
@@ -1,3 +1,3 @@
 Tests: run-tests
-Restrictions: allow-stderr 
-Depends: @, @builddeps@, fakeroot, wget, stunnel4, db-util
+Restrictions: allow-stderr
+Depends: @, @builddeps@, fakeroot, wget, stunnel4, db-util, gnupg, gnupg2
index 9d7c484fce66f68673c8166144bd0ef33d20498e..7cc37f618f5776a022b82d4b8acb22928b9320f8 100644 (file)
@@ -15,6 +15,7 @@ APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR=$(pwd)/build/bin \
 APT_INTEGRATION_TESTS_METHODS_DIR=/usr/lib/apt/methods \
 APT_INTEGRATION_TESTS_LIBEXEC_DIR=/usr/lib/apt/ \
 APT_INTEGRATION_TESTS_INTERNAL_SOLVER=/usr/lib/apt/solvers/apt \
+APT_INTEGRATION_TESTS_DUMP_SOLVER=/usr/lib/apt/solvers/dump \
 APT_INTEGRATION_TESTS_BUILD_DIR=/usr/bin \
 APT_INTEGRATION_TESTS_LIBRARY_PATH=/dev/null/does/not/exist \
 ./test/integration/run-tests
index 80b3be639389483a3a472023283b76590b17e900..a372a0d30fe8bb6eb1c9f87d76bb2a3d740d9bb7 100644 (file)
      Configuration Item: <literal>APT::Get::AllowUnauthenticated</literal>.</para></listitem>
      </varlistentry>
 
+     <varlistentry><term><option>--no-allow-insecure-repositories</option></term>
+     <listitem><para>Forbid the update command to acquire unverifiable
+     data from configured sources. Apt will fail at the update command
+     for repositories without valid cryptographically signatures.
+
+     Configuration Item: <literal>Acquire::AllowInsecureRepositories</literal>.</para></listitem>
+     </varlistentry>
+
      <varlistentry><term><option>--show-progress</option></term>
      <listitem><para>Show user friendly progress information in the
      terminal window when packages are installed, upgraded or
index e88d393323dda45082940de52212ef1f204a845b..dbec857905525cea95dcc3ac7e729423b251932d 100644 (file)
 ">
 
 <!-- this will be updated by 'prepare-release' -->
-<!ENTITY apt-product-version "1.0.9.6">
+<!ENTITY apt-product-version "1.0.9.7">
 
 <!-- (Code)names for various things used all over the place -->
 <!ENTITY oldstable-codename "wheezy">
index df6c77ff04447d417d9664e686b6e6bf0f864bda..efe986ea8c33a8e8ec2a2f7c7ff51d25abd8597e 100644 (file)
@@ -384,9 +384,9 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
      <para>The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to
      enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e.g. on
      high-latency connections. It specifies how many requests are sent in a pipeline.
-     Previous APT versions had a default of 10 for this setting, but the default value
-     is now 0 (= disabled) to avoid problems with the ever-growing amount of webservers
-     and proxies which choose to not conform to the HTTP/1.1 specification.</para>
+     APT tries to detect and workaround misbehaving webservers and proxies at runtime, but
+     if you know that yours does not conform to the HTTP/1.1 specification pipelining can
+     be disabled by setting the value to 0. It is enabled by default with the value 10.</para>
 
      <para><literal>Acquire::http::AllowRedirect</literal> controls whether APT will follow
      redirects, which is enabled by default.</para>
@@ -586,6 +586,38 @@ DPkg::Pre-Install-Pkgs {"/usr/sbin/dpkg-preconfigure --apt";};
         </para></listitem>
      </varlistentry>
 
+     <varlistentry><term><option>MaxReleaseFileSize</option></term>
+        <listitem><para>
+           The maximum file size of Release/Release.gpg/InRelease files.
+           The default is 10MB.
+        </para></listitem>
+     </varlistentry>
+
+     <varlistentry><term><option>AllowInsecureRepositories</option></term>
+        <listitem><para>
+           Allow the update operation to load data files from
+           a repository without a trusted signature. If enabled this
+           option no data files will be loaded and the update
+           operation fails with a error for this source. The default
+           is false for backward compatibility. This will be changed
+           in the future.
+        </para></listitem>
+     </varlistentry>
+
+     <varlistentry><term><option>AllowDowngradeToInsecureRepositories</option></term>
+        <listitem><para>
+           Allow that a repository that was previously gpg signed to become
+           unsigned durign a update operation. When there is no valid signature
+           of a perviously trusted repository apt will refuse the update. This
+           option can be used to override this protection. You almost certainly
+           never want to enable this. The default is false.
+
+           Note that apt will still consider packages from this source
+           untrusted and warn about them if you try to install
+           them.
+         </para></listitem>
+     </varlistentry>
+
    </variablelist>
  </refsect1>
 
index 56e7e1a80c8bb1011f8b128edbd828e10d5d5c30..ef1ae056d4cd4f89ed0d75a76666d8d13cd308d5 100644 (file)
@@ -34,7 +34,7 @@ APT
   {
      Host-Architecture "armel";
      Arch-Only "false";
-     AllowUnauthenticated "false";
+     AllowUnauthenticated "false";        // packages from unauthenticated
      AutomaticRemove "false";       
      HideAutoRemove "false";
      Download-Only "false";
index c403ad8e47388efddc73c59857914d9a10eaddaa..e3d3afa3cda344dc7dd7199ce2994ab68e8c3c67 100644 (file)
@@ -665,7 +665,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191 apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701 sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 apt-ftparchive.1.xml:603
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191 apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148 apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701 sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59 apt-ftparchive.1.xml:603
 msgid "See Also"
 msgstr ""
 
@@ -677,7 +677,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131 apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131 apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70 apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
 msgstr ""
 
@@ -1277,6 +1277,15 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: "
+"<literal>Acquire::AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1285,12 +1294,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121 apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 msgid ""
 "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, "
 "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the "
@@ -1298,7 +1307,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -2884,10 +2893,10 @@ msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial "
 "e.g. on high-latency connections. It specifies how many requests are sent in "
-"a pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the "
-"ever-growing amount of webservers and proxies which choose to not conform to "
-"the HTTP/1.1 specification."
+"a pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to "
+"0. It is enabled by default with the value 10."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -3191,13 +3200,40 @@ msgstr ""
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr ""
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable "
+"this. The default is false.  Note that apt will still consider packages from "
+"this source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -3209,7 +3245,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 msgid ""
 "<literal>Dir::Cache</literal> contains locations pertaining to local cache "
 "information, such as the two package caches <literal>srcpkgcache</literal> "
@@ -3223,7 +3259,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -3233,7 +3269,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -3241,7 +3277,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by "
 "<literal>Dir::Bin</literal>. <literal>Dir::Bin::Methods</literal> specifies "
@@ -3253,7 +3289,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -3266,7 +3302,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -3277,12 +3313,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -3290,7 +3326,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, "
@@ -3304,40 +3340,40 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -3345,7 +3381,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -3354,7 +3390,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -3365,7 +3401,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -3374,7 +3410,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -3385,7 +3421,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</literal> "
@@ -3396,26 +3432,26 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -3430,7 +3466,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -3440,7 +3476,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -3454,7 +3490,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -3467,7 +3503,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is "
@@ -3485,7 +3521,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure "
 "--pending</command> to let &dpkg; handle all required configurations and "
@@ -3497,7 +3533,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -3508,7 +3544,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -3520,7 +3556,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -3534,12 +3570,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -3548,12 +3584,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -3564,7 +3600,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, "
@@ -3572,7 +3608,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s "
@@ -3580,7 +3616,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -3590,65 +3626,65 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the "
 "<literal>apt</literal> libraries."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -3656,52 +3692,52 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial "
@@ -3711,7 +3747,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as "
 "keep/install/remove while the ProblemResolver does his work.  Each addition "
@@ -3729,45 +3765,45 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -3775,14 +3811,14 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from "
 "<filename>/etc/apt/vendors.list</filename>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes "
 "e.g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -3790,12 +3826,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233 apt-ftparchive.1.xml:592
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233 apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -3803,7 +3839,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr ""
 
index b376bc9b75b1651cfdebf6df13c0ac2e5869b8dc..4eb458d17d213e286757fa65c8da2cd47a874155 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: apt-doc 1.0.8\n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-28 00:20+0000\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2014-09-14 14:46+0200\n"
 "Last-Translator: Chris Leick <c.leick@vollbio.de>\n"
 "Language-Team: German <debian-l10n-german@lists.debian.org>\n"
@@ -845,9 +845,9 @@ msgstr ""
 "new-pkgs</literal> aktiviert."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 msgid "See Also"
@@ -863,7 +863,7 @@ msgstr ""
 "Benutzeranleitung in &guidesdir;, &apt-preferences;, das APT-Howto."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1773,10 +1773,19 @@ msgstr ""
 "fragen. Dies ist für Werkzeuge wie pbuilder nützlich. Konfigurationselement: "
 "<literal>APT::Get::AllowUnauthenticated</literal>."
 
-# FIXME s/Item/Items/
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+# FIXME s/Item/Items/
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1791,13 +1800,13 @@ msgstr ""
 "Progress-Fancy</literal>."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr "Dateien"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 msgid ""
 "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, "
 "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the "
@@ -1808,7 +1817,7 @@ msgstr ""
 "das APT-Howto."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -4084,14 +4093,23 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:384
+#, fuzzy
+#| msgid ""
+#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used "
+#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be "
+#| "beneficial e.g. on high-latency connections. It specifies how many "
+#| "requests are sent in a pipeline.  Previous APT versions had a default of "
+#| "10 for this setting, but the default value is now 0 (= disabled) to avoid "
+#| "problems with the ever-growing amount of webservers and proxies which "
+#| "choose to not conform to the HTTP/1.1 specification."
 msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 "Die Einstellung <literal>Acquire::http::Pipeline-Depth</literal> kann "
 "verwandt werden, um HTTP-Weiterleitung zu aktivieren (RFC 2616 Abschnitt "
@@ -4558,13 +4576,40 @@ msgstr "Beim Herunterladen wird die Verwendung des IPv4-Protokolls erzwungen."
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr "Beim Herunterladen wird die Verwendung des IPv6-Protokolls erzwungen."
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr "Verzeichnisse"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -4584,7 +4629,7 @@ msgstr ""
 "nicht mit <filename>/</filename> oder <filename>./</filename> beginnen."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 msgid ""
 "<literal>Dir::Cache</literal> contains locations pertaining to local cache "
 "information, such as the two package caches <literal>srcpkgcache</literal> "
@@ -4601,15 +4646,15 @@ msgstr ""
 "Paketzwischenspeicher <literal>srcpkgcache</literal> und <literal>pkgcache</"
 "literal>, sowie den Ort, an den heruntergeladene Archive platziert werden, "
 "<literal>Dir::Cache::archives</literal>. Die Generierung von "
-"Zwischenspeichern kann ausgeschaltet werden, indem "
-"<literal>pkgcache</literal> oder <literal>srcpkgcache</literal> auf "
-"<literal>\"\"</literal> wird. Dies wird den Start verlangsamen, aber "
-"Plattenplatz sparen. Es ist vermutlich vorzuziehen, statt des »srcpkgcache«s "
-"den »pkgcache« auszuschalten. Wie <literal>Dir::State</literal> ist das "
-"Standardverzeichnis in <literal>Dir::Cache</literal> enthalten."
+"Zwischenspeichern kann ausgeschaltet werden, indem <literal>pkgcache</"
+"literal> oder <literal>srcpkgcache</literal> auf <literal>\"\"</literal> "
+"wird. Dies wird den Start verlangsamen, aber Plattenplatz sparen. Es ist "
+"vermutlich vorzuziehen, statt des »srcpkgcache«s den »pkgcache« "
+"auszuschalten. Wie <literal>Dir::State</literal> ist das Standardverzeichnis "
+"in <literal>Dir::Cache</literal> enthalten."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -4624,7 +4669,7 @@ msgstr ""
 "Konfigurationsdatei erfolgt)."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -4636,7 +4681,7 @@ msgstr ""
 "geladen."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -4654,7 +4699,7 @@ msgstr ""
 "Programms an."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -4674,7 +4719,7 @@ msgstr ""
 "<filename>/tmp/staging/var/lib/dpkg/status</filename> nachgesehen."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -4692,12 +4737,12 @@ msgstr ""
 "diese Muster verwandt werden."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr "APT in DSelect"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -4708,7 +4753,7 @@ msgstr ""
 "<literal>DSelect</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -4731,7 +4776,7 @@ msgstr ""
 "vor dem Herunterladen neuer Pakete durch."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
@@ -4740,7 +4785,7 @@ msgstr ""
 "übermittelt, wenn es für die Installationsphase durchlaufen wird."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
@@ -4749,7 +4794,7 @@ msgstr ""
 "übermittelt, wenn es für die Aktualisierungsphase durchlaufen wird."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
@@ -4758,12 +4803,12 @@ msgstr ""
 "nachfragen, um fortzufahren. Vorgabe ist es, nur bei Fehlern nachzufragen."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr "Wie APT &dpkg; aufruft"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
@@ -4772,7 +4817,7 @@ msgstr ""
 "stehen im Abschnitt <literal>DPkg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -4783,7 +4828,7 @@ msgstr ""
 "jedes Listenelement wird als einzelnes Argument an &dpkg; übermittelt."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4797,7 +4842,7 @@ msgstr ""
 "APT abgebrochen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4816,7 +4861,7 @@ msgstr ""
 "übergeben."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -4829,7 +4874,7 @@ msgstr ""
 "Version die Architektur und den <literal>MultiArch</literal>-Schalter hinzu."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -4847,7 +4892,7 @@ msgstr ""
 "bietet."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -4865,7 +4910,7 @@ msgstr ""
 "verwendeten Dateideskriptors als eine Bestätigung."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
@@ -4874,7 +4919,7 @@ msgstr ""
 "die Vorgabe ist <filename>/</filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
@@ -4884,12 +4929,12 @@ msgstr ""
 "Programme werden erstellt."
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr "Dpkd-Trigger-Benutzung (und zugehörige Optionen)"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -4916,7 +4961,7 @@ msgstr ""
 "Pakete konfiguriert werden."
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -4930,7 +4975,7 @@ msgstr ""
 "DPkg::TriggersPending \"true\";"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -4955,7 +5000,7 @@ msgstr ""
 "Optionenkombination wäre <placeholder type=\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -4978,7 +5023,7 @@ msgstr ""
 "anhängen."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -5008,7 +5053,7 @@ msgstr ""
 "enden könnte und möglicherweise nicht mehr startbar ist."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -5027,7 +5072,7 @@ msgstr ""
 "deaktivieren."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -5043,7 +5088,7 @@ msgstr ""
 "benötigt werden."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -5061,7 +5106,7 @@ msgstr ""
 "};"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -5085,12 +5130,12 @@ msgstr ""
 "mit ihren Vorgabewerten. <placeholder type=\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr "Periodische- und Archivoptionen"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -5104,12 +5149,12 @@ msgstr ""
 "Dokumentation dieser Optionen zu erhalten."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr "Fehlersuchoptionen"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -5127,7 +5172,7 @@ msgstr ""
 "könnten es sein:"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -5138,7 +5183,7 @@ msgstr ""
 "getroffenen Entscheidungen ein."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -5149,7 +5194,7 @@ msgstr ""
 "<literal>apt-get -s install</literal>) als nicht root-Anwender auszuführen."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -5161,7 +5206,7 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
@@ -5170,12 +5215,12 @@ msgstr ""
 "Daten in CD-ROM-IDs aus."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr "Eine vollständige Liste der Fehlersuchoptionen von APT folgt."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
@@ -5183,28 +5228,28 @@ msgstr ""
 "literal>-Quellen beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 "gibt Informationen aus, die sich auf das Herunterladen von Paketen per FTP "
 "beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 "gibt Informationen aus, die sich auf das Herunterladen von Paketen per HTTP "
 "beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 "gibt Informationen aus, die sich auf das Herunterladen von Paketen per HTTPS "
 "beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
@@ -5213,7 +5258,7 @@ msgstr ""
 "mittels <literal>gpg</literal> beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
@@ -5222,13 +5267,13 @@ msgstr ""
 "CD-ROMs gespeichert sind."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 "beschreibt den Prozess der Auflösung von Bauabhängigkeiten in &apt-get;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
@@ -5237,7 +5282,7 @@ msgstr ""
 "Bibliotheken generiert wurde."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -5248,7 +5293,7 @@ msgstr ""
 "ID für eine CD-ROM generiert wird."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
@@ -5258,14 +5303,14 @@ msgstr ""
 "gleichen Zeit laufen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 "protokolliert, wenn Elemente aus der globalen Warteschlange zum "
 "Herunterladen hinzugefügt oder entfernt werden."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
@@ -5274,7 +5319,7 @@ msgstr ""
 "und kryptografischen Signaturen von heruntergeladenen Dateien beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
@@ -5283,7 +5328,7 @@ msgstr ""
 "Diffs und Fehler, die die Paketindexlisten-Diffs betreffen, aus."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
@@ -5293,7 +5338,7 @@ msgstr ""
 "werden."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
@@ -5301,7 +5346,7 @@ msgstr ""
 "durchführen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
@@ -5311,7 +5356,7 @@ msgstr ""
 "beziehen."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -5327,7 +5372,7 @@ msgstr ""
 "literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -5360,7 +5405,7 @@ msgstr ""
 "dem das Paket erscheint."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
@@ -5370,7 +5415,7 @@ msgstr ""
 "sind, aus."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
@@ -5379,7 +5424,7 @@ msgstr ""
 "und alle während deren Auswertung gefundenen Fehler aus."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
@@ -5389,7 +5434,7 @@ msgstr ""
 "soll."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
@@ -5397,12 +5442,12 @@ msgstr ""
 "von &dpkg; ausgeführt werden."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr "gibt die Priorität jeder Paketliste beim Start aus."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
@@ -5412,7 +5457,7 @@ msgstr ""
 "aufgetreten ist)."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -5424,7 +5469,7 @@ msgstr ""
 "Marker</literal> beschrieben."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
@@ -5433,7 +5478,7 @@ msgstr ""
 "filename> gelesenen Anbieter aus."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -5444,13 +5489,13 @@ msgstr ""
 "literal> oder <literal>APT::Update::{Pre,Post}-Invoke</literal> mit ein."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr "Beispiele"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -5460,7 +5505,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-cache;, &apt-config;, &apt-preferences;."
 
index 24602318d7d05311db0c0ebfa9ac2611db75829e..590ae4aeb78142c4d33f7f7ebc5b9a30084955aa 100644 (file)
@@ -38,7 +38,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: apt 0.9.7.1\n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-28 00:20+0000\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2014-07-04 01:31+0200\n"
 "Last-Translator: Omar Campagne <ocampagne@gmail.com>\n"
 "Language-Team: Debian l10n Spanish <debian-l10n-spanish@lists.debian.org>\n"
@@ -909,9 +909,9 @@ msgid ""
 msgstr "Las líneas <literal>Archive:</literal> o <literal>Suite:</literal>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 msgid "See Also"
@@ -933,7 +933,7 @@ msgstr ""
 "preferences;, el Cómo de APT."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1880,6 +1880,15 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1888,13 +1897,13 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr "Ficheros"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 #, fuzzy
 #| msgid ""
 #| "&apt-cache;, &apt-cdrom;, &dpkg;, &dselect;, &sources-list;, &apt-conf;, "
@@ -1910,7 +1919,7 @@ msgstr ""
 "preferences;, el Cómo de APT."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -4158,14 +4167,23 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:384
+#, fuzzy
+#| msgid ""
+#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used "
+#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be "
+#| "beneficial e.g. on high-latency connections. It specifies how many "
+#| "requests are sent in a pipeline.  Previous APT versions had a default of "
+#| "10 for this setting, but the default value is now 0 (= disabled) to avoid "
+#| "problems with the ever-growing amount of webservers and proxies which "
+#| "choose to not conform to the HTTP/1.1 specification."
 msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 "La opción <literal>Acquire::http::Pipeline-Depth</literal> se puede utilizar "
 "para activar HTTP pipelining (RFC 2616 sección 8.1.2.2), que puede "
@@ -4621,13 +4639,40 @@ msgstr ""
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr ""
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr "Directorios"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -4648,7 +4693,7 @@ msgstr ""
 "filename> ó <filename>./</filename>."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 #, fuzzy
 #| msgid ""
 #| "<literal>Dir::Cache</literal> contains locations pertaining to local "
@@ -4682,7 +4727,7 @@ msgstr ""
 "directorio predeterminado está en <literal>Dir::Cache</literal>"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -4698,7 +4743,7 @@ msgstr ""
 "<envar>APT_CONFIG</envar>)."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -4709,7 +4754,7 @@ msgstr ""
 "Al finalizar este proceso carga el fichero de configuración principal."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -4726,7 +4771,7 @@ msgstr ""
 "literal> especifican la ubicación de sus respectivos programas."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -4747,7 +4792,7 @@ msgstr ""
 "staging/var/lib/dpkg/status</filename>."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -4765,12 +4810,12 @@ msgstr ""
 "de expresiones regulares."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr "APT con DSelect"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -4781,7 +4826,7 @@ msgstr ""
 "encuentran en la sección <literal>DSelect</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -4803,7 +4848,7 @@ msgstr ""
 "realiza esta acción antes de descargar paquetes nuevos."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
@@ -4812,7 +4857,7 @@ msgstr ""
 "la línea de ordenes al ejecutar la fase de instalación."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
@@ -4821,7 +4866,7 @@ msgstr ""
 "la línea de ordenes al ejecutar la fase de actualización."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
@@ -4831,12 +4876,12 @@ msgstr ""
 "preguntará en caso de error."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr "Invocación de APT a dpkg"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
@@ -4845,7 +4890,7 @@ msgstr ""
 "se encuentran en la sección <literal>DPkg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -4856,7 +4901,7 @@ msgstr ""
 "introduce a &dpkg; como un sólo argumento."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4869,7 +4914,7 @@ msgstr ""
 "sh</filename>; en caso de fallo, APT cancela la acción."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 #, fuzzy
 #| msgid ""
 #| "This is a list of shell commands to run before invoking &dpkg;. Like "
@@ -4893,7 +4938,7 @@ msgstr ""
 "la entrada estándar."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 #, fuzzy
 #| msgid ""
 #| "Version 2 of this protocol dumps more information, including the protocol "
@@ -4915,7 +4960,7 @@ msgstr ""
 "literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -4926,7 +4971,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -4937,7 +4982,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
@@ -4946,7 +4991,7 @@ msgstr ""
 "predeterminado es <filename>/</filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
@@ -4956,12 +5001,12 @@ msgstr ""
 "paquetes y a producir todos los binarios."
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr "Uso del disparador de dpkg (y de las opciones relacionadas)"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -4988,7 +5033,7 @@ msgstr ""
 "tiempo (o más) durante la configuración de todos los paquetes."
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -5002,7 +5047,7 @@ msgstr ""
 "DPkg::TriggersPending \"true\";"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -5026,7 +5071,7 @@ msgstr ""
 "type=\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -5049,7 +5094,7 @@ msgstr ""
 "eliminación."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -5079,7 +5124,7 @@ msgstr ""
 "imposibilidad de arrancar el sistema. "
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -5097,7 +5142,7 @@ msgstr ""
 "desactivar esta opción en todas las ejecuciones menos la última."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -5113,7 +5158,7 @@ msgstr ""
 "los disparadores necesarios para configurar este paquete."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -5131,7 +5176,7 @@ msgstr ""
 "};"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -5156,12 +5201,12 @@ msgstr ""
 "<placeholder type=\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr "Las opciones «Periodic» y «Archives»"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -5175,12 +5220,12 @@ msgstr ""
 "documentación de estas opciones."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr "Opciones de depuración"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -5197,7 +5242,7 @@ msgstr ""
 "para un usuario normal, aunque unas cuantas sí son:"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -5208,7 +5253,7 @@ msgstr ""
 "purge</literal>."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -5219,7 +5264,7 @@ msgstr ""
 "<literal>apt-get -s install</literal>) como un usuario normal."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -5231,7 +5276,7 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
@@ -5240,14 +5285,14 @@ msgstr ""
 "statfs en los identificadores de los discos ópticos."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr ""
 "A continuación, se muestra la lista completa de las opciones de depuración "
 "de apt."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
@@ -5255,26 +5300,26 @@ msgstr ""
 "<literal>cdrom://</literal>"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 "Muestra la información relacionada con la descarga de paquetes mediante FTP."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 "Muestra la información relacionada con la descarga de paquetes mediante HTTP."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 "Muestra la información relacionada con la descarga de paquetes mediante "
 "HTTPS."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
@@ -5283,7 +5328,7 @@ msgstr ""
 "criptográficas mediante <literal>gpg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
@@ -5292,14 +5337,14 @@ msgstr ""
 "paquetes almacenadas en CD-ROM."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 "Describe el proceso de resolución de dependencias de compilación en &apt-"
 "get;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
@@ -5308,7 +5353,7 @@ msgstr ""
 "<literal>apt</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -5319,7 +5364,7 @@ msgstr ""
 "identificador de un CD-ROM."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
@@ -5329,14 +5374,14 @@ msgstr ""
 "a la vez."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 "Registra los elementos que se añaden o se borran de la cola de descarga "
 "global."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
@@ -5346,7 +5391,7 @@ msgstr ""
 "ficheros descargados."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
@@ -5355,7 +5400,7 @@ msgstr ""
 "lista de índices de paquetes, y los errores relacionados con éstos."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
@@ -5365,7 +5410,7 @@ msgstr ""
 "índices completos."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
@@ -5373,7 +5418,7 @@ msgstr ""
 "descargas."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
@@ -5382,7 +5427,7 @@ msgstr ""
 "de los paquetes y con la eliminación de los paquetes sin usar."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -5398,7 +5443,7 @@ msgstr ""
 "literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -5429,7 +5474,7 @@ msgstr ""
 "la sección en la que aparece el paquete."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
@@ -5438,7 +5483,7 @@ msgstr ""
 "invocó, con los argumentos separados por un espacio."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
@@ -5447,7 +5492,7 @@ msgstr ""
 "estado y cualquier error encontrado durante el análisis."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
@@ -5456,7 +5501,7 @@ msgstr ""
 "literal> debería entregar los paquetes a &dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
@@ -5464,12 +5509,12 @@ msgstr ""
 "&dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr "Muestra la prioridad de cada lista de paquetes al iniciarse."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
@@ -5478,7 +5523,7 @@ msgstr ""
 "lo que ocurre cuando se encuentra un problema de dependencias complejo)."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -5489,7 +5534,7 @@ msgstr ""
 "misma que la descrita en <literal>Debug::pkgDepCache::Marker</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
@@ -5498,7 +5543,7 @@ msgstr ""
 "vendors.list</filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -5506,13 +5551,13 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr "Ejemplos"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -5522,7 +5567,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-cache;, &apt-config;, &apt-preferences;."
 
index 76d428272304d09121914b3756749002da7062ea..c8c89408c8255f5a80bfe472cc799992d52c8321 100644 (file)
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-28 00:20+0000\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2014-07-04 00:45+0200\n"
 "Last-Translator: Beatrice Torracca <beatricet@libero.it>\n"
 "Language-Team: Italian <debian-l10n-italian@lists.debian.org>\n"
@@ -872,9 +872,9 @@ msgid ""
 msgstr "la riga <literal>Archive:</literal> o <literal>Suite:</literal>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 msgid "See Also"
@@ -896,7 +896,7 @@ msgstr ""
 "l'APT Howto."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1802,6 +1802,15 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
+msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
 #, fuzzy
 #| msgid ""
 #| "Show user friendly progress information in the terminal window when "
@@ -1824,13 +1833,13 @@ msgstr ""
 "Progress-Fancy</literal>."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr "File"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 msgid ""
 "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, "
 "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the "
@@ -1841,7 +1850,7 @@ msgstr ""
 "l'APT Howto."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -4100,14 +4109,23 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:384
+#, fuzzy
+#| msgid ""
+#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used "
+#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be "
+#| "beneficial e.g. on high-latency connections. It specifies how many "
+#| "requests are sent in a pipeline.  Previous APT versions had a default of "
+#| "10 for this setting, but the default value is now 0 (= disabled) to avoid "
+#| "problems with the ever-growing amount of webservers and proxies which "
+#| "choose to not conform to the HTTP/1.1 specification."
 msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 "L'impostazione <literal>Acquire::http::Pipeline-Depth</literal> può essere "
 "usata per abilitare le pipeline HTTP (RFC 2616, sezione 8.1.2.2) che possono "
@@ -4566,13 +4584,40 @@ msgstr "Durante gli scaricamenti, forza l'uso del solo protocollo IPv4."
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr "Durante gli scaricamenti, forza l'uso del solo protocollo IPv6."
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr "Directory"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -4592,7 +4637,7 @@ msgstr ""
 "<filename>/</filename> o <filename>./</filename>."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 #, fuzzy
 #| msgid ""
 #| "<literal>Dir::Cache</literal> contains locations pertaining to local "
@@ -4626,7 +4671,7 @@ msgstr ""
 "la directory predefinita è contenuta in <literal>Dir::Cache</literal>"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -4641,7 +4686,7 @@ msgstr ""
 "configurazione specificato da <envar>APT_CONFIG</envar>)."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -4652,7 +4697,7 @@ msgstr ""
 "termine viene caricato il file di configurazione principale."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -4669,7 +4714,7 @@ msgstr ""
 "specificano la posizione dei rispettivi programmi."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -4690,7 +4735,7 @@ msgstr ""
 "staging/var/lib/dpkg/status</filename>."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -4708,12 +4753,12 @@ msgstr ""
 "questi modelli possono usare una sintassi con espressioni regolari."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr "APT in DSelect"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -4724,7 +4769,7 @@ msgstr ""
 "sezione <literal>DSelect</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -4746,7 +4791,7 @@ msgstr ""
 "scaricare i nuovi pacchetti."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
@@ -4756,7 +4801,7 @@ msgstr ""
 "installazione."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
@@ -4766,7 +4811,7 @@ msgstr ""
 "aggiornamento."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
@@ -4776,12 +4821,12 @@ msgstr ""
 "solo in caso di errore."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr "Come APT invoca &dpkg;"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
@@ -4790,7 +4835,7 @@ msgstr ""
 "&dpkg;; sono nella sezione <literal>DPkg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -4801,7 +4846,7 @@ msgstr ""
 "passata a &dpkg; come un singolo argomento."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4814,7 +4859,7 @@ msgstr ""
 "bin/sh</filename>; se qualcuno dei comandi fallisce APT terminerà annullando."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4832,7 +4877,7 @@ msgstr ""
 "lo standard input."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -4846,7 +4891,7 @@ msgstr ""
 "versione di cui viene fatto il dump."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -4863,7 +4908,7 @@ msgstr ""
 "l'informazione nella versione più alta per cui ha il supporto."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -4881,7 +4926,7 @@ msgstr ""
 "file usato per conferma."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
@@ -4890,7 +4935,7 @@ msgstr ""
 "valore predefinito è <filename>/</filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
@@ -4900,12 +4945,12 @@ msgstr ""
 "binari."
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr "Uso dei trigger di dpkg (e relative opzioni)"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -4933,7 +4978,7 @@ msgstr ""
 "pacchetti."
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -4947,7 +4992,7 @@ msgstr ""
 "DPkg::TriggersPending \"true\";"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -4971,7 +5016,7 @@ msgstr ""
 "\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -4993,7 +5038,7 @@ msgstr ""
 "questa opzione anche alle chiamate per lo spacchettamento e la rimozione."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -5023,7 +5068,7 @@ msgstr ""
 "potrebbe finire in uno stato non configurato e potenzialmente non avviabile."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -5041,7 +5086,7 @@ msgstr ""
 "si può disattivare questa opzione in tutte le esecuzioni tranne l'ultima."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -5057,7 +5102,7 @@ msgstr ""
 "necessari per configurare il pacchetto in questione."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -5075,7 +5120,7 @@ msgstr ""
 "};"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -5100,12 +5145,12 @@ msgstr ""
 "con i loro valori predefiniti. <placeholder type=\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr "Opzioni Periodic e Archives"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -5119,12 +5164,12 @@ msgstr ""
 "all'inizio dello script."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr "Opzioni di debug"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -5142,7 +5187,7 @@ msgstr ""
 "esserlo:"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -5153,7 +5198,7 @@ msgstr ""
 "literal>."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -5164,7 +5209,7 @@ msgstr ""
 "install</literal>) come utente non root."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -5176,7 +5221,7 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
@@ -5185,37 +5230,37 @@ msgstr ""
 "negli ID dei CD-ROM."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr "Segue un elenco completo delle opzioni di debug per apt."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
 "Stampa informazioni relative all'accesso a fonti <literal>cdrom://</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 "Stampa informazioni relative allo scaricamento dei pacchetti usando FTP."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 "Stampa informazioni relative allo scaricamento dei pacchetti usando HTTP."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 "Stampa informazioni relative allo scaricamento dei pacchetti usando HTTPS."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
@@ -5224,7 +5269,7 @@ msgstr ""
 "usando <literal>gpg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
@@ -5233,14 +5278,14 @@ msgstr ""
 "pacchetti memorizzati su CD-ROM."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 "Descrive il processo di risoluzione delle dipendenze di compilazione in &apt-"
 "get;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
@@ -5249,7 +5294,7 @@ msgstr ""
 "<literal>apt</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -5260,7 +5305,7 @@ msgstr ""
 "system del CD-ROM."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
@@ -5270,14 +5315,14 @@ msgstr ""
 "contemporaneamente."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 "Registra nel log quando vengono aggiunte o rimosse voci dalla coda globale "
 "degli scaricamenti."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
@@ -5286,7 +5331,7 @@ msgstr ""
 "codici di controllo e delle firme di cifratura dei file scaricati."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
@@ -5296,7 +5341,7 @@ msgstr ""
 "diff."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
@@ -5306,7 +5351,7 @@ msgstr ""
 "invece degli indici completi."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
@@ -5314,7 +5359,7 @@ msgstr ""
 "realmente gli scaricamenti."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
@@ -5323,7 +5368,7 @@ msgstr ""
 "installato dei pacchetti e alla rimozione dei pacchetti non utilizzati."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -5339,7 +5384,7 @@ msgstr ""
 "pkgProblemResolver</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -5371,7 +5416,7 @@ msgstr ""
 "sezione in cui compare il pacchetto."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
@@ -5380,7 +5425,7 @@ msgstr ""
 "gli argomenti separati da un singolo carattere di spazio."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
@@ -5389,7 +5434,7 @@ msgstr ""
 "di stato ed ogni errore incontrato durante la sua analisi."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
@@ -5398,7 +5443,7 @@ msgstr ""
 "literal> deve passare i pacchetti a &dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
@@ -5406,12 +5451,12 @@ msgstr ""
 "nell'invocazione di &dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr "Produce in output la priorità di ogni elenco di pacchetti all'avvio."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
@@ -5421,7 +5466,7 @@ msgstr ""
 "dipendenze)."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -5432,7 +5477,7 @@ msgstr ""
 "la stessa descritta in <literal>Debug::pkgDepCache::Marker</literal>"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
@@ -5441,7 +5486,7 @@ msgstr ""
 "filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -5449,13 +5494,13 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr "Esempi"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -5465,7 +5510,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-cache;, &apt-config;, &apt-preferences;."
 
index 0a2984d96f52854e6ee8e406ae98afdc1aca8071..3e0712125d84ae8f03127b6919486b08abf8fb5c 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: apt 1.0.6\n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-28 00:20+0000\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2014-07-10 19:52+0900\n"
 "Last-Translator: KURASAWA Nozomu <nabetaro@debian.or.jp>\n"
 "Language-Team: Debian Japanese List <debian-japanese@lists.debian.org>\n"
@@ -892,9 +892,9 @@ msgstr ""
 "literal> がデフォルトで有効になっています。"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 msgid "See Also"
@@ -910,7 +910,7 @@ msgstr ""
 "&guidesdir; にあるAPTユーザガイド、 &apt-preferences;、 APT Howto."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1767,6 +1767,15 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1780,13 +1789,13 @@ msgstr ""
 "<literal>Dpkg::Progress-Fancy</literal>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr "ファイル"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 msgid ""
 "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, "
 "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the "
@@ -1797,7 +1806,7 @@ msgstr ""
 "Howto"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -3948,14 +3957,23 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:384
+#, fuzzy
+#| msgid ""
+#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used "
+#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be "
+#| "beneficial e.g. on high-latency connections. It specifies how many "
+#| "requests are sent in a pipeline.  Previous APT versions had a default of "
+#| "10 for this setting, but the default value is now 0 (= disabled) to avoid "
+#| "problems with the ever-growing amount of webservers and proxies which "
+#| "choose to not conform to the HTTP/1.1 specification."
 msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 "<literal>Acquire::http::Pipeline-Depth</literal> の設定は、例えばレイテンシの"
 "高い接続で有益な、HTTP パイプライン (RFC 2616 8.1.2.2 節) を有効にするのに使"
@@ -4390,13 +4408,40 @@ msgstr "ダウンロード時に IPv4 プロトコルだけを使うように強
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr "ダウンロード時に IPv6 プロトコルだけを使うように強制します。"
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr "ディレクトリ"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -4415,7 +4460,7 @@ msgstr ""
 "サブアイテムすべてに、前に付加するデフォルトディレクトリを含んでいます。"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 msgid ""
 "<literal>Dir::Cache</literal> contains locations pertaining to local cache "
 "information, such as the two package caches <literal>srcpkgcache</literal> "
@@ -4439,7 +4484,7 @@ msgstr ""
 "でいます。"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -4453,7 +4498,7 @@ msgstr ""
 "ファイルを指定された場合のみ、この設定の効果があります)"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -4464,7 +4509,7 @@ msgstr ""
 "します。"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -4481,7 +4526,7 @@ msgstr ""
 "プログラムの場所を指定します。"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -4501,7 +4546,7 @@ msgstr ""
 "<filename>/tmp/staging/var/lib/dpkg/status</filename> から探します。"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -4517,12 +4562,12 @@ msgstr ""
 "フォルト値を見ればわかる通り、このパターンには正規表現を使用できます。"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr "DSelect での APT"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -4533,7 +4578,7 @@ msgstr ""
 "ます。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -4554,7 +4599,7 @@ msgstr ""
 "パッケージをダウンロードする直前に行います。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
@@ -4563,7 +4608,7 @@ msgstr ""
 "されます。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
@@ -4572,7 +4617,7 @@ msgstr ""
 "されます。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
@@ -4581,12 +4626,12 @@ msgstr ""
 "します。デフォルトはエラーが発生した場合のみです。"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr "APT が &dpkg; を呼ぶ方法"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
@@ -4595,7 +4640,7 @@ msgstr ""
 "<literal>DPkg</literal> セクションにあります。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -4605,7 +4650,7 @@ msgstr ""
 "なければなりません。また、各リストは単一の引数として &dpkg; に渡されます。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4617,7 +4662,7 @@ msgstr ""
 "bin/sh</filename> を通して呼び出され、何か問題があれば APT が異常終了します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4634,7 +4679,7 @@ msgstr ""
 "ります。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -4647,7 +4692,7 @@ msgstr ""
 "<literal>MultiArch</literal> フラグが追加されています。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -4663,7 +4708,7 @@ msgstr ""
 "ポートしている最大のバージョンの情報を代わりに送ります。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -4680,7 +4725,7 @@ msgstr ""
 "ルディスクリプタの番号が収録されています。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
@@ -4689,7 +4734,7 @@ msgstr ""
 "<filename>/</filename> です。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
@@ -4698,12 +4743,12 @@ msgstr ""
 "ます。デフォルトでは署名を無効にし、全バイナリを生成します。"
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr "dpkg トリガの使い方 (および関連オプション)"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -4727,7 +4772,7 @@ msgstr ""
 "(もしくはそれ以上) の時間 100% のままとなり、進捗レポートを壊してしまいます。"
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -4741,7 +4786,7 @@ msgstr ""
 "DPkg::TriggersPending \"true\";"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -4764,7 +4809,7 @@ msgstr ""
 "\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -4784,7 +4829,7 @@ msgstr ""
 "在 APT は、このフラグを、展開呼び出しや削除呼び出しにも追加します。"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -4811,7 +4856,7 @@ msgstr ""
 "能性があるからです。"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -4828,7 +4873,7 @@ msgstr ""
 "では、最後以外のすべての実行で、無効にできます。"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -4843,7 +4888,7 @@ msgstr ""
 "ことに注意してください。"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -4861,7 +4906,7 @@ msgstr ""
 "};"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -4884,12 +4929,12 @@ msgstr ""
 "\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr "Periodic オプションと Archives オプション"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -4902,12 +4947,12 @@ msgstr ""
 "トは、このスクリプトの先頭を参照してください。"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr "デバッグオプション"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -4923,7 +4968,7 @@ msgstr ""
 "のオプションは興味がないでしょうが、以下のものは興味を引くかもしれません。"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -4934,7 +4979,7 @@ msgstr ""
 "にします。"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -4945,7 +4990,7 @@ msgstr ""
 "literal>) を行う場合に使用します。"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -4957,7 +5002,7 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
@@ -4966,34 +5011,34 @@ msgstr ""
 "ないようにします。"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr "以下は apt に対するデバッグオプションのすべてです。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
 "<literal>cdrom://</literal> ソースへのアクセスに関する情報を出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr "FTP を用いたパッケージのダウンロードに関する情報を出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr "HTTP を用いたパッケージのダウンロードに関する情報を出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr "HTTPS を用いたパッケージのダウンロードに関する情報を出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
@@ -5001,7 +5046,7 @@ msgstr ""
 "<literal>gpg</literal> を用いた暗号署名の検証に関する情報を出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
@@ -5010,12 +5055,12 @@ msgstr ""
 "します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr "&apt-get; での構築依存関係解決のプロセスを説明します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
@@ -5023,7 +5068,7 @@ msgstr ""
 "<literal>apt</literal> ライブラリが生成した、暗号化ハッシュを出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -5033,7 +5078,7 @@ msgstr ""
 "システムにある使用済・未使用ブロックの数からの情報を含めないようにします。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
@@ -5042,13 +5087,13 @@ msgstr ""
 "<quote><literal>apt-get update</literal></quote> を実行できるようになります。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 "グローバルダウンロードキューに対する項目の追加・削除の際にログを出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
@@ -5057,7 +5102,7 @@ msgstr ""
 "ジやエラーを出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
@@ -5066,7 +5111,7 @@ msgstr ""
 "します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
@@ -5075,14 +5120,14 @@ msgstr ""
 "リストへのパッチ適用に関する情報を出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
 "実際のダウンロードを行う際の、サブプロセスとのやりとりをログに出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
@@ -5091,7 +5136,7 @@ msgstr ""
 "に出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -5106,7 +5151,7 @@ msgstr ""
 "路に対応しています。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -5135,7 +5180,7 @@ msgstr ""
 "ます。<literal>section</literal> はパッケージが現れるセクション名です。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
@@ -5144,7 +5189,7 @@ msgstr ""
 "切られます。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
@@ -5153,7 +5198,7 @@ msgstr ""
 "を解析中に発生したエラーを出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
@@ -5162,18 +5207,18 @@ msgstr ""
 "のトレースを生成します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr "&dpkg; を呼び出す際に、実行手順を追跡した状態メッセージを出力します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr "起動時の各パッケージの優先度を表示します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
@@ -5182,7 +5227,7 @@ msgstr ""
 "した場合にのみ、適用されます)。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -5193,7 +5238,7 @@ msgstr ""
 "説明したものと同じです。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
@@ -5202,7 +5247,7 @@ msgstr ""
 "します。"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -5213,13 +5258,13 @@ msgstr ""
 "{Pre,Post}-Invoke</literal> があります。"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr "サンプル"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -5229,7 +5274,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-cache;, &apt-config;, &apt-preferences;."
 
index b0a6514b900ac1bdf95a18cded9bc0f689c4f7ca..481d85af6ae160dbb27015e34ade5247b8e4cab9 100644 (file)
@@ -11,7 +11,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: apt 0.9.7.3\n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-28 00:20+0000\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2014-07-04 02:13+0200\n"
 "Last-Translator: Robert Luberda <robert@debian.org>\n"
 "Language-Team: Polish <manpages-pl-list@lists.sourceforge.net>\n"
@@ -868,9 +868,9 @@ msgid ""
 msgstr "linia <literal>Archive:</literal> lub <literal>Suite:</literal>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 msgid "See Also"
@@ -893,7 +893,7 @@ msgstr ""
 "&apt-preferences;, APT Howto."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1879,6 +1879,15 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1887,14 +1896,14 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr "Pliki"
 
 #
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 #, fuzzy
 #| msgid ""
 #| "&apt-cache;, &apt-cdrom;, &dpkg;, &dselect;, &sources-list;, &apt-conf;, "
@@ -1911,7 +1920,7 @@ msgstr ""
 
 #
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -3996,10 +4005,10 @@ msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -4293,13 +4302,40 @@ msgstr ""
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr ""
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -4311,7 +4347,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 msgid ""
 "<literal>Dir::Cache</literal> contains locations pertaining to local cache "
 "information, such as the two package caches <literal>srcpkgcache</literal> "
@@ -4325,7 +4361,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -4335,7 +4371,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -4343,7 +4379,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -4354,7 +4390,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -4367,7 +4403,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -4378,12 +4414,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -4391,7 +4427,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -4404,40 +4440,40 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -4445,7 +4481,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4454,7 +4490,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4465,7 +4501,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -4474,7 +4510,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -4485,7 +4521,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -4496,26 +4532,26 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -4530,7 +4566,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -4544,7 +4580,7 @@ msgstr ""
 "DPkg::TriggersPending \"true\";"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -4558,7 +4594,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -4571,7 +4607,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -4588,7 +4624,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -4599,7 +4635,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -4609,7 +4645,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -4627,7 +4663,7 @@ msgstr ""
 "};"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -4641,12 +4677,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -4655,13 +4691,13 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 #, fuzzy
 msgid "Debug options"
 msgstr "opcje"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -4672,7 +4708,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -4680,7 +4716,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -4688,7 +4724,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -4698,7 +4734,7 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 #, fuzzy
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
@@ -4708,59 +4744,59 @@ msgstr ""
 "in CDROM IDs."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -4768,53 +4804,53 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -4824,7 +4860,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -4842,46 +4878,46 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -4889,14 +4925,14 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -4904,13 +4940,13 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr "Przykłady"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -4918,7 +4954,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-cache;, &apt-config;, &apt-preferences;."
 
index c92a2016d0dfa16c86c74d8a4bc899f7961d0bd4..3aefcc2a91b720b7b9237fa694f5ce2777eb1503 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: apt 1.0.7\n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-29 11:04+0200\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2014-08-29 00:34+0100\n"
 "Last-Translator: Américo Monteiro <a_monteiro@gmx.com>\n"
 "Language-Team: Portuguese <traduz@debianpt.org>\n"
@@ -889,9 +889,9 @@ msgstr ""
 "activado por predefinição."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 msgid "See Also"
@@ -907,7 +907,7 @@ msgstr ""
 "utilizadores do The APT em &guidesdir;, &apt-preferences;, o Howto do APT."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1796,6 +1796,15 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1809,13 +1818,13 @@ msgstr ""
 "Progress</literal> e <literal>Dpkg::Progress-Fancy</literal>."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr "Ficheiros"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 msgid ""
 "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, "
 "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the "
@@ -1826,7 +1835,7 @@ msgstr ""
 "preferences;, o Howto do APT."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -4065,14 +4074,23 @@ msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt.conf.5.xml:384
+#, fuzzy
+#| msgid ""
+#| "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used "
+#| "to enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be "
+#| "beneficial e.g. on high-latency connections. It specifies how many "
+#| "requests are sent in a pipeline.  Previous APT versions had a default of "
+#| "10 for this setting, but the default value is now 0 (= disabled) to avoid "
+#| "problems with the ever-growing amount of webservers and proxies which "
+#| "choose to not conform to the HTTP/1.1 specification."
 msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 "A definição <literal>Acquire::http::Pipeline-Depth</literal> pode ser usada "
 "para activar o 'pipelining' de HTTP (RFC 2616 secção 8.1.2.2) a qual pode "
@@ -4527,13 +4545,40 @@ msgstr "Ao descarregar, força o uso exclusivo do protocolo IPv4."
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr "Ao descarregar, força o uso exclusivo do protocolo IPv6."
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr "Directórios"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -4552,7 +4597,7 @@ msgstr ""
 "items que não começam com <filename>/</filename> ou <filename>./</filename>."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 msgid ""
 "<literal>Dir::Cache</literal> contains locations pertaining to local cache "
 "information, such as the two package caches <literal>srcpkgcache</literal> "
@@ -4575,7 +4620,7 @@ msgstr ""
 "literal> o directório predefinido é contido em <literal>Dir::Cache</literal>"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -4590,7 +4635,7 @@ msgstr ""
 "ficheiro de configuração especificado por <envar>APT_CONFIG</envar>)."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -4601,7 +4646,7 @@ msgstr ""
 "estar feito então é carregado o ficheiro de configuração principal."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -4619,7 +4664,7 @@ msgstr ""
 "respectivos programas."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -4640,7 +4685,7 @@ msgstr ""
 "procurado em <filename>/tmp/staging/var/lib/dpkg/status</filename>."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -4658,12 +4703,12 @@ msgstr ""
 "expressão regular."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr "APT em DSelect"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -4674,7 +4719,7 @@ msgstr ""
 "<literal>DSelect</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -4696,7 +4741,7 @@ msgstr ""
 "pacotes."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
@@ -4705,7 +4750,7 @@ msgstr ""
 "comandos quando é corrido para a fase de instalação."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
@@ -4714,7 +4759,7 @@ msgstr ""
 "comandos quando é executado para a fase de actualização."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
@@ -4723,12 +4768,12 @@ msgstr ""
 "continuar. A predefinição é avisar apenas em caso de erro."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr "Como o APT chama o &dpkg;"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
@@ -4737,7 +4782,7 @@ msgstr ""
 "&dpkg;. Estas estão na secção <literal>DPkg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -4748,7 +4793,7 @@ msgstr ""
 "um argumento único ao &dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4761,7 +4806,7 @@ msgstr ""
 "bin/sh</filename>, caso algum deles falhe, o APT irá abortar."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -4779,7 +4824,7 @@ msgstr ""
 "predefinição a entrada standard."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -4792,7 +4837,7 @@ msgstr ""
 "<literal>MultiArch</literal> a cada versão a ser despejada."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -4808,7 +4853,7 @@ msgstr ""
 "irá então enviar a informação na versão mais alta que suporta."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -4826,7 +4871,7 @@ msgstr ""
 "descritor de ficheiro usado."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
@@ -4835,7 +4880,7 @@ msgstr ""
 "predefinição é <filename>/</filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
@@ -4844,12 +4889,12 @@ msgstr ""
 "predefinição é desactivar a assinatura e produzir todos os binários."
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr "Utilização trigger do dpkg (e opções relacionadas)"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -4875,7 +4920,7 @@ msgstr ""
 "100% enquanto na realidade está a configurar todos os pacotes."
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -4889,7 +4934,7 @@ msgstr ""
 "DPkg::TriggersPending \"true\";"
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -4913,7 +4958,7 @@ msgstr ""
 "\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -4935,7 +4980,7 @@ msgstr ""
 "chamadas unpack e remove."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -4965,7 +5010,7 @@ msgstr ""
 "arrancar."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -4983,7 +5028,7 @@ msgstr ""
 "esta opção em todas excepto na última execução."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -4999,7 +5044,7 @@ msgstr ""
 "configurar este pacote."
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -5017,7 +5062,7 @@ msgstr ""
 "};"
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -5041,12 +5086,12 @@ msgstr ""
 "predefinidos. <placeholder type=\"literallayout\" id=\"0\"/>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr "Opções Periodic e Archives"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -5059,12 +5104,12 @@ msgstr ""
 "Veja o cabeçalho deste script para uma breve documentação das suas opções."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr "Opções de depuração"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -5081,7 +5126,7 @@ msgstr ""
 "interesse para o utilizador normal, mas algumas podem ter:"
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -5092,7 +5137,7 @@ msgstr ""
 "remove, purge</literal>."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -5103,7 +5148,7 @@ msgstr ""
 "<literal>apt-get -s install</literal>) como um utilizador não root."
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -5115,7 +5160,7 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
@@ -5124,12 +5169,12 @@ msgstr ""
 "IDs de CD-ROM."
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr "Segue-se uma lista completa de opções de depuração para o apt."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
@@ -5137,25 +5182,25 @@ msgstr ""
 "literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 "Escreve informação relacionada com o descarregamento de pacotes usando FTP."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 "Escreve informação relacionada com o descarregamento de pacotes usando HTTP."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 "Escreve informação relacionada com o descarregamento de pacotes usando HTTPS."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
@@ -5164,7 +5209,7 @@ msgstr ""
 "criptográficas usando <literal>gpg</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
@@ -5173,13 +5218,13 @@ msgstr ""
 "armazenados em CD-ROMs."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 "Descreve os processos de resolver dependências de compilação no &apt-get;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
@@ -5188,7 +5233,7 @@ msgstr ""
 "<literal>apt</literal>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -5199,7 +5244,7 @@ msgstr ""
 "para um CD-ROM."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
@@ -5209,14 +5254,14 @@ msgstr ""
 "literal></quote> ao mesmo tempo."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 "Regista no log quando os items são adicionados ou removidos da fila de "
 "download global."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
@@ -5225,7 +5270,7 @@ msgstr ""
 "checksums e assinaturas criptográficas dos ficheiros descarregados."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
@@ -5235,7 +5280,7 @@ msgstr ""
 "pacote."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
@@ -5244,7 +5289,7 @@ msgstr ""
 "do apt quando se descarrega diffs de índice em vez de índices completos."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
@@ -5252,7 +5297,7 @@ msgstr ""
 "downloads."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
@@ -5261,7 +5306,7 @@ msgstr ""
 "de pacotes e com a remoção de pacotes não utilizados."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -5276,7 +5321,7 @@ msgstr ""
 "literal>; veja <literal>Debug::pkgProblemResolver</literal> para isso."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -5307,7 +5352,7 @@ msgstr ""
 "pacote aparece."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
@@ -5317,7 +5362,7 @@ msgstr ""
 "único."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
@@ -5326,7 +5371,7 @@ msgstr ""
 "estado e quaisquer erros encontrados enquanto os analisa."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
@@ -5335,7 +5380,7 @@ msgstr ""
 "literal> deve passar os pacotes ao &dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
@@ -5343,12 +5388,12 @@ msgstr ""
 "&dpkg;."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr "Escreve a prioridade da cada lista de pacote no arranque."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
@@ -5357,7 +5402,7 @@ msgstr ""
 "acontece quando é encontrado um problema de dependências complexo)."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -5368,7 +5413,7 @@ msgstr ""
 "mesma que é descrita em <literal>Debug::pkgDepCache::Marker</literal>"
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
@@ -5377,7 +5422,7 @@ msgstr ""
 "vendors.list</filename>."
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -5388,13 +5433,13 @@ msgstr ""
 "literal> ou <literal>APT::Update::{Pre,Post}-Invoke</literal>."
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 msgid "Examples"
 msgstr "Exemplos"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -5404,7 +5449,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-cache;, &apt-config;, &apt-preferences;."
 
index d28c1e6336613a842e052bf3784406505c93c3d2..88b479e7512b73cdfb007cf8d178ecc285d963c2 100644 (file)
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: apt\n"
 "Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2014-08-28 00:20+0000\n"
+"POT-Creation-Date: 2014-11-06 09:45+0100\n"
 "PO-Revision-Date: 2004-09-20 17:02+0000\n"
 "Last-Translator: André Luís Lopes <andrelop@debian.org>\n"
 "Language-Team: <debian-l10n-portuguese@lists.debian.org>\n"
@@ -663,9 +663,9 @@ msgid ""
 msgstr "a linha <literal>Archive:</literal>"
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:170 apt-get.8.xml:552 apt-cache.8.xml:346 apt-key.8.xml:191
+#: apt.8.xml:170 apt-get.8.xml:560 apt-cache.8.xml:346 apt-key.8.xml:191
 #: apt-mark.8.xml:127 apt-secure.8.xml:187 apt-cdrom.8.xml:148
-#: apt-config.8.xml:105 apt.conf.5.xml:1222 apt_preferences.5.xml:701
+#: apt-config.8.xml:105 apt.conf.5.xml:1254 apt_preferences.5.xml:701
 #: sources.list.5.xml:274 apt-extracttemplates.1.xml:66 apt-sortpkgs.1.xml:59
 #: apt-ftparchive.1.xml:603
 #, fuzzy
@@ -680,7 +680,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.8.xml:176 apt-get.8.xml:558 apt-cache.8.xml:351 apt-mark.8.xml:131
+#: apt.8.xml:176 apt-get.8.xml:566 apt-cache.8.xml:351 apt-mark.8.xml:131
 #: apt-cdrom.8.xml:153 apt-config.8.xml:110 apt-extracttemplates.1.xml:70
 #: apt-sortpkgs.1.xml:63 apt-ftparchive.1.xml:607
 msgid "Diagnostics"
@@ -1274,6 +1274,15 @@ msgstr ""
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
 #: apt-get.8.xml:529
 msgid ""
+"Forbid the update command to acquire unverifiable data from configured "
+"sources. Apt will fail at the update command for repositories without valid "
+"cryptographically signatures.  Configuration Item: <literal>Acquire::"
+"AllowInsecureRepositories</literal>."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-get.8.xml:537
+msgid ""
 "Show user friendly progress information in the terminal window when packages "
 "are installed, upgraded or removed. For a machine parsable version of this "
 "data see README.progress-reporting in the apt doc directory.  Configuration "
@@ -1282,13 +1291,13 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt-get.8.xml:542 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
-#: apt.conf.5.xml:1216 apt_preferences.5.xml:694
+#: apt-get.8.xml:550 apt-cache.8.xml:339 apt-key.8.xml:170 apt-mark.8.xml:121
+#: apt.conf.5.xml:1248 apt_preferences.5.xml:694
 msgid "Files"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:553
+#: apt-get.8.xml:561
 msgid ""
 "&apt-cache;, &apt-cdrom;, &dpkg;, &sources-list;, &apt-conf;, &apt-config;, "
 "&apt-secure;, The APT User's guide in &guidesdir;, &apt-preferences;, the "
@@ -1296,7 +1305,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt-get.8.xml:559
+#: apt-get.8.xml:567
 msgid ""
 "<command>apt-get</command> returns zero on normal operation, decimal 100 on "
 "error."
@@ -2892,10 +2901,10 @@ msgid ""
 "The setting <literal>Acquire::http::Pipeline-Depth</literal> can be used to "
 "enable HTTP pipelining (RFC 2616 section 8.1.2.2) which can be beneficial e."
 "g. on high-latency connections. It specifies how many requests are sent in a "
-"pipeline.  Previous APT versions had a default of 10 for this setting, but "
-"the default value is now 0 (= disabled) to avoid problems with the ever-"
-"growing amount of webservers and proxies which choose to not conform to the "
-"HTTP/1.1 specification."
+"pipeline.  APT tries to detect and workaround misbehaving webservers and "
+"proxies at runtime, but if you know that yours does not conform to the "
+"HTTP/1.1 specification pipelining can be disabled by setting the value to 0. "
+"It is enabled by default with the value 10."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
@@ -3189,13 +3198,40 @@ msgstr ""
 msgid "When downloading, force to use only the IPv6 protocol."
 msgstr ""
 
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:591
+msgid ""
+"The maximum file size of Release/Release.gpg/InRelease files.  The default "
+"is 10MB."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:598
+msgid ""
+"Allow the update operation to load data files from a repository without a "
+"trusted signature. If enabled this option no data files will be loaded and "
+"the update operation fails with a error for this source. The default is "
+"false for backward compatibility. This will be changed in the future."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt.conf.5.xml:609
+msgid ""
+"Allow that a repository that was previously gpg signed to become unsigned "
+"durign a update operation. When there is no valid signature of a perviously "
+"trusted repository apt will refuse the update. This option can be used to "
+"override this protection. You almost certainly never want to enable this. "
+"The default is false.  Note that apt will still consider packages from this "
+"source untrusted and warn about them if you try to install them."
+msgstr ""
+
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:592
+#: apt.conf.5.xml:624
 msgid "Directories"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:594
+#: apt.conf.5.xml:626
 msgid ""
 "The <literal>Dir::State</literal> section has directories that pertain to "
 "local state information. <literal>lists</literal> is the directory to place "
@@ -3207,7 +3243,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:601
+#: apt.conf.5.xml:633
 msgid ""
 "<literal>Dir::Cache</literal> contains locations pertaining to local cache "
 "information, such as the two package caches <literal>srcpkgcache</literal> "
@@ -3221,7 +3257,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:611
+#: apt.conf.5.xml:643
 msgid ""
 "<literal>Dir::Etc</literal> contains the location of configuration files, "
 "<literal>sourcelist</literal> gives the location of the sourcelist and "
@@ -3231,7 +3267,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:617
+#: apt.conf.5.xml:649
 msgid ""
 "The <literal>Dir::Parts</literal> setting reads in all the config fragments "
 "in lexical order from the directory specified. After this is done then the "
@@ -3239,7 +3275,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:621
+#: apt.conf.5.xml:653
 msgid ""
 "Binary programs are pointed to by <literal>Dir::Bin</literal>. <literal>Dir::"
 "Bin::Methods</literal> specifies the location of the method handlers and "
@@ -3250,7 +3286,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:629
+#: apt.conf.5.xml:661
 msgid ""
 "The configuration item <literal>RootDir</literal> has a special meaning.  If "
 "set, all paths in <literal>Dir::</literal> will be relative to "
@@ -3263,7 +3299,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:642
+#: apt.conf.5.xml:674
 msgid ""
 "The <literal>Ignore-Files-Silently</literal> list can be used to specify "
 "which files APT should silently ignore while parsing the files in the "
@@ -3274,12 +3310,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:651
+#: apt.conf.5.xml:683
 msgid "APT in DSelect"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:653
+#: apt.conf.5.xml:685
 msgid ""
 "When APT is used as a &dselect; method several configuration directives "
 "control the default behavior. These are in the <literal>DSelect</literal> "
@@ -3287,7 +3323,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:658
+#: apt.conf.5.xml:690
 msgid ""
 "Cache Clean mode; this value may be one of <literal>always</literal>, "
 "<literal>prompt</literal>, <literal>auto</literal>, <literal>pre-auto</"
@@ -3300,40 +3336,40 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:672
+#: apt.conf.5.xml:704
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the install phase."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:677
+#: apt.conf.5.xml:709
 msgid ""
 "The contents of this variable are passed to &apt-get; as command line "
 "options when it is run for the update phase."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:682
+#: apt.conf.5.xml:714
 msgid ""
 "If true the [U]pdate operation in &dselect; will always prompt to continue.  "
 "The default is to prompt only on error."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:688
+#: apt.conf.5.xml:720
 msgid "How APT calls &dpkg;"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:689
+#: apt.conf.5.xml:721
 msgid ""
 "Several configuration directives control how APT invokes &dpkg;. These are "
 "in the <literal>DPkg</literal> section."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:694
+#: apt.conf.5.xml:726
 msgid ""
 "This is a list of options to pass to &dpkg;. The options must be specified "
 "using the list notation and each list item is passed as a single argument to "
@@ -3341,7 +3377,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:700
+#: apt.conf.5.xml:732
 msgid ""
 "This is a list of shell commands to run before/after invoking &dpkg;.  Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -3350,7 +3386,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:707
+#: apt.conf.5.xml:739
 msgid ""
 "This is a list of shell commands to run before invoking &dpkg;. Like "
 "<literal>options</literal> this must be specified in list notation. The "
@@ -3361,7 +3397,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:714
+#: apt.conf.5.xml:746
 msgid ""
 "Version 2 of this protocol dumps more information, including the protocol "
 "version, the APT configuration space and the packages, files and versions "
@@ -3370,7 +3406,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:719
+#: apt.conf.5.xml:751
 msgid ""
 "The version of the protocol to be used for the command "
 "<literal><replaceable>cmd</replaceable></literal> can be chosen by setting "
@@ -3381,7 +3417,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:726
+#: apt.conf.5.xml:758
 msgid ""
 "The file descriptor to be used to send the information can be requested with "
 "<literal>DPkg::Tools::options::<replaceable>cmd</replaceable>::InfoFD</"
@@ -3392,26 +3428,26 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:736
+#: apt.conf.5.xml:768
 msgid ""
 "APT chdirs to this directory before invoking &dpkg;, the default is "
 "<filename>/</filename>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:741
+#: apt.conf.5.xml:773
 msgid ""
 "These options are passed to &dpkg-buildpackage; when compiling packages; the "
 "default is to disable signing and produce all binaries."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt.conf.5.xml:746
+#: apt.conf.5.xml:778
 msgid "dpkg trigger usage (and related options)"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:747
+#: apt.conf.5.xml:779
 msgid ""
 "APT can call &dpkg; in such a way as to let it make aggressive use of "
 "triggers over multiple calls of &dpkg;. Without further options &dpkg; will "
@@ -3426,7 +3462,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para><literallayout>
-#: apt.conf.5.xml:762
+#: apt.conf.5.xml:794
 #, no-wrap
 msgid ""
 "DPkg::NoTriggers \"true\";\n"
@@ -3436,7 +3472,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt.conf.5.xml:756
+#: apt.conf.5.xml:788
 msgid ""
 "Note that it is not guaranteed that APT will support these options or that "
 "these options will not cause (big) trouble in the future. If you have "
@@ -3450,7 +3486,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:769
+#: apt.conf.5.xml:801
 msgid ""
 "Add the no triggers flag to all &dpkg; calls (except the ConfigurePending "
 "call).  See &dpkg; if you are interested in what this actually means. In "
@@ -3463,7 +3499,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:777
+#: apt.conf.5.xml:809
 msgid ""
 "Valid values are \"<literal>all</literal>\", \"<literal>smart</literal>\" "
 "and \"<literal>no</literal>\".  The default value is \"<literal>all</literal>"
@@ -3480,7 +3516,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:792
+#: apt.conf.5.xml:824
 msgid ""
 "If this option is set APT will call <command>dpkg --configure --pending</"
 "command> to let &dpkg; handle all required configurations and triggers. This "
@@ -3491,7 +3527,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:799
+#: apt.conf.5.xml:831
 msgid ""
 "Useful for the <literal>smart</literal> configuration as a package which has "
 "pending triggers is not considered as <literal>installed</literal>, and "
@@ -3501,7 +3537,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para><literallayout>
-#: apt.conf.5.xml:812
+#: apt.conf.5.xml:844
 #, no-wrap
 msgid ""
 "OrderList::Score {\n"
@@ -3513,7 +3549,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><refsect2><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:805
+#: apt.conf.5.xml:837
 msgid ""
 "Essential packages (and their dependencies) should be configured immediately "
 "after unpacking. It is a good idea to do this quite early in the upgrade "
@@ -3527,12 +3563,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:825
+#: apt.conf.5.xml:857
 msgid "Periodic and Archives options"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:826
+#: apt.conf.5.xml:858
 msgid ""
 "<literal>APT::Periodic</literal> and <literal>APT::Archives</literal> groups "
 "of options configure behavior of apt periodic updates, which is done by the "
@@ -3541,12 +3577,12 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:834
+#: apt.conf.5.xml:866
 msgid "Debug options"
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:836
+#: apt.conf.5.xml:868
 msgid ""
 "Enabling options in the <literal>Debug::</literal> section will cause "
 "debugging information to be sent to the standard error stream of the program "
@@ -3557,7 +3593,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:847
+#: apt.conf.5.xml:879
 msgid ""
 "<literal>Debug::pkgProblemResolver</literal> enables output about the "
 "decisions made by <literal>dist-upgrade, upgrade, install, remove, purge</"
@@ -3565,7 +3601,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:855
+#: apt.conf.5.xml:887
 msgid ""
 "<literal>Debug::NoLocking</literal> disables all file locking.  This can be "
 "used to run some operations (for instance, <literal>apt-get -s install</"
@@ -3573,7 +3609,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:864
+#: apt.conf.5.xml:896
 msgid ""
 "<literal>Debug::pkgDPkgPM</literal> prints out the actual command line each "
 "time that <literal>apt</literal> invokes &dpkg;."
@@ -3583,66 +3619,66 @@ msgstr ""
 #.        motivating example, except I haven't a clue why you'd want
 #.        to do this. 
 #. type: Content of: <refentry><refsect1><para><itemizedlist><listitem><para>
-#: apt.conf.5.xml:872
+#: apt.conf.5.xml:904
 msgid ""
 "<literal>Debug::IdentCdrom</literal> disables the inclusion of statfs data "
 "in CD-ROM IDs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:882
+#: apt.conf.5.xml:914
 msgid "A full list of debugging options to apt follows."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:891
+#: apt.conf.5.xml:923
 msgid ""
 "Print information related to accessing <literal>cdrom://</literal> sources."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:902
+#: apt.conf.5.xml:934
 msgid "Print information related to downloading packages using FTP."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:913
+#: apt.conf.5.xml:945
 msgid "Print information related to downloading packages using HTTP."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:924
+#: apt.conf.5.xml:956
 msgid "Print information related to downloading packages using HTTPS."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:935
+#: apt.conf.5.xml:967
 msgid ""
 "Print information related to verifying cryptographic signatures using "
 "<literal>gpg</literal>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:946
+#: apt.conf.5.xml:978
 msgid ""
 "Output information about the process of accessing collections of packages "
 "stored on CD-ROMs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:956
+#: apt.conf.5.xml:988
 msgid "Describes the process of resolving build-dependencies in &apt-get;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:966
+#: apt.conf.5.xml:998
 msgid ""
 "Output each cryptographic hash that is generated by the <literal>apt</"
 "literal> libraries."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:976
+#: apt.conf.5.xml:1008
 msgid ""
 "Do not include information from <literal>statfs</literal>, namely the number "
 "of used and free blocks on the CD-ROM filesystem, when generating an ID for "
@@ -3650,53 +3686,53 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:987
+#: apt.conf.5.xml:1019
 msgid ""
 "Disable all file locking.  For instance, this will allow two instances of "
 "<quote><literal>apt-get update</literal></quote> to run at the same time."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:999
+#: apt.conf.5.xml:1031
 msgid "Log when items are added to or removed from the global download queue."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1009
+#: apt.conf.5.xml:1041
 msgid ""
 "Output status messages and errors related to verifying checksums and "
 "cryptographic signatures of downloaded files."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1019
+#: apt.conf.5.xml:1051
 msgid ""
 "Output information about downloading and applying package index list diffs, "
 "and errors relating to package index list diffs."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1031
+#: apt.conf.5.xml:1063
 msgid ""
 "Output information related to patching apt package lists when downloading "
 "index diffs instead of full indices."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1042
+#: apt.conf.5.xml:1074
 msgid ""
 "Log all interactions with the sub-processes that actually perform downloads."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1053
+#: apt.conf.5.xml:1085
 msgid ""
 "Log events related to the automatically-installed status of packages and to "
 "the removal of unused packages."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1063
+#: apt.conf.5.xml:1095
 msgid ""
 "Generate debug messages describing which packages are being automatically "
 "installed to resolve dependencies.  This corresponds to the initial auto-"
@@ -3706,7 +3742,7 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1077
+#: apt.conf.5.xml:1109
 msgid ""
 "Generate debug messages describing which packages are marked as keep/install/"
 "remove while the ProblemResolver does his work.  Each addition or deletion "
@@ -3724,46 +3760,46 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1098
+#: apt.conf.5.xml:1130
 msgid ""
 "When invoking &dpkg;, output the precise command line with which it is being "
 "invoked, with arguments separated by a single space character."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1109
+#: apt.conf.5.xml:1141
 msgid ""
 "Output all the data received from &dpkg; on the status file descriptor and "
 "any errors encountered while parsing it."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1120
+#: apt.conf.5.xml:1152
 msgid ""
 "Generate a trace of the algorithm that decides the order in which "
 "<literal>apt</literal> should pass packages to &dpkg;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1132
+#: apt.conf.5.xml:1164
 msgid ""
 "Output status messages tracing the steps performed when invoking &dpkg;."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1143
+#: apt.conf.5.xml:1175
 msgid "Output the priority of each package list on startup."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1153
+#: apt.conf.5.xml:1185
 msgid ""
 "Trace the execution of the dependency resolver (this applies only to what "
 "happens when a complex dependency problem is encountered)."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1164
+#: apt.conf.5.xml:1196
 msgid ""
 "Display a list of all installed packages with their calculated score used by "
 "the pkgProblemResolver. The description of the package is the same as "
@@ -3771,14 +3807,14 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1176
+#: apt.conf.5.xml:1208
 msgid ""
 "Print information about the vendors read from <filename>/etc/apt/vendors."
 "list</filename>."
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt.conf.5.xml:1186
+#: apt.conf.5.xml:1218
 msgid ""
 "Display the external commands that are called by apt hooks.  This includes e."
 "g. the config options <literal>DPkg::{Pre,Post}-Invoke</literal> or "
@@ -3786,14 +3822,14 @@ msgid ""
 msgstr ""
 
 #. type: Content of: <refentry><refsect1><title>
-#: apt.conf.5.xml:1210 apt_preferences.5.xml:541 sources.list.5.xml:233
+#: apt.conf.5.xml:1242 apt_preferences.5.xml:541 sources.list.5.xml:233
 #: apt-ftparchive.1.xml:592
 #, fuzzy
 msgid "Examples"
 msgstr "Exemplos"
 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1211
+#: apt.conf.5.xml:1243
 msgid ""
 "&configureindex; is a configuration file showing example values for all "
 "possible options."
@@ -3801,7 +3837,7 @@ msgstr ""
 
 #.  ? reading apt.conf 
 #. type: Content of: <refentry><refsect1><para>
-#: apt.conf.5.xml:1223
+#: apt.conf.5.xml:1255
 #, fuzzy
 msgid "&apt-cache;, &apt-config;, &apt-preferences;."
 msgstr "&apt-get; &apt-cache; &apt-conf; &sources-list;"
index ebf99a8f8541a031a4b1399fda4f3ca20503b17a..adf1b6d73214921a4663b2e7799e2f74e062e5ce 100644 (file)
@@ -19,6 +19,9 @@
 #include <apt-pkg/init.h>
 #include <apt-pkg/fileutl.h>
 
+#include <apt-private/private-cmndline.h>
+#include <apt-private/private-output.h>
+
 #include <algorithm>
 #include <climits>
 #include <sys/time.h>
 #include <apti18n.h>
                                                                        /*}}}*/
 
-using namespace std;    
-ostream c0out(0);
-ostream c1out(0);
-ostream c2out(0);
-ofstream devnull("/dev/null");
+using namespace std;
 unsigned Quiet = 0;
 
 // struct PackageMap - List of all package files in the config file    /*{{{*/
@@ -1060,31 +1059,12 @@ int main(int argc, const char *argv[])
 
    // Parse the command line and initialize the package library
    CommandLine CmdL(Args,_config);
-   if (pkgInitConfig(*_config) == false || CmdL.Parse(argc,argv) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-   
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-   
-   // Setup the output streams
-   c0out.rdbuf(clog.rdbuf());
-   c1out.rdbuf(clog.rdbuf());
-   c2out.rdbuf(clog.rdbuf());
+   ParseCommandLine(CmdL, Cmds, Args, &_config, NULL, argc, argv, ShowHelp);
+
+   _config->CndSet("quiet",0);
    Quiet = _config->FindI("quiet",0);
-   if (Quiet > 0)
-      c0out.rdbuf(devnull.rdbuf());
-   if (Quiet > 1)
-      c1out.rdbuf(devnull.rdbuf());
+   InitOutput(clog.rdbuf());
+
    // Match the operation
    CmdL.DispatchArg(Cmds);
    
index c73a64fb774b59538a082a9467224fc5ac9df7d2..1dc2685946684598e602b6f2ba7f3a1b781dd25f 100644 (file)
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/debfile.h>
 #include <apt-pkg/gpgv.h>
+#include <apt-pkg/hashes.h>
 
 #include <netinet/in.h>       // htonl, etc
 #include <ctype.h>
 #include <stddef.h>
 #include <sys/stat.h>
+#include <strings.h>
 
 #include "cachedb.h"
 
 #include <apti18n.h>
                                                                        /*}}}*/
 
-CacheDB::CacheDB(std::string const &DB) 
+CacheDB::CacheDB(std::string const &DB)
    : Dbp(0), Fd(NULL), DebFile(0)
 {
    TmpKey[0]='\0';
    ReadyDB(DB);
-};
+}
 
 CacheDB::~CacheDB()
 {
    ReadyDB();
    delete DebFile;
-};
+}
 
 // CacheDB::ReadyDB - Ready the DB2                                    /*{{{*/
 // ---------------------------------------------------------------------
@@ -268,15 +270,10 @@ bool CacheDB::GetCurStat()
                                                                        /*}}}*/
 // CacheDB::GetFileInfo - Get all the info about the file              /*{{{*/
 // ---------------------------------------------------------------------
-bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl, 
-                          bool const &DoContents,
-                          bool const &GenContentsOnly, 
-                          bool const &DoSource,
-                          bool const &DoMD5, bool const &DoSHA1,
-                          bool const &DoSHA256, bool const &DoSHA512, 
+bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl, bool const &DoContents,
+                               bool const &GenContentsOnly, bool const DoSource, unsigned int const DoHashes,
                           bool const &checkMtime)
 {
-   bool result = true;
    this->FileName = FileName;
 
    if (GetCurStat() == false)
@@ -284,31 +281,28 @@ bool CacheDB::GetFileInfo(std::string const &FileName, bool const &DoControl,
    OldStat = CurStat;
 
    if (GetFileStat(checkMtime) == false)
-      return false;    
+      return false;
 
    /* if mtime changed, update CurStat from disk */
    if (checkMtime == true && OldStat.mtime != CurStat.mtime)
       CurStat.Flags = FlSize;
 
    Stats.Bytes += CurStat.FileSize;
-   Stats.Packages++;
+   ++Stats.Packages;
 
    if ((DoControl && LoadControl() == false)
-       || (DoContents && LoadContents(GenContentsOnly) == false)
-       || (DoSource && LoadSource() == false)
-       || (DoMD5 && GetMD5(false) == false)
-       || (DoSHA1 && GetSHA1(false) == false)
-       || (DoSHA256 && GetSHA256(false) == false)
-       || (DoSHA512 && GetSHA512(false) == false) )
+        || (DoContents && LoadContents(GenContentsOnly) == false)
+        || (DoSource && LoadSource() == false)
+        || (DoHashes != 0 && GetHashes(false, DoHashes) == false)
+      )
    {
-      result = false;
+      return false;
    }
-    
-   return result;
+
+   return true;
 }
                                                                        /*}}}*/
-
-bool CacheDB::LoadSource()
+bool CacheDB::LoadSource()                                             /*{{{*/
 {
    // Try to read the control information out of the DB.
    if ((CurStat.Flags & FlSource) == FlSource)
@@ -338,7 +332,7 @@ bool CacheDB::LoadSource()
 
    return true;
 }
-
+                                                                       /*}}}*/
 // CacheDB::LoadControl - Load Control information                     /*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -407,7 +401,7 @@ bool CacheDB::LoadContents(bool const &GenOnly)
    return true;
 }
                                                                        /*}}}*/
-
+// CacheDB::GetHashes - Get the hashs                                  /*{{{*/
 static std::string bytes2hex(uint8_t *bytes, size_t length) {
    char buf[3];
    std::string space;
@@ -437,125 +431,63 @@ static void hex2bytes(uint8_t *bytes, const char *hex, int length) {
       bytes++;
    } 
 }
-
-// CacheDB::GetMD5 - Get the MD5 hash                                  /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool CacheDB::GetMD5(bool const &GenOnly)
+bool CacheDB::GetHashes(bool const GenOnly, unsigned int const DoHashes)
 {
-   // Try to read the control information out of the DB.
-   if ((CurStat.Flags & FlMD5) == FlMD5)
-   {
-      if (GenOnly == true)
-        return true;
-      
-      MD5Res = bytes2hex(CurStat.MD5, sizeof(CurStat.MD5));
-        return true;
-   }
-   
-   Stats.MD5Bytes += CurStat.FileSize;
-        
-   if (OpenFile() == false)
-      return false;
+   unsigned int FlHashes = DoHashes & (Hashes::MD5SUM | Hashes::SHA1SUM | Hashes::SHA256SUM | Hashes::SHA512SUM);
+   HashesList.clear();
 
-   MD5Summation MD5;
-   if (Fd->Seek(0) == false || MD5.AddFD(*Fd, CurStat.FileSize) == false)
-      return false;
-   
-   MD5Res = MD5.Result();
-   hex2bytes(CurStat.MD5, MD5Res.data(), sizeof(CurStat.MD5));
-      CurStat.Flags |= FlMD5;
-   return true;
-}
-                                                                       /*}}}*/
-// CacheDB::GetSHA1 - Get the SHA1 hash                                        /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool CacheDB::GetSHA1(bool const &GenOnly)
-{
-   // Try to read the control information out of the DB.
-   if ((CurStat.Flags & FlSHA1) == FlSHA1)
+   if (FlHashes != 0)
    {
-      if (GenOnly == true)
-        return true;
+      if (OpenFile() == false)
+        return false;
 
-      SHA1Res = bytes2hex(CurStat.SHA1, sizeof(CurStat.SHA1));
-      return true;
-   }
-   
-   Stats.SHA1Bytes += CurStat.FileSize;
-        
-   if (OpenFile() == false)
-      return false;
+      Hashes hashes;
+      if (Fd->Seek(0) == false || hashes.AddFD(*Fd, CurStat.FileSize, FlHashes) == false)
+        return false;
 
-   SHA1Summation SHA1;
-   if (Fd->Seek(0) == false || SHA1.AddFD(*Fd, CurStat.FileSize) == false)
-      return false;
-   
-   SHA1Res = SHA1.Result();
-   hex2bytes(CurStat.SHA1, SHA1Res.data(), sizeof(CurStat.SHA1));
-   CurStat.Flags |= FlSHA1;
-   return true;
-}
-                                                                       /*}}}*/
-// CacheDB::GetSHA256 - Get the SHA256 hash                            /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool CacheDB::GetSHA256(bool const &GenOnly)
-{
-   // Try to read the control information out of the DB.
-   if ((CurStat.Flags & FlSHA256) == FlSHA256)
-   {
-      if (GenOnly == true)
-        return true;
-
-      SHA256Res = bytes2hex(CurStat.SHA256, sizeof(CurStat.SHA256));
-      return true;
+      HashStringList hl = hashes.GetHashStringList();
+      for (HashStringList::const_iterator hs = hl.begin(); hs != hl.end(); ++hs)
+      {
+        HashesList.push_back(*hs);
+        if (strcasecmp(hs->HashType().c_str(), "SHA512") == 0)
+        {
+           Stats.SHA512Bytes += CurStat.FileSize;
+           hex2bytes(CurStat.SHA512, hs->HashValue().data(), sizeof(CurStat.SHA512));
+           CurStat.Flags |= FlSHA512;
+        }
+        else if (strcasecmp(hs->HashType().c_str(), "SHA256") == 0)
+        {
+           Stats.SHA256Bytes += CurStat.FileSize;
+           hex2bytes(CurStat.SHA256, hs->HashValue().data(), sizeof(CurStat.SHA256));
+           CurStat.Flags |= FlSHA256;
+        }
+        else if (strcasecmp(hs->HashType().c_str(), "SHA1") == 0)
+        {
+           Stats.SHA1Bytes += CurStat.FileSize;
+           hex2bytes(CurStat.SHA1, hs->HashValue().data(), sizeof(CurStat.SHA1));
+           CurStat.Flags |= FlSHA1;
+        }
+        else if (strcasecmp(hs->HashType().c_str(), "MD5Sum") == 0)
+        {
+           Stats.MD5Bytes += CurStat.FileSize;
+           hex2bytes(CurStat.MD5, hs->HashValue().data(), sizeof(CurStat.MD5));
+           CurStat.Flags |= FlMD5;
+        }
+        else if (strcasecmp(hs->HashType().c_str(), "Checksum-FileSize") == 0)
+        {
+           // we store it in a different field already
+        }
+        else
+           return _error->Error("Got unknown unrequested hashtype %s", hs->HashType().c_str());
+      }
    }
-   
-   Stats.SHA256Bytes += CurStat.FileSize;
-        
-   if (OpenFile() == false)
-      return false;
-
-   SHA256Summation SHA256;
-   if (Fd->Seek(0) == false || SHA256.AddFD(*Fd, CurStat.FileSize) == false)
-      return false;
-   
-   SHA256Res = SHA256.Result();
-   hex2bytes(CurStat.SHA256, SHA256Res.data(), sizeof(CurStat.SHA256));
-   CurStat.Flags |= FlSHA256;
-   return true;
-}
-                                                                       /*}}}*/
-// CacheDB::GetSHA256 - Get the SHA256 hash                            /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool CacheDB::GetSHA512(bool const &GenOnly)
-{
-   // Try to read the control information out of the DB.
-   if ((CurStat.Flags & FlSHA512) == FlSHA512)
-   {
-      if (GenOnly == true)
-        return true;
-
-      SHA512Res = bytes2hex(CurStat.SHA512, sizeof(CurStat.SHA512));
+   if (GenOnly == true)
       return true;
-   }
-   
-   Stats.SHA512Bytes += CurStat.FileSize;
-        
-   if (OpenFile() == false)
-      return false;
 
-   SHA512Summation SHA512;
-   if (Fd->Seek(0) == false || SHA512.AddFD(*Fd, CurStat.FileSize) == false)
-      return false;
-   
-   SHA512Res = SHA512.Result();
-   hex2bytes(CurStat.SHA512, SHA512Res.data(), sizeof(CurStat.SHA512));
-   CurStat.Flags |= FlSHA512;
-   return true;
+   return HashesList.push_back(HashString("MD5Sum", bytes2hex(CurStat.MD5, sizeof(CurStat.MD5)))) &&
+      HashesList.push_back(HashString("SHA1", bytes2hex(CurStat.SHA1, sizeof(CurStat.SHA1)))) &&
+      HashesList.push_back(HashString("SHA256", bytes2hex(CurStat.SHA256, sizeof(CurStat.SHA256)))) &&
+      HashesList.push_back(HashString("SHA512", bytes2hex(CurStat.SHA512, sizeof(CurStat.SHA512))));
 }
                                                                        /*}}}*/
 // CacheDB::Finish - Write back the cache structure                    /*{{{*/
index 29d710d2c51292d6d43cfbe8a982f5356d1bc30f..613963f6f2a442032249d18d1d5b0f501266e022 100644 (file)
@@ -12,6 +12,7 @@
 #ifndef CACHEDB_H
 #define CACHEDB_H
 
+#include <apt-pkg/hashes.h>
 #include <apt-pkg/debfile.h>
 
 #include <db.h>
@@ -94,15 +95,12 @@ class CacheDB
    bool LoadControl();
    bool LoadContents(bool const &GenOnly);
    bool LoadSource();
-   bool GetMD5(bool const &GenOnly);
-   bool GetSHA1(bool const &GenOnly);
-   bool GetSHA256(bool const &GenOnly);
-   bool GetSHA512(bool const &GenOnly);
-   
+   bool GetHashes(bool const GenOnly, unsigned int const DoHashes);
+
    // Stat info stored in the DB, Fixed types since it is written to disk.
    enum FlagList {FlControl = (1<<0),FlMD5=(1<<1),FlContents=(1<<2),
-                  FlSize=(1<<3), FlSHA1=(1<<4), FlSHA256=(1<<5), 
-                  FlSHA512=(1<<6), FlSource=(1<<7),
+                  FlSize=(1<<3), FlSHA1=(1<<4), FlSHA256=(1<<5),
+                  FlSHA512=(1<<6), FlSource=(1<<7)
    };
 
    // the on-disk format changed (FileSize increased to 64bit) in 
@@ -142,12 +140,8 @@ class CacheDB
    debDebFile::MemControlExtract Control;
    ContentsExtract Contents;
    DscExtract Dsc;
+   HashStringList HashesList;
 
-   std::string MD5Res;
-   std::string SHA1Res;
-   std::string SHA256Res;
-   std::string SHA512Res;
-   
    // Runtime statistics
    struct Stats
    {
@@ -183,16 +177,13 @@ class CacheDB
    bool SetFile(std::string const &FileName,struct stat St,FileFd *Fd);
 
    // terrible old overloaded interface
-   bool GetFileInfo(std::string const &FileName, 
-                    bool const &DoControl, 
-                    bool const &DoContents, 
-                    bool const &GenContentsOnly, 
-                    bool const &DoSource,
-                   bool const &DoMD5, 
-                    bool const &DoSHA1, 
-                    bool const &DoSHA256, 
-                    bool const &DoSHA512, 
-                    bool const &checkMtime = false);
+   bool GetFileInfo(std::string const &FileName,
+        bool const &DoControl,
+        bool const &DoContents,
+        bool const &GenContentsOnly,
+        bool const DoSource,
+        unsigned int const DoHashes,
+        bool const &checkMtime = false);
 
    bool Finish();   
    
index 91dd2b8bde68de0ed8d8859aee8debdabe810f5f..8c4181eda090c46dc59ab717a74a24e620897562 100644 (file)
@@ -302,17 +302,17 @@ void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf)
    DoPrint(Out,Top->BTreeRight,Buf);  
 }
                                                                        /*}}}*/
-// ContentsExtract Constructor                                         /*{{{*/
+// ContentsExtract Constructor                                         /*{{{*/
 ContentsExtract::ContentsExtract()
-   : Data(0), MaxSize(0), CurSize(0) 
+   : Data(0), MaxSize(0), CurSize(0)
 {
-};
+}
                                                                        /*}}}*/
-// ContentsExtract Destructor                                          /*{{{*/
+// ContentsExtract Destructor                                          /*{{{*/
 ContentsExtract::~ContentsExtract()
 {
    free(Data);
-};
+}
                                                                        /*}}}*/
 // ContentsExtract::Read - Read the archive                            /*{{{*/
 // ---------------------------------------------------------------------
index d1ffe182a2c4ebe7c74fe2a0db00a46dac5b8ce0..e67272e1e8f016d2d0e9543fbe610f4c6d62fe8a 100644 (file)
@@ -9,8 +9,8 @@ include ../buildlib/defaults.mak
 ifdef BDBLIB
 APT_DOMAIN:=apt-utils
 PROGRAM=apt-ftparchive
-SLIBS = -lapt-pkg -lapt-inst $(BDBLIB) $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile apt-inst/makefile
+SLIBS = -lapt-pkg -lapt-inst -lapt-private $(BDBLIB) $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile
 SOURCE = apt-ftparchive.cc cachedb.cc writer.cc contents.cc override.cc \
          multicompress.cc sources.cc
 include $(PROGRAM_H)
index 0f6cc177b177446cd9173f3a9cef5880781f5dbd..a63d8846b155a92aee3622612218e4cdc9954ca3 100644 (file)
@@ -54,29 +54,42 @@ FTWScanner *FTWScanner::Owner;
 // SetTFRewriteData - Helper for setting rewrite lists                 /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-inline void SetTFRewriteData(struct TFRewriteData &tfrd,
-                            const char *tag,
+static inline TFRewriteData SetTFRewriteData(const char *tag,
                             const char *rewrite,
                             const char *newtag = 0)
 {
-    tfrd.Tag = tag;
-    tfrd.Rewrite = rewrite;
-    tfrd.NewTag = newtag;
+   TFRewriteData tfrd;
+   tfrd.Tag = tag;
+   tfrd.Rewrite = rewrite;
+   tfrd.NewTag = newtag;
+   return tfrd;
+}
+                                                                       /*}}}*/
+// ConfigToDoHashes - which hashes to generate                         /*{{{*/
+static void SingleConfigToDoHashes(unsigned int &DoHashes, std::string const &Conf, unsigned int const Flag)
+{
+   if (_config->FindB(Conf, true) == true)
+      DoHashes |= Flag;
+   else
+      DoHashes &= ~Flag;
+}
+static void ConfigToDoHashes(unsigned int &DoHashes, std::string const &Conf)
+{
+   SingleConfigToDoHashes(DoHashes, Conf + "::MD5", Hashes::MD5SUM);
+   SingleConfigToDoHashes(DoHashes, Conf + "::SHA1", Hashes::SHA1SUM);
+   SingleConfigToDoHashes(DoHashes, Conf + "::SHA256", Hashes::SHA256SUM);
+   SingleConfigToDoHashes(DoHashes, Conf + "::SHA512", Hashes::SHA512SUM);
 }
                                                                        /*}}}*/
 
 // FTWScanner::FTWScanner - Constructor                                        /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-FTWScanner::FTWScanner(string const &Arch): Arch(Arch)
+FTWScanner::FTWScanner(string const &Arch): Arch(Arch), DoHashes(~0)
 {
    ErrorPrinted = false;
    NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true);
-
-   DoMD5 = _config->FindB("APT::FTPArchive::MD5",true);
-   DoSHA1 = _config->FindB("APT::FTPArchive::SHA1",true);
-   DoSHA256 = _config->FindB("APT::FTPArchive::SHA256",true);
-   DoSHA512 = _config->FindB("APT::FTPArchive::SHA512",true);
+   ConfigToDoHashes(DoHashes, "APT::FTPArchive");
 }
                                                                        /*}}}*/
 // FTWScanner::Scanner - FTW Scanner                                   /*{{{*/
@@ -327,10 +340,7 @@ PackagesWriter::PackagesWriter(string const &DB,string const &Overrides,string c
    DeLinkLimit = 0;
 
    // Process the command line options
-   DoMD5 = _config->FindB("APT::FTPArchive::Packages::MD5",DoMD5);
-   DoSHA1 = _config->FindB("APT::FTPArchive::Packages::SHA1",DoSHA1);
-   DoSHA256 = _config->FindB("APT::FTPArchive::Packages::SHA256",DoSHA256);
-   DoSHA512 = _config->FindB("APT::FTPArchive::Packages::SHA512",DoSHA512);
+   ConfigToDoHashes(DoHashes, "APT::FTPArchive::Packages");
    DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false);
    DoContents = _config->FindB("APT::FTPArchive::Contents",true);
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
@@ -385,12 +395,12 @@ bool FTWScanner::SetExts(string const &Vals)
 bool PackagesWriter::DoPackage(string FileName)
 {      
    // Pull all the data we need form the DB
-   if (Db.GetFileInfo(FileName, 
-                      true,   /* DoControl */
-                      DoContents, 
-                      true,   /* GenContentsOnly */
-                      false,  /* DoSource */
-                      DoMD5, DoSHA1, DoSHA256, DoSHA512, DoAlwaysStat) == false)
+   if (Db.GetFileInfo(FileName,
+           true, /* DoControl */
+           DoContents,
+           true, /* GenContentsOnly */
+           false, /* DoSource */
+           DoHashes, DoAlwaysStat) == false)
    {
      return false;
    }
@@ -454,30 +464,29 @@ bool PackagesWriter::DoPackage(string FileName)
    }
 
    // This lists all the changes to the fields we are going to make.
-   // (7 hardcoded + maintainer + suggests + end marker)
-   TFRewriteData Changes[6+2+OverItem->FieldOverride.size()+1+1];
-
-   unsigned int End = 0;
-   SetTFRewriteData(Changes[End++], "Size", Size);
-   if (DoMD5 == true)
-      SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str());
-   if (DoSHA1 == true)
-      SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str());
-   if (DoSHA256 == true)
-      SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str());
-   if (DoSHA512 == true)
-      SetTFRewriteData(Changes[End++], "SHA512", Db.SHA512Res.c_str());
-   SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str());
-   SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str());
-   SetTFRewriteData(Changes[End++], "Status", 0);
-   SetTFRewriteData(Changes[End++], "Optional", 0);
+   std::vector<TFRewriteData> Changes;
+
+   Changes.push_back(SetTFRewriteData("Size", Size));
+   for (HashStringList::const_iterator hs = Db.HashesList.begin(); hs != Db.HashesList.end(); ++hs)
+   {
+      if (hs->HashType() == "MD5Sum")
+        Changes.push_back(SetTFRewriteData("MD5sum", hs->HashValue().c_str()));
+      else if (hs->HashType() == "Checksum-FileSize")
+        continue;
+      else
+        Changes.push_back(SetTFRewriteData(hs->HashType().c_str(), hs->HashValue().c_str()));
+   }
+   Changes.push_back(SetTFRewriteData("Filename", NewFileName.c_str()));
+   Changes.push_back(SetTFRewriteData("Priority", OverItem->Priority.c_str()));
+   Changes.push_back(SetTFRewriteData("Status", 0));
+   Changes.push_back(SetTFRewriteData("Optional", 0));
 
    string DescriptionMd5;
    if (LongDescription == false) {
       MD5Summation descmd5;
       descmd5.Add(desc.c_str());
       DescriptionMd5 = descmd5.Result().Value();
-      SetTFRewriteData(Changes[End++], "Description-md5", DescriptionMd5.c_str());
+      Changes.push_back(SetTFRewriteData("Description-md5", DescriptionMd5.c_str()));
       if (TransWriter != NULL)
         TransWriter->DoPackage(Package, desc, DescriptionMd5);
    }
@@ -492,12 +501,12 @@ bool PackagesWriter::DoPackage(string FileName)
         NewLine(1);
         ioprintf(c1out, _("  %s maintainer is %s not %s\n"),
               Package.c_str(), Tags.FindS("Maintainer").c_str(), OverItem->OldMaint.c_str());
-      }      
+      }
    }
-   
+
    if (NewMaint.empty() == false)
-      SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str());
-   
+      Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str()));
+
    /* Get rid of the Optional tag. This is an ugly, ugly, ugly hack that
       dpkg-scanpackages does. Well sort of. dpkg-scanpackages just does renaming
       but dpkg does this append bit. So we do the append bit, at least that way the
@@ -508,17 +517,17 @@ bool PackagesWriter::DoPackage(string FileName)
    {
       if (Tags.FindS("Suggests").empty() == false)
         OptionalStr = Tags.FindS("Suggests") + ", " + OptionalStr;
-      SetTFRewriteData(Changes[End++], "Suggests", OptionalStr.c_str());
+      Changes.push_back(SetTFRewriteData("Suggests", OptionalStr.c_str()));
    }
 
-   for (map<string,string>::const_iterator I = OverItem->FieldOverride.begin(); 
+   for (map<string,string>::const_iterator I = OverItem->FieldOverride.begin();
         I != OverItem->FieldOverride.end(); ++I)
-      SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str());
+      Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str()));
 
-   SetTFRewriteData(Changes[End++], 0, 0);
+   Changes.push_back(SetTFRewriteData( 0, 0));
 
    // Rewrite and store the fields.
-   if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes) == false)
+   if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes.data()) == false)
       return false;
    fprintf(Output,"\n");
 
@@ -589,10 +598,7 @@ SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string c
    BufSize = 0;
    
    // Process the command line options
-   DoMD5 = _config->FindB("APT::FTPArchive::Sources::MD5",DoMD5);
-   DoSHA1 = _config->FindB("APT::FTPArchive::Sources::SHA1",DoSHA1);
-   DoSHA256 = _config->FindB("APT::FTPArchive::Sources::SHA256",DoSHA256);
-   DoSHA512 = _config->FindB("APT::FTPArchive::Sources::SHA512",DoSHA512);
+   ConfigToDoHashes(DoHashes, "APT::FTPArchive::Sources");
    NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
    DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false);
 
@@ -614,17 +620,25 @@ SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string c
 }
                                                                        /*}}}*/
 // SourcesWriter::DoPackage - Process a single package                 /*{{{*/
-// ---------------------------------------------------------------------
-/* */
+static std::ostream& addDscHash(std::ostream &out, unsigned int const DoHashes,
+      Hashes::SupportedHashes const DoIt, pkgTagSection &Tags, char const * const FieldName,
+      HashString const * const Hash, unsigned long long Size, std::string FileName)
+{
+   if ((DoHashes & DoIt) != DoIt || Tags.Exists(FieldName) == false || Hash == NULL)
+      return out;
+   out << "\n " << Hash->HashValue() << " " << Size << " " << FileName
+      << "\n " << Tags.FindS(FieldName);
+   return out;
+}
 bool SourcesWriter::DoPackage(string FileName)
 {
    // Pull all the data we need form the DB
    if (Db.GetFileInfo(FileName,
-                      false,  /* DoControl */
-                      false,  /* DoContents */
-                      false,  /* GenContentsOnly */
-                      true,   /* DoSource */
-                      DoMD5, DoSHA1, DoSHA256, DoSHA512, DoAlwaysStat) == false)
+           false, /* DoControl */
+           false, /* DoContents */
+           false, /* GenContentsOnly */
+           true, /* DoSource */
+           DoHashes, DoAlwaysStat) == false)
    {
       return false;
    }
@@ -704,29 +718,19 @@ bool SourcesWriter::DoPackage(string FileName)
         *SOverItem = *OverItem;
       }
    }
-   
+
    // Add the dsc to the files hash list
    string const strippedName = flNotDir(FileName);
    std::ostringstream ostreamFiles;
-   if (DoMD5 == true && Tags.Exists("Files"))
-      ostreamFiles << "\n " << Db.MD5Res.c_str() << " " << St.st_size << " "
-                  << strippedName << "\n " << Tags.FindS("Files");
+   addDscHash(ostreamFiles, DoHashes, Hashes::MD5SUM, Tags, "Files", Db.HashesList.find("MD5Sum"), St.st_size, strippedName);
    string const Files = ostreamFiles.str();
 
    std::ostringstream ostreamSha1;
-   if (DoSHA1 == true && Tags.Exists("Checksums-Sha1"))
-      ostreamSha1 << "\n " << string(Db.SHA1Res.c_str()) << " " << St.st_size << " "
-                  << strippedName << "\n " << Tags.FindS("Checksums-Sha1");
-
+   addDscHash(ostreamSha1, DoHashes, Hashes::SHA1SUM, Tags, "Checksums-Sha1", Db.HashesList.find("SHA1"), St.st_size, strippedName);
    std::ostringstream ostreamSha256;
-   if (DoSHA256 == true && Tags.Exists("Checksums-Sha256"))
-      ostreamSha256 << "\n " << string(Db.SHA256Res.c_str()) << " " << St.st_size << " "
-                  << strippedName << "\n " << Tags.FindS("Checksums-Sha256");
-
+   addDscHash(ostreamSha256, DoHashes, Hashes::SHA256SUM, Tags, "Checksums-Sha256", Db.HashesList.find("SHA256"), St.st_size, strippedName);
    std::ostringstream ostreamSha512;
-   if (DoSHA512 == true && Tags.Exists("Checksums-Sha512"))
-      ostreamSha512 << "\n " << string(Db.SHA512Res.c_str()) << " " << St.st_size << " "
-                  << strippedName << "\n " << Tags.FindS("Checksums-Sha512");
+   addDscHash(ostreamSha512, DoHashes, Hashes::SHA512SUM, Tags, "Checksums-Sha512", Db.HashesList.find("SHA512"), St.st_size, strippedName);
 
    // Strip the DirStrip prefix from the FileName and add the PathPrefix
    string NewFileName;
@@ -758,35 +762,54 @@ bool SourcesWriter::DoPackage(string FileName)
       string OriginalPath = Directory + ParseJnk;
 
       // Add missing hashes to source files
-      if ((DoSHA1 == true && !Tags.Exists("Checksums-Sha1")) ||
-          (DoSHA256 == true && !Tags.Exists("Checksums-Sha256")) ||
-          (DoSHA512 == true && !Tags.Exists("Checksums-Sha512")))
+      if (((DoHashes & Hashes::SHA1SUM) == Hashes::SHA1SUM && !Tags.Exists("Checksums-Sha1")) ||
+          ((DoHashes & Hashes::SHA256SUM) == Hashes::SHA256SUM && !Tags.Exists("Checksums-Sha256")) ||
+          ((DoHashes & Hashes::SHA512SUM) == Hashes::SHA512SUM && !Tags.Exists("Checksums-Sha512")))
       {
-         if (Db.GetFileInfo(OriginalPath, 
+         if (Db.GetFileInfo(OriginalPath,
                             false, /* DoControl */
                             false, /* DoContents */
                             false, /* GenContentsOnly */
                             false, /* DoSource */
-                            DoMD5, DoSHA1, DoSHA256, DoSHA512,
+                            DoHashes,
                             DoAlwaysStat) == false)
          {
             return _error->Error("Error getting file info");
          }
 
-         if (DoSHA1 == true && !Tags.Exists("Checksums-Sha1"))
-            ostreamSha1 << "\n " << string(Db.SHA1Res) << " "
-               << Db.GetFileSize() << " " << ParseJnk;
-
-         if (DoSHA256 == true && !Tags.Exists("Checksums-Sha256"))
-            ostreamSha256 << "\n " << string(Db.SHA256Res) << " "
-               << Db.GetFileSize() << " " << ParseJnk;
-
-         if (DoSHA512 == true && !Tags.Exists("Checksums-Sha512"))
-            ostreamSha512 << "\n " << string(Db.SHA512Res) << " "
-               << Db.GetFileSize() << " " << ParseJnk;
+         for (HashStringList::const_iterator hs = Db.HashesList.begin(); hs != Db.HashesList.end(); ++hs)
+        {
+           if (hs->HashType() == "MD5Sum" || hs->HashType() == "Checksum-FileSize")
+              continue;
+           char const * fieldname;
+           std::ostream * out;
+           if (hs->HashType() == "SHA1")
+           {
+              fieldname = "Checksums-Sha1";
+              out = &ostreamSha1;
+           }
+           else if (hs->HashType() == "SHA256")
+           {
+              fieldname = "Checksums-Sha256";
+              out = &ostreamSha256;
+           }
+           else if (hs->HashType() == "SHA512")
+           {
+              fieldname = "Checksums-Sha512";
+              out = &ostreamSha512;
+           }
+           else
+           {
+              _error->Warning("Ignoring unknown Checksumtype %s in SourcesWriter::DoPackages", hs->HashType().c_str());
+              continue;
+           }
+           if (Tags.Exists(fieldname) == true)
+              continue;
+           (*out) << "\n " << hs->HashValue() << " " << Db.GetFileSize() << " " << ParseJnk;
+        }
 
-         // write back the GetFileInfo() stats data 
-         Db.Finish();
+        // write back the GetFileInfo() stats data 
+        Db.Finish();
       }
 
       // Perform the delinking operation
@@ -812,22 +835,21 @@ bool SourcesWriter::DoPackage(string FileName)
 
    // This lists all the changes to the fields we are going to make.
    // (5 hardcoded + checksums + maintainer + end marker)
-   TFRewriteData Changes[5+2+1+SOverItem->FieldOverride.size()+1];
+   std::vector<TFRewriteData> Changes;
 
-   unsigned int End = 0;
-   SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package");
+   Changes.push_back(SetTFRewriteData("Source",Package.c_str(),"Package"));
    if (Files.empty() == false)
-      SetTFRewriteData(Changes[End++],"Files",Files.c_str());
+      Changes.push_back(SetTFRewriteData("Files",Files.c_str()));
    if (ChecksumsSha1.empty() == false)
-      SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str());
+      Changes.push_back(SetTFRewriteData("Checksums-Sha1",ChecksumsSha1.c_str()));
    if (ChecksumsSha256.empty() == false)
-      SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str());
+      Changes.push_back(SetTFRewriteData("Checksums-Sha256",ChecksumsSha256.c_str()));
    if (ChecksumsSha512.empty() == false)
-      SetTFRewriteData(Changes[End++],"Checksums-Sha512",ChecksumsSha512.c_str());
+      Changes.push_back(SetTFRewriteData("Checksums-Sha512",ChecksumsSha512.c_str()));
    if (Directory != "./")
-      SetTFRewriteData(Changes[End++],"Directory",Directory.c_str());
-   SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str());
-   SetTFRewriteData(Changes[End++],"Status",0);
+      Changes.push_back(SetTFRewriteData("Directory",Directory.c_str()));
+   Changes.push_back(SetTFRewriteData("Priority",BestPrio.c_str()));
+   Changes.push_back(SetTFRewriteData("Status",0));
 
    // Rewrite the maintainer field if necessary
    bool MaintFailed;
@@ -842,16 +864,16 @@ bool SourcesWriter::DoPackage(string FileName)
       }      
    }
    if (NewMaint.empty() == false)
-      SetTFRewriteData(Changes[End++], "Maintainer", NewMaint.c_str());
+      Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str()));
    
    for (map<string,string>::const_iterator I = SOverItem->FieldOverride.begin(); 
         I != SOverItem->FieldOverride.end(); ++I)
-      SetTFRewriteData(Changes[End++],I->first.c_str(),I->second.c_str());
+      Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str()));
 
-   SetTFRewriteData(Changes[End++], 0, 0);
+   Changes.push_back(SetTFRewriteData(0, 0));
       
    // Rewrite and store the fields.
-   if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes) == false)
+   if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes.data()) == false)
       return false;
    fprintf(Output,"\n");
 
@@ -878,15 +900,13 @@ ContentsWriter::ContentsWriter(string const &DB, string const &Arch) :
    determine what the package name is. */
 bool ContentsWriter::DoPackage(string FileName, string Package)
 {
-   if (!Db.GetFileInfo(FileName, 
-                       Package.empty(), /* DoControl */
-                       true,            /* DoContents */
-                       false,           /* GenContentsOnly */
-                       false,           /* DoSource */
-                       false,           /* DoMD5 */
-                       false,           /* DoSHA1 */
-                       false,           /* DoSHA256 */
-                       false))          /* DoSHA512 */
+   if (!Db.GetFileInfo(FileName,
+           Package.empty(), /* DoControl */
+           true, /* DoContents */
+           false, /* GenContentsOnly */
+           false, /* DoSource */
+           0, /* DoHashes */
+           false /* checkMtime */))
    {
       return false;
    }
@@ -1022,9 +1042,7 @@ ReleaseWriter::ReleaseWriter(string const &/*DB*/)
       fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str());
    }
 
-   DoMD5 = _config->FindB("APT::FTPArchive::Release::MD5",DoMD5);
-   DoSHA1 = _config->FindB("APT::FTPArchive::Release::SHA1",DoSHA1);
-   DoSHA256 = _config->FindB("APT::FTPArchive::Release::SHA256",DoSHA256);
+   ConfigToDoHashes(DoHashes, "APT::FTPArchive::Release");
 }
                                                                        /*}}}*/
 // ReleaseWriter::DoPackage - Process a single package                 /*{{{*/
@@ -1058,15 +1076,8 @@ bool ReleaseWriter::DoPackage(string FileName)
    CheckSums[NewFileName].size = fd.Size();
 
    Hashes hs;
-   hs.AddFD(fd, 0, DoMD5, DoSHA1, DoSHA256, DoSHA512);
-   if (DoMD5 == true)
-      CheckSums[NewFileName].MD5 = hs.MD5.Result();
-   if (DoSHA1 == true)
-      CheckSums[NewFileName].SHA1 = hs.SHA1.Result();
-   if (DoSHA256 == true)
-      CheckSums[NewFileName].SHA256 = hs.SHA256.Result();
-   if (DoSHA512 == true)
-      CheckSums[NewFileName].SHA512 = hs.SHA512.Result();
+   hs.AddFD(fd, 0, DoHashes);
+   CheckSums[NewFileName].Hashes = hs.GetHashStringList();
    fd.Close();
 
    return true;
@@ -1075,54 +1086,29 @@ bool ReleaseWriter::DoPackage(string FileName)
                                                                        /*}}}*/
 // ReleaseWriter::Finish - Output the checksums                                /*{{{*/
 // ---------------------------------------------------------------------
-void ReleaseWriter::Finish()
+static void printChecksumTypeRecord(FILE * const Output, char const * const Type, map<string, ReleaseWriter::CheckSum> const &CheckSums)
 {
-   if (DoMD5 == true)
-   {
-      fprintf(Output, "MD5Sum:\n");
-      for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
-         I != CheckSums.end(); ++I)
-      {
-        fprintf(Output, " %s %16llu %s\n",
-                (*I).second.MD5.c_str(),
-                (*I).second.size,
-                (*I).first.c_str());
-      }
-   }
-   if (DoSHA1 == true)
-   {
-      fprintf(Output, "SHA1:\n");
-      for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
-         I != CheckSums.end(); ++I)
-      {
-        fprintf(Output, " %s %16llu %s\n",
-                (*I).second.SHA1.c_str(),
-                (*I).second.size,
-                (*I).first.c_str());
-      }
-   }
-   if (DoSHA256 == true)
-   {
-      fprintf(Output, "SHA256:\n");
-      for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
+      fprintf(Output, "%s:\n", Type);
+      for(map<string,ReleaseWriter::CheckSum>::const_iterator I = CheckSums.begin();
          I != CheckSums.end(); ++I)
       {
+        HashString const * const hs = I->second.Hashes.find(Type);
+        if (hs == NULL)
+           continue;
         fprintf(Output, " %s %16llu %s\n",
-                (*I).second.SHA256.c_str(),
+                hs->HashValue().c_str(),
                 (*I).second.size,
                 (*I).first.c_str());
       }
-   }
-
-   fprintf(Output, "SHA512:\n");
-   for(map<string,struct CheckSum>::const_iterator I = CheckSums.begin();
-       I != CheckSums.end();
-       ++I)
-   {
-      fprintf(Output, " %s %16llu %s\n",
-              (*I).second.SHA512.c_str(),
-              (*I).second.size,
-              (*I).first.c_str());
-   }
-
+}
+void ReleaseWriter::Finish()
+{
+   if ((DoHashes & Hashes::MD5SUM) == Hashes::MD5SUM)
+      printChecksumTypeRecord(Output, "MD5Sum", CheckSums);
+   if ((DoHashes & Hashes::SHA1SUM) == Hashes::SHA1SUM)
+      printChecksumTypeRecord(Output, "SHA1", CheckSums);
+   if ((DoHashes & Hashes::SHA256SUM) == Hashes::SHA256SUM)
+      printChecksumTypeRecord(Output, "SHA256", CheckSums);
+   if ((DoHashes & Hashes::SHA512SUM) == Hashes::SHA512SUM)
+      printChecksumTypeRecord(Output, "SHA512", CheckSums);
 }
index d8a10e0bbc578376139842bb63cdd48579bbc5cc..226996475242ece27fabd1b82d594f1223ded0a9 100644 (file)
@@ -13,6 +13,8 @@
 #ifndef WRITER_H
 #define WRITER_H
 
+#include <apt-pkg/hashes.h>
+
 #include <string>
 #include <stdio.h>
 #include <iostream>
@@ -61,10 +63,7 @@ class FTWScanner
    }
    
    public:
-   bool DoMD5;
-   bool DoSHA1;
-   bool DoSHA256;
-   bool DoSHA512;
+   unsigned int DoHashes;
 
    unsigned long DeLinkLimit;
    string InternalPrefix;
@@ -197,17 +196,14 @@ public:
    string PathPrefix;
    string DirStrip;
 
-protected:
    struct CheckSum
    {
-      string MD5;
-      string SHA1;
-      string SHA256;
-      string SHA512;
+      HashStringList Hashes;
       // Limited by FileFd::Size()
       unsigned long long size;
       ~CheckSum() {};
    };
+protected:
    map<string,struct CheckSum> CheckSums;
 };
 
index 40f8f85ecda2bb9c1ad9c4db6ffaedfb24f9801b..a23c0316c4717568950cacf3aebee238c4fdde30 100644 (file)
@@ -67,6 +67,14 @@ bool CopyMethod::Fetch(FetchItem *Itm)
    Res.LastModified = Buf.st_mtime;
    Res.IMSHit = false;      
    URIStart(Res);
+
+   // when the files are identical, just compute the hashes
+   if(File == Itm->DestFile)
+   {
+      CalculateHashes(Res);
+      URIDone(Res);
+      return true;
+   }
    
    // just calc the hashes if the source and destination are identical
    if (File == Itm->DestFile)
@@ -116,5 +124,6 @@ int main()
    setlocale(LC_ALL, "");
 
    CopyMethod Mth;
+
    return Mth.Run();
 }
index 66787a7bea661808f147804ea020426cc2690b5a..0504e58724f253025f1191282d2e0803af59b1f9 100644 (file)
@@ -75,9 +75,10 @@ time_t FtpMethod::FailTime = 0;
 // FTPConn::FTPConn - Constructor                                      /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1), 
+FTPConn::FTPConn(URI Srv) : Len(0), ServerFd(-1), DataFd(-1),
                             DataListenFd(-1), ServerName(Srv),
-                           ForceExtended(false), TryPassive(true)
+                           ForceExtended(false), TryPassive(true),
+                           PeerAddrLen(0), ServerAddrLen(0)
 {
    Debug = _config->FindB("Debug::Acquire::Ftp",false);
    PasvAddr = 0;
@@ -848,7 +849,8 @@ bool FTPConn::Finalize()
 /* This opens a data connection, sends REST and RETR and then
    transfers the file over. */
 bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
-                 Hashes &Hash,bool &Missing)
+                 Hashes &Hash,bool &Missing, unsigned long long MaximumSize,
+                  pkgAcqMethod *Owner)
 {
    Missing = false;
    if (CreateDataFd() == false)
@@ -921,7 +923,14 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long long Resume,
       {
         Close();
         return false;
-      }      
+      }
+
+      if (MaximumSize > 0 && To.Tell() > MaximumSize)
+      {
+         Owner->SetFailReason("MaximumSizeExceeded");
+         return _error->Error("Writing more data than expected (%llu > %llu)",
+                              To.Tell(), MaximumSize);
+      }
    }
 
    // All done
@@ -979,6 +988,10 @@ bool FtpMethod::Configuration(string Message)
       return false;
    
    TimeOut = _config->FindI("Acquire::Ftp::Timeout",TimeOut);
+
+   // no more active ftp, sorry
+   DropPrivsOrDie();
+
    return true;
 }
                                                                        /*}}}*/
@@ -1062,7 +1075,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
       FailFd = Fd.Fd();
       
       bool Missing;
-      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing) == false)
+      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Itm->MaximumSize,this) == false)
       {
         Fd.Close();
 
@@ -1131,6 +1144,6 @@ int main(int, const char *argv[])
    }
    
    FtpMethod Mth;
-   
+
    return Mth.Run();
 }
index dd92f0086e936043af045211f923ae0eccad9ceb..2efd28ec6e28bb0acbc0f5d46dec1fb334f40dd4 100644 (file)
@@ -62,7 +62,8 @@ class FTPConn
    bool Size(const char *Path,unsigned long long &Size);
    bool ModTime(const char *Path, time_t &Time);
    bool Get(const char *Path,FileFd &To,unsigned long long Resume,
-           Hashes &MD5,bool &Missing);
+           Hashes &MD5,bool &Missing, unsigned long long MaximumSize,
+            pkgAcqMethod *Owner);
    
    FTPConn(URI Srv);
    ~FTPConn();
index ae521a2edbd6d831e6a1ecf52d20f080f306133a..41f138be64d12b663896aca6129aad3b68d2498c 100644 (file)
@@ -5,6 +5,7 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/gpgv.h>
 #include <apt-pkg/strutl.h>
+#include <apt-pkg/fileutl.h>
 
 #include <ctype.h>
 #include <errno.h>
@@ -43,12 +44,22 @@ class GPGVMethod : public pkgAcqMethod
    
    protected:
    virtual bool Fetch(FetchItem *Itm);
-   
+   virtual bool Configuration(string Message);
    public:
    
    GPGVMethod() : pkgAcqMethod("1.0",SingleInstance | SendConfig) {};
 };
 
+bool GPGVMethod::Configuration(string Message)
+{
+   if (pkgAcqMethod::Configuration(Message) == false)
+      return false;
+
+   DropPrivsOrDie();
+
+   return true;
+}
+
 string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
                                         vector<string> &GoodSigners,
                                         vector<string> &BadSigners,
@@ -74,34 +85,13 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
 
    FILE *pipein = fdopen(fd[0], "r");
 
-   // Loop over the output of gpgv, and check the signatures.
-   size_t buffersize = 64;
-   char *buffer = (char *) malloc(buffersize);
-   size_t bufferoff = 0;
+   // Loop over the output of apt-key (which really is gnupg), and check the signatures.
+   size_t buffersize = 0;
+   char *buffer = NULL;
    while (1)
    {
-      int c;
-
-      // Read a line.  Sigh.
-      while ((c = getc(pipein)) != EOF && c != '\n')
-      {
-        if (bufferoff == buffersize)
-        {
-           char* newBuffer = (char *) realloc(buffer, buffersize *= 2);
-           if (newBuffer == NULL)
-           {
-              free(buffer);
-              return "Couldn't allocate a buffer big enough for reading";
-           }
-           buffer = newBuffer;
-        }
-         *(buffer+bufferoff) = c;
-         bufferoff++;
-      }
-      if (bufferoff == 0 && c == EOF)
-         break;
-      *(buffer+bufferoff) = '\0';
-      bufferoff = 0;
+      if (getline(&buffer, &buffersize, pipein) == -1)
+        break;
       if (Debug == true)
          std::clog << "Read: " << buffer << std::endl;
 
@@ -115,7 +105,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
             std::clog << "Got BADSIG! " << std::endl;
          BadSigners.push_back(string(buffer+sizeof(GNUPGPREFIX)));
       }
-      
+
       if (strncmp(buffer, GNUPGNOPUBKEY, sizeof(GNUPGNOPUBKEY)-1) == 0)
       {
          if (Debug == true)
@@ -159,7 +149,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
    waitpid(pid, &status, 0);
    if (Debug == true)
    {
-      std::clog << "gpgv exited\n";
+      ioprintf(std::clog, "gpgv exited with status %i\n", WEXITSTATUS(status));
    }
    
    if (WEXITSTATUS(status) == 0)
@@ -171,7 +161,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
    else if (WEXITSTATUS(status) == 1)
       return _("At least one invalid signature was encountered.");
    else if (WEXITSTATUS(status) == 111)
-      return _("Could not execute 'gpgv' to verify signature (is gpgv installed?)");
+      return _("Could not execute 'apt-key' to verify signature (is gnupg installed?)");
    else if (WEXITSTATUS(status) == 112)
    {
       // acquire system checks for "NODATA" to generate GPG errors (the others are only warnings)
@@ -181,7 +171,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile,
       return errmsg;
    }
    else
-      return _("Unknown error executing gpgv");
+      return _("Unknown error executing apt-key");
 }
 
 bool GPGVMethod::Fetch(FetchItem *Itm)
@@ -199,7 +189,7 @@ bool GPGVMethod::Fetch(FetchItem *Itm)
    Res.Filename = Itm->DestFile;
    URIStart(Res);
 
-   // Run gpgv on file, extract contents and get the key ID of the signer
+   // Run apt-key on file, extract contents and get the key ID of the signer
    string msg = VerifyGetSigners(Path.c_str(), Itm->DestFile.c_str(),
                                  GoodSigners, BadSigners, WorthlessSigners,
                                  NoPubKeySigners);
@@ -251,7 +241,7 @@ bool GPGVMethod::Fetch(FetchItem *Itm)
 
    if (_config->FindB("Debug::Acquire::gpgv", false))
    {
-      std::clog << "gpgv succeeded\n";
+      std::clog << "apt-key succeeded\n";
    }
 
    return true;
@@ -261,7 +251,7 @@ bool GPGVMethod::Fetch(FetchItem *Itm)
 int main()
 {
    setlocale(LC_ALL, "");
-   
+
    GPGVMethod Mth;
 
    return Mth.Run();
index df3f8828f805e30ba2f4bf87e9659391deb874cc..387c05f2ec99304eb0f259bb2b9b28d35a4fa654 100644 (file)
@@ -33,12 +33,22 @@ const char *Prog;
 class GzipMethod : public pkgAcqMethod
 {
    virtual bool Fetch(FetchItem *Itm);
+   virtual bool Configuration(std::string Message);
    
    public:
    
    GzipMethod() : pkgAcqMethod("1.1",SingleInstance | SendConfig) {};
 };
 
+bool GzipMethod::Configuration(std::string Message)
+{
+   if (pkgAcqMethod::Configuration(Message) == false)
+      return false;
+
+   DropPrivsOrDie();
+
+   return true;
+}
 
 // GzipMethod::Fetch - Decompress the passed URI                       /*{{{*/
 // ---------------------------------------------------------------------
@@ -139,5 +149,6 @@ int main(int, char *argv[])
    ++Prog;
 
    GzipMethod Mth;
+
    return Mth.Run();
 }
index 1b996db9816bab01f688a645a0f855b90a0c138f..ad1347d36fc5544d7db2e0b1318ee5642805c1e0 100644 (file)
@@ -64,7 +64,8 @@ const unsigned int CircleBuf::BW_HZ=10;
 // CircleBuf::CircleBuf - Circular input buffer                                /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-CircleBuf::CircleBuf(unsigned long long Size) : Size(Size), Hash(0)
+CircleBuf::CircleBuf(unsigned long long Size) 
+   : Size(Size), Hash(0), TotalWriten(0)
 {
    Buf = new unsigned char[Size];
    Reset();
@@ -80,6 +81,7 @@ void CircleBuf::Reset()
    InP = 0;
    OutP = 0;
    StrPos = 0;
+   TotalWriten = 0;
    MaxGet = (unsigned long long)-1;
    OutQueue = string();
    if (Hash != 0)
@@ -217,6 +219,8 @@ bool CircleBuf::Write(int Fd)
         
         return false;
       }
+
+      TotalWriten += Res;
       
       if (Hash != 0)
         Hash->Add(Buf + (OutP%Size),Res);
@@ -653,6 +657,13 @@ bool HttpServerState::Go(bool ToFile, FileFd * const File)
         return _error->Errno("write",_("Error writing to output file"));
    }
 
+   if (MaximumSize > 0 && File && File->Tell() > MaximumSize)
+   {
+      Owner->SetFailReason("MaximumSizeExceeded");
+      return _error->Error("Writing more data than expected (%llu > %llu)",
+                           File->Tell(), MaximumSize);
+   }
+
    // Handle commands from APT
    if (FD_ISSET(STDIN_FILENO,&rfds))
    {
@@ -761,6 +772,8 @@ bool HttpMethod::Configuration(string Message)
    if (ServerMethod::Configuration(Message) == false)
       return false;
 
+   DropPrivsOrDie();
+
    AllowRedirect = _config->FindB("Acquire::http::AllowRedirect",true);
    PipelineDepth = _config->FindI("Acquire::http::Pipeline-Depth",
                                  PipelineDepth);
index 1df9fa07d68c60849d375cb3a7cc952b6c144625..40a88a7be03b3a8e254b981ca6711f833c8173e7 100644 (file)
@@ -63,6 +63,8 @@ class CircleBuf
 
    public:
    Hashes *Hash;
+   // total amount of data that got written so far
+   unsigned long long TotalWriten;
 
    // Read data in
    bool Read(int Fd);
@@ -81,8 +83,8 @@ class CircleBuf
    bool ReadSpace() const {return Size - (InP - OutP) > 0;};
    bool WriteSpace() const {return InP - OutP > 0;};
 
-   // Dump everything
    void Reset();
+   // Dump everything
    void Stats();
 
    CircleBuf(unsigned long long Size);
index 3b346a514a234397322903a2d3d0a679901ecdf6..cd52c42e83407bd22dc217720c0ca66970cbe06a 100644 (file)
@@ -1,5 +1,6 @@
 #include <config.h>
-
+#include <apt-pkg/fileutl.h>
+#include <apt-pkg/error.h>
 #include <signal.h>
 
 #include "http.h"
@@ -13,5 +14,6 @@ int main()
    signal(SIGPIPE, SIG_IGN);
 
    HttpMethod Mth;
+
    return Mth.Loop();
 }
index 3a5981b5824511a4cc9d9d74eb2f2bc3fbf475cd..37a8ff5fd46a54067146279434a8eeabe936728c 100644 (file)
                                                                        /*}}}*/
 using namespace std;
 
+bool HttpsMethod::Configuration(std::string Message)
+{
+   if (pkgAcqMethod::Configuration(Message) == false)
+      return false;
+
+   DropPrivsOrDie();
+
+   return true;
+}
+
 size_t
 HttpsMethod::parse_header(void *buffer, size_t size, size_t nmemb, void *userp)
 {
@@ -85,21 +95,33 @@ HttpsMethod::write_data(void *buffer, size_t size, size_t nmemb, void *userp)
    if (me->Server->JunkSize != 0)
       return buffer_size;
 
-   if (me->ReceivedData == false)
+   if (me->Server->ReceivedData == false)
    {
       me->URIStart(me->Res);
-      me->ReceivedData = true;
+      me->Server->ReceivedData = true;
    }
 
    if(me->File->Write(buffer, buffer_size) != true)
-      return false;
+      return 0;
+
+   if(me->Queue->MaximumSize > 0)
+   {
+      unsigned long long const TotalWritten = me->File->Tell();
+      if (TotalWritten > me->Queue->MaximumSize)
+      {
+        me->SetFailReason("MaximumSizeExceeded");
+        _error->Error("Writing more data than expected (%llu > %llu)",
+              TotalWritten, me->Queue->MaximumSize);
+        return 0;
+      }
+   }
 
    return buffer_size;
 }
 
 int
 HttpsMethod::progress_callback(void *clientp, double dltotal, double /*dlnow*/,
-                             double /*ultotal*/, double /*ulnow*/)
+                              double /*ultotal*/, double /*ulnow*/)
 {
    HttpsMethod *me = (HttpsMethod *)clientp;
    if(dltotal > 0 && me->Res.Size == 0) {
@@ -112,6 +134,7 @@ HttpsMethod::progress_callback(void *clientp, double dltotal, double /*dlnow*/,
 HttpsServerState::HttpsServerState(URI Srv,HttpsMethod * /*Owner*/) : ServerState(Srv, NULL)
 {
    TimeOut = _config->FindI("Acquire::https::Timeout",TimeOut);
+   ReceivedData = false;
    Reset();
 }
                                                                        /*}}}*/
@@ -179,11 +202,10 @@ void HttpsMethod::SetupProxy()                                    /*{{{*/
 bool HttpsMethod::Fetch(FetchItem *Itm)
 {
    struct stat SBuf;
-   struct curl_slist *headers=NULL;  
+   struct curl_slist *headers=NULL;
    char curl_errorstr[CURL_ERROR_SIZE];
    URI Uri = Itm->Uri;
    string remotehost = Uri.Host;
-   ReceivedData = false;
 
    // TODO:
    //       - http::Pipeline-Depth
index 411b71440119146e78166f94566437b510cb739f..6917a6ff68981d311168ec85ae45ed1f9935b2bb 100644 (file)
@@ -50,6 +50,8 @@ class HttpsServerState : public ServerState
 
    HttpsServerState(URI Srv, HttpsMethod *Owner);
    virtual ~HttpsServerState() {Close();};
+
+   bool ReceivedData;
 };
 
 class HttpsMethod : public pkgAcqMethod
@@ -58,22 +60,22 @@ class HttpsMethod : public pkgAcqMethod
    static const int DL_MIN_SPEED = 10;
 
    virtual bool Fetch(FetchItem *);
+   virtual bool Configuration(std::string Message);
+
    static size_t parse_header(void *buffer, size_t size, size_t nmemb, void *userp);
    static size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);
-   static int progress_callback(void *clientp, double dltotal, double dlnow, 
-                               double ultotal, double ulnow);
+   static int progress_callback(void *clientp, double dltotal, double dlnow,
+                                double ultotal, double ulnow);
    void SetupProxy();
    CURL *curl;
    FetchResult Res;
    HttpsServerState *Server;
-   bool ReceivedData;
 
    public:
    FileFd *File;
-      
-   HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig), File(NULL)
+
+   HttpsMethod() : pkgAcqMethod("1.2",Pipeline | SendConfig), Server(NULL), File(NULL)
    {
-      File = 0;
       curl = curl_easy_init();
    };
 
index cabb3c456ae923b66ba3bb87e3afcf4e378a3865..774b58a4092bb9eba75a1da35089aa9f6e03d496 100644 (file)
@@ -150,11 +150,11 @@ class FileChanges {
    std::list<struct Change>::iterator where;
    size_t pos; // line number is as far left of iterator as possible
 
-   bool pos_is_okay(void)
+   bool pos_is_okay(void) const
    {
 #ifdef POSDEBUG
       size_t cpos = 0;
-      std::list<struct Change>::iterator x;
+      std::list<struct Change>::const_iterator x;
       for (x = changes.begin(); x != where; ++x) {
         assert(x != changes.end());
         cpos += x->offset + x->add_cnt;
index e321e0230362a363702214d383edde2bbbf59301..c17f27f7375a18d5fbec90b7c320b7435be78095 100644 (file)
@@ -328,10 +328,10 @@ ServerMethod::DealWithHeaders(FetchResult &Res)
       failure */
    if (Server->Result < 200 || Server->Result >= 300)
    {
-      char err[255];
-      snprintf(err,sizeof(err)-1,"HttpError%i",Server->Result);
+      std::string err;
+      strprintf(err, "HttpError%u", Server->Result);
       SetFailReason(err);
-      _error->Error("%u %s",Server->Result,Server->Code);
+      _error->Error("%u %s", Server->Result, Server->Code);
       if (Server->HaveContent == true)
         return ERROR_WITH_CONTENT_PAGE;
       return ERROR_UNRECOVERABLE;
@@ -397,9 +397,16 @@ bool ServerMethod::Fetch(FetchItem *)
    for (FetchItem *I = Queue; I != 0 && Depth < (signed)PipelineDepth; 
        I = I->Next, Depth++)
    {
-      // If pipelining is disabled, we only queue 1 request
-      if (Server->Pipeline == false && Depth >= 0)
-        break;
+      if (Depth >= 0)
+      {
+        // If pipelining is disabled, we only queue 1 request
+        if (Server->Pipeline == false)
+           break;
+        // if we have no hashes, do at most one such request
+        // as we can't fixup pipeling misbehaviors otherwise
+        else if (I->ExpectedHashes.usable() == false)
+           break;
+      }
       
       // Make sure we stick with the same server
       if (Server->Comp(I->Uri) == false)
@@ -529,6 +536,13 @@ int ServerMethod::Loop()
 
            // Run the data
            bool Result = true;
+
+            // ensure we don't fetch too much
+            // we could do "Server->MaximumSize = Queue->MaximumSize" here
+            // but that would break the clever pipeline messup detection
+            // so instead we use the size of the biggest item in the queue
+            Server->MaximumSize = FindMaximumObjectSizeInQueue();
+
             if (Server->HaveContent)
               Result = Server->RunData(File);
 
@@ -551,7 +565,38 @@ int ServerMethod::Loop()
            // Send status to APT
            if (Result == true)
            {
-              Res.TakeHashes(*Server->GetHashes());
+              Hashes * const resultHashes = Server->GetHashes();
+              HashStringList const hashList = resultHashes->GetHashStringList();
+              if (PipelineDepth != 0 && Queue->ExpectedHashes.usable() == true && Queue->ExpectedHashes != hashList)
+              {
+                 // we did not get the expected hash… mhhh:
+                 // could it be that server/proxy messed up pipelining?
+                 FetchItem * BeforeI = Queue;
+                 for (FetchItem *I = Queue->Next; I != 0 && I != QueueBack; I = I->Next)
+                 {
+                    if (I->ExpectedHashes.usable() == true && I->ExpectedHashes == hashList)
+                    {
+                       // yes, he did! Disable pipelining and rewrite queue
+                       if (Server->Pipeline == true)
+                       {
+                          // FIXME: fake a warning message as we have no proper way of communicating here
+                          std::string out;
+                          strprintf(out, _("Automatically disabled %s due to incorrect response from server/proxy. (man 5 apt.conf)"), "Acquire::http::PipelineDepth");
+                          std::cerr << "W: " << out << std::endl;
+                          Server->Pipeline = false;
+                          // we keep the PipelineDepth value so that the rest of the queue can be fixed up as well
+                       }
+                       Rename(Res.Filename, I->DestFile);
+                       Res.Filename = I->DestFile;
+                       BeforeI->Next = I->Next;
+                       I->Next = Queue;
+                       Queue = I;
+                       break;
+                    }
+                    BeforeI = I;
+                 }
+              }
+              Res.TakeHashes(*resultHashes);
               URIDone(Res);
            }
            else
@@ -571,7 +616,10 @@ int ServerMethod::Loop()
                  QueueBack = Queue;
               }
               else
+               {
+                  Server->Close();
                  Fail(true);
+               }
            }
            break;
         }
@@ -664,5 +712,15 @@ int ServerMethod::Loop()
    }
    
    return 0;
+}
+                                                                       /*}}}*/
+                                                                       /*{{{*/
+unsigned long long
+ServerMethod::FindMaximumObjectSizeInQueue() const 
+{
+   unsigned long long MaxSizeInQueue = 0;
+   for (FetchItem *I = Queue; I != 0 && I != QueueBack; I = I->Next)
+      MaxSizeInQueue = std::max(MaxSizeInQueue, I->MaximumSize);
+   return MaxSizeInQueue;
 }
                                                                        /*}}}*/
index 1b81e3549b5d05370700f1985aa532d2e3fff2aa..b974ec89a1b2f6604468e8f2cecd91794024fb83 100644 (file)
@@ -50,6 +50,8 @@ struct ServerState
    URI Proxy;
    unsigned long TimeOut;
 
+   unsigned long long MaximumSize;
+
    protected:
    ServerMethod *Owner;
 
@@ -74,7 +76,7 @@ struct ServerState
    bool Comp(URI Other) const {return Other.Host == ServerName.Host && Other.Port == ServerName.Port;};
    virtual void Reset() {Major = 0; Minor = 0; Result = 0; Code[0] = '\0'; Size = 0; JunkSize = 0;
                 StartPos = 0; Encoding = Closes; time(&Date); HaveContent = false;
-                State = Header; Persistent = false; Pipeline = true;};
+                State = Header; Persistent = false; Pipeline = true; MaximumSize = 0;};
    virtual bool WriteResponse(std::string const &Data) = 0;
 
    /** \brief Transfer the data from the socket */
@@ -105,6 +107,10 @@ class ServerMethod : public pkgAcqMethod
    unsigned long PipelineDepth;
    bool AllowRedirect;
 
+   // Find the biggest item in the fetch queue for the checking of the maximum
+   // size
+   unsigned long long FindMaximumObjectSizeInQueue() const APT_PURE;
+
    public:
    bool Debug;
 
@@ -141,7 +147,7 @@ class ServerMethod : public pkgAcqMethod
    virtual ServerState * CreateServerState(URI uri) = 0;
    virtual void RotateDNS() = 0;
 
-   ServerMethod(const char *Ver,unsigned long Flags = 0) : pkgAcqMethod(Ver, Flags), Server(NULL), File(NULL), PipelineDepth(0), AllowRedirect(false), Debug(false) {};
+   ServerMethod(const char *Ver,unsigned long Flags = 0) : pkgAcqMethod(Ver, Flags), Server(NULL), File(NULL), PipelineDepth(10), AllowRedirect(false), Debug(false) {};
    virtual ~ServerMethod() {};
 };
 
diff --git a/po/ChangeLog b/po/ChangeLog
deleted file mode 100644 (file)
index 373ef4c..0000000
+++ /dev/null
@@ -1,1077 +0,0 @@
-2009-09-26   Christian Perrier  <bubulle@debian.org>
-
-       * LINGUAS: re-disabled Hebrew translation on translator's request.
-
-2009-06-05  Jordi Mallach  <jordi@debian.org>
-
-       * ca.po: Updated to 539t
-
-2009-06-04  Milo Casagrande  <milo@ubuntu.com>
-
-       * it.po: Updated to 539t
-
-2009-06-01  Deng Xiyue  <manphiz-guest@users.alioth.debian.org>
-
-       * zh_CN.po: Updated to 539t
-
-2009-05-21  Marcos  <marcos.alvarez.costales@gmail.com>
-
-       * ast.po: Updated to 539t
-
-2009-04-28  Ivan Masár  <helix84@centrum.sk>
-
-       * sk.po: Updated to 539t
-
-2009-04-23  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 545 strings.
-         Formerly complete PO files are now 539t1f6u
-       * fr.po: updated to 545t.
-
-2009-03-19  Ivan Masár  <helix84@centrum.sk>
-
-       * sk.po: Updated to 539t
-
-2009-03-04  Daniel Nylander  <po@danielnylander.se>
-
-       * sv.po: Updated to 539t
-
-2009-02-23  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 539 strings.
-         Formerly complete PO files are now 538t1u
-       * fr.po: updated to 539t.
-
-2009-02-01  Hans Fredrik Nordhaug  <hans@nordhaug.priv.no>
-
-       * nb.po: updated to 539t.
-
-2009-01-27  Damyan Ivanov  <dmn@debian.org>
-
-       * bg.po: updated to 539t.
-
-2008-12-11  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: fix spelling error to "défectueux"
-
-2009-01-04  Tetralet  <tetralet@gmail.com>
-
-       * zh_TW.po: Added as 538t1u.
-
-2008-12-22  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: updated to 539t.
-
-2008-12-22  Jordi Mallach  <jordi@debian.org>
-
-       * ca.po: updated to 539t.
-
-2008-12-19  Marcelino Villarino  <mvillarino@gmail.com>
-
-       * gl.po: updated to 539t.
-
-2008-12-12  Tapio Lehtonen  <tale@debian.org>
-
-       * fi.po: updated to 539t.
-
-2008-12-06  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: dropped awful use of first person
-
-2008-11-23  Artem Bondarenko  <artem.brz@gmail.com>
-
-       * uk.po: updated to 477t55f7u
-
-2008-11-23  Sampada Nakhare  <sampadanakhare@gmail.com>
-
-       * mr.po: updated to 539t
-
-2008-11-21  Yuri Kozlov  <kozlov.y@gmail.com>
-
-       * ru.po: Update to 539t
-
-2008-11-18  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: updated to 539t.
-
-2008-11-17  Felipe Augusto van de Wiel (faw)  <faw@debian.org>
-
-       * pt_BR.po: updated to 539t.
-
-2008-11-17  Hans Fredrik Nordhaug  <hans@nordhaug.priv.no>
-
-       * nb.po: updated to 539t.
-
-2008-11-17  Miroslav Kure  <kurem@upcase.inf.upol.cz>
-
-       * cs.po: updated to 539t.
-
-2008-11-17  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: Updated to 539t
-
-2008-11-16  Javier Fernandez-Sanguino  <jfs@debian.org>
-
-       * es.po: updated to 539t
-
-2008-11-15  Deng Xiyue  <manphiz-guest@users.alioth.debian.org>
-
-       * zh_CN.po: updated to 539t.
-
-2008-11-15  Eddy Petrișor  <eddy.petrisor@gmail.com>
-
-       * ro.po: updated to 539t.
-
-2008-11-15  Javier Fernandez-Sanguino  <jfs@debian.org>
-
-       * es.po: updated to 536t3f2u
-
-2008-11-14  Holger Wansing  <linux@wansing-online.de>
-
-       * de.po: Updated to 539t
-
-2008-11-14  Wiktor Wandachowicz  <siryes@gmail.com>
-
-       * pl.po: Updated to 539t
-
-2008-11-14  Neil Williams  <linux@codehelp.co.uk>
-
-       * en_GB.po: Updated to 539t
-
-2008-11-14  Samuele Giovanni Tonon  <samu@debian.org>
-
-       * it.po: Updated to 539t
-
-2008-11-14  Jordi Mallach  <jordi@debian.org>
-
-       * ca.po: Updated to 539t
-
-2008-11-14  Changwoo Ryu  <cwryu@debian.org>
-
-       * ko.po: Updated to 539t
-
-2008-11-14  Kenshi Muto  <kmuto@debian.org>
-
-       * ja.po: Updated to 539t
-
-2008-11-14  Daniel Nylander  <po@danielnylander.se>
-
-       * sv.po: Updated to 539t
-
-2008-11-14  Ivan Masár  <helix84@centrum.sk>
-
-       * sk.po: Updated to 539t
-
-2008-11-13  Damyan Ivanov  <dmn@debian.org>
-
-       * bg.po: Updated to 538t1f
-
-2008-11-13  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 538 strings.
-         Formerly complete PO files are now 538t1f
-       * French translation re-completed
-
-2008-11-09  Theppitak Karoonboonyanan  <thep@linux.thai.net>
-
-       * th.po: updated to 540t.
-
-2008-11-06  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 540 strings.
-         Formerly complete PO files are now 538t1f1u
-
-2008-09-19  Jordi Mallach  <jordi@debian.org>
-
-       * ca.po: Update to 538t
-
-2008-09-16  Wiktor Wandachowicz  <siryes@gmail.com>
-
-       * pl.po: Update to 538t
-
-2008-09-16  Yuri Kozlov  <kozlov.y@gmail.com>
-
-       * ru.po: Update to 538t
-
-2008-09-12  Emmanuel Galatoulas  <galaxico@quad-nrg.net>
-
-       * el.po: Update to 538t
-
-2008-09-10  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: Updated to 538t
-
-2008-09-05  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: updated to 538t.
-
-2008-09-01  Hans Fredrik Nordhaug  <hans@nordhaug.priv.no>
-
-       * nb.po: updated to 538t.
-
-2008-08-31  Miroslav Kure  <kurem@upcase.inf.upol.cz>
-
-       * cs.po: updated to 538t.
-
-2008-08-28  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: updated to 538t.
-
-2008-08-26  Felipe Augusto van de Wiel (faw)  <faw@debian.org>
-
-       * pt_BR.po: updated to 538t.
-
-2008-08-18  Deng Xiyue  <manphiz-guest@users.alioth.debian.org>
-
-       * zh_CN.po: updated to 538t.
-
-2008-08-07  Serafeim Zanikolas  <serzan@hellug.gr>
-
-       * el.po: updated to 534t3f1u.
-
-2008-08-02   Gintautas Miliauskas  <gintas@akl.lt>
-
-       * lt.po: updated to 300t4f234u.
-
-2008-08-01  Kenshi Muto  <kmuto@debian.org>
-
-       * ja.po: updated to 538t.
-
-2008-07-28  Eddy Petrisor  <eddy.petrisor@gmail.com>
-
-       * ro.po: updated to 538t.
-
-2008-07-28  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: updated to 538t.
-
-2008-07-27  Ivan Masár  <helix84@centrum.sk>
-
-       * sk.po: Updated to 538t
-
-2008-07-26  Damyan Ivanov  <dmn@debian.org>
-
-       * bg.po: Updated to 538t
-
-2008-07-26  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Updated to 538t
-
-2008-07-25  Michael Vogt  <mvo@debian.org>
-
-       * Update all PO files and apt-all.pot. 538 strings.
-         Formerly complete PO files are now 536t1f1u
-
-2008-07-21  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: Updated to 536t
-
-2008-07-19  Changwoo Ryu  <cwryu@debian.org>
-
-       * ko.po: Updated to 536t
-
-2008-07-12  Holger Wansing  <linux@wansing-online.de>
-
-       * de.po: corrected.
-
-2008-06-29  Asho Yeh  <asho@debian.org.tw>
-
-       * zh_TW.po: Updated to 536t
-
-2008-06-27  Eddy Petrisor  <eddy.petrisor@gmail.com>
-
-       * ro.po: updated to 536t.
-
-2008-05-14  Hans Fr. Nordhaug  <hans@nordhaug.priv.no>
-
-       * nb.po: updated to 536t.
-
-2008-05-11  SZERVÁC Attila  <sas@321.hu>
-
-       * hu.po: updated to 536t.
-
-2008-05-11  Felipe Augusto van de Wiel (faw)  <faw@debian.org>
-
-       * pt_BR.po: updated to 536t.
-
-2008-05-08  Erdal Ronahi  <erdal dot ronahi at gmail dot com> 
-
-       * ku.po: updated to 136t25f343u
-
-2008-05-08  Bart Cornelis  <cobaco@skolelinux.no>
-
-       * nl.po: updated to 536t.
-
-2008-05-07  Jens Seidel  <jensseidel@users.sf.net>
-
-       * de.po: updated to 536t.
-
-2008-05-07  Peter Karlsson  <peterk@debian.org>
-
-       * sv.po: updated to 536t.
-
-2008-05-07  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: updated to 536t.
-
-2008-05-07  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: updated to 536t.
-
-2008-05-07  Yuri Kozlov  <kozlov.y@gmail.com>
-
-       * ru.po: updated to 536t.
-
-2008-05-07  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: updated to 536t.
-
-2008-05-06  Peter Mann  <Peter.Mann@tuke.sk>
-
-       * sk.po: updated to 536t.
-
-2008-05-06  Miroslav Kure  <kurem@upcase.inf.upol.cz>
-
-       * cs.po: updated to 536t.
-
-2008-05-06  Kenshi Muto  <kmuto@debian.org>
-
-       * ja.po: updated to 536t.
-
-2008-05-05  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: updated to 536t.
-
-2008-05-05  Sunjae Park  <darehanl@gmail.com>
-
-       * ko.po: updated to 536t.
-
-2008-05-05  Tapio Lehtonen  <tale@debian.org>
-
-       * fi.po: updated to 536t.
-
-2008-05-04  Damyan Ivanov  <dmn@debiian.org>
-
-       * bg.po: updated to 536t.
-
-2008-05-04  Samuele Giovanni Tonon  <samu@debian.org>
-
-       * it.po: updated to 536t.
-
-2008-05-04  Wiktor Wandachowicz  <siryes@gmail.com>
-
-       * pl.po: updated to 536t.
-
-2008-05-04  Theppitak Karoonboonyanan  <thep@linux.thai.net>
-
-       * th.po: updated to 536t.
-
-2008-05-04  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: updated to 536t.
-
-2008-05-04  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 536 strings.
-         Formerly complete PO files are now 535t1u (new string
-         from dselect/install. See #322470
-
-2008-05-04  Deng Xiyue  <manphiz-guest@users.alioth.debian.org>
-
-       * zh_CN.po: updated to 535t. Closes: #473360
-
-2008-05-03  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: updated to 535t. Closes: #479008
-
-2008-04-19  Jacobo Tarrío  <jtarrio@debian.org>
-
-       * gl.po: updated to 536t.
-
-2008-04-16  Damyan Ivanov  <dmn@debian.org>
-
-       * bg.po: updated to 536t.
-
-2008-04-16  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: updated to 536t.
-
-2008-03-19  Ivan Masár  <helix84@centrum.sk>
-
-       * sk.po: updated to 536t.
-
-2008-03-06  Wiktor Wandachowicz <siryes@gmail.com>\
-
-       * pl.po: updated to 536t.
-
-2008-02-28  Peter Karlsson  <peterk@debian.org>
-
-       * sv.po: updated to 536t.
-
-2008-02-21  Jens Seidel  <jensseidel@users.sf.net>
-
-       * de.po: updated to 536t. Closes: #466842
-
-2008-02-16  Deng Xiyue  <manphiz-guest@users.alioth.debian.org>
-
-       * zh_CN.po: updated to 536t. Closes: #465866
-
-2008-02-13  Sunjae Park  <darehanl@gmail.com>
-
-       * ko.po: updated to 529t7f. Closes: #448430
-
-2008-02-07  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: updated to 536t. Closes: #464575
-
-2008-01-19  Christian Perrier  <bubulle@debian.org>
-
-       * Preventive unfuzzy files for a message aimed at fixing #452640
-
-2008-01-19  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: updated to 536t. Closes: #461468
-
-2008-01-17  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: updated to 536t. Closes: #461166
-
-2008-01-13  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 536 strings.
-         Formerly complete PO files are now 534t2f but were
-         unfuzzied
-
-2008-01-04  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: updated to 536t. Closes: #459013
-
-2008-01-02  Hans Fredrik Nordhaug  <hans@nordhaug.priv.no>
-
-       * nb.po: Updated to 536t. Closes: #457917
-
-2007-12-29  Deng Xiyue  <manphiz-guest@users.alioth.debian.org>
-
-       * zh_CN.po: Updated to 536t. Closes: #458039
-
-2007-12-18  Kenshi Muto  <kmuto@debian.org>
-
-       * ja.po: Updated to 536t. Closes: #456909
-
-2007-12-17  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: completed to 536t.
-
-2007-12-17  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 536 strings.
-         Formerly complete PO files are now 530t6f
-
-2007-12-15  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: completed to 542t.
-
-2007-12-15  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 542 strings.
-         Formerly complete PO files are now 536t6f
-
-2007-12-01  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: updated to 536t.
-
-2007-11-27  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: updated to 536t.
-
-2007-11-01  Christian Perrier  <bubulle@debian.org>
-
-       * *.po: preventive unfuzzy after removal of an extra space
-         in a message "Stored label: %s\n"
-
-2007-10-30  Peter Karlsson  <peterk@debian.org>
-
-       * sv.po: updated to 536t.
-
-2007-10-29  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: updated to 536t. Closes: #448497
-
-2007-10-29  Sunjae Park  <darehanl@gmail.com>
-
-       * ko.po: Updated to 536t. Closes: #448430
-
-2007-10-28  Christian Perrier  <bubulle@debian.org>
-
-       * Add a bunch of languages that were not listed in LINGUAS:
-         Arabic, Dzongkha, Khmer, Marathi, Nepali, Thai
-
-2007-10-28  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: completed to 536t.
-
-2007-10-28  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO files and apt-all.pot. 536 strings.
-         Formerly complete PO files are now 532t3f1u
-
-2007-10-14  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: updated to 535t. Closes: #446626
-
-2007-10-12  Peter Karlsson  <peterk@debian.org>
-
-       * sv.po: updated to 535t.
-
-2007-09-17  Theppitak Karoonboonyanan  <thep@linux.thai.net>
-
-       * th.po: added with 535t. Closes: #442833
-
-2007-09-07  Claus Hindsgaul  <claus.hindsgaul@gmail.com>
-
-       * da.po: completed to 532t3f. Closes: #441102
-
-2007-09-03  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: completed to 535t. Closes: #440611
-
-2007-08-07  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: completed to 535t. Closes: #436425
-
-2007-08-04  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: completed to 535t.
-
-2007-08-04  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO and the POT. Gives 529t6f for formerly
-         complete translations
-
-2007-07-11  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: completed to 532t. Closes: #423766
-
-2007-07-06  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO and the POT. Gives 529t3f for formerly
-         complete translations
-       * Unfuzzy formerly complete translations (es, fr, gl, vi)
-
-2007-06-21  Javier Fernandez-Sanguino  <jfs@debian.org>
-
-       * es.po: completed to 532t, again. Closes: #429935
-
-2007-06-21  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: completed to 532t, again. Closes: #429899
-
-2007-06-19  Jacobo Tarrío  <jtarrio@debian.org>
-
-       * gl.po: completed to 532t. Closes: #429506
-
-2007-06-13  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: completed to 532t. Closes: #428672
-
-2007-06-12  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO and the POT. Gives 514t14f4u for formerly
-         complete translations
-       * fr.po: completed to 532t
-
-2007-06-12  Christian Perrier  <bubulle@debian.org>
-
-       * ku.po, uk.po, LINGUAS: reintegrate those translations
-         which disappeared from the BZR repositories
-
-2007-06-01  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: Updated to 515t. Closes: #426976
-
-2007-05-13  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Updated to 515t. Closes: #423766
-
-2007-05-10  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: 515t. Closes: #423111
-
-2007-05-08  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Updated by Christian Perrier
-
-2007-05-08  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO and the POT. Gives 513t2f for formerly
-         complete translations
-
-2007-04-01  priti Patil  <prithisd@gmail.com>
-
-       * mr.po: New Marathi translation
-                Closes: #416806
-
-2007-03-31  Kov Chai  <tchaikov@sjtu.org>
-
-       * zh_CN.po: Updated by Kov Chai
-                Closes: #416822
-
-2007-03-29  eric pareja  <xenos@upm.edu.ph>
-
-       * tl.po: Updated by Eric Pareja
-                Closes: #416638
-
-2007-02-28  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: Updated by Jacobo Tarrio
-                Closes: #412828
-
-2007-02-03  Claus Hindsgaul  <claus.hindsgaul@gmail.com>
-
-       * da.po: Updated by Claus Hindsgaul
-                Closes: #409483
-
-2007-01-29  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Remove a non-breakable space for usability
-                issues. Closes: #408877
-
-2006-12-12  Yuri Kozlov  <kozlov.y@gmail.com>
-
-       * ru.po: Updated Russian translation. Closes: #405476
-
-2006-12-12  Christian Perrier  <bubulle@debian.org>
-
-       * *.po: Unfuzzy after upstream typo corrections
-
-2006-12-12  Eugeniy Meshcheryakov  <eugen@debian.org>
-
-       * uk.po: Updated Ukrainian translation: 495t16f3u
-
-2006-11-04  Artem Bondarenko  <artem.brz@gmail.com>
-
-       * uk.po: New Ukrainian translation: 483t28f3u
-
-2006-11-02  Emmanuel Galatoulas  <galas@tee.gr>
-
-       * el.po: Update to 503t9f2u
-
-2006-10-24  Michael Piefel  <piefel@debian.org>
-
-       * de.po: Updates and corrections.
-
-2006-10-22  Jordi Mallach  <jordi@debian.org>
-
-       * ca.po: Updated to 514t
-
-2006-10-22  Bart Cornelis  <cobaco@linux.be>
-
-       * be.po: Updated to 514t
-
-2006-10-21  Samuele Giovanni Tonon  <samu@debian.org>
-
-       * it.po: Updated to 514t
-
-2006-10-21  SZERVÁC Attila  <sas@321.hu>
-
-       * hu.po: Updated to 514t
-
-2006-10-21  Asho Yeh  <asho@debian.org.tw>
-
-       * zh_TW.po: Updated to 514t
-
-2006-10-21  Ossama M. Khayat  <okhayat@yahoo.com>
-
-       * ar.po: Updated to 293t221u.
-
-2006-10-16  Yuri Kozlov  <kozlov.y@gmail.com>
-
-       * ru.po: Updated to 514t. Closes: #392466
-
-2006-10-16  Hans Fredrik Nordhaug  <hans@nordhaug.priv.no>
-
-       * nb.po: Updated to 514t. Closes: #392466
-
-2006-10-15  Rui Az.  <astronomy@mail.pt>
-
-       * pt.po: Updated to 514t. Closes: #393199
-
-2006-10-14  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: One spelling error corrected: s/accèder/accéder
-
-2006-10-13  Khoem Sokhem  <khoemsokhem@khmeros.info>
-
-       * km.po: Updated to 514t.
-
-2006-10-13  Sunjae Park  <darehanl@gmail.com>
-
-       * ko.po: Updated to 514t.
-
-2006-10-12  Yavor Doganov  <yavor@doganov.org>
-
-       * bg.po: Updated to 514t.
-
-2006-10-12  Michael Piefel  <piefel@debian.org>
-
-       * de.po: Updated to 514t.
-
-2006-10-12  Neil Williams  <linux@codehelp.co.uk>
-
-       * en_GB.po: Updated to 514t.
-
-2006-10-08  Javier Fernández-Sanguino Peña  <jfs@computer.org>
-
-       * es.po: Updated to 514t. Closes: #391661
-
-2006-10-06  Claus Hindsgaul  <claus.hindsgaul@gmail.com>
-
-       * da.po: Updated to 514t. Closes: #391424
-
-2006-10-04  Miroslav Kure  <kurem@upcase.inf.upol.cz>
-
-       * cs.po: Updated. Closes: #391064
-
-2006-09-29  Tapio Lehtonen  <tale@debian.org>
-
-       * fi.po: Updated to 514t. Closes: #390149
-
-2006-09-27  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Updated to 514t. Closes: #389725
-
-2006-09-21  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: Updated to 514t. Closes: #388555
-
-2006-09-20  Sorin Batariuc  <sorin@bonbon.net>
-
-       * ro.po: Updated to 514t. Closes: #388402
-
-2006-09-18  Kinley Tshering  <gasepkuenden2k3@hotmail.com>
-
-       * dz.po: Updated to 514t. Closes: #388184
-
-2006-09-17  Davide Viti  <zinosat@tiscali.it> 
-
-       * it.po: Fixed typos. Closes: #387812
-
-2006-09-17  Erdal Ronahi  <erdal.ronahi@gmail.com>
-
-       * ku.po: New kurdish translation. Closes: #387766
-                71t40f403u
-
-2006-09-10  Peter Mann  <Peter.Mann@tuke.sk>
-
-       * sk.po: Updated to 514t. Closes: #386851
-
-2006-09-08   Christian Perrier  <bubulle@debian.org>
-
-       * LINGUAS: re-enabled Hebrew translation on translator's request.
-
-2006-09-08  Kenshi Muto  <kmuto@debian.org>
-
-       * ja.po: Updated to 514t. Closes: #386537
-
-2006-09-06  Jacobo Tarrio  <jtarrio@debian.org>
-
-       * gl.po: Updated to 514t. Closes: #386397
-
-2006-09-02  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Updated to 516t.
-
-2006-09-02  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Updated to 516t.
-
-2006-08-20  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO and the POT. Gives 512t3f1uf for formerly
-         complete translations
-
-2006-08-13  Tapio Lehtonen  <tale@debian.org>
-
-       * fi.po: Updated to 512t. Closes: #382702
-
-2006-07-19  Sunjae Park  <darehanl@gmail.com>
-
-       * ko.po: Updated to 512t. Closes: #378901
-
-2006-07-02  SZERVAC Attila  <sas@321.hu>
-
-       * hu.po: Updated to 512t. Closes: #376330
-
-2006-07-01  Leang Chumsoben  <soben@khmeros.info>
-
-       * km.po: New Khmer translation: 506t6f. Closes: #375068
-
-2006-07-01  Shiva Pokharel  <pokharelshiva@hotmail.com>
-
-       * ne.po: New Nepali translation: 512t. Closes: #373729
-
-2006-07-01  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: Updated to 512t. Closes: #368038
-
-2006-07-01  Christian Perrier  <bubulle@debian.org>
-
-       * zh_TW.po: Remove an extra %s in one string. Closes: #370551
-
-2006-07-01  Kinley Tshering  <gasepkuenden2k3@hotmail.com>
-
-       * dz.po: New Dzongkha translation: 512t
-
-2006-06-25  Sorin Batariuc  <sorin@bonbon.net>
-
-       * ro.po: Updated to 512t
-
-2006-06-21  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Updated
-
-2006-06-07  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Updated
-
-2006-05-29  Peter Mann  <Peter.Mann@tuke.sk>
-
-       * sk.po: Completed to 512t
-
-2006-05-28  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Completed to 512t
-
-2006-05-17  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Completed to 512t
-
-2006-05-17  Daniel Nylander  <yeager@lidkoping.net>
-
-       * sv.po: Completed to 512t
-
-2006-05-16  Christian Perrier  <bubulle@debian.org>
-
-       * Update all PO and the POT. Gives 506t6f for formerly
-         complete translations
-
-2006-04-01  Yavor Doganov  <yavor@doganov.org>
-
-       * bg.po: Added, complete to 512t. Closes: #360262
-
-2006-03-16  eric pareja  <xenos@upm.edu.ph>
-
-       * tl.po: Completed to 512t. Closes: #357215
-
-2006-03-13  Sorin Batariuc  <sorin@bonbon.net>
-
-       * ro.po: Completed to 512t. Closes: #355897
-
-2006-03-12  Miguel Figueiredo  <elmig@debianpt.org>
-
-       * pt.po: Completed to 512t. Closes: #355798
-
-2006-02-14  Carlos Z.F. Liu  <carlosliu@users.sourceforge.net>
-
-       * zh_CN.po: Completed to 512t. Closes: #353936
-
-2006-02-14  Samuele Giovanni Tonon <samu@debian.org>
-
-       * it.po: Completed to 512t. Closes: #352803
-
-2006-02-13  Andre Luis Lopes  <andrelop@debian.org>
-
-       * ca.po: Completed to 512t. Closes: #352419
-
-2006-02-06  Jordi Mallach  <jordi@debian.org>
-
-       * ca.po: Completed to 512t. Closes: #351592
-
-2006-01-30  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Completed to 512t. Closes: #350483
-
-2006-01-24  Kenshi Muto  <kmuto@debian.org>
-
-       * ja.po: Completed to 512t. Closes: #349806
-
-2006-01-23  Bartosz Fenski aka fEnIo  <fenio@debian.org>
-
-       * pl.po: Completed to 512t. Closes: #349514
-
-2006-01-23  Peter Mann  <Peter.Mann@tuke.sk>
-
-       * sk.po: Completed to 512t. Closes: #349474
-
-2006-01-23  Jacobo Tarrio  <jtarrio@trasno.net>
-
-       * gl.po: Completed to 512 strings 
-                Closes: #349407
-
-2006-01-22  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: Completed to 512 strings
-
-2006-01-21  Daniel Nylander  <yeager@lidkoping.net>
-
-       * sv.po: Completed to 512 strings
-                Closes: #349210
-
-2006-01-21  Yuri Kozlov  <kozlov.y@gmail.com>
-
-       * ru.po: Completed to 512 strings
-                Closes: #349154
-
-2006-01-21  Claus Hindsgaul  <claus_h@image.dk>
-
-       * da.po: Completed to 512 strings
-                Closes: #349084
-
-2006-01-20  Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Completed to 512 strings
-       * LINGUAS: Add Welsh
-
-2006-01-20  Christian Perrier  <bubulle@debian.org>
-
-       * *.po: Updated from sources (512 strings)
-
-2006-01-20  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: Completed to 511 strings
-                Closes: #348968
-
-2006-01-18  Konstantinos Margaritis  <markos@debian.org>
-
-       * el.po: Completed to 511 strings
-                Closes: #344642
-
-2005-11-07  Claus Hindsgaul  <claus_h@image.dk>
-
-       * da.po: Completed to 511 strings
-                Closes: #348574
-
-2005-11-16  Andrew Deason  <adeason@tjhsst.edu>
-
-       * en_GB.po: Minor errors correction
-
-2005-11-12  Ruben Porras  <nahoo82@telefonica.net>
-
-       * es.po: Updated to 510t1f
-                Closes: #348158
-
-2005-11-12  Jacobo Tarrio  <jacobo@tarrio.org>
-
-       * gl.po: Completed to 511 strings
-                Closes: #347729
-
-2006-01-10 Samuele Giovanni Tonon  <samu@mclink.it>
-
-       * it.po: Yet another update
-                          Closes: #347435
-
-2006-01-09 Jonas Koelker  <jonaskoelker@users.sourceforge.net>
-
-       * en_GB.po, de.po: fix spaces errors in "Ign " translations
-                          Closes: #347258
-
-2006-01-09  Thomas Huriaux  <thomas.huriaux@gmail.com>
-
-       * makefile: make update-po a pre-requisite of clean target so
-                   that POT and PO files are always up-to-date
-
-2006-01-08  Daniel Nylander  <yeager@lidkoping.net>
-
-       * sv.po: Completed to 511t. Closes: #346450
-
-2006-01-06  Peter Mann  <Peter.Mann@tuke.sk>
-
-       * sk.po: Completed to 511t. Closes: #346369
-
-2006-01-06  Christian Perrier  <bubulle@debian.org>
-
-       * *.po: Updated from sources (511 strings)
-       * fr.po: Completed to 511t
-
-2006-01-01  Samuele Giovanni Tonon  <samu@mclink.it>
-
-       * it.po: Completed to 510t
-
-2006-01-01  Neil Williams  <linux@codehelp.co.uk>
-
-       * en_GB.po: Completed to 510t
-
-2005-12-30  Miroslav Kure  <kurem@upcase.inf.upol.cz>
-
-       * cs.po: Completed to 510t
-
-2005-12-25  Ming Hua  <minghua@rice.edu>
-
-       * zh_CN.po: Completed to 510t
-
-2005-12-25  Konstantinos Margaritis  <markos@debian.org>
-
-       * el.po: Updated to 510t
-
-2005-12-19  Clytie Siddall  <clytie@riverland.net.au>
-
-       * vi.po: Updated to 383t93f34u
-
-2005-12-19  eric pareja  <xenos@upm.edu.ph>
-
-       * tl.po: Completed to 510 strings
-                Closes: #344306
-
-2005-12-19  Daniel Nylander  <yeager@lidkoping.net>
-
-       * sv.po: Completed to 510 strings
-                Closes: #344056
-
-2005-11-29   Christian Perrier  <bubulle@debian.org>
-
-       * LINGUAS: disabled Hebrew translation. Closes: #313283
-
-2005-12-05  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Completed to 510 strings
-                Closes: #342091
-
-2005-11-29   Christian Perrier  <bubulle@debian.org>
-
-       * fr.po: Completed to 510 strings
-       * *.po : Synced with the POT files
-
-2005-11-14   Kov Tchai  <tchaikov@sjtu.edu.cn>
-
-       * zh_CN.po: Completed to 510 strings
-                Definitely Closes: #338267
-
-2005-11-13   Kov Tchai  <tchaikov@sjtu.edu.cn>
-
-       * zh_CN.po: Completed to 507 strings
-                Closes: #338267
-
-2005-11-09  Jacobo Tarrio  <jacobo@tarrio.org>
-
-       * gl.po: Completed to 510 strings
-                Closes: #338356
-
-2005-11-08  Piarres Beobide  <pi@beobide.net>
-
-       * eu.po: Completed to 510 strings
-                Closes: #338101
-
-2005-11-07  Claus Hindsgaul  <claus_h@image.dk>
-
-       * da.po: Completed to 510 strings
-                Closes: #337949
-
-2005-11-04  Eric Pareja  <xenos@upm.edu.ph>
-
-       * tl.po: Completed to 510 strings
-                Closes: #337306
-
-2005-11-04  Christian Perrier  <bubulle@debian.org>
-
-       * Changelog: added to better track down fixed issues
-
index 3822dd9dbc6fa0d9372a3bb27a52ceb3f3a2e6e4..4e91a8e33b9e89b399768beabd22b6d103cec4c7 100644 (file)
@@ -901,7 +901,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -913,7 +913,7 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
+msgid "Unknown error executing apt-key"
 msgstr ""
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
@@ -1515,7 +1515,7 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
+msgid "Calculating upgrade"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:28
@@ -2344,12 +2344,7 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr ""
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
+msgid "Unable to parse package file %s (%d)"
 msgstr ""
 
 #: apt-pkg/indexrecords.cc:78
index a22a38f33872b636267b8144fe80490e0d316f24..1a64f460629be4137eedf8091d2125b4cc787444 100644 (file)
--- a/po/ar.po
+++ b/po/ar.po
@@ -914,7 +914,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -926,7 +926,7 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
+msgid "Unknown error executing apt-key"
 msgstr ""
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
@@ -1541,8 +1541,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "حساب الترقية..."
+msgid "Calculating upgrade"
+msgstr "حساب الترقية"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2380,12 +2380,7 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr ""
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
+msgid "Unable to parse package file %s (%d)"
 msgstr ""
 
 #: apt-pkg/indexrecords.cc:78
index 0e013f9fe944eda6524ac66004314daacd3c2b5b..1da4e6ebab97b80a2d7e15c899369080e6b455a5 100644 (file)
--- a/po/ast.po
+++ b/po/ast.po
@@ -1021,8 +1021,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "Atopóse polo menos una robla mala."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Nun pudo executase 'gpgv' pa verificar la robla (¿ta instaláu gpgv?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Nun pudo executase 'apt-key' pa verificar la robla (¿ta instaláu gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1033,8 +1033,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Fallu desconocíu al executar gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Fallu desconocíu al executar apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1669,8 +1669,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calculando l'anovamientu... "
+msgid "Calculating upgrade"
+msgstr "Calculando l'anovamientu"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2536,13 +2536,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Nun se pudo tratar el ficheru de paquetes %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Nun se pudo tratar el ficheru de paquetes %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Nun se pudo tratar el ficheru de paquetes %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index fc1d7b08a4172e773fdb321b3aa154e3628fad25..4b6c30793c02a4e7609f7f4aaaa0de14884f8416 100644 (file)
--- a/po/bg.po
+++ b/po/bg.po
@@ -1051,10 +1051,10 @@ msgid "At least one invalid signature was encountered."
 msgstr "Намерен е поне един невалиден подпис."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Неуспех при изпълнение на „gpgv“ за проверка на подписа (инсталиран ли е "
-"gpgv?)"
+"Неуспех при изпълнение на „apt-key“ за проверка на подписа (инсталиран ли е "
+"gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1065,8 +1065,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Неизвестна грешка при изпълнението на gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Неизвестна грешка при изпълнението на apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1706,8 +1706,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Изчисляване на актуализацията..."
+msgid "Calculating upgrade"
+msgstr "Изчисляване на актуализацията"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2581,13 +2581,8 @@ msgstr "Изпълняване на външна програма за удов
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Неуспех при анализирането на пакетен файл %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Неуспех при анализирането на пакетен файл %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Неуспех при анализирането на пакетен файл %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 5bbec432a902f813d9dce074433a9aa7b8fa0e05..e32f2353fe90f9a8b854e0033f2663254a6fadb7 100644 (file)
--- a/po/bs.po
+++ b/po/bs.po
@@ -920,7 +920,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -932,7 +932,7 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
+msgid "Unknown error executing apt-key"
 msgstr ""
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
@@ -1541,8 +1541,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Računam nadogradnju..."
+msgid "Calculating upgrade"
+msgstr "Računam nadogradnju"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2375,12 +2375,7 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr ""
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
+msgid "Unable to parse package file %s (%d)"
 msgstr ""
 
 #: apt-pkg/indexrecords.cc:78
index d916d73e180df732eaf40e1b6e773c2cb6db0afb..ea0f2fe3510b37889fb3d9c2161bbfcb1934f682 100644 (file)
--- a/po/ca.po
+++ b/po/ca.po
@@ -1034,10 +1034,10 @@ msgid "At least one invalid signature was encountered."
 msgstr "S'ha trobat almenys una signatura invàlida."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"No s'ha pogut executar el «gpgv» per a verificar la signatura (està "
-"instaŀlat el gpgv?)"
+"No s'ha pogut executar el «apt-key» per a verificar la signatura (està "
+"instaŀlat el gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1048,8 +1048,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "S'ha produït un error desconegut en executar el gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "S'ha produït un error desconegut en executar el apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1694,8 +1694,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "S'està calculant l'actualització… "
+msgid "Calculating upgrade"
+msgstr "S'està calculant l'actualització"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2576,13 +2576,8 @@ msgstr "Executa un resoledor extern"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "No es pot analitzar el fitxer del paquet %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "No es pot analitzar el fitxer del paquet %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "No es pot analitzar el fitxer del paquet %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index e90f98d2846d54aace8eb454d934f6f17974bab6..05d07af6356c30e539347f7d67a190601bd771ef 100644 (file)
--- a/po/cs.po
+++ b/po/cs.po
@@ -1062,8 +1062,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "Byl zaznamenán nejméně jeden neplatný podpis. "
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Nelze spustit „gpgv“ pro ověření podpisu (je gpgv nainstalováno?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Nelze spustit „apt-key“ pro ověření podpisu (je gnupg nainstalováno?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1076,8 +1076,8 @@ msgstr ""
 "ověření?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Neznámá chyba při spouštění gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Neznámá chyba při spouštění apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1720,8 +1720,8 @@ msgid "Full Text Search"
 msgstr "Fulltextové hledání"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Propočítává se aktualizace… "
+msgid "Calculating upgrade"
+msgstr "Propočítává se aktualizace"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2579,13 +2579,8 @@ msgstr "Spuštění externího řešitele"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Nelze zpracovat soubor %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Nelze zpracovat soubor %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Nelze zpracovat soubor %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 0f2fd4c146ce9d55023ba0f8e615249011f2cf11..8c4121ae71bb0f77d7f93ba29309561fe997ed41 100644 (file)
--- a/po/cy.po
+++ b/po/cy.po
@@ -1042,7 +1042,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1054,7 +1054,7 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
+msgid "Unknown error executing apt-key"
 msgstr ""
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
@@ -1694,8 +1694,8 @@ msgstr ""
 
 #: apt-private/private-upgrade.cc:25
 #, fuzzy
-msgid "Calculating upgrade... "
-msgstr "Yn Cyfrifo'r Uwchraddiad... "
+msgid "Calculating upgrade"
+msgstr "Yn Cyfrifo'r Uwchraddiad"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2575,16 +2575,10 @@ msgstr ""
 msgid "Execute external solver"
 msgstr ""
 
-# FIXME: number?
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Ni ellir gramadegu ffeil becynnau %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Ni ellir gramadegu ffeil becynnau %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Ni ellir gramadegu ffeil becynnau %s (%d)"
 
 # FIXME: number?
 #: apt-pkg/indexrecords.cc:78
index 2f6f9982d7dc36d707226f308ed3f92683c2017e..712dec981c880bd27c37655b2c05111223615dd8 100644 (file)
--- a/po/da.po
+++ b/po/da.po
@@ -1075,9 +1075,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Stødte på mindst én ugyldig signatur."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Kunne ikke køre »gpgv« for at verificere signaturen (er gpgv installeret?)"
+"Kunne ikke køre »apt-key« for at verificere signaturen (er gnupg installeret?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1090,8 +1090,8 @@ msgstr ""
 "autentificering?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Ukendt fejl ved kørsel af gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Ukendt fejl ved kørsel af apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1734,8 +1734,8 @@ msgid "Full Text Search"
 msgstr "Fuldtekst-søgning"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Beregner opgraderingen ... "
+msgid "Calculating upgrade"
+msgstr "Beregner opgraderingen"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2602,13 +2602,8 @@ msgstr "Kør ekstern problemløser"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Kunne ikke tolke pakkefilen %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Kunne ikke tolke pakkefilen %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Kunne ikke tolke pakkefilen %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 733739ce137d3a04376213913e17876874218258..bc74e184c7460ff4f472f0044e987bce8e3f3eb1 100644 (file)
--- a/po/de.po
+++ b/po/de.po
@@ -1113,9 +1113,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Mindestens eine ungültige Signatur wurde entdeckt."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"»gpgv« konnte zur Überprüfung der Signatur nicht ausgeführt werden (ist gpgv "
+"»apt-key« konnte zur Überprüfung der Signatur nicht ausgeführt werden (ist gnupg "
 "installiert?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1129,8 +1129,8 @@ msgstr ""
 "das Netzwerk eine Authentifizierung?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Unbekannter Fehler beim Ausführen von gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Unbekannter Fehler beim Ausführen von apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1796,8 +1796,8 @@ msgid "Full Text Search"
 msgstr "Volltextsuche"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Paketaktualisierung (Upgrade) wird berechnet... "
+msgid "Calculating upgrade"
+msgstr "Paketaktualisierung (Upgrade) wird berechnet"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2689,13 +2689,8 @@ msgstr "Externen Problemlöser ausführen"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Paketdatei %s konnte nicht verarbeitet werden (1)."
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Paketdatei %s konnte nicht verarbeitet werden (2)."
+msgid "Unable to parse package file %s (%d)"
+msgstr "Paketdatei %s konnte nicht verarbeitet werden (%d)."
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 76723a58997cb3dc8b30b162976860f6a2db7481..fa842efc7a5112109fdcfafc1f9d726caaa943bd 100644 (file)
--- a/po/dz.po
+++ b/po/dz.po
@@ -1016,9 +1016,9 @@ msgstr "ཉུང་མཐའ་རང་ནུས་མེད་ཀྱི་མ
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"མིང་རྟགས་བདེན་སྦྱོར་འབད་ནི་ལུ་'%s'འདི་ལག་ལེན་འཐབ་མ་ཚུགས། (gpgv་དེ་ཁཞི་བཙུགས་འབད་ཡོདཔ་ཨིན་ན།?)"
+"མིང་རྟགས་བདེན་སྦྱོར་འབད་ནི་ལུ་'%s'འདི་ལག་ལེན་འཐབ་མ་ཚུགས། (gnupg་དེ་ཁཞི་བཙུགས་འབད་ཡོདཔ་ཨིན་ན།?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1029,8 +1029,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "gpgv་ལག་ལེན་འཐབ་ནི་ལུ་མ་ཤེས་པའི་འཛོལ་བ་།"
+msgid "Unknown error executing apt-key"
+msgstr "apt-key་ལག་ལེན་འཐབ་ནི་ལུ་མ་ཤེས་པའི་འཛོལ་བ་།"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1659,8 +1659,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "ཡར་བསྐྱེད་རྩིས་བཏོན་དོ་... "
+msgid "Calculating upgrade"
+msgstr "ཡར་བསྐྱེད་རྩིས་བཏོན་དོ་"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2522,13 +2522,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "%s (༡་)་ཐུམ་སྒྲིལ་ཡིག་སྣོད་འདི་མིང་དཔྱད་འབད་མ་ཚུགས།"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "%s (༢་)་ཐུམ་སྒྲིལ་ཡིག་སྣོད་འདི་མིང་དཔྱད་འབད་མ་ཚུགས།"
+msgid "Unable to parse package file %s (%d)"
+msgstr "%s (%d)་ཐུམ་སྒྲིལ་ཡིག་སྣོད་འདི་མིང་དཔྱད་འབད་མ་ཚུགས།"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 4c7e0263410ed4aab83112007f490bd4216e6195..393d5ceef7369d563cd6a56982fa880337484682 100644 (file)
--- a/po/el.po
+++ b/po/el.po
@@ -1028,10 +1028,10 @@ msgstr "Βρέθηκε τουλάχιστον μια μη έγκυρη υπογ
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 "Αδυναμία εκτέλεσης του '%s' για την επαλήθευση της υπογραφής (είναι "
-"εγκατεστημένο το gpgv;)"
+"εγκατεστημένο το gnupg;)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1042,8 +1042,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Άγνωστο σφάλμα κατά την εκτέλεση του gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Άγνωστο σφάλμα κατά την εκτέλεση του apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1681,8 +1681,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Υπολογισμός της αναβάθμισης... "
+msgid "Calculating upgrade"
+msgstr "Υπολογισμός της αναβάθμισης"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2549,13 +2549,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Αδύνατη η ανάλυση του αρχείου πακέτου %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Αδύνατη η ανάλυση του αρχείου πακέτου %s (2)"
+msgid "Unable to parse package file %s (%s)"
+msgstr "Αδύνατη η ανάλυση του αρχείου πακέτου %s (%s)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 3384c0e7da4216186a7645e0a28242fb57ec61a3..8ef8006a0237838e89cad51d6290416b833bec9a 100644 (file)
--- a/po/es.po
+++ b/po/es.po
@@ -1148,9 +1148,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Se encontró al menos una firma inválida."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"No se pudo ejecutar «gpgv»  para verificar la firma (¿está instalado gpgv?)"
+"No se pudo ejecutar «apt-key»  para verificar la firma (¿está instalado gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1163,8 +1163,8 @@ msgstr ""
 "autenticación?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Error desconocido ejecutando «gpgv»"
+msgid "Unknown error executing apt-key"
+msgstr "Error desconocido ejecutando «apt-key»"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1805,8 +1805,8 @@ msgid "Full Text Search"
 msgstr "Buscar en todo el texto"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calculando la actualización... "
+msgid "Calculating upgrade"
+msgstr "Calculando la actualización"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2687,13 +2687,8 @@ msgstr "Ejecutar solucionador externo"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "No se pudo tratar el archivo de paquetes %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "No se pudo tratar el archivo de paquetes %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "No se pudo tratar el archivo de paquetes %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 5271613efcf4d72160723c5072665a0cd1272b40..943d81b7840235bc949479bba460eda8bec4e0ec 100644 (file)
--- a/po/eu.po
+++ b/po/eu.po
@@ -1017,8 +1017,8 @@ msgstr "Beintza sinadura baliogabe bat aurkitu da."
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Ezin da %s abiarazi sinadura egiaztatzeko (gpgv instalaturik al dago?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Ezin da %s abiarazi sinadura egiaztatzeko (gnupg instalaturik al dago?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1029,8 +1029,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Errore ezezaguna gpgv exekutatzean"
+msgid "Unknown error executing apt-key"
+msgstr "Errore ezezaguna apt-key exekutatzean"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1663,8 +1663,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Berriketak kalkulatzen... "
+msgid "Calculating upgrade"
+msgstr "Berriketak kalkulatzen"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2520,13 +2520,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Ezin da %s pakete fitxategia analizatu (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Ezin da %s pakete fitxategia analizatu (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Ezin da %s pakete fitxategia analizatu (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index bf4994788a19abbb890471ae8ad22878d1715ffb..532f8be588178e8b1a4d2502ddcefaf81317dca3 100644 (file)
--- a/po/fi.po
+++ b/po/fi.po
@@ -1008,9 +1008,9 @@ msgstr "LÖytyi ainakin yksi kelvoton allekirjoitus."
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Ei käynnistynyt \"%s\" allekirjoitusta tarkistamaan (onko gpgv asennettu?)"
+"Ei käynnistynyt \"%s\" allekirjoitusta tarkistamaan (onko gnupg asennettu?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1021,8 +1021,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Tapahtui tuntematon virhe suoritettaessa gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Tapahtui tuntematon virhe suoritettaessa apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1655,8 +1655,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Käsitellään päivitystä ... "
+msgid "Calculating upgrade"
+msgstr "Käsitellään päivitystä"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2514,13 +2514,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Pakettitiedostoa %s (1) ei voi jäsentää"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Pakettitiedostoa %s (2) ei voi jäsentää"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Pakettitiedostoa %s ei voi jäsentää (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 6c3d7f20e6025a8c4666bb3963b9e324487e19e0..8f49987f11c00eae507e65ce79d865d1a2cb18f2 100644 (file)
--- a/po/fr.po
+++ b/po/fr.po
@@ -1088,10 +1088,10 @@ msgid "At least one invalid signature was encountered."
 msgstr "Au moins une signature non valable a été rencontrée."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Impossible d'exécuter « gpgv » pour contrôler la signature (veuillez "
-"vérifier si gpgv est installé)."
+"Impossible d'exécuter « apt-key » pour contrôler la signature (veuillez "
+"vérifier si gnupg est installé)."
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1104,8 +1104,8 @@ msgstr ""
 "Peut-être le réseau nécessite-t-il une authentification."
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Erreur inconnue à l'exécution de gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Erreur inconnue à l'exécution de apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1760,8 +1760,8 @@ msgid "Full Text Search"
 msgstr "Recherche en texte intégral"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calcul de la mise à jour... "
+msgid "Calculating upgrade"
+msgstr "Calcul de la mise à jour"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2657,13 +2657,8 @@ msgstr "Exécution du solveur externe"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Impossible de traiter le fichier %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Impossible de traiter le fichier %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Impossible de traiter le fichier %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 3311b9382953426d8494e20512255f8ae3ceb8f5..9ae0dd5a39938593080d1e053dcfaeae71d2c5be 100644 (file)
--- a/po/gl.po
+++ b/po/gl.po
@@ -1032,10 +1032,10 @@ msgid "At least one invalid signature was encountered."
 msgstr "Atopouse polo menos unha sinatura incorrecta."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Non é posíbel executar «gpgv» para verificar a sinatura (Está instalado "
-"gpgv?)"
+"Non é posíbel executar «apt-key» para verificar a sinatura (Está instalado "
+"gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1046,8 +1046,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Produciuse un erro descoñecido ao executar gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Produciuse un erro descoñecido ao executar apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1692,8 +1692,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calculando a anovación... "
+msgid "Calculating upgrade"
+msgstr "Calculando a anovación"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2566,13 +2566,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Non é posíbel analizar o ficheiro de paquetes %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Non é posíbel analizar o ficheiro de paquetes %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Non é posíbel analizar o ficheiro de paquetes %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index adc738becbe966e8580cc1fb50e29d6a1e00f010..b3ef8f8310d09b0bd5bc7442c840b01741296280 100644 (file)
--- a/po/he.po
+++ b/po/he.po
@@ -1006,7 +1006,7 @@ msgid "Recommended packages:"
 msgstr ""
 
 #: cmdline/apt-get.cc:1965
-msgid "Calculating upgrade... "
+msgid "Calculating upgrade"
 msgstr ""
 
 #: cmdline/apt-get.cc:1968 methods/ftp.cc:708 methods/connect.cc:112
@@ -1810,11 +1810,11 @@ msgstr ""
 
 #: methods/gpgv.cc:232
 #, c-format
-msgid "Could not execute '%s' to verify signature (is gpgv installed?)"
+msgid "Could not execute '%s' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #: methods/gpgv.cc:237
-msgid "Unknown error executing gpgv"
+msgid "Unknown error executing apt-key"
 msgstr ""
 
 #: methods/gpgv.cc:271 methods/gpgv.cc:278
@@ -2259,12 +2259,7 @@ msgstr "כשלון בפענוח %s"
 
 #: apt-pkg/tagfile.cc:102
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr ""
-
-#: apt-pkg/tagfile.cc:189
-#, c-format
-msgid "Unable to parse package file %s (2)"
+msgid "Unable to parse package file %s (%d)"
 msgstr ""
 
 #: apt-pkg/sourcelist.cc:90
index 3b5865600b5f006995bbf39972150d671f0f2da7..e65d9789f8d15ff17faf7f188be096ac26fdc36d 100644 (file)
--- a/po/hu.po
+++ b/po/hu.po
@@ -1050,9 +1050,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Legalább egy aláírás érvénytelen."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Nem indítható el a „gpgv” az aláírás ellenőrzéséhez (telepítve van a gpgv?)"
+"Nem indítható el a „apt-key” az aláírás ellenőrzéséhez (telepítve van a gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1063,8 +1063,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Ismeretlen gpgv futtatási hiba"
+msgid "Unknown error executing apt-key"
+msgstr "Ismeretlen apt-key futtatási hiba"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1699,8 +1699,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Frissítés kiszámítása... "
+msgid "Calculating upgrade"
+msgstr "Frissítés kiszámítása"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2568,13 +2568,8 @@ msgstr "Külső solver végrehajtása"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Nem lehet a(z) %s csomagfájlt feldolgozni (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Nem lehet a(z) %s csomagfájlt feldolgozni (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Nem lehet a(z) %s csomagfájlt feldolgozni (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index b382fd2af032d5137b99d190d6227e2c3cc561a8..6a096bf62f92a94328b2bb6a7d2a794860d00aa0 100644 (file)
--- a/po/it.po
+++ b/po/it.po
@@ -1093,9 +1093,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "È stata trovata almeno una firma non valida."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Impossibile eseguire \"gpgv\" per verificare la firma (forse gpgv non è "
+"Impossibile eseguire \"apt-key\" per verificare la firma (forse gnupg non è "
 "installato)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1109,8 +1109,8 @@ msgstr ""
 "richiede autenticazione?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Errore sconosciuto durante l'esecuzione di gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Errore sconosciuto durante l'esecuzione di apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1758,8 +1758,8 @@ msgid "Full Text Search"
 msgstr "Ricerca sul testo"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calcolo dell'aggiornamento... "
+msgid "Calculating upgrade"
+msgstr "Calcolo dell'aggiornamento"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2647,13 +2647,8 @@ msgstr "Esecuzione solver esterno"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Impossibile analizzare il file di pacchetto %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Impossibile analizzare il file di pacchetto %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Impossibile analizzare il file di pacchetto %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 9da59c1cf20b1a7633152f7e4a5c26bf47dfb18a..10263ade79bbc7de3d560bcef7e1f5df1f7edbf5 100644 (file)
--- a/po/ja.po
+++ b/po/ja.po
@@ -1084,9 +1084,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "少なくとも 1 つの不正な署名が発見されました。"
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"署名を検証するための 'gpgv' の実行ができませんでした (gpgv はインストールされ"
+"署名を検証するための 'apt-key' の実行ができませんでした (gnupg はインストールされ"
 "ていますか?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1100,8 +1100,8 @@ msgstr ""
 "が必要?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "gpgv の実行中に未知のエラーが発生"
+msgid "Unknown error executing apt-key"
+msgstr "apt-key の実行中に未知のエラーが発生"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1736,8 +1736,8 @@ msgid "Full Text Search"
 msgstr "全文検索"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "アップグレードパッケージを検出しています ... "
+msgid "Calculating upgrade"
+msgstr "アップグレードパッケージを検出しています"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2610,13 +2610,8 @@ msgstr "外部ソルバを実行"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "パッケージファイル %s を解釈することができません (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "パッケージファイル %s を解釈することができません (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "パッケージファイル %s を解釈することができません (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index d57d7def996f77f9ca0b3f5b46810634261036bf..e8ac36e7b8a6b6321345f0a7cfb9b21d8ece8b46 100644 (file)
--- a/po/km.po
+++ b/po/km.po
@@ -1005,8 +1005,8 @@ msgstr "​បានជួប​ប្រទះ​​​​ហត្ថលេខ
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "មិន​អាច​ប្រតិបត្តិ '%s' ដើម្បី​ផ្ទៀងផ្ទាត់​ហត្ថលេខា (តើ gpgv ត្រូវ​បាន​ដំឡើង​ឬនៅ ?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "មិន​អាច​ប្រតិបត្តិ '%s' ដើម្បី​ផ្ទៀងផ្ទាត់​ហត្ថលេខា (តើ gnupg ត្រូវ​បាន​ដំឡើង​ឬនៅ ?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1017,8 +1017,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "មិនស្គាល់កំហុស ក្នុងការប្រតិបត្តិ gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "មិនស្គាល់កំហុស ក្នុងការប្រតិបត្តិ apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1638,8 +1638,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "កំពុង​គណនា​ការ​ធ្វើ​ឲ្យ​ប្រសើរ... "
+msgid "Calculating upgrade"
+msgstr "កំពុង​គណនា​ការ​ធ្វើ​ឲ្យ​ប្រសើរ"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2489,13 +2489,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "មិនអាច​ញែក​ឯកសារកញ្ចប់ %s (1) បានឡើយ"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "មិនអាច​ញែក​ឯកសារកញ្ចប់​ %s (2) បានឡើយ"
+msgid "Unable to parse package file %s (%d)"
+msgstr "មិនអាច​ញែក​ឯកសារកញ្ចប់ %s (%d) បានឡើយ"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 3d7c36109abf3a36550b50ea10568eb990a620d6..4c00e7627f87da1e0fd619093c45321a64df5dcd 100644 (file)
--- a/po/ko.po
+++ b/po/ko.po
@@ -1011,9 +1011,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "최소한 하나 이상의 서명이 잘못되었습니다."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"서명을 확인하는 'gpgv' 프로그램을 실행할 수 없습니다. (gpgv를 설치했습니까?)"
+"서명을 확인하는 'apt-key' 프로그램을 실행할 수 없습니다. (gnupg를 설치했습니까?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1024,8 +1024,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "gpgv 실행 도중 알 수 없는 오류 발생"
+msgid "Unknown error executing apt-key"
+msgstr "apt-key 실행 도중 알 수 없는 오류 발생"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1651,8 +1651,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "업그레이드를 계산하는 중입니다... "
+msgid "Calculating upgrade"
+msgstr "업그레이드를 계산하는 중입니다"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2507,13 +2507,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "패키지 파일 %s 파일을 파싱할 수 없습니다 (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "패키지 파일 %s 파일을 파싱할 수 없습니다 (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "패키지 파일 %s 파일을 파싱할 수 없습니다 (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 4dbe31fbb779227f1f2304b8ab73190880774cd5..bc4e14204814ef97d6f163a3141e9b3ad55cbe18 100644 (file)
--- a/po/ku.po
+++ b/po/ku.po
@@ -923,7 +923,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -935,8 +935,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Di xebitandina gpgv de çewtiya nenas"
+msgid "Unknown error executing apt-key"
+msgstr "Di xebitandina apt-key de çewtiya nenas"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 #, fuzzy
@@ -1544,8 +1544,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Bilindkirin tê hesibandin..."
+msgid "Calculating upgrade"
+msgstr "Bilindkirin tê hesibandin"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2378,12 +2378,7 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, fuzzy, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Pakêt nehate dîtin %s"
-
-#: apt-pkg/tagfile.cc:237
-#, fuzzy, c-format
-msgid "Unable to parse package file %s (2)"
+msgid "Unable to parse package file %s (%d)"
 msgstr "Pakêt nehate dîtin %s"
 
 #: apt-pkg/indexrecords.cc:78
index 42959db622b026de39408b5be5cf6a8ef4d4def4..821c28db7a06571bab9897a80d31382140cafba7 100644 (file)
--- a/po/lt.po
+++ b/po/lt.po
@@ -928,7 +928,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -940,8 +940,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Nežinoma klaida kviečiant gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Nežinoma klaida kviečiant apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1563,8 +1563,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Skaičiuojami atnaujinimai... "
+msgid "Calculating upgrade"
+msgstr "Skaičiuojami atnaujinimai"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2409,12 +2409,7 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr ""
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
+msgid "Unable to parse package file %s (%d)"
 msgstr ""
 
 #: apt-pkg/indexrecords.cc:78
index ffc91baf67fb7909b28124b1cde834c5763a1ec4..afc83c869026a4fbe5fea0728f06b317fb52acc2 100644 (file)
--- a/po/mr.po
+++ b/po/mr.po
@@ -1002,9 +1002,9 @@ msgstr "किमान एक अवैध सही सापडली."
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"सहीची खात्री करण्यासाठी '%s' कार्यान्वित करू शकत नाही (gpgv संस्थापित केले आहे का?)"
+"सहीची खात्री करण्यासाठी '%s' कार्यान्वित करू शकत नाही (gnupg संस्थापित केले आहे का?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1015,8 +1015,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "gpgv कार्यान्वित होत असताना अपरिचित त्रुटी"
+msgid "Unknown error executing apt-key"
+msgstr "apt-key कार्यान्वित होत असताना अपरिचित त्रुटी"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1642,8 +1642,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "पुढिल आवृत्तीची गणती करीत आहे..."
+msgid "Calculating upgrade"
+msgstr "पुढिल आवृत्तीची गणती करीत आहे"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2501,13 +2501,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "%s (1) पॅकेज फाईल पार्स करण्यात असमर्थ"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "%s (२) पॅकेज फाईल पार्स करण्यात असमर्थ"
+msgid "Unable to parse package file %s (%d)"
+msgstr "%s पॅकेज फाईल पार्स करण्यात असमर्थ (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index d096e9a69df2a4c9d6048452b6bb1d6dd8bee8c7..088f17fa8bb54a0c7edef8239403e59b6a379922 100644 (file)
--- a/po/nb.po
+++ b/po/nb.po
@@ -1017,9 +1017,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Minst en ugyldig signatur ble funnet."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Klarte ikke kjøre «gpgv» for å verifisere signaturen (er gpgv installert?)"
+"Klarte ikke kjøre «apt-key» for å verifisere signaturen (er gnupg installert?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1030,8 +1030,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Ukjent feil ved kjøring av gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Ukjent feil ved kjøring av apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1669,8 +1669,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Beregner oppgradering... "
+msgid "Calculating upgrade"
+msgstr "Beregner oppgradering"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2530,13 +2530,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Klarer ikke å fortolke pakkefila %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Klarer ikke å fortolke pakkefila %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Klarer ikke å fortolke pakkefila %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 6743a9bdb8c52df2b7b7ff8400416d7314126271..09b9858f7e14f6caaa312366717012aa730f3f88 100644 (file)
--- a/po/ne.po
+++ b/po/ne.po
@@ -1003,8 +1003,8 @@ msgstr "कम्तिमा एउटा अवैध हस्ताक्ष
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "हस्ताक्षर रूजू गर्न '%s' कार्यन्वयन गर्न सकिएन (के gpgv स्थापना भयो?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "हस्ताक्षर रूजू गर्न '%s' कार्यन्वयन गर्न सकिएन (के gnupg स्थापना भयो?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1015,8 +1015,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "gpgv कार्यन्वयन गर्दा अज्ञात त्रुटि"
+msgid "Unknown error executing apt-key"
+msgstr "apt-key कार्यन्वयन गर्दा अज्ञात त्रुटि"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1638,8 +1638,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "स्तर वृद्धि गणना गरिदैछ..."
+msgid "Calculating upgrade"
+msgstr "स्तर वृद्धि गणना गरिदैछ"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2492,13 +2492,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "प्याकेज फाइल पद वर्णन गर्न असक्षम %s (१)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "प्याकेज फाइल पद वर्णन गर्न असक्षम %s (२)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "प्याकेज फाइल पद वर्णन गर्न असक्षम %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 74e839b78b3708556012d42037d94f733babd30b..eaae16e517e3e638a3474fbf9c9f719e89cfadd6 100644 (file)
--- a/po/nl.po
+++ b/po/nl.po
@@ -1095,9 +1095,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Er is tenminste één ongeldige ondertekening gevonden."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Kon 'gpgv' niet uitvoeren om ondertekening te verifiëren (is gpgv "
+"Kon 'apt-key' niet uitvoeren om ondertekening te verifiëren (is gnupg "
 "geïnstalleerd?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1111,8 +1111,8 @@ msgstr ""
 "het netwerk authenticatie?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Onbekende fout bij het uitvoeren van gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Onbekende fout bij het uitvoeren van apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1762,8 +1762,8 @@ msgid "Full Text Search"
 msgstr "Volledige tekst doorzoeken"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Opwaardering wordt doorgerekend... "
+msgid "Calculating upgrade"
+msgstr "Opwaardering wordt doorgerekend"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2653,13 +2653,8 @@ msgstr "Externe oplosser uitvoeren"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Kon pakketbestand %s niet ontleden (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Kon pakketbestand %s niet ontleden (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Kon pakketbestand %s niet ontleden (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 070feb567b891629ead7001dd52ab72185fd14eb..dcb3d55d656e02e0a07a1f2b4f4010c4aaec6165 100644 (file)
--- a/po/nn.po
+++ b/po/nn.po
@@ -1012,7 +1012,7 @@ msgid "At least one invalid signature was encountered."
 msgstr ""
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1024,7 +1024,7 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
+msgid "Unknown error executing apt-key"
 msgstr ""
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
@@ -1654,8 +1654,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Reknar ut oppgradering ... "
+msgid "Calculating upgrade"
+msgstr "Reknar ut oppgradering"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2512,13 +2512,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Klarte ikkje tolka pakkefila %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Klarte ikkje tolka pakkefila %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Klarte ikkje tolka pakkefila %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 32173ad87ec23529cd87e5640da50feff2b042ce..f1df0ee4a98366838018450cdd0cbbc8c504ff94 100644 (file)
--- a/po/pl.po
+++ b/po/pl.po
@@ -1060,9 +1060,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Napotkano przynajmniej jeden nieprawidłowy podpis."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Nie udało się uruchomić gpgv by zweryfikować podpis (czy gpgv jest "
+"Nie udało się uruchomić apt-key by zweryfikować podpis (czy gnupg jest "
 "zainstalowane?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1074,8 +1074,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Nieznany błąd podczas uruchamiania gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Nieznany błąd podczas uruchamiania apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1734,8 +1734,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Obliczanie aktualizacji..."
+msgid "Calculating upgrade"
+msgstr "Obliczanie aktualizacji"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2608,13 +2608,8 @@ msgstr "Wykonywanie zewnętrznego mechanizmu rozwiązywania zależności"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Nie udało się zanalizować pliku pakietu %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Nie udało się zanalizować pliku pakietu %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Nie udało się zanalizować pliku pakietu %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 8e21e97ef5ccfef375c237c416af3588a2a71f26..e35b146e923f56d055dbbd556d14d58ee92974fc 100644 (file)
--- a/po/pt.po
+++ b/po/pt.po
@@ -1050,9 +1050,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Pelo menos uma assinatura inválida foi encontrada."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Não foi possível executar 'gpgv' para verificar a assinatura  (o gpgv está "
+"Não foi possível executar 'apt-key' para verificar a assinatura  (o gnupg está "
 "instalado?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1064,8 +1064,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Erro desconhecido ao executar gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Erro desconhecido ao executar apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1704,8 +1704,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "A calcular a actualização... "
+msgid "Calculating upgrade"
+msgstr "A calcular a actualização"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2591,13 +2591,8 @@ msgstr "Executar resolvedor externo"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Não foi possível fazer parse ao ficheiro do pacote %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Não foi possível fazer parse ao ficheiro de pacote %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Não foi possível fazer parse ao ficheiro do pacote %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index f50171edcbe9186e49fc9301de8c26177ffc8bd1..96bbf0a6528cb6d9b57a144af70600beb394179e 100644 (file)
@@ -1023,9 +1023,9 @@ msgstr "Ao menos uma assinatura inválida foi encontrada."
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Não foi possível executar '%s' para verificar a assinatura (o gpgv está "
+"Não foi possível executar '%s' para verificar a assinatura (o gnupg está "
 "instalado?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
@@ -1037,8 +1037,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Erro desconhecido executando gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Erro desconhecido executando apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1673,8 +1673,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calculando atualização... "
+msgid "Calculating upgrade"
+msgstr "Calculando atualização"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2546,13 +2546,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Impossível analisar arquivo de pacote %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Impossível analisar arquivo de pacote %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Impossível analisar arquivo de pacote %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 522ba61f352c39daa6ada4489580d738786140e0..eb66192ad9535cabb2497db4ac11b8d21b09b5a2 100644 (file)
--- a/po/ro.po
+++ b/po/ro.po
@@ -1024,9 +1024,9 @@ msgstr "Cel puțin o semnătură nevalidă a fost întâlnită."
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Nu s-a putut executa „%s” pentru verificarea semnăturii (gpgv este instalat?)"
+"Nu s-a putut executa „%s” pentru verificarea semnăturii (gnupg este instalat?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1037,8 +1037,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Eroare necunoscută în timp ce se execută gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Eroare necunoscută în timp ce se execută apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1680,8 +1680,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Calculez înnoirea... "
+msgid "Calculating upgrade"
+msgstr "Calculez înnoirea"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2554,13 +2554,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Nu s-a putut analiza fișierul pachet %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Nu s-a putut analiza fișierul pachet %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Nu s-a putut analiza fișierul pachet %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 38276c0c216ac71b4dd1f83c86d588868b8ea8b2..6381e783958627284cec8d046104bdfa58eaf865 100644 (file)
--- a/po/ru.po
+++ b/po/ru.po
@@ -1059,8 +1059,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "Найдена как минимум одна неправильная подпись."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Не удалось выполнить «gpgv» для проверки подписи (gpgv установлена?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Не удалось выполнить «apt-key» для проверки подписи (gnupg установлена?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1071,8 +1071,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Неизвестная ошибка при выполнении gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Неизвестная ошибка при выполнении apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1727,8 +1727,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Расчёт обновлений"
+msgid "Calculating upgrade"
+msgstr "Расчёт обновлений"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2600,13 +2600,8 @@ msgstr "Запустить внешний решатель"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Невозможно разобрать содержимое пакета %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Невозможно разобрать содержимое пакета %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Невозможно разобрать содержимое пакета %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 4c40d4f2d4ee789ba613c25f45aa55dab370f032..4dfeab746e37ad752b50aa6b5ce78d6e26d49d18 100644 (file)
--- a/po/sk.po
+++ b/po/sk.po
@@ -1039,8 +1039,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "Bola zistená aspoň jedna nesprávna signatúra."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Nedá sa spustiť „gpgv“ kvôli overeniu podpisu (je nainštalované gpgv?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Nedá sa spustiť „apt-key“ kvôli overeniu podpisu (je nainštalované gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1051,8 +1051,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Neznáma chyba pri spustení gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Neznáma chyba pri spustení apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1701,8 +1701,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Prepočítava sa aktualizácia... "
+msgid "Calculating upgrade"
+msgstr "Prepočítava sa aktualizácia"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2563,13 +2563,8 @@ msgstr "Spustiť externého riešiteľa"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Súbor %s sa nedá spracovať (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Súbor %s sa nedá spracovať (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Súbor %s sa nedá spracovať (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 20d2db3175d0e2d13743be96694249dbf86d17d7..16a39656a23413ae8dcf713df3a080382d2d4f73 100644 (file)
--- a/po/sl.po
+++ b/po/sl.po
@@ -1036,8 +1036,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "Najden je bil vsaj en neveljaven podpis."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Ni mogoče izvesti 'gpgv' za preverjanje podpisa (je gpgv nameščen?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Ni mogoče izvesti 'apt-key' za preverjanje podpisa (je gnupg nameščen?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1048,8 +1048,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Neznana napaka med izvajanjem gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Neznana napaka med izvajanjem apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1702,8 +1702,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Preračunavanje nadgradnje ... "
+msgid "Calculating upgrade"
+msgstr "Preračunavanje nadgradnje"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2567,13 +2567,8 @@ msgstr "Izvedi zunanji reševalnik"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Ni mogoče razčleniti datoteke paketa %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Ni mogoče razčleniti datoteke paketa %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Ni mogoče razčleniti datoteke paketa %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 995de163000068f47a57eee0d523302cb1e6db9a..55afb20d8d022fae6081d26c98316decde85a609 100644 (file)
--- a/po/sv.po
+++ b/po/sv.po
@@ -1025,9 +1025,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Minst en ogiltig signatur träffades på."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Kunde inte köra \"gpgv\" för att verifiera signatur (är gpgv installerad?)"
+"Kunde inte köra \"apt-key\" för att verifiera signatur (är gnupg installerad?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1038,8 +1038,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Okänt fel vid körning av gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Okänt fel vid körning av apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1681,8 +1681,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Beräknar uppgradering... "
+msgid "Calculating upgrade"
+msgstr "Beräknar uppgradering"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2556,13 +2556,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Kunde inte tolka paketfilen %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Kunde inte tolka paketfilen %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Kunde inte tolka paketfilen %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index c9577c01f077549bc552437b0718f05bbc1c4d26..1dee18de7d58253a959c3ae1106f766fd331ffd4 100644 (file)
--- a/po/th.po
+++ b/po/th.po
@@ -1052,8 +1052,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "พบลายเซ็นที่ใช้การไม่ได้อย่างน้อยหนึ่งรายการ"
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "ไม่สามารถเรียก 'gpgv' เพื่อตรวจสอบลายเซ็น (ได้ติดตั้ง gpgv ไว้หรือไม่?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "ไม่สามารถเรียก 'apt-key' เพื่อตรวจสอบลายเซ็น (ได้ติดตั้ง gnupg ไว้หรือไม่?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1066,8 +1066,8 @@ msgstr ""
 "'%s' (เครือข่ายต้องยืนยันตัวบุคคลหรือไม่?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะเรียก gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "เกิดข้อผิดพลาดไม่ทราบสาเหตุขณะเรียก apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1682,8 +1682,8 @@ msgid "Full Text Search"
 msgstr "ค้นทั่วทั้งเนื้อความ"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "กำลังคำนวณการปรับรุ่น... "
+msgid "Calculating upgrade"
+msgstr "กำลังคำนวณการปรับรุ่น"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2532,13 +2532,8 @@ msgstr "เรียกกลไกการแก้ปัญหาภายน
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "ไม่สามารถแจงแฟ้มแพกเกจ %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "ไม่สามารถแจงแฟ้มแพกเกจ %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "ไม่สามารถแจงแฟ้มแพกเกจ %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 1060c582e4f8a7d9121f5e38e74713fc202985c4..2bf076a03d92f757a10747e1ef6dedbbc3d4b9b2 100644 (file)
--- a/po/tl.po
+++ b/po/tl.po
@@ -1018,9 +1018,9 @@ msgstr "Hindi kukulang sa isang hindi tanggap na lagda ang na-enkwentro."
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Hindi maitakbo ang '%s' upang maberipika ang lagda (nakaluklok ba ang gpgv?)"
+"Hindi maitakbo ang '%s' upang maberipika ang lagda (nakaluklok ba ang gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1031,8 +1031,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Hindi kilalang error sa pag-execute ng gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Hindi kilalang error sa pag-execute ng apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1663,8 +1663,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Sinusuri ang pag-upgrade... "
+msgid "Calculating upgrade"
+msgstr "Sinusuri ang pag-upgrade"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2533,13 +2533,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Hindi ma-parse ang talaksang pakete %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Hindi ma-parse ang talaksang pakete %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Hindi ma-parse ang talaksang pakete %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, fuzzy, c-format
index 47f8b914bbafaae62a146457e690552fb4427ff5..621d4610873cc5e1558ffb11a4cdf22ff0458e15 100644 (file)
--- a/po/tr.po
+++ b/po/tr.po
@@ -1077,8 +1077,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "En az bir geçersiz imza ile karşılaşıldı."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "İmza doğrulama için 'gpgv' çalıştırılamadı (gpgv kurulu mu?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "İmza doğrulama için 'apt-key' çalıştırılamadı (gnupg kurulu mu?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1091,8 +1091,8 @@ msgstr ""
 "gerektiriyor mu?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "gpgv çalıştırılırken bilinmeyen hata"
+msgid "Unknown error executing apt-key"
+msgstr "apt-key çalıştırılırken bilinmeyen hata"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1739,8 +1739,8 @@ msgid "Full Text Search"
 msgstr "Tam Metin Arama"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Yükseltme hesaplanıyor... "
+msgid "Calculating upgrade"
+msgstr "Yükseltme hesaplanıyor"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2607,13 +2607,8 @@ msgstr "Harici çözücüyü çalıştır"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Paket dosyası %s ayrıştırılamadı (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Paket dosyası %s ayrıştırılamadı (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Paket dosyası %s ayrıştırılamadı (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 493c9002ca6a902f72e07285f089bc7c40bd6f3c..92f07bb1502ad49ee180eb7166864d24be11256d 100644 (file)
--- a/po/uk.po
+++ b/po/uk.po
@@ -1057,8 +1057,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "Знайдено як мінімум один невірний підпис."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "Неможливо виконати 'gpgv' для перевірки підпису (чи встановлено gpgv?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "Неможливо виконати 'apt-key' для перевірки підпису (чи встановлено gnupg?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1069,8 +1069,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Невідома помилка виконання gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Невідома помилка виконання apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1722,8 +1722,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Обчислення оновлень... "
+msgid "Calculating upgrade"
+msgstr "Обчислення оновлень"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2600,13 +2600,8 @@ msgstr "Виконати зовнішній розв'язувач"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Неможливо проаналізувати файл пакунку %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Неможливо проаналізувати файл пакунку %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Неможливо проаналізувати файл пакунку %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 1c36fcef32c02ef9d718284d9229f67c08bc68b2..fb80076f9a81cb56ad93c5f38f9e862e69cb0a7b 100644 (file)
--- a/po/vi.po
+++ b/po/vi.po
@@ -1092,9 +1092,9 @@ msgid "At least one invalid signature was encountered."
 msgstr "Gặp ít nhất một chữ ký không hợp lệ."
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
 msgstr ""
-"Không thể thực hiện “gpgv” để thẩm tra chữ ký (gpgv đã được cài đặt chưa?)"
+"Không thể thực hiện “apt-key” để thẩm tra chữ ký (gnupg đã được cài đặt chưa?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1107,8 +1107,8 @@ msgstr ""
 "không?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "Gặp lỗi không rõ khi thực hiện gpgv"
+msgid "Unknown error executing apt-key"
+msgstr "Gặp lỗi không rõ khi thực hiện apt-key"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1737,8 +1737,8 @@ msgid "Full Text Search"
 msgstr "Tìm kiếm toàn văn"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "Đang tính toán nâng cấp... "
+msgid "Calculating upgrade"
+msgstr "Đang tính toán nâng cấp"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2605,13 +2605,8 @@ msgstr "Thi hành bộ phân giải từ bên ngoài"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "Không thể phân tích tập tin gói %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "Không thể phân tích tập tin gói %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "Không thể phân tích tập tin gói %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index 5022016b2b21f79e654517f9e5175543de0f493f..661d8f92c7c46ebbec450c424b999715f98f606f 100644 (file)
@@ -1056,8 +1056,8 @@ msgid "At least one invalid signature was encountered."
 msgstr "至少发现一个无效的签名。"
 
 #: methods/gpgv.cc:174
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "无法运行 gpgv 以验证签名(您安装了 gpgv 吗?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "无法运行 apt-key 以验证签名(您安装了 gnupg 吗?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1068,8 +1068,8 @@ msgid ""
 msgstr "明文签署文件不可用,结果为‘%s’(您的网络需要认证吗?)"
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "运行 gpgv 时发生未知错误"
+msgid "Unknown error executing apt-key"
+msgstr "运行 apt-key 时发生未知错误"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1679,8 +1679,8 @@ msgid "Full Text Search"
 msgstr "全文搜索"
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "正在对升级进行计算... "
+msgid "Calculating upgrade"
+msgstr "正在对升级进行计算"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2532,13 +2532,8 @@ msgstr "执行外部solver"
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "无法解析软件包文件 %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "无法解析软件包文件 %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "无法解析软件包文件 %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index b240111511540b6ca28672f400b0fa4c92884209..c9a134b625b6245c09752cdc396cf998602ee42d 100644 (file)
@@ -999,8 +999,8 @@ msgstr "至少發現一個無效的簽章。"
 
 #: methods/gpgv.cc:174
 #, fuzzy
-msgid "Could not execute 'gpgv' to verify signature (is gpgv installed?)"
-msgstr "無法執行 '%s' 來驗證簽章(gpgv 是否安裝了?)"
+msgid "Could not execute 'apt-key' to verify signature (is gnupg installed?)"
+msgstr "無法執行 '%s' 來驗證簽章(gnupg 是否安裝了?)"
 
 #. TRANSLATORS: %s is a single techy word like 'NODATA'
 #: methods/gpgv.cc:180
@@ -1011,8 +1011,8 @@ msgid ""
 msgstr ""
 
 #: methods/gpgv.cc:184
-msgid "Unknown error executing gpgv"
-msgstr "在執行 gpgv 時發生未知的錯誤"
+msgid "Unknown error executing apt-key"
+msgstr "在執行 apt-key 時發生未知的錯誤"
 
 #: methods/gpgv.cc:217 methods/gpgv.cc:224
 msgid "The following signatures were invalid:\n"
@@ -1632,8 +1632,8 @@ msgid "Full Text Search"
 msgstr ""
 
 #: apt-private/private-upgrade.cc:25
-msgid "Calculating upgrade... "
-msgstr "籌備升級中... "
+msgid "Calculating upgrade"
+msgstr "籌備升級中"
 
 #: apt-private/private-upgrade.cc:28
 msgid "Done"
@@ -2477,13 +2477,8 @@ msgstr ""
 
 #: apt-pkg/tagfile.cc:140
 #, c-format
-msgid "Unable to parse package file %s (1)"
-msgstr "無法辨識套件檔 %s (1)"
-
-#: apt-pkg/tagfile.cc:237
-#, c-format
-msgid "Unable to parse package file %s (2)"
-msgstr "無法辨識套件檔 %s (2)"
+msgid "Unable to parse package file %s (%d)"
+msgstr "無法辨識套件檔 %s (%d)"
 
 #: apt-pkg/indexrecords.cc:78
 #, c-format
index e61266eef82f190a35cfaaf52286f0ef4ede74b9..67f4638d60327e7bd5af3d89ad71d53eb0ff14fe 100755 (executable)
@@ -130,8 +130,8 @@ elif [ "$1" = 'coverage' ]; then
        LCOVRC='--rc geninfo_checksum=1 --rc lcov_branch_coverage=1'
        mkdir "$DIR"
        lcov --no-external --directory . --capture --initial --output-file "${DIR}/apt.coverage.init" ${LCOVRC}
-       make test
-       ./test/integration/run-tests -q
+       make test || true
+       ./test/integration/run-tests -q || true
        lcov --no-external --directory . --capture --output-file "${DIR}/apt.coverage.run" ${LCOVRC}
        lcov -a "${DIR}/apt.coverage.init" -a "${DIR}/apt.coverage.run"  -o "${DIR}/apt.coverage.total" ${LCOVRC}
        cp "${DIR}/apt.coverage.total" "${DIR}/apt.coverage.fixed"
index 70ad381e980814efb3476106ef2cc21b8ce1f1d0..5f13df1c056334abed41b26e8be97cb4b64ef06d 100644 (file)
@@ -23,30 +23,43 @@ if [ "$MSGCOLOR" != 'NO' ]; then
        CCMD="\033[1;35m" # pink
 fi
 
-msgdie() { printf "${CERROR}E: $1${CNORMAL}\n" >&2; exit 1; }
-msgwarn() { printf "${CWARNING}W: $1${CNORMAL}\n" >&2; }
-msgmsg() { printf "${CMSG}$1${CNORMAL}\n"; }
-msginfo() { printf "${CINFO}I: $1${CNORMAL}\n"; }
-msgdebug() { printf "${CDEBUG}D: $1${CNORMAL}\n"; }
-msgdone() { printf "${CDONE}DONE${CNORMAL}\n"; }
-msgnwarn() { printf "${CWARNING}W: $1${CNORMAL}" >&2; }
-msgnmsg() { printf "${CMSG}$1${CNORMAL}"; }
-msgninfo() { printf "${CINFO}I: $1${CNORMAL}"; }
-msgndebug() { printf "${CDEBUG}D: $1${CNORMAL}"; }
-msgtest() {
-       while [ -n "$1" ]; do
-               printf "${CINFO}$1${CCMD} "
-               printf -- "$(echo "$2" | sed -e 's#^apt\([cgfs]\)#apt-\1#')${CINFO} "
+msgprintf() {
+       local START="$1"
+       local MIDDLE="$2"
+       local END="$3"
+       shift 3
+       if [ -n "$1" ]; then
+               printf "$START " "$1"
                shift
-               if [ -n "$1" ]; then shift; else break; fi
-       done
-       printf "…${CNORMAL} "
-}
+               while [ -n "$1" ]; do
+                       printf "$MIDDLE " "$(echo "$1" | sed -e 's#^apt\([cfghs]\)#apt-\1#')"
+                       shift
+               done
+       fi
+       printf "${END}"
+}
+msgdie() { msgprintf "${CERROR}E: %s" '%s' "${CNORMAL}\n" "$@" >&2; exit 1; }
+msgwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}\n" "$@" >&2; }
+msgmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}\n" "$@"; }
+msginfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}\n" "$@"; }
+msgdebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}\n" "$@"; }
+msgdone() { msgprintf "${CDONE}DONE" '%s' "${CNORMAL}\n" "$@"; }
+msgnwarn() { msgprintf "${CWARNING}W: %s" '%s' "${CNORMAL}" "$@" >&2; }
+msgnmsg() { msgprintf "${CMSG}%s" '%s' "${CNORMAL}" "$@"; }
+msgninfo() { msgprintf "${CINFO}I: %s" '%s' "${CNORMAL}" "$@"; }
+msgndebug() { msgprintf "${CDEBUG}D: %s" '%s' "${CNORMAL}" "$@"; }
+msgtest() { msgprintf "${CINFO}%s" "${CCMD}%s${CINFO}" "…${CNORMAL} " "$@"; }
 msgpass() { printf "${CPASS}PASS${CNORMAL}\n"; }
-msgskip() { printf "${CWARNING}SKIP${CNORMAL}\n" >&2; }
+msgskip() {
+       if [ $# -gt 0 ]; then printf "${CWARNING}SKIP: $*${CNORMAL}\n" >&2;
+       else printf "${CWARNING}SKIP${CNORMAL}\n" >&2; fi
+}
 msgfail() {
        if [ $# -gt 0 ]; then printf "${CFAIL}FAIL: $*${CNORMAL}\n" >&2;
        else printf "${CFAIL}FAIL${CNORMAL}\n" >&2; fi
+       if [ -n "$APT_DEBUG_TESTS" ]; then
+               $SHELL
+       fi
        EXIT_CODE=$((EXIT_CODE+1));
 }
 
@@ -64,12 +77,6 @@ if [ $MSGLEVEL -le 2 ]; then
        msgnmsg() { true; }
        msgtest() { true; }
        msgpass() { printf " ${CPASS}P${CNORMAL}"; }
-       msgskip() { printf " ${CWARNING}S${CNORMAL}" >&2; }
-       if [ -n "$CFAIL" ]; then
-               msgfail() { printf " ${CFAIL}FAIL${CNORMAL}" >&2; EXIT_CODE=$((EXIT_CODE+1)); }
-       else
-               msgfail() { printf " ###FAILED###" >&2; EXIT_CODE=$((EXIT_CODE+1)); }
-       fi
 fi
 if [ $MSGLEVEL -le 3 ]; then
        msginfo() { true; }
@@ -105,7 +112,7 @@ runapt() {
        sh|aptitude|*/*|command) ;;
        *) CMD="${BUILDDIRECTORY}/$CMD";;
        esac
-       MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${BUILDDIRECTORY} $CMD "$@"
+       MALLOC_PERTURB_=21 MALLOC_CHECK_=2 APT_CONFIG="$(getaptconfig)" LD_LIBRARY_PATH=${LIBRARYPATH} $CMD "$@"
 }
 aptconfig() { runapt apt-config "$@"; }
 aptcache() { runapt apt-cache "$@"; }
@@ -121,26 +128,18 @@ aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; }
 aptitude() { runapt aptitude "$@"; }
 aptextracttemplates() { runapt apt-extracttemplates "$@"; }
 aptinternalsolver() { runapt "${APTINTERNALSOLVER}" "$@"; }
+aptdumpsolver() { runapt "${APTDUMPSOLVER}" "$@"; }
 
 dpkg() {
-       command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
+       "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg" "$@"
 }
 dpkgcheckbuilddeps() {
        command dpkg-checkbuilddeps --admindir=${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg "$@"
 }
 gdb() {
-       echo "gdb: run »$*«"
-       CMD="$1"
+       local CMD="$1"
        shift
-
-       APT_CONFIG=aptconfig.conf LD_LIBRARY_PATH=${LIBRARYPATH} command gdb ${BUILDDIRECTORY}/$CMD --args ${BUILDDIRECTORY}/$CMD "$@"
-}
-gpg() {
-       # see apt-key for the whole trickery. Setup is done in setupenvironment
-       command gpg --ignore-time-conflict --no-options --no-default-keyring \
-               --homedir "${TMPWORKINGDIRECTORY}/gnupghome" \
-               --no-auto-check-trustdb --trust-model always \
-               "$@"
+       runapt command gdb --quiet -ex run "${BUILDDIRECTORY}/$CMD" --args "${BUILDDIRECTORY}/$CMD" "$@"
 }
 
 exitwithstatus() {
@@ -172,10 +171,23 @@ addtrap() {
 }
 
 setupenvironment() {
+       # privilege dropping and testing doesn't work if /tmp isn't world-writeable (as e.g. with libpam-tmpdir)
+       if [ -n "$TMPDIR" ] && [ "$(id -u)" = '0' ] && [ "$(stat --format '%a' "$TMPDIR")" != '1777' ]; then
+               unset TMPDIR
+       fi
        TMPWORKINGDIRECTORY=$(mktemp -d)
-       TESTDIRECTORY=$(readlink -f $(dirname $0))
+       addtrap "cd /; rm -rf $TMPWORKINGDIRECTORY;"
        msgninfo "Preparing environment for ${CCMD}$(basename $0)${CINFO} in ${TMPWORKINGDIRECTORY}… "
 
+       mkdir -m 700 "${TMPWORKINGDIRECTORY}/downloaded"
+       if [ "$(id -u)" = '0' ]; then
+               # relax permissions so that running as root with user switching works
+               umask 022
+               chmod 711 "$TMPWORKINGDIRECTORY"
+               chown _apt:root "${TMPWORKINGDIRECTORY}/downloaded"
+       fi
+
+       TESTDIRECTORY=$(readlink -f $(dirname $0))
         # allow overriding the default BUILDDIR location
        BUILDDIRECTORY=${APT_INTEGRATION_TESTS_BUILD_DIR:-"${TESTDIRECTORY}/../../build/bin"}
        LIBRARYPATH=${APT_INTEGRATION_TESTS_LIBRARY_PATH:-"${BUILDDIRECTORY}"}
@@ -183,15 +195,15 @@ setupenvironment() {
         APTHELPERBINDIR=${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"}
         APTWEBSERVERBINDIR=${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}"}
         APTINTERNALSOLVER=${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/apt-internal-solver"}
+       APTDUMPSOLVER=${APT_INTEGRATION_TESTS_DUMP_SOLVER:-"${BUILDDIRECTORY}/apt-dump-solver"}
        test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first"
         # -----
 
-       addtrap "cd /; rm -rf $TMPWORKINGDIRECTORY;"
        cd $TMPWORKINGDIRECTORY
        mkdir rootdir aptarchive keys
        cd rootdir
        mkdir -p etc/apt/apt.conf.d etc/apt/sources.list.d etc/apt/trusted.gpg.d etc/apt/preferences.d
-       mkdir -p var/cache var/lib/apt var/log tmp
+       mkdir -p usr/bin var/cache var/lib var/log tmp
        mkdir -p var/lib/dpkg/info var/lib/dpkg/updates var/lib/dpkg/triggers
        touch var/lib/dpkg/available
        mkdir -p usr/lib/apt
@@ -219,41 +231,74 @@ setupenvironment() {
                cp "${TESTDIRECTORY}/${SOURCESSFILE}" aptarchive/Sources
        fi
        cp $(find $TESTDIRECTORY -name '*.pub' -o -name '*.sec') keys/
+       chmod 644 $(find keys -name '*.pub' -o -name '*.sec')
        ln -s ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+
        echo "Dir \"${TMPWORKINGDIRECTORY}/rootdir\";" > aptconfig.conf
        echo "Dir::state::status \"${TMPWORKINGDIRECTORY}/rootdir/var/lib/dpkg/status\";" >> aptconfig.conf
-       echo "Debug::NoLocking \"true\";" >> aptconfig.conf
        echo "APT::Get::Show-User-Simulation-Note \"false\";" >> aptconfig.conf
        echo "Dir::Bin::Methods \"${METHODSDIR}\";" >> aptconfig.conf
-       echo "Dir::Bin::dpkg \"fakeroot\";" >> aptconfig.conf
-       echo "DPKG::options:: \"dpkg\";" >> aptconfig.conf
-       echo "DPKG::options:: \"--root=${TMPWORKINGDIRECTORY}/rootdir\";" >> aptconfig.conf
-       echo "DPKG::options:: \"--force-not-root\";" >> aptconfig.conf
-       echo "DPKG::options:: \"--force-bad-path\";" >> aptconfig.conf
+       # store apt-key were we can access it, even if we run it as a different user
+       # destroys coverage reporting though, so just do it for root for now
+       if [ "$(id -u)" = '0' ]; then
+               cp "${BUILDDIRECTORY}/apt-key" "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/"
+               chmod o+rx "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key"
+               echo "Dir::Bin::apt-key \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/apt-key\";" >> aptconfig.conf
+       else
+               echo "Dir::Bin::apt-key \"${BUILDDIRECTORY}/apt-key\";" >> aptconfig.conf
+       fi
+
+       cat << EOF > "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg"
+#!/bin/sh
+set -e
+if [ -r "${TMPWORKINGDIRECTORY}/noopchroot.so" ]; then
+       if [ -n "\$LD_PRELOAD" ]; then
+               export LD_PRELOAD="${TMPWORKINGDIRECTORY}/noopchroot.so \${LD_PRELOAD}"
+       else
+               export LD_PRELOAD="${TMPWORKINGDIRECTORY}/noopchroot.so"
+       fi
+fi
+exec fakeroot dpkg --root="${TMPWORKINGDIRECTORY}/rootdir" \\
+       --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log \\
+       --force-not-root --force-bad-path "\$@"
+EOF
+       chmod +x "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg"
+       echo "Dir::Bin::dpkg \"${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg\";" > rootdir/etc/apt/apt.conf.d/99dpkg
+
        if ! command dpkg --assert-multi-arch >/dev/null 2>&1; then
                echo "DPKG::options:: \"--force-architecture\";" >> aptconfig.conf # Added to test multiarch before dpkg is ready for it…
        fi
-       echo "DPKG::options:: \"--log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log\";" >> aptconfig.conf
        echo 'quiet::NoUpdate "true";' >> aptconfig.conf
-       echo "Acquire::https::CaInfo \"${TESTDIR}/apt.pem\";" > rootdir/etc/apt/apt.conf.d/99https
-        echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary
+       echo 'quiet::NoStatistic "true";' >> aptconfig.conf
+       # too distracting for users, but helpful to detect changes
+       echo 'Acquire::Progress::Ignore::ShowErrorText "true";' >> aptconfig.conf
+       # in testcases, it can appear as if localhost has a rotation setup,
+       # hide this as we can't really deal with it properly
+       echo 'Acquire::Failure::ShowIP "false";' >> aptconfig.conf
+
+       cp "${TESTDIRECTORY}/apt.pem" "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem"
+       if [ "$(id -u)" = '0' ]; then
+               chown _apt:root "${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem"
+       fi
+       echo "Acquire::https::CaInfo \"${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem\";" > rootdir/etc/apt/apt.conf.d/99https
+       echo "Apt::Cmd::Disable-Script-Warning \"1\";" > rootdir/etc/apt/apt.conf.d/apt-binary
        configcompression '.' 'gz' #'bz2' 'lzma' 'xz'
 
-       # gpg needs a trustdb to function, but it can't be invalid (not even empty)
-       # see also apt-key where this trickery comes from:
-       local TRUSTDBDIR="${TMPWORKINGDIRECTORY}/gnupghome"
-       mkdir "$TRUSTDBDIR"
-       chmod 700 "$TRUSTDBDIR"
-       # We also don't use a secret keyring, of course, but gpg panics and
-       # implodes if there isn't one available - and writeable for imports
-       local SECRETKEYRING="${TRUSTDBDIR}/secring.gpg"
-       touch $SECRETKEYRING
-       # now create the trustdb with an (empty) dummy keyring
-       # newer gpg versions are fine without it, but play it safe for now
-       gpg --quiet --check-trustdb --secret-keyring $SECRETKEYRING --keyring $SECRETKEYRING >/dev/null 2>&1
+       # create some files in /tmp and look at user/group to get what this means
+       TEST_DEFAULT_USER="$USER"
+       if [ "$(uname)" = 'GNU/kFreeBSD' ]; then
+               TEST_DEFAULT_GROUP='root'
+       else
+               TEST_DEFAULT_GROUP="$USER"
+       fi
+
+        # Acquire::AllowInsecureRepositories=false is not yet the default
+        # but we want it to be the default soon
+        configallowinsecurerepositories "false";
 
        # cleanup the environment a bit
-       export PATH="${PATH}:/usr/local/sbin:/usr/sbin:/sbin"
+        # prefer our apt binaries over the system apt binaries
+       export PATH="${BUILDDIRECTORY}:${PATH}:/usr/local/sbin:/usr/sbin:/sbin"
        export LC_ALL=C.UTF-8
        unset LANGUAGE APT_CONFIG
        unset GREP_OPTIONS DEB_BUILD_PROFILES
@@ -275,7 +320,7 @@ getarchitecture() {
 }
 
 getarchitectures() {
-       echo "$(aptconfig dump | grep APT::Architecture | cut -d'"' -f 2 | sed '/^$/ d' | sort | uniq | tr '\n' ' ')"
+       aptconfig dump --no-empty --format '%v%n' APT::Architecture APT::Architectures | sort -u | tr '\n' ' '
 }
 
 getarchitecturesfromcommalist() {
@@ -355,22 +400,15 @@ int execvp(const char *file, char *const argv[]) {
        char newfile[strlen(chrootdir) + strlen(file)];
        strcpy(newfile, chrootdir);
        strcat(newfile, file);
+       char const * const baseadmindir = "/var/lib/dpkg";
+       char admindir[strlen(chrootdir) + strlen(baseadmindir)];
+       strcpy(admindir, chrootdir);
+       strcat(admindir, baseadmindir);
+       setenv("DPKG_ADMINDIR", admindir, 1);
        return func_execvp(newfile, argv);
 }
 EOF
        testsuccess --nomsg gcc -fPIC -shared -o noopchroot.so noopchroot.c -ldl
-
-       mkdir -p "${TMPWORKINGDIRECTORY}/rootdir/usr/bin/"
-       DPKG="${TMPWORKINGDIRECTORY}/rootdir/usr/bin/dpkg"
-       echo "#!/bin/sh
-if [ -n \"\$LD_PRELOAD\" ]; then
-       export LD_PRELOAD=\"${TMPWORKINGDIRECTORY}/noopchroot.so \${LD_PRELOAD}\"
-else
-       export LD_PRELOAD=\"${TMPWORKINGDIRECTORY}/noopchroot.so\"
-fi
-dpkg \"\$@\"" > $DPKG
-       chmod +x $DPKG
-       sed -ie "s|^DPKG::options:: \"dpkg\";\$|DPKG::options:: \"$DPKG\";|" aptconfig.conf
 }
 
 configallowinsecurerepositories() {
@@ -534,8 +572,8 @@ Package: $NAME" >> ${BUILDDIR}/debian/control
                | while read SRC; do
                echo "pool/${SRC}" >> ${BUILDDIR}/../${RELEASE}.${DISTSECTION}.srclist
 #              if expr match "${SRC}" '.*\.dsc' >/dev/null 2>&1; then
-#                      gpg --yes --secret-keyring ./keys/joesixpack.sec \
-#                              --keyring ./keys/joesixpack.pub --default-key 'Joe Sixpack' \
+#                      aptkey --keyring ./keys/joesixpack.pub --secret-keyring ./keys/joesixpack.sec --quiet --readonly \
+#                              adv --yes --default-key 'Joe Sixpack' \
 #                              --clearsign -o "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC"
 #                      mv "${BUILDDIR}/../${SRC}.sign" "${BUILDDIR}/../$SRC"
 #              fi
@@ -602,12 +640,8 @@ buildaptarchive() {
 
 createaptftparchiveconfig() {
        local COMPRESSORS="$(cut -d'    ' -f 1 ${TMPWORKINGDIRECTORY}/rootdir/etc/testcase-compressor.conf | tr '\n' ' ')"
-       COMPRESSORS="${COMPRESSORS%* }"
-       local ARCHS="$(find pool/ -name '*.deb' | grep -oE '_[a-z0-9-]+\.deb$' | sort | uniq | sed -e '/^_all.deb$/ d' -e 's#^_\([a-z0-9-]*\)\.deb$#\1#' | tr '\n' ' ')"
-       if [ -z "$ARCHS" ]; then
-               # the pool is empty, so we will operate on faked packages - let us use the configured archs
-               ARCHS="$(getarchitectures)"
-       fi
+       local COMPRESSORS="${COMPRESSORS%* }"
+       local ARCHS="$(getarchitectures)"
        echo -n 'Dir {
        ArchiveDir "' >> ftparchive.conf
        echo -n $(readlink -f .) >> ftparchive.conf
@@ -679,40 +713,52 @@ buildaptftparchivedirectorystructure() {
 }
 
 insertpackage() {
-       local RELEASE="$1"
+       local RELEASES="$1"
        local NAME="$2"
        local ARCH="$3"
        local VERSION="$4"
        local DEPENDENCIES="$5"
        local PRIORITY="${6:-optional}"
-       local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASE}
+       local DESCRIPTION="${7:-"an autogenerated dummy ${NAME}=${VERSION}/${RELEASES}
  If you find such a package installed on your system,
  something went horribly wrong! They are autogenerated
  und used only by testcases and surf no other propose…"}"
        local ARCHS=""
-       for arch in $(getarchitecturesfromcommalist "$ARCH"); do
-               if [ "$arch" = 'all' -o "$arch" = 'none' ]; then
-                       ARCHS="$(getarchitectures)"
-               else
-                       ARCHS="$arch"
+       for RELEASE in $(printf '%s' "$RELEASES" | tr ',' '\n'); do
+               if [ "$RELEASE" = 'installed' ]; then
+                       insertinstalledpackage "$2" "$3" "$4" "$5" "$6" "$7"
+                       continue
                fi
-               for BUILDARCH in $ARCHS; do
-                       local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}"
-                       mkdir -p $PPATH aptarchive/dists/${RELEASE}/main/source
-                       touch aptarchive/dists/${RELEASE}/main/source/Sources
-                       local FILE="${PPATH}/Packages"
-                       echo "Package: $NAME
+               for arch in $(getarchitecturesfromcommalist "$ARCH"); do
+                       if [ "$arch" = 'all' -o "$arch" = 'none' ]; then
+                               ARCHS="$(getarchitectures)"
+                       else
+                               ARCHS="$arch"
+                       fi
+                       for BUILDARCH in $ARCHS; do
+                               local PPATH="aptarchive/dists/${RELEASE}/main/binary-${BUILDARCH}"
+                               mkdir -p $PPATH
+                               local FILE="${PPATH}/Packages"
+                               echo "Package: $NAME
 Priority: $PRIORITY
 Section: other
 Installed-Size: 42
 Maintainer: Joe Sixpack <joe@example.org>" >> $FILE
-                       test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE
-                       echo "Version: $VERSION
+                               test "$arch" = 'none' || echo "Architecture: $arch" >> $FILE
+                               echo "Version: $VERSION
 Filename: pool/main/${NAME}/${NAME}_${VERSION}_${arch}.deb" >> $FILE
-                       test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
-                       echo "Description: $DESCRIPTION" >> $FILE
-                       echo >> $FILE
+                               test -z "$DEPENDENCIES" || echo "$DEPENDENCIES" >> $FILE
+                               echo "Description: $(printf '%s' "$DESCRIPTION" | head -n 1)" >> $FILE
+                               echo "Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)" >> $FILE
+                               echo >> $FILE
+                       done
                done
+               mkdir -p aptarchive/dists/${RELEASE}/main/source aptarchive/dists/${RELEASE}/main/i18n
+               touch aptarchive/dists/${RELEASE}/main/source/Sources
+               echo "Package: $NAME
+Description-md5: $(printf '%s' "$DESCRIPTION" | md5sum | cut -d' ' -f 1)
+Description-en: $DESCRIPTION
+" >> aptarchive/dists/${RELEASE}/main/i18n/Translation-en
        done
 }
 
@@ -783,12 +829,12 @@ buildaptarchivefromincoming() {
        testsuccess aptftparchive generate ftparchive.conf
        cd - > /dev/null
        msgdone "info"
-       generatereleasefiles
+       generatereleasefiles "$@"
 }
 
 buildaptarchivefromfiles() {
        msginfo "Build APT archive for ${CCMD}$(basename $0)${CINFO} based on prebuild files…"
-       find aptarchive -name 'Packages' -o -name 'Sources' | while read line; do
+       find aptarchive -name 'Packages' -o -name 'Sources' -o -name 'Translation-*' | while read line; do
                msgninfo "\t${line} file… "
                compressfile "$line" "$1"
                msgdone "info"
@@ -898,24 +944,29 @@ setupflataptarchive() {
 }
 
 setupaptarchive() {
-       buildaptarchive
+       local NOUPDATE=0
+       if [ "$1" = '--no-update' ]; then
+               NOUPDATE=1
+               shift
+       fi
+       buildaptarchive "$@"
        if [ -e aptarchive/dists ]; then
                setupdistsaptarchive
        else
                setupflataptarchive
        fi
-       signreleasefiles
-       if [ "$1" != '--no-update' ]; then
-               msgninfo "\tSync APT's cache with the archive… "
-               aptget update -qq
-               msgdone "info"
+       signreleasefiles 'Joe Sixpack'
+       if [ "1" != "$NOUPDATE" ]; then
+               testsuccess aptget update -o Debug::pkgAcquire::Worker=true -o Debug::Acquire::gpgv=true
        fi
 }
 
 signreleasefiles() {
        local SIGNER="${1:-Joe Sixpack}"
-       local GPG="gpg --batch --yes"
-       msgninfo "\tSign archive with $SIGNER key… "
+       local REPODIR="${2:-aptarchive}"
+       local KEY="keys/$(echo "$SIGNER" | tr 'A-Z' 'a-z' | sed 's# ##g')"
+       local GPG="aptkey --quiet --keyring ${KEY}.pub --secret-keyring ${KEY}.sec --readonly adv --batch --yes"
+       msgninfo "\tSign archive with $SIGNER key $KEY… "
        local REXKEY='keys/rexexpired'
        local SECEXPIREBAK="${REXKEY}.sec.bak"
        local PUBEXPIREBAK="${REXKEY}.pub.bak"
@@ -931,18 +982,15 @@ signreleasefiles() {
                        cp $SECUNEXPIRED ${REXKEY}.sec
                        cp $PUBUNEXPIRED ${REXKEY}.pub
                else
-                       printf "expire\n1w\nsave\n" | $GPG --keyring ${REXKEY}.pub --secret-keyring ${REXKEY}.sec --command-fd 0 --edit-key "${SIGNER}" >/dev/null 2>&1 || true
+                       if ! printf "expire\n1w\nsave\n" | $GPG --default-key "$SIGNER" --command-fd 0 --edit-key "${SIGNER}" >setexpire.gpg 2>&1; then
+                               cat setexpire.gpg
+                               exit 1
+                       fi
                        cp ${REXKEY}.sec $SECUNEXPIRED
                        cp ${REXKEY}.pub $PUBUNEXPIRED
                fi
        fi
-       for KEY in $(find keys/ -name '*.sec'); do
-               GPG="$GPG --secret-keyring $KEY"
-       done
-       for KEY in $(find keys/ -name '*.pub'); do
-               GPG="$GPG --keyring $KEY"
-       done
-       for RELEASE in $(find aptarchive/ -name Release); do
+       for RELEASE in $(find ${REPODIR}/ -name Release); do
                $GPG --default-key "$SIGNER" --armor --detach-sign --sign --output ${RELEASE}.gpg ${RELEASE}
                local INRELEASE="$(echo "${RELEASE}" | sed 's#/Release$#/InRelease#')"
                $GPG --default-key "$SIGNER" --clearsign --output $INRELEASE $RELEASE
@@ -957,23 +1005,35 @@ signreleasefiles() {
 }
 
 webserverconfig() {
-       msgtest "Set webserver config option '${1}' to" "$2"
+       local NOCHECK=false
+       if [ "$1" = '--no-check' ]; then
+               NOCHECK=true
+               shift
+       fi
        local DOWNLOG='rootdir/tmp/download-testfile.log'
-       local STATUS='rootdir/tmp/webserverconfig.status'
+       local STATUS='downloaded/webserverconfig.status'
        rm -f "$STATUS" "$DOWNLOG"
-       if downloadfile "http://localhost:8080/_config/set/${1}/${2}" "$STATUS" > "$DOWNLOG"; then
+       local URI
+       if [ -n "$2" ]; then
+               msgtest "Set webserver config option '${1}' to" "$2"
+               URI="http://localhost:8080/_config/set/${1}/${2}"
+       else
+               msgtest 'Clear webserver config option' "${1}"
+               URI="http://localhost:8080/_config/clear/${1}"
+       fi
+       if downloadfile "$URI" "$STATUS" > "$DOWNLOG"; then
                msgpass
        else
-               cat "$DOWNLOG" "$STATUS"
+               cat "$DOWNLOG" "$STATUS" || true
                msgfail
        fi
-       testwebserverlaststatuscode '200'
+       $NOCHECK || testwebserverlaststatuscode '200'
 }
 
 rewritesourceslist() {
        local APTARCHIVE="file://$(readlink -f "${TMPWORKINGDIRECTORY}/aptarchive")"
        for LIST in $(find rootdir/etc/apt/sources.list.d/ -name 'apt-test-*.list'); do
-               sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#http://localhost:8080/#${1}#" -e "s#http://localhost:4433/#${1}#"
+               sed -i $LIST -e "s#$APTARCHIVE#${1}#" -e "s#http://localhost:8080/#${1}#" -e "s#https://localhost:4433/#${1}#"
        done
 }
 
@@ -1024,7 +1084,7 @@ changetohttpswebserver() {
                changetowebserver --no-rewrite "$@"
        fi
        echo "pid = ${TMPWORKINGDIRECTORY}/aptarchive/stunnel.pid
-cert = ${TESTDIRECTORY}/apt.pem
+cert = ${TMPWORKINGDIRECTORY}/rootdir/etc/webserver.pem
 output = /dev/null
 
 [https]
@@ -1060,7 +1120,7 @@ acquire::cdrom::autodetect 0;" > rootdir/etc/apt/apt.conf.d/00cdrom
        mv "${CD}" "${CD}-unmounted"
        # we don't want the disk to be modifiable
        addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/media/cdrom/dists/ $PWD/rootdir/media/cdrom-unmounted/dists/ || true;"
-       chmod -R -w rootdir/media/cdrom-unmounted/dists
+       chmod -R 555 rootdir/media/cdrom-unmounted/dists
 }
 
 downloadfile() {
@@ -1068,7 +1128,7 @@ downloadfile() {
        apthelper -o Debug::Acquire::${PROTO}=1 -o Debug::pkgAcquire::Worker=1 \
                download-file "$1" "$2" 2>&1 || true
        # only if the file exists the download was successful
-       if [ -e "$2" ]; then
+       if [ -r "$2" ]; then
                return 0
        else
                return 1
@@ -1076,7 +1136,7 @@ downloadfile() {
 }
 
 checkdiff() {
-       local DIFFTEXT="$(command diff -u "$@" | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')"
+       local DIFFTEXT="$(command diff -u "$@" 2>&1 | sed -e '/^---/ d' -e '/^+++/ d' -e '/^@@/ d')"
        if [ -n "$DIFFTEXT" ]; then
                echo >&2
                echo >&2 "$DIFFTEXT"
@@ -1100,12 +1160,14 @@ testfileequal() {
 testempty() {
        msgtest "Test for no output of" "$*"
        local COMPAREFILE="${TMPWORKINGDIRECTORY}/rootdir/tmp/testempty.comparefile"
-       if $* >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then
+       if "$@" >$COMPAREFILE 2>&1 && test ! -s $COMPAREFILE; then
                msgpass
        else
+               echo
                cat $COMPAREFILE
                msgfail
        fi
+       aptautotest 'testempty' "$@"
 }
 
 testequal() {
@@ -1123,6 +1185,7 @@ testequal() {
                msgtest "$MSG" "$*"
        fi
        "$@" 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
+       aptautotest 'testequal' "$@"
 }
 
 testequalor2() {
@@ -1133,7 +1196,7 @@ testequalor2() {
        echo "$2" > $COMPAREFILE2
        shift 2
        msgtest "Test for equality OR of" "$*"
-       $* >$COMPAREAGAINST 2>&1 || true
+       "$@" >$COMPAREAGAINST 2>&1 || true
        if checkdiff $COMPAREFILE1 $COMPAREAGAINST >/dev/null 2>&1 || \
                checkdiff $COMPAREFILE2 $COMPAREAGAINST >/dev/null 2>&1
        then
@@ -1145,6 +1208,7 @@ testequalor2() {
                checkdiff $COMPAREFILE2 $COMPAREAGAINST || true
                msgfail
        fi
+       aptautotest 'testequalor2' "$@"
 }
 
 testshowvirtual() {
@@ -1213,6 +1277,36 @@ testmarkedauto() {
        aptmark showauto 2>&1 | checkdiff $COMPAREFILE - && msgpass || msgfail
 }
 
+msgfailoutput() {
+       local MSG="$1"
+       local OUTPUT="$2"
+       shift 2
+       echo >&2
+       if [ "$1" = 'grep' ]; then
+               while [ -n "$2" ]; do shift; done
+               echo "#### Complete file: $1 ####"
+               cat >&2 "$1" || true
+               echo '#### grep output ####'
+       elif [ "$1" = 'test' ]; then
+               # doesn't support ! or non-file flags
+               msgfailoutputstatfile() {
+                       local FILEFLAGS='^-[bcdefgGhkLOprsStuwx]$'
+                       if expr match "$1" "$FILEFLAGS" >/dev/null; then
+                               echo "#### stat(2) of file: $2 ####"
+                               stat "$2" || true
+                       fi
+               }
+               msgfailoutputstatfile "$2" "$3"
+               while [ -n "$5" ] && [ "$4" = '-o' -o "$4" = '-a' ]; do
+                       shift 3
+                       msgfailoutputstatfile "$2" "$3"
+               done
+               echo '#### test output ####'
+       fi
+       cat >&2 $OUTPUT
+       msgfail "$MSG"
+}
+
 testsuccess() {
        if [ "$1" = '--nomsg' ]; then
                shift
@@ -1221,14 +1315,52 @@ testsuccess() {
        fi
        local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
        if "$@" >${OUTPUT} 2>&1; then
-               msgpass
+               if expr match "$1" '^apt.*' >/dev/null; then
+                       if grep -q -E ' runtime error: ' "$OUTPUT"; then
+                               msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+                       elif grep -q -E '^[WE]: ' "$OUTPUT"; then
+                               msgfailoutput 'successful run, but output contains warnings/errors' "$OUTPUT" "$@"
+                       else
+                               msgpass
+                       fi
+               else
+                       msgpass
+               fi
        else
+               local EXITCODE=$?
+               msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
+       fi
+       aptautotest 'testsuccess' "$@"
+}
+testwarning() {
+       if [ "$1" = '--nomsg' ]; then
+               shift
+       else
+               msgtest 'Test for successful execution with warnings of' "$*"
+       fi
+       local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testsuccess.output"
+       if "$@" >${OUTPUT} 2>&1; then
+               if expr match "$1" '^apt.*' >/dev/null; then
+                       if grep -q -E ' runtime error: ' "$OUTPUT"; then
+                               msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+                       elif grep -q -E '^E: ' "$OUTPUT"; then
+                               msgfailoutput 'successful run, but output contains errors' "$OUTPUT" "$@"
+                       elif ! grep -q -E '^W: ' "$OUTPUT"; then
+                               msgfailoutput 'successful run, but output contains no warnings' "$OUTPUT" "$@"
+                       else
+                               msgpass
+                       fi
+               else
+                       msgpass
+               fi
+       else
+               local EXITCODE=$?
                echo >&2
                cat >&2 $OUTPUT
-               msgfail
+               msgfail "exitcode $EXITCODE"
        fi
+       aptautotest 'testwarning' "$@"
 }
-
 testfailure() {
        if [ "$1" = '--nomsg' ]; then
                shift
@@ -1236,22 +1368,48 @@ testfailure() {
                msgtest 'Test for failure in execution of' "$*"
        fi
        local OUTPUT="${TMPWORKINGDIRECTORY}/rootdir/tmp/testfailure.output"
-       if $@ >${OUTPUT} 2>&1; then
-               echo >&2
-               cat >&2 $OUTPUT
-               msgfail
+       if "$@" >${OUTPUT} 2>&1; then
+               local EXITCODE=$?
+               msgfailoutput "exitcode $EXITCODE" "$OUTPUT" "$@"
        else
+               local EXITCODE=$?
+               if expr match "$1" '^apt.*' >/dev/null; then
+                       if grep -q -E ' runtime error: ' "$OUTPUT"; then
+                               msgfailoutput 'compiler detected undefined behavior' "$OUTPUT" "$@"
+                       elif ! grep -q -E '^E: ' "$OUTPUT"; then
+                               msgfailoutput "run failed with exitcode ${EXITCODE}, but with no errors" "$OUTPUT" "$@"
+                       else
+                               msgpass
+                       fi
+               else
+                       msgpass
+               fi
+       fi
+       aptautotest 'testfailure' "$@"
+}
+
+testfilestats() {
+       msgtest "Test that file $1 has $2 $3" "$4"
+       if [ "$4" "$3" "$(stat --format "$2" "$1")" ]; then
                msgpass
+       else
+               echo >&2
+               ls -ld >&2 "$1"
+               echo -n >&2 "stat(1) reports for $2: "
+               stat --format "$2" "$1"
+               msgfail
        fi
 }
+testaccessrights() {
+       testfilestats "$1" '%a' '=' "$2"
+}
 
 testwebserverlaststatuscode() {
        local DOWNLOG='rootdir/tmp/webserverstatus-testfile.log'
-       local STATUS='rootdir/tmp/webserverstatus-statusfile.log'
+       local STATUS='downloaded/webserverstatus-statusfile.log'
        rm -f "$DOWNLOG" "$STATUS"
        msgtest 'Test last status code from the webserver was' "$1"
-       downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG"
-       if [ "$(cat "$STATUS")" = "$1" ]; then
+       if downloadfile "http://localhost:8080/_config/find/aptwebserver::last-status-code" "$STATUS" > "$DOWNLOG" && [ "$(cat "$STATUS")" = "$1" ]; then
                msgpass
        else
                echo >&2
@@ -1271,3 +1429,79 @@ pause() {
        local IGNORE
        read IGNORE
 }
+
+listcurrentlistsdirectory() {
+       find rootdir/var/lib/apt/lists -maxdepth 1 -type d | while read line; do
+               stat --format '%U:%G:%a:%n' "$line"
+       done
+       find rootdir/var/lib/apt/lists -maxdepth 1 \! -type d | while read line; do
+               stat --format '%U:%G:%a:%s:%y:%n' "$line"
+       done
+}
+
+### convinience hacks ###
+mkdir() {
+       # creating some directories by hand is a tedious task, so make it look simple
+       if [ "$*" = '-p rootdir/var/lib/apt/lists' ] || [ "$*" = "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" ] ||
+          [ "$*" = '-p rootdir/var/lib/apt/lists/partial' ] || [ "$*" = "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial" ]; then
+               # only the last directory created by mkdir is effected by the -m !
+               command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt"
+               command mkdir -m 755 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"
+               command mkdir -m 700 -p "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial"
+               touch "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/lock"
+               if [ "$(id -u)" = '0' ]; then
+                       chown _apt:root "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists/partial"
+               fi
+       else
+               command mkdir "$@"
+       fi
+}
+
+### The following tests are run by most test methods automatically to check
+### general things about commands executed without writing the test every time.
+
+aptautotest() {
+       local TESTCALL="$1"
+       local CMD="$2"
+       local FIRSTOPT="$3"
+       local AUTOTEST="aptautotest_$(basename "$CMD" | tr -d '-')_$(echo "$FIRSTOPT" | tr -d '-')"
+       if command -v $AUTOTEST >/dev/null; then
+               shift 3
+               # save and restore the *.output files from other tests
+               # as we might otherwise override them in these automatic tests
+               rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-before
+               mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-before
+               mkdir ${TMPWORKINGDIRECTORY}/rootdir/tmp
+               $AUTOTEST "$TESTCALL" "$@"
+               rm -rf ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest
+               mv ${TMPWORKINGDIRECTORY}/rootdir/tmp ${TMPWORKINGDIRECTORY}/rootdir/tmp-aptautotest
+               mv ${TMPWORKINGDIRECTORY}/rootdir/tmp-before ${TMPWORKINGDIRECTORY}/rootdir/tmp
+       fi
+}
+
+aptautotest_aptget_update() {
+       if ! test -d "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists"; then return; fi
+       testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:755"
+       testfilestats "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:755"
+       # all copied files are properly chmodded
+       for file in $(find "${TMPWORKINGDIRECTORY}/rootdir/var/lib/apt/lists" -maxdepth 1 -type f ! -name 'lock'); do
+               testfilestats "$file" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644"
+       done
+}
+aptautotest_apt_update() { aptautotest_aptget_update "$@"; }
+
+testaptautotestnodpkgwarning() {
+       local TESTCALL="$1"
+       while [ -n "$2" ]; do
+               if [ "$2" = '-s' ]; then return; fi
+               shift
+       done
+       testfailure grep '^dpkg: warning:.*ignor.*' "${TMPWORKINGDIRECTORY}/rootdir/tmp-before/${TESTCALL}.output"
+}
+
+aptautotest_aptget_install() { testaptautotestnodpkgwarning "$@"; }
+aptautotest_aptget_remove() { testaptautotestnodpkgwarning "$@"; }
+aptautotest_aptget_purge() { testaptautotestnodpkgwarning "$@"; }
+aptautotest_apt_install() { testaptautotestnodpkgwarning "$@"; }
+aptautotest_apt_remove() { testaptautotestnodpkgwarning "$@"; }
+aptautotest_apt_purge() { testaptautotestnodpkgwarning "$@"; }
index c39a2ac68a16bef50d93a791c53e9dbd1aeed1d8..6c6a376116f88f9838727183f29e13ed332dcf57 100755 (executable)
@@ -46,7 +46,11 @@ for testcase in $(run-parts --list $DIR | grep '/test-'); do
        if ! ${testcase}; then
                FAIL=$((FAIL+1))
                FAILED_TESTS="$FAILED_TESTS $(basename $testcase)"
-               echo >&2 "$(basename $testcase) ... FAIL"
+               if [ "$MSGLEVEL" -le 2 ]; then
+                       printf >&2 "\n${CHIGH}Running $(basename $testcase) -> FAILED${CRESET}"
+               else
+                       echo >&2 "${CHIGH}Running $(basename $testcase) -> FAILED${CRESET}"
+               fi
        else
                PASS=$((PASS+1))
        fi
diff --git a/test/integration/skip-aptwebserver b/test/integration/skip-aptwebserver
new file mode 100755 (executable)
index 0000000..0622941
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+buildsimplenativepackage 'apt' 'all' '1.0' 'stable'
+
+setupaptarchive
+changetowebserver
+
+rm -rf rootdir/var/lib/apt/lists
+aptget update -qq
+testequal 'Hit http://localhost stable InRelease
+Hit http://localhost stable/main Sources
+Hit http://localhost stable/main amd64 Packages
+Hit http://localhost stable/main Translation-en
+Reading package lists...' aptget update
+
+mv rootdir/var/lib/apt/lists/localhost* rootdir/var/lib/apt/lists/partial
+aptget update
+
diff --git a/test/integration/test-00-commands-have-help b/test/integration/test-00-commands-have-help
new file mode 100755 (executable)
index 0000000..bbd1475
--- /dev/null
@@ -0,0 +1,63 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+# this test does double duty: The obvious is checking for --help and co,
+# but it also checks if the binary can find all methods in the library.
+# The later is quite handy for manual testing of non-abibreaking changes
+export LD_BIND_NOW=1
+
+checkversionmessage() {
+       testsuccess grep '^apt .* compiled on ' ${1}-help.output
+}
+
+checkhelpmessage() {
+       checkversionmessage "$1"
+       testsuccess grep '^Usage:' ${1}-help.output
+}
+
+checkoptions() {
+       testsuccess $1 --help
+       cp -f rootdir/tmp/testsuccess.output ${1}-help.output
+       checkhelpmessage "$1"
+
+       testsuccess $1 --version
+       cp -f rootdir/tmp/testsuccess.output ${1}-help.output
+       checkversionmessage "$1"
+}
+
+for CMD in 'apt-cache' 'apt-cdrom' 'apt-config' \
+       'apt-extracttemplates' 'apt-get' 'apt-helper' \
+       'apt-mark' 'apt-sortpkgs' 'apt' 'apt-ftparchive'; do
+       cmd="$(echo "$CMD" | tr -d '-')"
+       msgtest 'Test for failure with no parameters calling' "$CMD"
+       if $cmd > ${cmd}-help.output 2>&1; then
+               echo
+               cat ${cmd}-help.output
+               msgfail 'zero exit'
+       else
+               msgpass
+       fi
+       checkhelpmessage "$cmd"
+       checkoptions "$cmd"
+done
+
+for CMD in 'apt-dump-solver'  'apt-internal-solver'; do
+       checkoptions "$(echo "$CMD" | tr -d '-')"
+done
+
+# in times of need, we all look for super cow to save the day
+testsuccess aptget moo
+testsuccess aptget moo -q=2
+testsuccess aptget moo moo
+testsuccess aptget moo moo -q=2
+testsuccess aptget moo moo --color
+testsuccess aptget moo moo moo
+testsuccess aptget moo moo moo -q=2
+testsuccess aptget moo moo moo moo
+testsuccess aptget moo moo moo moo -q=2
index d60cb8dafbba71bbc68636d5329d0cb8218bc84e..e1d805ce91dbab8d2183790b9786a0973b0f678a 100755 (executable)
@@ -44,6 +44,7 @@ insertinstalledpackage 'libdb-dev' 'amd64' '5.1.7' 'Depends: libdb5.1-dev'
 insertinstalledpackage 'libdb5.1-dev' 'amd64' '5.1.29-7'
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   libdb5.1-dev
 The following NEW packages will be installed:
@@ -58,6 +59,7 @@ Conf libdb5.3-dev (5.3.28-3 unversioned [amd64])
 Conf libdb-dev (5.3.0 unversioned [amd64])' aptget dist-upgrade -st unversioned
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   libdb5.1-dev
 The following NEW packages will be installed:
@@ -76,21 +78,25 @@ insertinstalledpackage 'foo' 'amd64' '1'
 insertinstalledpackage 'bar' 'amd64' '1'
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   bar foo
 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st unversioned
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   bar foo
 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st versioned
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   bar foo
 0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.' aptget dist-upgrade -st multipleno
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   foo
 The following packages will be upgraded:
@@ -155,6 +161,7 @@ insertinstalledpackage 'login' 'amd64' '1' 'Essential: yes'
 insertinstalledpackage 'libaudit0' 'amd64' '1'
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   gdm3 libaudit0
 The following NEW packages will be installed:
diff --git a/test/integration/test-apt-by-hash-update b/test/integration/test-apt-by-hash-update
new file mode 100755 (executable)
index 0000000..d9d0b14
--- /dev/null
@@ -0,0 +1,49 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+insertpackage 'unstable' 'foo' 'all' '1.0'
+
+setupaptarchive --no-update
+
+APTARCHIVE=$(readlink -f ./aptarchive)
+
+# make Packages *only* accessable by-hash for this test
+mkdir -p aptarchive/dists/unstable/main/binary-i386/by-hash/SHA512
+(cd  aptarchive/dists/unstable/main/binary-i386/by-hash/SHA512 && 
+     mv ../../Packages* . &&
+     ln -s Packages.gz  $(sha512sum Packages.gz|cut -f1 -d' ') )
+
+# add sources
+mkdir -p aptarchive/dists/unstable/main/source/by-hash/SHA512
+(cd  aptarchive/dists/unstable/main/source/by-hash/SHA512 && 
+     ln -s ../../Sources.gz  $(sha512sum ../../Sources.gz|cut -f1 -d' ') 
+)
+
+# we moved the Packages file away, normal update won't work
+testfailure aptget upate
+
+# ensure we do not know about "foo"
+testequal "Reading package lists...
+Building dependency tree...
+E: Unable to locate package foo" aptget install -q -s foo
+
+# ensure we can apt-get update by hash
+testsuccess aptget update -o APT::Acquire::By-Hash=1 -o Acquire::Languages=none
+
+# ensure it works
+testequal "Inst foo (1.0 unstable [all])
+Conf foo (1.0 unstable [all])" aptget install -qq -s foo
+
+# add magic string to Release file ...
+MAGIC="Acquire-By-Hash: true"
+sed -i "s#Suite: unstable#Suite: unstable\n$MAGIC#" aptarchive/dists/unstable/Release
+signreleasefiles
+# ... and verify that it fetches by hash now
+testsuccess aptget update -o Acquire::Languages=none
+
diff --git a/test/integration/test-apt-cache b/test/integration/test-apt-cache
new file mode 100755 (executable)
index 0000000..f47c0e0
--- /dev/null
@@ -0,0 +1,124 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64' 'i386'
+
+DESCR='Some description
+ That has multiple lines'
+insertpackage 'unstable' 'fancy' 'all' '1'
+insertpackage 'unstable,installed' 'foo' 'all' '1' 'Depends: bar
+Conflicts: foobar
+Recommends: cool (>= 2) | cooler (<< 5)' "$DESCR"
+insertpackage 'unstable' 'bar' 'all' '1' 'Depends: bar
+Breaks: foo (<< 1)
+Replaces: foo (<< 1)' "$DESCR"
+
+setupaptarchive
+
+# dpkg is installed by our framework
+testdpkginstalled 'dpkg'
+testempty aptcache unmet dpkg
+
+# FIXME: Find some usecase for unmet as it seems kinda useless/broken
+#testsuccess aptcache unmet
+#testsuccess aptcache unmet foo
+
+# not too useful to test, but makes coverage green…
+testsuccess aptcache stats
+cp rootdir/tmp/testsuccess.output stats.output
+testsuccess test -s stats.output
+testsuccess aptcache xvcg foo
+cp rootdir/tmp/testsuccess.output xvcg.output
+testsuccess test -s xvcg.output
+testsuccess aptcache dotty foo
+cp rootdir/tmp/testsuccess.output dotty.output
+testsuccess test -s dotty.output
+# for this, even the sourcecode says it is useless (expect debugging)
+testsuccess aptcache dump
+cp rootdir/tmp/testsuccess.output dump.output
+testsuccess test -s dump.output
+
+testequal 'dpkg
+bar
+fancy
+foo' aptcache pkgnames
+testequal 'bar' aptcache pkgnames bar
+testequal 'fancy
+foo' aptcache pkgnames f
+
+testequal "       foo |          1 | file:$(readlink -f .)/aptarchive/ unstable/main amd64 Packages" aptcache madison foo
+
+### depends
+
+testequal 'foo
+  Depends: bar
+ |Recommends: <cool>
+  Recommends: <cooler>
+  Conflicts: <foobar>
+  Conflicts: <foobar:i386>' aptcache depends foo
+testequal 'foo
+  Depends: bar
+  Recommends: <cool>
+  Conflicts: <foobar>
+  Conflicts: <foobar:i386>' aptcache depends foo -o APT::Cache::ShowOnlyFirstOr=1
+testequal 'foo
+  Depends: bar
+ |Recommends: <cool> (>= 2)
+  Recommends: <cooler> (<< 5)
+  Conflicts: <foobar>
+  Conflicts: <foobar:i386>' aptcache depends foo -o APT::Cache::ShowVersion=1
+testequal 'foo
+  Depends: bar
+  Conflicts: <foobar>
+  Conflicts: <foobar:i386>' aptcache depends foo --no-recommends
+testequal 'foo
+  Depends: bar' aptcache depends foo --important
+testequal 'foo
+  Conflicts: <foobar>
+  Conflicts: <foobar:i386>' aptcache depends foo --important --no-depends --conflicts
+testequal 'foo
+  Depends: bar
+ |Recommends: <cool>
+  Recommends: <cooler>
+  Conflicts: <foobar>
+  Conflicts: <foobar:i386>
+bar
+  Depends: bar
+  Breaks: foo
+  Breaks: <foo:i386>
+  Replaces: foo
+  Replaces: <foo:i386>
+<cool>
+<cooler>
+<foobar>
+<foobar:i386>
+<foo:i386>' aptcache depends foo --recurse
+testequal 'foo
+  Depends: bar
+bar
+  Depends: bar
+  Replaces: foo
+  Replaces: <foo:i386>
+<foo:i386>' aptcache depends foo --recurse --important --replaces
+
+## rdpends
+
+testequal 'foo
+Reverse Depends:
+  bar
+  bar' aptcache rdepends foo
+testequal 'foo
+Reverse Depends:
+  Replaces: bar
+  Breaks: bar' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1
+testequal 'foo
+Reverse Depends:
+  Replaces: bar (<< 1)
+  Breaks: bar (<< 1)' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 -o APT::Cache::ShowVersion=1
+testequal 'foo
+Reverse Depends:
+  Breaks: bar (<< 1)' aptcache rdepends foo -o APT::Cache::ShowDependencyType=1 -o APT::Cache::ShowVersion=1 --important --breaks
index 44eccb7bf88a0c5fdea729306685351a1be25fd8..7f4b3c2576bbae6cb4840a088cf46d13bb072c09 100755 (executable)
@@ -21,7 +21,7 @@ echo 'Description-de: automatisch generiertes Testpaket testing=0.8.15/stable
 ' >> Translation-de
 compressfile Translation-de
 rm -f Translation-en Translation-de
-chmod -R -w .
+chmod -R 555 .
 cd - > /dev/null
 
 aptcdromlog() {
@@ -29,7 +29,7 @@ aptcdromlog() {
        test ! -e rootdir/media/cdrom || echo "CD-ROM is mounted, but shouldn't be!"
        test -e rootdir/media/cdrom-unmounted || echo "Unmounted CD-ROM doesn't exist, but it should!"
        aptcdrom "$@" -o quiet=1 >rootdir/tmp/apt-cdrom.log 2>&1 </dev/null
-       sed -e '/gpgv/ d' -e '/^Identifying/ d' -e '/Reading / d' rootdir/tmp/apt-cdrom.log
+       sed -e '/gpgv\?: Signature made/ d' -e '/gpgv\?: Good signature/ d' -e '/^Identifying/ d' -e '/Reading / d' rootdir/tmp/apt-cdrom.log
        test ! -e rootdir/media/cdrom || echo "CD-ROM is mounted, but shouldn't be!"
        test -e rootdir/media/cdrom-unmounted || echo "Unmounted CD-ROM doesn't exist, but it should!"
 }
@@ -99,6 +99,7 @@ Conf testing:i386 (0.8.15 stable [i386])' aptget install testing:i386 -s
        testsuccess aptget purge testing:i386 -y
        testdpkgnotinstalled testing:i386
 
+       cd downloaded
        rm -f testing_0.8.15_amd64.deb
        testsuccess aptget download testing
        testsuccess test -s testing_0.8.15_amd64.deb
@@ -108,6 +109,7 @@ Conf testing:i386 (0.8.15 stable [i386])' aptget install testing:i386 -s
        testsuccess aptget source testing --dsc-only -d
        testsuccess test -s testing_0.8.15.dsc
        rm -f testing_0.8.15.dsc
+       cd - >/dev/null
 }
 testcdromusage
 
@@ -123,7 +125,6 @@ $CDROM_POST" aptcdromlog add
 msgtest 'Test for the german description translation of' 'testing'
 aptcache show testing -o Acquire::Languages=de | grep -q '^Description-de: ' && msgpass || msgfail
 rm -rf rootdir/var/lib/apt/lists
-mkdir -p rootdir/var/lib/apt/lists/partial
 testequal "$CDROM_PRE
 Found 2 package indexes, 1 source indexes, 1 translation indexes and 1 signatures
 $CDROM_POST" aptcdromlog add
@@ -142,3 +143,8 @@ testcdromusage
 testsuccess aptget update
 testfileequal rootdir/tmp/testsuccess.output 'Reading package lists...'
 testcdromusage
+
+msgmsg 'Check that nothing touched our' 'CD-ROM'
+for file in $(find rootdir/media/cdrom-unmounted/dists); do
+       testfilestats "$file" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:555"
+done
index 8f009d57cc5be9d988b7b8a82a77bc7485ece399..1a28ba4da5f8dba3e0a66e2e2bdc4cc6173a2252 100755 (executable)
@@ -25,6 +25,9 @@ setupaptarchive
 
 APTARCHIVE=$(readlink -f ./aptarchive)
 
+testequal 'E: You must give at least one search pattern' aptcache search
+testequal 'E: You must give at least one search pattern' apt search
+
 # with OP progress 
 testequal "Sorting...
 Full Text Search...
index 4c8e134d6557896313bb676e5bb7593970d95912..930e591e091514a8568a3a4c26f9a10d31360c23 100755 (executable)
@@ -36,3 +36,14 @@ APT-Sources: file:$APTARCHIVE/ unstable/main i386 Packages
 Description: Some description 
  That has multiple lines
 " apt show foo
+
+# this is the default, but disabled by the testcases
+testsuccess apt show foo -o Apt::Cmd::Disable-Script-Warning=0
+cp rootdir/tmp/testsuccess.output aptshow.output
+testsuccess grep '^WARNING: ' aptshow.output
+
+if [ "$(id -u)" != '0' ]; then
+       testsuccess apt install foo -s -o APT::Get::Show-User-Simulation-Note=1
+       cp rootdir/tmp/testsuccess.output aptshow.output
+       testsuccess grep '^NOTE: ' aptshow.output
+fi
index 8237bf03f08c14b7c05c5267efa5f12480937ab0..83cc94b93b7de39201ee16ea0932fa218186ed65 100755 (executable)
@@ -8,10 +8,17 @@ setupenvironment
 configarchitecture "i386"
 
 insertpackage 'unstable' 'foo' 'all' '2.0'
+cp rootdir/var/lib/dpkg/status dpkg.status
 insertinstalledpackage 'foo' 'all' '1.0'
 
-setupaptarchive
+setupaptarchive --no-update
 
 APTARCHIVE=$(readlink -f ./aptarchive)
 
+testequal 'E: The update command takes no arguments' apt update -q arguments
+
 testequal "1 package can be upgraded. Run 'apt list --upgradable' to see it." apt update -q
+
+cp dpkg.status rootdir/var/lib/dpkg/status
+insertinstalledpackage 'foo' 'all' '2.0'
+testequal 'All packages are up to date.' apt update -q
diff --git a/test/integration/test-apt-config b/test/integration/test-apt-config
new file mode 100755 (executable)
index 0000000..2f2ff9d
--- /dev/null
@@ -0,0 +1,36 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+testsuccess aptconfig dump
+testequal 'APT::Architecture "amd64";' aptconfig dump APT::Architecture
+testempty aptconfig dump config::which::does::not::exist
+
+testequal 'APT::Architectures "";
+APT::Architectures:: "amd64";' aptconfig dump APT::Architectures
+testequal 'APT::Architectures:: "amd64";' aptconfig dump --no-empty APT::Architectures
+testequal 'amd64' aptconfig dump --no-empty --format='%v%n' APT::Architectures
+
+testempty aptconfig shell
+testequal 'E: Arguments not in pairs' aptconfig shell APT::Architecture
+testempty aptconfig shell APT::Architecture ARCH # incorrect order
+testequal "ARCH='amd64'" aptconfig shell ARCH APT::Architecture
+
+ROOTDIR="$(readlink -f rootdir)"
+testequal "CONFIG='apt.conf'" aptconfig shell CONFIG Dir::Etc::main
+testequal "CONFIG='${ROOTDIR}/etc/apt/apt.conf'" aptconfig shell CONFIG Dir::Etc::main/f
+testequal "CONFIG='etc/apt/'" aptconfig shell CONFIG Dir::Etc
+testequal "CONFIG='${ROOTDIR}/etc/apt/'" aptconfig shell CONFIG Dir::Etc/ # old style
+testequal "CONFIG='${ROOTDIR}/etc/apt/'" aptconfig shell CONFIG Dir::Etc/d
+
+testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles
+export DEB_BUILD_PROFILES='nodoc stage1'
+testequal 'nodoc
+stage1' aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles
+unset DEB_BUILD_PROFILES
+testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles
index 0a9020bece02556d8f32f66ae1e733353f124d3f..b2c9effe6832e88f5d292ceaa69ec6f0cb76673d 100755 (executable)
@@ -13,12 +13,11 @@ changetohttpswebserver
 assertprogress() {
     T="$1"
     testsuccess grep "dlstatus:1:0:Retrieving file 1 of 1" "$T"
-    if ! egrep -q "dlstatus:1:[0-9]{1,2}\.(.*):Retrieving file 1 of 1" "$T"; then
+    if ! egrep -q "dlstatus:1:[1-9][0-9](\..*)?:Retrieving file 1 of 1" "$T"; then
         cat "$T"
         msgfail "Failed to detect download progress"
     fi
     testsuccess grep "dlstatus:1:100:Retrieving file 1 of 1" "$T"
-    #cat $T
 }
 
 # we need to ensure the file is reasonable big so that apt has a chance to
@@ -28,15 +27,13 @@ TESTFILE=testfile.big
 testsuccess dd if=/dev/zero of=./aptarchive/$TESTFILE bs=800k count=1 
 
 msgtest 'download progress works via' 'http'
-printf '\n'
 exec 3> apt-progress.log
-testsuccess apthelper download-file "http://localhost:8080/$TESTFILE" http-$TESTFILE -o APT::Status-Fd=3 -o Acquire::http::Dl-Limit=800
+testsuccess --nomsg apthelper download-file "http://localhost:8080/$TESTFILE" http-$TESTFILE -o APT::Status-Fd=3 -o Acquire::http::Dl-Limit=800
 assertprogress apt-progress.log
 
 msgtest 'download progress works via' 'https'
-printf '\n'
 exec 3> apt-progress.log
-testsuccess apthelper download-file "https://localhost:4433/$TESTFILE" https-$TESTFILE -o APT::Status-Fd=3 -o Acquire::https::Dl-Limit=800
+testsuccess --nomsg apthelper download-file "https://localhost:4433/$TESTFILE" https-$TESTFILE -o APT::Status-Fd=3 -o Acquire::https::Dl-Limit=800
 assertprogress apt-progress.log
 
 # cleanup
index ae2cc8bc27be05c21913eba1e5cdc32a1a9df6c2..276862464096bafecb6737947505218daaa90266 100755 (executable)
@@ -8,38 +8,63 @@ setupenvironment
 configarchitecture 'amd64'
 
 # apt-extracttemplates needs this
-insertinstalledpackage 'debconf' 'amd64' '1.5'
 insertinstalledpackage 'pkg-with-template' 'amd64' '1.0'
 
 # build a simple package that contains a config and a tempalte
 mkdir -p DEBIAN
-TEMPLATE_STR="Template: foo/bar
-Type: string
-Description: Some bar var
-"
-echo "$TEMPLATE_STR" > DEBIAN/templates
-
 CONFIG_STR="#!/bin/sh
 random shell stuff
 "
 echo "$CONFIG_STR" > DEBIAN/config
 
-buildsimplenativepackage 'pkg-with-template' 'amd64' '0.8.15' 'stable' '' 'pkg with template' '' '' './DEBIAN' 
+testrun() {
+       local TEMPLATE_STR='Template: foo/bar
+Type: string
+Description: Some bar var
+'
+       echo "$TEMPLATE_STR" > DEBIAN/templates
+       buildsimplenativepackage "$1" 'amd64' '0.8.15' 'stable' "$2" 'pkg with template' '' '' './DEBIAN'
+
+       cp dpkg.status rootdir/var/lib/dpkg/status
+       insertinstalledpackage 'debconf' 'amd64' '3'
+
+       # ensure we get the right stuff out of the file
+       rm -rf extracttemplates-out rootdir/var/cache/apt
+       mkdir extracttemplates-out
+       testsuccess aptextracttemplates -t ./extracttemplates-out incoming/${1}*.deb
+       OUT='rootdir/tmp/testsuccess.output'
+       testequal "$1" cut -f1 -d' ' $OUT
+       if [ -n "$2" ]; then
+               testequal '' cut -f2 -d' ' $OUT
+       else
+               testequal '1.0' cut -f2 -d' ' $OUT
+       fi
+       TEMPLATE=$(cut -f3 -d' ' $OUT)
+       testfileequal "$TEMPLATE" "$TEMPLATE_STR"
+       CONFIG=$(cut -f4 -d' ' $OUT)
+       testfileequal "$CONFIG" "$CONFIG_STR"
 
-# ensure we get the right stuff out of the file
-mkdir extracttemplates-out
-OUT="$(aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template*.deb)"
+       # ensure that the format of the output string has the right number of dots
+       for s in "$CONFIG" "$TEMPLATE"; do
+               NR_DOTS=$(basename "$s" | tr -c -d '.')
+               testequal '..' echo $NR_DOTS
+       done
 
-PKG=$(printf "$OUT" | cut -f1 -d' ')
-INSTALLED_VER=$(printf "$OUT" | cut -f2 -d' ')
-TEMPLATE=$(printf "$OUT" | cut -f3 -d' ')
-CONFIG=$(printf "$OUT" | cut -f4 -d' ')
+       if [ -n "$2" ]; then
+               rm -rf extracttemplates-out rootdir/var/cache/apt
+               mkdir extracttemplates-out
+               cp dpkg.status rootdir/var/lib/dpkg/status
+               insertinstalledpackage 'debconf' 'amd64' '1'
+               testempty aptextracttemplates -t ./extracttemplates-out incoming/${1}*.deb
+       fi
+}
 
-testequal "$CONFIG_STR" cat $CONFIG
-testequal "$TEMPLATE_STR" cat $TEMPLATE
+cp rootdir/var/lib/dpkg/status dpkg.status
+testrun 'pkg-with-template' ''
+testrun 'pkg-with-template-depends' 'Depends: debconf (>= 2)'
+testrun 'pkg-with-template-predepends' 'Pre-Depends: debconf (>= 2)'
 
-# ensure that the format of the output string has the right number of dots
-for s in "$CONFIG" "$TEMPLATE"; do
-    NR_DOTS=$(basename "$s" | tr -c -d .)
-    testequal ".." echo $NR_DOTS
-done
+# test with no debconf installed
+cp dpkg.status rootdir/var/lib/dpkg/status
+testfailure aptextracttemplates -t ./extracttemplates-out incoming/pkg-with-template-depends*.deb
+testfileequal 'rootdir/tmp/testfailure.output' 'E: Cannot get debconf version. Is debconf installed?'
index 0e1986bcd0c407573eeb3f192e4b10d3346b7ddc..866e5a4696589ac9f77645db2f07167caf01d438 100755 (executable)
@@ -69,32 +69,38 @@ buildsimplenativepackage 'foo' 'i386' '1' 'test'
 mv incoming/* aptarchive/pool/main/
 
 # generate (empty cachedb)
-aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt
+testsuccess aptftparchive generate ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1
+cp rootdir/tmp/testsuccess.output stats-out.txt
 ensure_correct_packages_file
 ensure_correct_contents_file
-testequal " Misses in Cache: 2
- dists/test/Contents-i386: New 402 B  Misses in Cache: 0" grep Misses stats-out.txt
+testsuccess grep Misses stats-out.txt
+testfileequal 'rootdir/tmp/testsuccess.output' ' Misses in Cache: 2
+ dists/test/Contents-i386: New 402 B  Misses in Cache: 0'
 
 # generate again
-aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt
+testsuccess aptftparchive generate ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1
+cp rootdir/tmp/testsuccess.output stats-out.txt
 ensure_correct_packages_file
 ensure_correct_contents_file
-testequal " Misses in Cache: 0
- dists/test/Contents-i386:  Misses in Cache: 0" grep Misses stats-out.txt
+testsuccess grep Misses stats-out.txt
+testfileequal 'rootdir/tmp/testsuccess.output' ' Misses in Cache: 0
+ dists/test/Contents-i386:  Misses in Cache: 0'
 
 # and again (with removing the Packages file)
 rm -f ./aptarchive/dists/test/main/binary-i386/*
 rm -f ./aptarchive/dists/test/Contents-i386
-aptftparchive generate ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt
+testsuccess aptftparchive generate ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1
+cp rootdir/tmp/testsuccess.output stats-out.txt
 ensure_correct_packages_file
 ensure_correct_contents_file
-testequal " Misses in Cache: 0
- dists/test/Contents-i386: New 402 B  Misses in Cache: 0" grep Misses stats-out.txt
+testsuccess grep Misses stats-out.txt
+testfileequal 'rootdir/tmp/testsuccess.output' ' Misses in Cache: 0
+ dists/test/Contents-i386: New 402 B  Misses in Cache: 0'
 
 # and clean
 rm -rf aptarchive/pool/main/*
-testequal "packages-main-i386.db" aptftparchive clean ftparchive.conf
-aptftparchive clean ftparchive.conf -o Debug::APT::FTPArchive::Clean=1 > clean-out.txt 2>&1 
+testequal "packages-main-i386.db" aptftparchive clean ftparchive.conf -q=0
+testsuccess aptftparchive clean ftparchive.conf -q=0 -o Debug::APT::FTPArchive::Clean=1
+cp rootdir/tmp/testsuccess.output clean-out.txt
 testequal "0   Number of unique keys in the tree" grep unique clean-out.txt
 testequal "packages-main-i386.db" grep packages-main-i386.db clean-out.txt
-
index 0ac4d558f364e82e86fece37aab81a0a42fba4ea..28321e3c57095dd8fd25abf0588ac1d829b9f5ed 100755 (executable)
@@ -106,28 +106,22 @@ mkdir -p aptarchive/dists/test/main/source/
 mkdir aptarchive-overrides
 mkdir aptarchive-cache
 
-
-
-# generate with --db option
-(cd aptarchive && aptftparchive --db ./test.db sources pool/main/ \
-    -o APT::FTPArchive::ShowCacheMisses=1  \
-    > dists/test/main/source/Sources \
-    2> stats-out.txt
-    testequal " Misses in Cache: 2" grep Misses stats-out.txt
-)
+msgtest 'generate with --db option'
+cd aptarchive
+aptftparchive --db ./test.db sources pool/main/ -q=0 -o APT::FTPArchive::ShowCacheMisses=1  > dists/test/main/source/Sources 2>stats-out.txt && msgpass || msgfail
+testsuccess grep Misses stats-out.txt
+testfileequal '../rootdir/tmp/testsuccess.output' ' Misses in Cache: 2'
+cd ..
 assert_correct_sources_file
 
-# generate with --db option (again to ensure its in the cache)
-(cd aptarchive && aptftparchive --db ./test.db sources pool/main/ \
-    -o APT::FTPArchive::ShowCacheMisses=1  \
-    > dists/test/main/source/Sources \
-    2> stats-out.txt  
-    testequal " Misses in Cache: 0" grep Misses stats-out.txt
-)
+msgtest 'generate with --db option (again to ensure its in the cache)'
+cd aptarchive
+aptftparchive --db ./test.db sources pool/main/ -q=0 -o APT::FTPArchive::ShowCacheMisses=1  > dists/test/main/source/Sources 2>stats-out.txt && msgpass || msgfail
+testsuccess grep Misses stats-out.txt
+testfileequal '../rootdir/tmp/testsuccess.output' ' Misses in Cache: 0'
+cd ..
 assert_correct_sources_file
 
-
-
 # get ready for the "apt-ftparchive generate" command
 cat > apt-ftparchive.conf <<"EOF"
 Dir {
@@ -159,31 +153,38 @@ Tree "dists/test" {
 };
 EOF
 
-# generate (empty cachedb)
-aptftparchive generate apt-ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1 2> stats-out.txt
-testequal " Misses in Cache: 2" grep Misses stats-out.txt
+msgtest 'generate (empty cachedb)'
+testsuccess aptftparchive generate apt-ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1
+cp rootdir/tmp/testsuccess.output stats-out.txt
+testsuccess grep Misses stats-out.txt
+testfileequal rootdir/tmp/testsuccess.output ' Misses in Cache: 2'
 assert_correct_sources_file
 
-
-# generate again out of the cache
+msgtest 'generate again out of the cache'
 rm -f ./aptarchive/dists/test/main/source/Sources
-aptftparchive generate apt-ftparchive.conf -o APT::FTPArchive::ShowCacheMisses=1  2> stats-out.txt
-testequal " Misses in Cache: 0" grep Misses stats-out.txt
+testsuccess aptftparchive generate apt-ftparchive.conf -q=0 -o APT::FTPArchive::ShowCacheMisses=1
+cp rootdir/tmp/testsuccess.output stats-out.txt
+testsuccess grep Misses stats-out.txt
+testfileequal rootdir/tmp/testsuccess.output ' Misses in Cache: 0'
 assert_correct_sources_file
 
-
-
 # generate invalid files
 mkdir aptarchive/pool/invalid
 printf "meep" > aptarchive/pool/invalid/invalid_1.0.dsc
 testequal "
+E: Could not find a record in the DSC 'aptarchive/pool/invalid/invalid_1.0.dsc'" aptftparchive sources aptarchive/pool/invalid
+rm -f aptarchive/pool/invalid/invalid_1.0.dsc
+
+printf "meep: yes" > aptarchive/pool/invalid/invalid_1.0.dsc
+testequal "
 E: Could not find a Source entry in the DSC 'aptarchive/pool/invalid/invalid_1.0.dsc'" aptftparchive sources aptarchive/pool/invalid
 rm -f aptarchive/pool/invalid/invalid_1.0.dsc
 
 # ensure clean works
 rm -f aptarchive/pool/main/*
-aptftparchive clean apt-ftparchive.conf -o Debug::APT::FTPArchive::Clean=1 > clean-out.txt 2>&1 
-testequal "0   Number of unique keys in the tree" grep unique clean-out.txt
-testequal "sources-main.db" grep sources-main.db clean-out.txt
-
-
+testsuccess aptftparchive clean apt-ftparchive.conf -q=0 -o Debug::APT::FTPArchive::Clean=1
+cp rootdir/tmp/testsuccess.output clean-out.txt
+testsuccess grep unique clean-out.txt
+testfileequal 'rootdir/tmp/testsuccess.output' "0      Number of unique keys in the tree"
+testsuccess grep sources-main.db clean-out.txt
+testfileequal 'rootdir/tmp/testsuccess.output' "sources-main.db"
diff --git a/test/integration/test-apt-get-build-dep b/test/integration/test-apt-get-build-dep
new file mode 100755 (executable)
index 0000000..87ec6e5
--- /dev/null
@@ -0,0 +1,129 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+buildsimplenativepackage 'debhelper' 'i386' '7' 'stable'
+buildsimplenativepackage 'build-essential' 'i386' '1' 'stable'
+
+setupaptarchive
+cat > 2vcard_0.5-3.dsc <<EOF
+Format: 1.0
+Source: 2vcard
+Binary: 2vcard
+Architecture: all
+Version: 0.5-3
+Maintainer: Martin Albisetti <argentina@gmail.com>
+Uploaders: Marcela Tiznado <mlt@debian.org>
+Standards-Version: 3.8.0
+Build-Depends: debhelper (>= 5.0.37)
+Checksums-Sha1: 
+ b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz
+ 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz
+Checksums-Sha256: 
+ efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz
+ 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz
+Files: 
+ f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz
+ 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz
+EOF
+
+testequal "Reading package lists...
+Building dependency tree...
+Note, using file '2vcard_0.5-3.dsc' to get the build dependencies
+The following NEW packages will be installed:
+  build-essential debhelper
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst build-essential (1 stable [i386])
+Inst debhelper (7 stable [i386])
+Conf build-essential (1 stable [i386])
+Conf debhelper (7 stable [i386])" aptget build-dep -s 2vcard_0.5-3.dsc
+
+cat > 2vcard_0.5-3.dsc <<EOF
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA1
+
+Format: 1.0
+Source: 2vcard
+Binary: 2vcard
+Architecture: all
+Version: 0.5-3
+Maintainer: Martin Albisetti <argentina@gmail.com>
+Uploaders: Marcela Tiznado <mlt@debian.org>
+Standards-Version: 3.8.0
+Build-Depends: debhelper (>= 5.0.37)
+Checksums-Sha1: 
+ b7f1ce31ec856414a3f0f1090689f91aa7456d56 9398 2vcard_0.5.orig.tar.gz
+ 5f9acd07ebda6ab00fa6b4fe3198c13e94090862 2036 2vcard_0.5-3.diff.gz
+Checksums-Sha256: 
+ efdc22859ac2f8f030d038dc4faa9020082ebae34212498c288968ffd45c9764 9398 2vcard_0.5.orig.tar.gz
+ 82673ff3456af571094066c89bcea87b25c23c87cf1d0050b731e5222563626b 2036 2vcard_0.5-3.diff.gz
+Files: 
+ f73a69c170f772f3f6e75f2d11bbb792 9398 2vcard_0.5.orig.tar.gz
+ 1e806d32233af87437258d86b1561f57 2036 2vcard_0.5-3.diff.gz
+
+-----BEGIN PGP SIGNATURE-----
+Version: GnuPG v1.4.9 (GNU/Linux)
+
+iEYEARECAAYFAkijKhsACgkQsrBfRdYmq7aA2gCfaOW9riTYVQMx5ajKQVAcctlC
+z2UAn1oXgTai6opwhVfkxrlmJ+iRxzuc
+=4eRd
+-----END PGP SIGNATURE-----
+EOF
+
+testequal "Reading package lists...
+Building dependency tree...
+Note, using file '2vcard_0.5-3.dsc' to get the build dependencies
+The following NEW packages will be installed:
+  build-essential debhelper
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst build-essential (1 stable [i386])
+Inst debhelper (7 stable [i386])
+Conf build-essential (1 stable [i386])
+Conf debhelper (7 stable [i386])" aptget build-dep --simulate 2vcard_0.5-3.dsc
+
+
+# unpacked source dir
+mkdir -p foo-1.0/debian
+cat > foo-1.0/debian/control <<'EOF'
+Source: apturl
+Section: admin
+Priority: optional
+Maintainer: Michael Vogt <mvo@ubuntu.com>
+Build-Depends: debhelper (>= 7)
+X-Python3-Version: >= 3.2
+Standards-Version: 3.9.3
+
+Package: apturl-common
+Architecture: any
+Depends: ${python3:Depends},
+ ${shlibs:Depends},
+ ${misc:Depends},
+ python3-apt,
+ python3-update-manager
+Replaces: apturl (<< 0.3.6ubuntu2)
+Description: install packages using the apt protocol - common data
+ AptUrl is a simple graphical application that takes an URL (which follows the
+ apt-protocol) as a command line option, parses it and carries out the
+ operations that the URL describes (that is, it asks the user if he wants the
+ indicated packages to be installed and if the answer is positive does so for
+ him).
+ .
+ This package contains the common data shared between the frontends.
+
+EOF
+
+testequal "Reading package lists...
+Building dependency tree...
+Note, using directory './foo-1.0' to get the build dependencies
+The following NEW packages will be installed:
+  build-essential debhelper
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst build-essential (1 stable [i386])
+Inst debhelper (7 stable [i386])
+Conf build-essential (1 stable [i386])
+Conf debhelper (7 stable [i386])" aptget build-dep --simulate ./foo-1.0
index 4ee1134822e487cb8ecf78baa4de19c427db99d7..01f2bd393be32f25c0a1de9af54b178ab0c5d199 100755 (executable)
@@ -13,26 +13,36 @@ setupaptarchive --no-update
 changetowebserver
 testsuccess aptget update
 
+# simulate normal user with non-existent root-owned directories
+rm -rf rootdir/var/cache/apt/archives/
+mkdir rootdir/var/cache/apt/archives/
+addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/var/cache/apt/archives || true;"
+chmod -R -w rootdir/var/cache/apt/archives
+
 echo 'Apt::Changelogs::Server "http://localhost:8080/";' > rootdir/etc/apt/apt.conf.d/changelog.conf
 
-testequal "'http://localhost:8080//pool/apt_1.0/changelog'" aptget changelog apt --print-uris
+testequal "'http://localhost:8080/pool/apt_1.0/changelog'" aptget changelog apt --print-uris
+
+testequal "'http://localhost:8080/pool/apt_1.0/changelog'
+'http://localhost:8080/pool/apt_1.0/changelog'" aptget changelog apt apt --print-uris
 
-testequal "'http://localhost:8080//pool/apt_1.0/changelog'
-'http://localhost:8080//pool/apt_1.0/changelog'" aptget changelog apt apt --print-uris
+cd downloaded
 
-aptget changelog apt -qq > apt.changelog
-testfileequal 'apt.changelog' "$(cat aptarchive/pool/apt_1.0/changelog)"
-rm apt.changelog
+testsuccess aptget changelog apt -qq
+testfileequal '../rootdir/tmp/testsuccess.output' "$(cat ../aptarchive/pool/apt_1.0/changelog)"
 
 testsuccess aptget changelog apt -d
-testfileequal 'apt.changelog' "$(cat  aptarchive/pool/apt_1.0/changelog)"
-rm apt.changelog aptarchive/pool/apt_1.0/changelog
+testfileequal 'apt.changelog' "$(cat  ../aptarchive/pool/apt_1.0/changelog)"
+testfilestats 'apt.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644"
+rm -f apt.changelog ../aptarchive/pool/apt_1.0/changelog
 
-testequal "$(cat aptarchive/pool/apt_1.0.changelog)" aptget changelog apt \
+testequal "$(cat ../aptarchive/pool/apt_1.0.changelog)" aptget changelog apt \
        -qq -o APT::Changelogs::Server='http://not-on-the-main-server:8080/'
 
 testsuccess aptget changelog apt -d
-testfileequal 'apt.changelog' "$(cat aptarchive/pool/apt_1.0.changelog)"
-rm apt.changelog aptarchive/pool/apt_1.0.changelog
+testfileequal 'apt.changelog' "$(cat ../aptarchive/pool/apt_1.0.changelog)"
+testfilestats 'apt.changelog' '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644"
+rm -f apt.changelog ../aptarchive/pool/apt_1.0.changelog
 
-testequal 'E: changelog download failed' aptget changelog apt -qq -o APT::Changelogs::Server='http://not-on-the-main-server:8080/'
+testequal 'E: changelog download failed' aptget changelog apt -qq -d -o APT::Changelogs::Server='http://not-on-the-main-server:8080/'
+testfailure test -e apt.changelog
diff --git a/test/integration/test-apt-get-clean b/test/integration/test-apt-get-clean
new file mode 100755 (executable)
index 0000000..457bff9
--- /dev/null
@@ -0,0 +1,35 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+insertpackage 'testing' 'foo' 'all' '1'
+insertpackage 'unstable' 'foo' 'all' '2'
+insertinstalledpackage 'foo' 'all' '3'
+
+setupaptarchive
+
+# nothing to do always works
+testsuccess aptget clean
+
+# generate some dirt and clean it up
+touch rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en
+mkdir -p rootdir/var/cache/apt/archives
+touch rootdir/var/cache/apt/archives/foo_1_all.deb
+touch rootdir/var/cache/apt/archives/foo_2_all.deb
+touch rootdir/var/cache/apt/archives/foo_3_all.deb
+touch rootdir/var/cache/apt/archives/foo_4_all.deb
+
+testsuccess aptget clean
+
+testfailure test -e rootdir/var/lib/apt/lists/partial/http.debian.net_debian_dists_sid_main_i18n_Translation-en
+testfailure test -e rootdir/var/cache/apt/archives/foo_1_all.deb
+testfailure test -e rootdir/var/cache/apt/archives/foo_2_all.deb
+testfailure test -e rootdir/var/cache/apt/archives/foo_3_all.deb
+testfailure test -e rootdir/var/cache/apt/archives/foo_4_all.deb
+
+
index be3144e1f15c5075a36eec54dd0c7478a710ed5f..6503bbd1cb10b3751ccc3a365db0ce9e7cb5d13d 100755 (executable)
@@ -11,7 +11,26 @@ buildsimplenativepackage 'apt' 'all' '1.0' 'stable'
 buildsimplenativepackage 'apt' 'all' '2.0' 'unstable'
 insertinstalledpackage 'vrms' 'all' '1.0'
 
-setupaptarchive
+OLD_UMASK="$(umask)"
+umask 0027
+setupaptarchive --no-update
+umask "$OLD_UMASK"
+
+# directories should be readable by everyone
+find aptarchive/dists -type d | while read dir; do
+       chmod o+rx "$dir"
+done
+# apt-ftparchive knows how to chmod files
+find aptarchive/dists -name '*Packages*' -type f | while read file; do
+       testaccessrights "$file" '644'
+       chmod 640 "$file"
+done
+# created by the framework without special care
+find aptarchive/dists -name '*Release*' -type f | while read file; do
+       testaccessrights "$file" '640'
+done
+
+testsuccess aptget update
 
 testdownload() {
        local APT="$2"
@@ -20,18 +39,34 @@ testdownload() {
        fi
        msgtest "Test download of package file $1 with" "$APT"
        testsuccess --nomsg aptget download ${APT}
-       testsuccess test -f $1
-       rm $1
+       testsuccess test -f "$1"
+       rm -f "$1"
 }
 
+# normal case as "root"
+OLDPWD="$(pwd)"
+cd downloaded
+testdownload apt_2.0_all.deb apt
+cd "$OLDPWD"
+
+# simulate normal user with non-existent root-owned directories
+rm -rf rootdir/var/cache/apt/archives/
+mkdir rootdir/var/cache/apt/archives/
+addtrap 'prefix' "chmod -f -R +w $PWD/rootdir/var/cache/apt/archives || true;"
+chmod -R -w rootdir/var/cache/apt/archives
+
+OLDPWD="$(pwd)"
+cd downloaded
+
 # normal case(es)
 testdownload apt_1.0_all.deb apt stable
 testdownload apt_2.0_all.deb apt
 
-DEBFILE="$(readlink -f aptarchive)/pool/apt_2.0_all.deb"
+DEBFILE="$(readlink -f ../aptarchive)/pool/apt_2.0_all.deb"
 testequal "'file://${DEBFILE}' apt_2.0_all.deb $(stat -c%s $DEBFILE) SHA512:$(sha512sum $DEBFILE | cut -d' ' -f 1)" aptget download apt --print-uris
 
 # deb:677887
+testequal "E: Can't find a source to download version '1.0' of 'vrms:i386'" aptget download vrms --print-uris
 testequal "E: Can't find a source to download version '1.0' of 'vrms:i386'" aptget download vrms
 
 # deb:736962
@@ -45,3 +80,21 @@ rm -f apt_1.0_all.deb apt_2.0_all.deb
 testsuccess aptget download apt apt apt/unstable apt=2.0
 testsuccess test -s apt_2.0_all.deb
 
+# restore "root" rights
+cd "$OLDPWD"
+chmod -f -R +w $PWD/rootdir/var/cache/apt/archives
+rm -rf rootdir/var/cache/apt/archives/
+
+# file: debs aren't copied to archives, so change to http which obviously are
+changetowebserver
+testsuccess aptget update
+
+# test with already stored deb
+testsuccess aptget install -d apt
+testsuccess test -s rootdir/var/cache/apt/archives/apt_2.0_all.deb
+testaccessrights 'aptarchive/pool/apt_2.0_all.deb' '644'
+mv aptarchive/pool/apt_2.0_all.deb aptarchive/pool/apt_2.0_all.deb.gone
+cd downloaded
+testdownload apt_2.0_all.deb apt
+cd "$OLDPWD"
+mv aptarchive/pool/apt_2.0_all.deb.gone aptarchive/pool/apt_2.0_all.deb
diff --git a/test/integration/test-apt-get-install-deb b/test/integration/test-apt-get-install-deb
new file mode 100755 (executable)
index 0000000..f2e5229
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+# regression test for #754904
+testequal 'E: Unable to locate package /dev/null' aptget install -qq /dev/null
+
+# and ensure we fail for invalid debs
+cat > foo.deb <<EOF
+I'm not a deb, I'm a teapot.
+EOF
+testfailure aptget install ./foo.deb
+testsuccess grep '^E: Sub-process Popen returned an error code' rootdir/tmp/testfailure.output
+testequal 'E: Encountered a section with no Package: header
+E: Problem with MergeLister for ./foo.deb
+E: The package lists or status file could not be parsed or opened.' tail -n 3 rootdir/tmp/testfailure.output
+
+# fakeroot is currently not found, framwork needs updating
+buildsimplenativepackage 'foo' 'all' '1.0'
+testdpkgnotinstalled 'foo'
+testsuccess aptget install ./incoming/foo_1.0_all.deb
+testdpkginstalled 'foo'
index 2cee139230eea39de7c96c819955cd18f2b8518a..685bc566b98e2e2306719232098ca698703c22fd 100755 (executable)
@@ -21,11 +21,13 @@ APTARCHIVE=$(readlink -f ./aptarchive)
 rm -f $APTARCHIVE/dists/unstable/*Release*
 
 # update without authenticated InRelease file
-testsuccess aptget update
+testwarning aptget update --allow-insecure-repositories
 
 # this all should fail
 testfailure aptget install -y foo
+cd downloaded
 testfailure aptget source foo
-
+testfailure test -e foo_2.0.dsc
 # allow overriding the warning
-testsuccess aptget source --allow-unauthenticated foo
+testsuccess aptget source --allow-unauthenticated foo -o Debug::pkgAcquire::Worker=1
+testsuccess test -s foo_2.0.dsc -a -L foo_2.0.dsc
diff --git a/test/integration/test-apt-get-update-unauth-warning b/test/integration/test-apt-get-update-unauth-warning
new file mode 100755 (executable)
index 0000000..80c5115
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+#
+# ensure we print warnings for unauthenticated repositories
+# 
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+# a "normal" package with source and binary
+buildsimplenativepackage 'foo' 'all' '2.0'
+
+setupaptarchive --no-update
+
+APTARCHIVE=$(readlink -f ./aptarchive)
+rm -f $APTARCHIVE/dists/unstable/*Release*
+
+# update without authenticated files leads to warning
+testequal "Ign file: unstable InRelease
+  File not found
+Err file: unstable Release
+  File not found
+W: The repository 'file: unstable Release' does not have a Release file. This is deprecated, please contact the owner of the repository.
+E: Use --allow-insecure-repositories to force the update" aptget update --no-allow-insecure-repositories
+
+# no package foo
+testequal 'Listing...' apt list foo
+testequal 'lock
+partial' ls rootdir/var/lib/apt/lists
+
+# allow override
+testequal "Ign file: unstable InRelease
+  File not found
+Ign file: unstable Release
+  File not found
+Reading package lists...
+W: The repository 'file: unstable Release' does not have a Release file. This is deprecated, please contact the owner of the repository." aptget update --allow-insecure-repositories
+# ensure we can not install the package
+testequal "WARNING: The following packages cannot be authenticated!
+  foo
+E: There are problems and -y was used without --force-yes" aptget install -qq -y foo
index 23446299ca8b5b2dfd394928a9a17111793746e7..d042e4fb73c6ad4148e8cb1d2068d05d6e90f0da 100755 (executable)
@@ -8,29 +8,25 @@ setupenvironment
 configarchitecture "i386"
 
 # simple case
-insertpackage 'stable' 'upgrade-simple' 'all' '1.0'
+insertpackage 'stable,installed' 'upgrade-simple' 'all' '1.0'
 insertpackage 'unstable' 'upgrade-simple' 'all' '2.0'
-insertinstalledpackage 'upgrade-simple' 'all' '1.0'
 
 # upgrade with a new dependency
-insertpackage 'stable' 'upgrade-with-new-dep' 'all' '1.0' 
+insertpackage 'stable,installed' 'upgrade-with-new-dep' 'all' '1.0'
 insertpackage 'unstable' 'upgrade-with-new-dep' 'all' '2.0' 'Depends: new-dep'
 insertpackage 'stable' 'new-dep' 'all' '1.0'
-insertinstalledpackage 'upgrade-with-new-dep' 'all' '1.0'
 
 # upgrade with conflict and a new pkg with higher priority than conflict
-insertpackage 'stable' 'upgrade-with-conflict' 'all' '1.0'
+insertpackage 'stable,installed' 'upgrade-with-conflict' 'all' '1.0'
 insertpackage 'unstable' 'upgrade-with-conflict' 'all' '2.0' 'Conflicts: conflicting-dep' 'standard'
-insertpackage 'stable' 'conflicting-dep' 'all' '1.0'
-insertinstalledpackage 'upgrade-with-conflict' 'all' '1.0'
-insertinstalledpackage 'conflicting-dep' 'all' '1.0'
-
+insertpackage 'stable,installed' 'conflicting-dep' 'all' '1.0'
 
 setupaptarchive
 
 # Test if normal upgrade works as expected
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   upgrade-with-conflict upgrade-with-new-dep
 The following packages will be upgraded:
@@ -42,6 +38,7 @@ Conf upgrade-simple (2.0 unstable [all])' aptget -s upgrade
 # Test if apt-get upgrade --with-new-pkgs works
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following NEW packages will be installed:
   new-dep
 The following packages have been kept back:
@@ -59,6 +56,7 @@ Conf upgrade-with-new-dep (2.0 unstable [all])' aptget -s upgrade --with-new-pkg
 # Test if apt-get dist-upgrade works
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   conflicting-dep
 The following NEW packages will be installed:
index 31e471677c3d6992e2b5bcd995787b06460ef1df..ff5d506b51ca04818f10c2420eac6597c23d4c4d 100755 (executable)
@@ -5,7 +5,7 @@ TESTDIR=$(readlink -f $(dirname $0))
 . $TESTDIR/framework
 
 setupenvironment
-configarchitecture "i386"
+configarchitecture 'i386'
 
 changetohttpswebserver
 
@@ -54,7 +54,7 @@ echo "http://some-proxy"
 EOF
     chmod 755 apt-proxy-detect
     echo "Acquire::http::Proxy-Auto-Detect \"$(pwd)/apt-proxy-detect\";" > rootdir/etc/apt/apt.conf.d/02proxy-detect
-    
+
     testequal "Using proxy 'http://some-proxy' for URL 'http://www.example.com/'" apthelper auto-detect-proxy http://www.example.com
 
 
@@ -65,13 +65,15 @@ echo "https://https-proxy"
 EOF
     chmod 755 apt-proxy-detect
     echo "Acquire::https::Proxy-Auto-Detect \"$(pwd)/apt-proxy-detect\";" > rootdir/etc/apt/apt.conf.d/02proxy-detect
-    
-    testequal "Using proxy 'https://https-proxy' for URL 'https://ssl.example.com/'" apthelper auto-detect-proxy https://ssl.example.com 
 
-
-    
+    testequal "Using proxy 'https://https-proxy' for URL 'https://ssl.example.com/'" apthelper auto-detect-proxy https://ssl.example.com
 }
 
 test_apt_helper_download
 test_apt_helper_detect_proxy
 
+# test failure modes
+testequal 'E: Invalid operation download' apthelper download
+testequal 'E: Must specify at least one pair url/filename' apthelper download-file
+testequal 'E: Must specify at least one pair url/filename' apthelper download-file http://example.org/
+testequal 'E: Need one URL as argument' apthelper auto-detect-proxy
index 47230cb55368f5020368b72210531dd3a5119471..b6b7b7909a8883a01b349cb533a7b648ccaa590c 100755 (executable)
@@ -7,107 +7,177 @@ TESTDIR=$(readlink -f $(dirname $0))
 setupenvironment
 configarchitecture 'amd64'
 
-msgtest 'Check that paths in list output are not' 'double-slashed'
-aptkey list 2>&1 | grep -q '//' && msgfail || msgpass
+# start from a clean plate again
+cleanplate() {
+       rm -rf rootdir/etc/apt/trusted.gpg.d/ rootdir/etc/apt/trusted.gpg
+       mkdir rootdir/etc/apt/trusted.gpg.d/
+}
 
-msgtest 'Check that paths in finger output are not' 'double-slashed'
-aptkey finger 2>&1 | grep -q '//' && msgfail || msgpass
+testaptkeys() {
+       if ! aptkey list | grep '^pub' > aptkey.list; then
+               echo -n > aptkey.list
+       fi
+       testequal "$1" cat ./aptkey.list
+}
 
 echo 'APT::Key::ArchiveKeyring "./keys/joesixpack.pub";
 APT::Key::RemovedKeys "./keys/rexexpired.pub";' > rootdir/etc/apt/apt.conf.d/aptkey.conf
 
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/DBAC8DAE 2010-08-18'
+testrun() {
+       cleanplate
+       ln -sf ${TMPWORKINGDIRECTORY}/keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
 
-testequal 'gpg: key DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed
+       msgtest 'Check that paths in list output are not' 'double-slashed'
+       aptkey list 2>&1 | grep -q '//' && msgfail || msgpass
+
+       msgtest 'Check that paths in finger output are not' 'double-slashed'
+       aptkey finger 2>&1 | grep -q '//' && msgfail || msgpass
+
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18'
+
+       testequal 'gpg: key DBAC8DAE: "Joe Sixpack (APT Testcases Dummy) <joe@example.org>" not changed
 gpg: Total number processed: 1
 gpg:              unchanged: 1' aptkey --fakeroot update
 
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/DBAC8DAE 2010-08-18'
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18'
 
-testsuccess aptkey --fakeroot add ./keys/rexexpired.pub
+       testfailure test -e rootdir/etc/apt/trusted.gpg
+       testsuccess aptkey --fakeroot add ./keys/rexexpired.pub
+       msgtest 'Check if trusted.gpg is created with permissions set to' '0644'
+       if [ "$(stat -c '%a' rootdir/etc/apt/trusted.gpg )" = '644' ]; then
+               msgpass
+       else
+               msgfail
+       fi
 
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/27CE74F9 2013-07-12 [expired: 2013-07-13]
+       testaptkeys 'pub   2048R/27CE74F9 2013-07-12 [expired: 2013-07-13]
 pub   2048R/DBAC8DAE 2010-08-18'
 
-msgtest 'Execute update again to trigger removal of' 'Rex Expired key'
-testsuccess --nomsg aptkey --fakeroot update
-
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/DBAC8DAE 2010-08-18'
-
-msgtest "Try to remove a key which exists, but isn't in the" 'forced keyring'
-testsuccess --nomsg aptkey --fakeroot --keyring rootdir/etc/apt/trusted.gpg del DBAC8DAE
+       msgtest 'Check that Sixpack key can be' 'exported'
+       aptkey export 'Sixpack' > aptkey.export
+       aptkey --keyring rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg exportall > aptkey.exportall
+       testsuccess --nomsg cmp aptkey.export aptkey.exportall
+       testsuccess test -s aptkey.export
+       testsuccess test -s aptkey.exportall
+
+       msgtest 'Execute update again to trigger removal of' 'Rex Expired key'
+       testsuccess --nomsg aptkey --fakeroot update
+
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18'
+
+       msgtest "Try to remove a key which exists, but isn't in the" 'forced keyring'
+       testsuccess --nomsg aptkey --fakeroot --keyring rootdir/etc/apt/trusted.gpg del DBAC8DAE
+
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18'
+
+       testsuccess aptkey --fakeroot del DBAC8DAE
+       testempty aptkey list
+
+       msgtest 'Test key removal with' 'single key in real file'
+       cleanplate
+       cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
+       testempty aptkey list
+       testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
+
+       msgtest 'Test key removal with' 'long key ID'
+       cleanplate
+       cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess --nomsg aptkey --fakeroot del 5A90D141DBAC8DAE
+       testempty aptkey list
+       testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
+
+       msgtest 'Test key removal with' 'fingerprint'
+       cleanplate
+       cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess --nomsg aptkey --fakeroot del 34A8E9D18DB320F367E8EAA05A90D141DBAC8DAE
+       testempty aptkey list
+       testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
+
+       msgtest 'Test key removal with' 'single key in softlink'
+       cleanplate
+       ln -s $(readlink -f ./keys/joesixpack.pub) rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
+       testempty aptkey list
+       testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess test -L rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
+
+       cleanplate
+       testsuccess aptkey --fakeroot add ./keys/joesixpack.pub
+       testsuccess aptkey --fakeroot add ./keys/marvinparanoid.pub
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/528144E2 2011-01-16'
+       cp -a rootdir/etc/apt/trusted.gpg keys/testcase-multikey.pub # store for reuse
+
+       msgtest 'Test key removal with' 'multi key in real file'
+       cleanplate
+       cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg
+       testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
+       testaptkeys 'pub   2048R/528144E2 2011-01-16'
+       testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
+
+       msgtest 'Test key removal with' 'multi key in softlink'
+       cleanplate
+       ln -s $(readlink -f ./keys/testcase-multikey.pub) rootdir/etc/apt/trusted.gpg.d/multikey.gpg
+       testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
+       testaptkeys 'pub   2048R/528144E2 2011-01-16'
+       testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
+       testfailure test -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg
+       testsuccess test -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
+
+       msgtest 'Test key removal with' 'multiple files including key'
+       cleanplate
+       cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg
+       testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
+       testaptkeys 'pub   2048R/528144E2 2011-01-16'
+       testfailure test -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
+       testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
+
+       cleanplate
+       cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
+       cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/528144E2 2011-01-16'
+       msgtest 'Test merge-back of' 'added keys'
+       testsuccess --nomsg aptkey adv --batch --yes --import keys/rexexpired.pub
+       testaptkeys 'pub   2048R/27CE74F9 2013-07-12 [expired: 2013-07-13]
+pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/528144E2 2011-01-16'
 
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/DBAC8DAE 2010-08-18'
+       msgtest 'Test merge-back of' 'removed keys'
+       testsuccess --nomsg aptkey adv --batch --yes --delete-keys 27CE74F9
+       testaptkeys 'pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/DBAC8DAE 2010-08-18
+pub   2048R/528144E2 2011-01-16'
 
-testsuccess aptkey --fakeroot del DBAC8DAE
-testempty aptkey list
+       msgtest 'Test merge-back of' 'removed duplicate keys'
+       testsuccess --nomsg aptkey adv --batch --yes --delete-keys DBAC8DAE
+       testaptkeys 'pub   2048R/528144E2 2011-01-16'
+}
 
-# start from a clean plate again
-cleanplate() {
-       rm -rf rootdir/etc/apt/trusted.gpg.d/ rootdir/etc/apt/trusted.gpg
-       mkdir rootdir/etc/apt/trusted.gpg.d/
+setupgpgcommand() {
+       echo "APT::Key::GPGCommand \"$1\";" > rootdir/etc/apt/apt.conf.d/00gpgcmd
+       msgtest 'Test that apt-key uses for the following tests command' "$1"
+       aptkey adv --version >aptkey.version 2>&1
+       if grep -q "^Executing: $1 --" aptkey.version; then
+               msgpass
+       else
+               cat aptkey.version
+               msgfail
+       fi
 }
 
-msgtest 'Test key removal with' 'single key in real file'
-cleanplate
-cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
-testempty aptkey list
-testsuccess test ! -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
-
-msgtest 'Test key removal with' 'single key in softlink'
-cleanplate
-ln -s $(readlink -f ./keys/joesixpack.pub) rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
-testempty aptkey list
-testsuccess test ! -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-testsuccess test -L rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
-
-cleanplate
-testsuccess aptkey --fakeroot add ./keys/joesixpack.pub
-testsuccess aptkey --fakeroot add ./keys/marvinparanoid.pub
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/DBAC8DAE 2010-08-18
-pub   2048R/528144E2 2011-01-16'
-cp -a rootdir/etc/apt/trusted.gpg keys/testcase-multikey.pub # store for reuse
-
-msgtest 'Test key removal with' 'multi key in real file'
-cleanplate
-cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg
-testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/528144E2 2011-01-16'
-testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
-
-msgtest 'Test key removal with' 'multi key in softlink'
-cleanplate
-ln -s $(readlink -f ./keys/testcase-multikey.pub) rootdir/etc/apt/trusted.gpg.d/multikey.gpg
-testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/528144E2 2011-01-16'
-testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
-testsuccess test ! -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg
-testsuccess test -L rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
-
-msgtest 'Test key removal with' 'multiple files including key'
-cleanplate
-cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-cp -a keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg
-testsuccess --nomsg aptkey --fakeroot del DBAC8DAE
-aptkey list | grep '^pub' > aptkey.list
-testfileequal ./aptkey.list 'pub   2048R/528144E2 2011-01-16'
-testsuccess test ! -e rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-testsuccess cmp keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg~
-testsuccess cmp keys/testcase-multikey.pub rootdir/etc/apt/trusted.gpg.d/multikey.gpg~
-
-msgtest 'Test key removal with' '8 byte key ID'
-cleanplate
-cp -a keys/joesixpack.pub rootdir/etc/apt/trusted.gpg.d/joesixpack.gpg
-testsuccess --nomsg aptkey --fakeroot del 5A90D141DBAC8DAE
-testempty aptkey list
+# run with default (whatever this is)
+testrun
+# run with …
+setupgpgcommand 'gpg'
+testrun
+setupgpgcommand 'gpg2'
+testrun
index 4b38cd9b55d8037c1d9440e1971e4ece9c3f8b94..b3c118555c742887a88dc5493e4921b67773b038 100755 (executable)
@@ -28,6 +28,9 @@ gpg: key F68C85A3: public key "Test Automatic Archive Signing Key <ftpmaster@exa
 gpg: Total number processed: 1
 gpg:               imported: 1  (RSA: 1)' aptkey --fakeroot net-update
 
+aptkey list | grep '^pub' > aptkey.list
+testfileequal ./aptkey.list 'pub   1024R/F68C85A3 2013-12-19
+pub   2048R/DBAC8DAE 2010-08-18'
 
 # now try a different one
 # setup archive-keyring 
@@ -38,6 +41,8 @@ echo 'APT::Key::Net-Update-Enabled "1";' >> ./aptconfig.conf
 
 # test against the "real" webserver
 testequal "Checking for new archive signing keys now
-Key 'E8525D47528144E2' not added. It is not signed with a master key" aptkey --fakeroot net-update
-
+Key 'DE66AECA9151AFA1877EC31DE8525D47528144E2' not added. It is not signed with a master key" aptkey --fakeroot net-update
 
+aptkey list | grep '^pub' > aptkey.list
+testfileequal ./aptkey.list 'pub   1024R/F68C85A3 2013-12-19
+pub   2048R/DBAC8DAE 2010-08-18'
diff --git a/test/integration/test-apt-mark b/test/integration/test-apt-mark
new file mode 100755 (executable)
index 0000000..5a3ae4b
--- /dev/null
@@ -0,0 +1,101 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64' 'i386'
+
+insertpackage 'unstable' 'bar' 'amd64,i386' '1'
+insertpackage 'unstable' 'uninstalled' 'all' '1'
+insertpackage 'unstable' 'uninstalled-native' 'amd64' '1'
+
+insertinstalledpackage 'foo' 'all' '1'
+insertinstalledpackage 'bar' 'amd64' '1'
+
+setupaptarchive
+
+# dpkg is "installed" by our test framework
+testdpkginstalled dpkg
+
+testnoautopkg() {
+       testempty aptmark showauto
+       testempty aptcache showauto
+       testequal 'bar
+dpkg
+foo' aptmark showmanual
+       testequal 'bar
+foo' aptmark showmanual bar foo uninstalled
+}
+testfooisauto() {
+       testequal 'foo' aptmark showauto
+       testequal 'foo' aptcache showauto
+       testequal 'foo' aptmark showauto foo
+       testequal 'foo' aptcache showauto foo
+       testequal 'bar
+dpkg' aptmark showmanual
+       testequal 'bar' aptmark showmanual bar
+}
+testmarkonpkgasauto() {
+       testsuccess $1 $2 foo
+       testfooisauto
+       testsuccess $1 $2 foo
+       testfooisauto
+
+       testsuccess $1 $3 foo
+       testnoautopkg
+       testsuccess $1 $3 foo
+       testnoautopkg
+}
+
+testequal 'E: No packages found' aptmark auto
+testequal 'E: No packages found' aptmark manual
+
+testnoautopkg
+testmarkonpkgasauto 'aptmark' 'auto' 'manual'
+testmarkonpkgasauto 'aptmark' 'markauto' 'unmarkauto'
+testmarkonpkgasauto 'aptget' 'markauto' 'unmarkauto'
+
+testnoholdpkg() {
+       testempty aptmark showhold
+       testempty aptmark showholds  # typical "typo"
+       testempty aptmark showhold dpkg
+       testempty aptmark showholds dpkg
+}
+testpkgonhold() {
+       testequal "$1" aptmark showhold
+       testequal "$1" aptmark showholds
+       testequal "$1" aptmark showhold $1
+       testequal "$1" aptmark showholds $1
+}
+testmarkonepkgashold() {
+       testsuccess aptmark hold $1
+       testpkgonhold $1
+       testsuccess aptmark hold $1
+       testpkgonhold $1
+       testsuccess aptmark unhold $1
+       testnoholdpkg
+       testsuccess aptmark unhold $1
+       testnoholdpkg
+}
+
+testequal 'E: No packages found' aptmark hold
+testequal 'E: No packages found' aptmark unhold
+
+testnoholdpkg
+testmarkonepkgashold 'foo'
+testmarkonepkgashold 'bar'
+
+msgtest 'dpkg supports --merge-avail via' 'stdin'
+if dpkg --merge-avail - < /dev/null >/dev/null 2>&1; then
+       msgpass
+else
+       msgskip 'dpkg version too old'
+       exit 0
+fi
+
+testmarkonepkgashold 'uninstalled'
+testmarkonepkgashold 'uninstalled-native'
+
+testequal 'uninstalled set on hold.' aptmark hold uninstalled
+testequal 'uninstalled-native set on hold.' aptmark hold uninstalled-native
index 68cc0439c42761806eb481c2541c9dab49359ca6..90e6ef7e4e3c24aa38828491bf4015312ba6946c 100755 (executable)
@@ -16,7 +16,7 @@ setupaptarchive
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.1 -y -o APT::Status-Fd=3
 testequal "dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:0:Retrieving file 1 of 1
+dlstatus:1:20:Retrieving file 1 of 1
 pmstatus:dpkg-exec:0:Running dpkg
 pmstatus:testing:0:Installing testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
@@ -32,7 +32,7 @@ pmstatus:dpkg-exec:83.3333:Running dpkg" cat apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 -y -o APT::Status-Fd=3
 testequal "dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:0:Retrieving file 1 of 1
+dlstatus:1:20:Retrieving file 1 of 1
 pmstatus:dpkg-exec:0:Running dpkg
 pmstatus:testing:0:Installing testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
@@ -48,7 +48,7 @@ pmstatus:dpkg-exec:83.3333:Running dpkg" cat apt-progress.log
 exec 3> apt-progress.log
 testsuccess aptget install testing=0.8.15 --reinstall -y -o APT::Status-Fd=3
 testequal "dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:0:Retrieving file 1 of 1
+dlstatus:1:20:Retrieving file 1 of 1
 pmstatus:dpkg-exec:0:Running dpkg
 pmstatus:testing:0:Installing testing (amd64)
 pmstatus:testing:16.6667:Preparing testing (amd64)
@@ -76,7 +76,7 @@ testsuccess aptget install testing2:i386 -y -o APT::Status-Fd=3
 
 # and compare
 testequal "dlstatus:1:0:Retrieving file 1 of 1
-dlstatus:1:0:Retrieving file 1 of 1
+dlstatus:1:20:Retrieving file 1 of 1
 pmstatus:dpkg-exec:0:Running dpkg
 pmstatus:testing2:0:Installing testing2 (i386)
 pmstatus:testing2:16.6667:Preparing testing2 (i386)
index 5f54b75315dfc5b68826681c7a83ea938e17d366..d8b2334ad707b9584eb75c15b6315e8d1bc860e6 100755 (executable)
@@ -23,14 +23,14 @@ Description: summay
 
 msgtest 'Test sources.list' 'old style'
 echo "deb http://ftp.debian.org/debian stable main" > $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 :
+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 "  aptget update --print-uris
 
 msgtest 'Test sources.list' 'simple deb822'
 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 :
-'http://ftp.debian.org/debian/dists/stable/main/i18n/Translation-en.bz2' ftp.debian.org_debian_dists_stable_main_i18n_Translation-en 0 :
+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 "  aptget update --print-uris
 
 
@@ -39,29 +39,29 @@ msgtest 'Test deb822 with' 'two entries'
 echo "$BASE" > $SOURCES
 echo "" >> $SOURCES
 echo "$BASE" | sed  s/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 :
+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/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
 
 # 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 :
+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/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 "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 :
+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 
 'http://ftp.debian.org/debian/dists/stable/InRelease' ftp.debian.org_debian_dists_stable_InRelease 0 "  aptget update --print-uris
 
 
@@ -85,19 +85,19 @@ 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 :
+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/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 :
+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 
 
 # a Suite
@@ -107,6 +107,6 @@ Types: deb
 URIs: http://emacs.naquadah.org
 Suites: stable/
 EOF
-testequal --nomsg "'http://emacs.naquadah.org/stable/Packages.bz2' emacs.naquadah.org_stable_Packages 0 :
-'http://emacs.naquadah.org/stable/en.bz2' emacs.naquadah.org_stable_en 0 :
+testequal --nomsg "'http://emacs.naquadah.org/stable/Packages.bz2' emacs.naquadah.org_stable_Packages 0 
+'http://emacs.naquadah.org/stable/en.bz2' emacs.naquadah.org_stable_en 0 
 'http://emacs.naquadah.org/stable/InRelease' emacs.naquadah.org_stable_InRelease 0 "  aptget update --print-uris 
diff --git a/test/integration/test-apt-update-expected-size b/test/integration/test-apt-update-expected-size
new file mode 100755 (executable)
index 0000000..045217a
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+insertpackage 'unstable' 'apt' 'all' '1.0'
+
+setupaptarchive --no-update
+changetowebserver
+
+# normal update works fine
+testsuccess aptget update
+
+# make InRelease really big to trigger fallback
+mv aptarchive/dists/unstable/InRelease aptarchive/dists/unstable/InRelease.good
+dd if=/dev/zero of=aptarchive/dists/unstable/InRelease bs=1M count=2 2>/dev/null
+touch -d '+1hour' aptarchive/dists/unstable/InRelease
+testsuccess aptget update -o Apt::Get::List-Cleanup=0  -o acquire::MaxReleaseFileSize=$((1*1000*1000)) -o Debug::pkgAcquire::worker=0
+msgtest 'Check that the max write warning is triggered'
+if grep -q "Writing more data than expected" rootdir/tmp/testsuccess.output; then
+    msgpass
+else
+    cat rootdir/tmp/testsuccess.output
+    msgfail
+fi
+# ensure the failed InRelease file got renamed
+testsuccess ls rootdir/var/lib/apt/lists/partial/*InRelease.FAILED
+mv aptarchive/dists/unstable/InRelease.good aptarchive/dists/unstable/InRelease
+
+
+# append junk at the end of the Packages.gz/Packages
+SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)"
+find aptarchive -name 'Packages*' | while read pkg; do
+       echo "1234567890" >> "$pkg"
+done
+NEW_SIZE="$(stat --printf=%s aptarchive/dists/unstable/main/binary-i386/Packages)"
+rm -f rootdir/var/lib/apt/lists/localhost*
+testequal "W: Failed to fetch http://localhost:8080/dists/unstable/main/binary-i386/Packages  Writing more data than expected ($NEW_SIZE > $SIZE)
+
+E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
index fbcd473ccb70cdb96167d58b02451dbb852daa26..1ecf9a38a2a9da4bb60e0d47149e9480fbe13230 100755 (executable)
@@ -10,27 +10,26 @@ TESTDIR=$(readlink -f $(dirname $0))
 
 setupenvironment
 configarchitecture "amd64"
-configcompression 'bz2' 'gz' 
+configcompression 'bz2' 'gz'
 
-insertpackage 'unstable' 'foo' 'all' '1.0'
+insertpackage 'unstable' 'foo' 'all' '1'
+insertsource 'unstable' 'foo' 'all' '1'
 
-umask 022
 setupaptarchive --no-update
 
 # ensure the archive is not writable
+addtrap 'prefix' 'chmod 750 aptarchive/dists/unstable/main/binary-amd64;'
 chmod 550 aptarchive/dists/unstable/main/binary-amd64
 
-testsuccess aptget update -qq
-testsuccess aptget update -qq
-aptget update -qq -o Debug::pkgAcquire::Auth=1 2> output.log
+testsuccess aptget update
+testsuccess aptget update -o Debug::pkgAcquire::Auth=1
+cp -a rootdir/tmp/testsuccess.output rootdir/tmp/update.output
 
-# ensure that the hash of the uncompressed file was verified even on a local 
-# ims hit
+# ensure that the hash of the uncompressed file was verified even on a local ims hit
 canary="SHA512:$(bzcat aptarchive/dists/unstable/main/binary-amd64/Packages.bz2 | sha512sum |cut -f1 -d' ')"
-grep -q "RecivedHash: $canary" output.log
+testsuccess grep -- "$canary" rootdir/tmp/update.output
 
 # foo is still available
 testsuccess aptget install -s foo
-
-# the cleanup should still work
-chmod 750 aptarchive/dists/unstable/main/binary-amd64
+testsuccess aptcache showsrc foo
+testsuccess aptget source foo --print-uris
diff --git a/test/integration/test-apt-update-filesize-mismatch b/test/integration/test-apt-update-filesize-mismatch
new file mode 100755 (executable)
index 0000000..f78b83b
--- /dev/null
@@ -0,0 +1,50 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+configcompression 'gz'
+
+insertpackage 'testing' 'foo' 'all' '1'
+insertpackage 'testing' 'foo2' 'all' '1'
+insertsource 'testing' 'foo' 'all' '1'
+insertsource 'testing' 'foo2' 'all' '1'
+
+setupaptarchive --no-update
+changetowebserver
+
+find aptarchive \( -name 'Packages' -o -name 'Sources' -o -name 'Translation-en' \) -delete
+for release in $(find aptarchive -name 'Release'); do
+       cp "$release" "${release}.backup"
+done
+
+testsuccess aptget update
+testsuccess aptcache show foo
+testsuccess aptget install foo -s
+
+for get in $(sed -n 's#^GET /\([^ ]\+\.gz\) HTTP.\+$#\1#p' aptarchive/webserver.log); do
+       for ext in '' '.gz'; do
+               COMPRESSFILE="$get"
+               get="${get}${ext}"
+               FILE="$(basename "$get" '.gz')"
+               msgmsg 'Test filesize mismatch with file' "$FILE"
+               rm -rf rootdir/var/lib/apt/lists
+
+               for release in $(find aptarchive -name 'Release'); do
+                       SIZE="$(awk "/$FILE\$/ { print \$2; exit }" "${release}.backup")"
+                       sed "s# $SIZE # $(($SIZE + 111)) #" "${release}.backup" > "$release"
+               done
+               signreleasefiles
+
+               testfailure aptget update -o Debug::pkgAcquire::Worker=1
+               cp rootdir/tmp/testfailure.output rootdir/tmp/update.output
+               testsuccess grep -E "$(basename -s '.gz' "$COMPRESSFILE").*Hash Sum mismatch" rootdir/tmp/update.output
+               testfailure aptcache show foo
+               testfailure aptget install foo -s
+
+               testfailure aptcache show bar
+               testfailure aptget install bar -s
+       done
+done
diff --git a/test/integration/test-apt-update-hashsum-mismatch b/test/integration/test-apt-update-hashsum-mismatch
new file mode 100755 (executable)
index 0000000..c2c5b38
--- /dev/null
@@ -0,0 +1,44 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+configcompression 'gz'
+
+insertpackage 'testing' 'foo' 'all' '1'
+insertpackage 'testing' 'foo2' 'all' '1'
+insertsource 'testing' 'foo' 'all' '1'
+insertsource 'testing' 'foo2' 'all' '1'
+
+setupaptarchive --no-update
+changetowebserver
+
+echo 'Package: bar
+Maintainer: Doctor Evil <evil@example.com>
+Description: come to the dark side
+' > aptarchive/DoctorEvil
+compressfile aptarchive/DoctorEvil
+
+find aptarchive \( -name 'Packages' -o -name 'Sources' -o -name 'Translation-en' \) -delete
+
+testsuccess aptget update
+testsuccess aptcache show foo
+testsuccess aptget install foo -s
+
+for get in $(sed -n 's#^GET /\([^ ]\+\.gz\) HTTP.\+$#\1#p' aptarchive/webserver.log); do
+       msgmsg 'Test hashsum mismatch with file' "$get"
+       rm -rf rootdir/var/lib/apt/lists
+       webserverconfig 'aptwebserver::overwrite' ''
+       webserverconfig "aptwebserver::overwrite::$(printf '%s' "${get}" | sed 's#/#%2F#g' )::filename" '%2FDoctorEvil.gz'
+
+       testfailure aptget update
+       cp rootdir/tmp/testfailure.output rootdir/tmp/update.output
+       testsuccess grep -E "$(basename -s '.gz' "$get").*Hash Sum mismatch" rootdir/tmp/update.output
+       testfailure aptcache show foo
+       testfailure aptget install foo -s
+
+       testfailure aptcache show bar
+       testfailure aptget install bar -s
+done
diff --git a/test/integration/test-apt-update-ims b/test/integration/test-apt-update-ims
new file mode 100755 (executable)
index 0000000..0fa882d
--- /dev/null
@@ -0,0 +1,90 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+buildsimplenativepackage 'unrelated' 'all' '0.5~squeeze1' 'unstable'
+
+setupaptarchive --no-update
+changetowebserver
+
+runtest() {
+    configallowinsecurerepositories "${1:-false}"
+
+    rm -f rootdir/var/lib/apt/lists/localhost*
+
+    if [ "$1" = 'true' ]; then
+       testwarning aptget update
+    else
+       testsuccess aptget update
+    fi
+
+    # ensure no leftovers in partial
+    testfailure ls "rootdir/var/lib/apt/lists/partial/*"
+
+    # check that I-M-S header is kept in redirections
+    testequal "$EXPECT" aptget update  -o Debug::pkgAcquire::Worker=0 -o Debug::Acquire::http=0
+    
+    # ensure that we still do a hash check on ims hit
+    msgtest 'Test I-M-S' 'reverify'
+    aptget update -o Debug::pkgAcquire::Auth=1 2>&1 | grep -A2 'ReceivedHash:' | grep -q -- '- SHA' && msgpass || msgfail
+
+    # ensure no leftovers in partial
+    testfailure ls "rootdir/var/lib/apt/lists/partial/*"
+}
+
+msgmsg "InRelease"
+EXPECT="Hit http://localhost:8080 unstable InRelease
+Hit http://localhost:8080 unstable/main Sources
+Hit http://localhost:8080 unstable/main amd64 Packages
+Hit http://localhost:8080 unstable/main Translation-en
+Reading package lists..."
+# with InRelease
+runtest
+
+# with gzip
+echo "Acquire::GzipIndexes "1";" > rootdir/etc/apt/apt.conf.d/02compressindex
+runtest
+
+msgmsg "Release/Release.gpg"
+# with Release/Release.gpg
+EXPECT="Ign http://localhost:8080 unstable InRelease
+  404  Not Found
+Hit http://localhost:8080 unstable Release
+Hit http://localhost:8080 unstable Release.gpg
+Hit http://localhost:8080 unstable/main Sources
+Hit http://localhost:8080 unstable/main amd64 Packages
+Hit http://localhost:8080 unstable/main Translation-en
+Reading package lists..."
+
+find aptarchive -name 'InRelease' -delete
+
+echo "Acquire::GzipIndexes "0";" > rootdir/etc/apt/apt.conf.d/02compressindex
+runtest
+
+echo "Acquire::GzipIndexes "1";" > rootdir/etc/apt/apt.conf.d/02compressindex
+runtest
+
+# no Release.gpg or InRelease
+msgmsg "Release only"
+EXPECT="Ign http://localhost:8080 unstable InRelease
+  404  Not Found
+Hit http://localhost:8080 unstable Release
+Ign http://localhost:8080 unstable Release.gpg
+  404  Not Found
+Hit http://localhost:8080 unstable/main Sources
+Hit http://localhost:8080 unstable/main amd64 Packages
+Hit http://localhost:8080 unstable/main Translation-en
+Reading package lists...
+W: The data from 'http://localhost:8080 unstable Release.gpg' is not signed. Packages from that repository can not be authenticated."
+
+find aptarchive -name 'Release.gpg' -delete
+
+echo "Acquire::GzipIndexes "0";" > rootdir/etc/apt/apt.conf.d/02compressindex
+runtest "true"
+
+echo "Acquire::GzipIndexes "1";" > rootdir/etc/apt/apt.conf.d/02compressindex
+runtest "true"
diff --git a/test/integration/test-apt-update-nofallback b/test/integration/test-apt-update-nofallback
new file mode 100755 (executable)
index 0000000..e82a976
--- /dev/null
@@ -0,0 +1,247 @@
+#!/bin/sh
+#
+# ensure we never fallback from a signed to a unsigned repo
+# 
+# hash checks are done in 
+# 
+set -e
+
+simulate_mitm_and_inject_evil_package()
+{
+    rm -f $APTARCHIVE/dists/unstable/InRelease
+    rm -f $APTARCHIVE/dists/unstable/Release.gpg
+    inject_evil_package
+}
+
+inject_evil_package()
+{
+    cat > $APTARCHIVE/dists/unstable/main/binary-i386/Packages <<EOF
+Package: evil
+Installed-Size: 29
+Maintainer: Joe Sixpack <joe@example.org>
+Architecture: all
+Version: 1.0
+Filename: pool/evil_1.0_all.deb
+Size: 1270
+Description: an autogenerated evil package
+EOF
+    # avoid ims hit
+    touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages
+}
+
+assert_update_is_refused_and_last_good_state_used()
+{
+    testequal "E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update -qq
+
+    assert_repo_is_intact
+}
+
+assert_repo_is_intact()
+{
+    testequal "foo/unstable 2.0 all" apt list -q
+    testsuccess aptget install -y -s foo
+    testfailure aptget install -y evil
+    testsuccess aptget source foo --print-uris
+
+    LISTDIR=rootdir/var/lib/apt/lists
+    if ! ( ls $LISTDIR/*InRelease >/dev/null 2>&1 || 
+            ls $LISTDIR/*Release.gpg >/dev/null 2>&1 ); then
+        echo "Can not find InRelease/Release.gpg in $(ls $LISTDIR)"
+        msgfail
+    fi
+}
+
+setupaptarchive_with_lists_clean()
+{
+    setupaptarchive --no-update
+    rm -rf rootdir/var/lib/apt/lists
+}
+
+test_from_inrelease_to_unsigned()
+{
+    # setup archive with InRelease file
+    setupaptarchive_with_lists_clean
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+
+    simulate_mitm_and_inject_evil_package
+    assert_update_is_refused_and_last_good_state_used
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+}
+
+test_from_release_gpg_to_unsigned()
+{
+    # setup archive with Release/Release.gpg (but no InRelease)
+    setupaptarchive_with_lists_clean
+    rm $APTARCHIVE/dists/unstable/InRelease
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+
+    simulate_mitm_and_inject_evil_package
+    assert_update_is_refused_and_last_good_state_used
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+}
+
+test_from_inrelease_to_unsigned_with_override()
+{
+    # setup archive with InRelease file
+    setupaptarchive_with_lists_clean
+    # FIXME: is not what the server reported 4104 4106
+    testsuccess aptget update #-o Debug::pkgAcquire::Worker=1
+
+    # simulate moving to a unsigned but otherwise valid repo
+    simulate_mitm_and_inject_evil_package
+    generatereleasefiles
+
+    # and ensure we can update to it (with enough force) 
+    testwarning aptget update --allow-insecure-repositories \
+        -o Acquire::AllowDowngradeToInsecureRepositories=1
+    # but that the individual packages are still considered untrusted
+    testequal "WARNING: The following packages cannot be authenticated!
+  evil
+E: There are problems and -y was used without --force-yes" aptget install -qq -y evil
+}
+
+test_cve_2012_0214()
+{
+    # see https://bugs.launchpad.net/ubuntu/+source/apt/+bug/947108
+    #
+    # it was possible to MITM the download so that InRelease/Release.gpg
+    # are not delivered (404) and a altered Release file was send
+    #
+    # apt left the old InRelease file in /var/lib/apt/lists and downloaded
+    # the unauthenticated Release file too giving the false impression that
+    # Release was authenticated
+    #
+    # Note that this is pretty much impossible nowdays because:
+    # a) InRelease is left as is, not split to InRelease/Release as it was 
+    #    in the old days
+    # b) we refuse to go from signed->unsigned
+    #
+    # Still worth having a regression test the simulates the condition
+
+    # setup archive with InRelease
+    setupaptarchive_with_lists_clean
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+
+    # do what CVE-2012-0214 did
+    rm $APTARCHIVE/dists/unstable/InRelease
+    rm $APTARCHIVE/dists/unstable/Release.gpg
+    inject_evil_package
+    # build valid Release file
+    aptftparchive -qq release ./aptarchive > aptarchive/dists/unstable/Release 
+
+    assert_update_is_refused_and_last_good_state_used
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+
+    # ensure there is no _Release file downloaded
+    testfailure ls rootdir/var/lib/apt/lists/*_Release
+}
+
+test_subvert_inrelease()
+{
+    # setup archive with InRelease
+    setupaptarchive_with_lists_clean
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+
+    # replace InRelease with something else
+    mv $APTARCHIVE/dists/unstable/Release $APTARCHIVE/dists/unstable/InRelease
+
+    testequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease  Does not start with a cleartext signature
+
+E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
+
+    # ensure we keep the repo
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    assert_repo_is_intact
+}
+
+test_inrelease_to_invalid_inrelease()
+{
+    # setup archive with InRelease
+    setupaptarchive_with_lists_clean
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+
+    # now remove InRelease and subvert Release do no longer verify
+    sed -i 's/Codename.*/Codename: evil!'/ $APTARCHIVE/dists/unstable/InRelease
+    inject_evil_package
+
+    testequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable InRelease: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
+
+W: Failed to fetch file:${APTARCHIVE}/dists/unstable/InRelease  The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
+
+W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
+
+    # ensure we keep the repo
+    testfailure grep 'evil' rootdir/var/lib/apt/lists/*InRelease
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    assert_repo_is_intact
+}
+
+test_release_gpg_to_invalid_release_release_gpg()
+{
+    # setup archive with InRelease
+    setupaptarchive_with_lists_clean
+    rm $APTARCHIVE/dists/unstable/InRelease
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+
+    # now subvert Release do no longer verify
+    echo "Some evil data" >>  $APTARCHIVE/dists/unstable/Release
+    inject_evil_package
+
+    testequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable Release.gpg: The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
+
+W: Failed to fetch file:${APTARCHIVE}/dists/unstable/Release.gpg  The following signatures were invalid: BADSIG 5A90D141DBAC8DAE Joe Sixpack (APT Testcases Dummy) <joe@example.org>
+
+W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
+
+    testfailure grep 'evil' rootdir/var/lib/apt/lists/*Release
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    assert_repo_is_intact
+}
+
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+# a "normal" package with source and binary
+buildsimplenativepackage 'foo' 'all' '2.0'
+
+# setup the archive and ensure we have a single package that installs fine
+setupaptarchive
+APTARCHIVE=$(readlink -f ./aptarchive)
+assert_repo_is_intact
+
+# test the various cases where a repo may go from signed->unsigned
+msgmsg "test_from_inrelease_to_unsigned"
+test_from_inrelease_to_unsigned
+
+msgmsg "test_from_release_gpg_to_unsigned"
+test_from_release_gpg_to_unsigned
+
+# ensure we do not regress on CVE-2012-0214
+msgmsg "test_cve_2012_0214"
+test_cve_2012_0214
+
+# ensure InRelase can not be subverted
+msgmsg "test_subvert_inrelease"
+test_subvert_inrelease
+
+# ensure we revert to last good state if InRelease does not verify
+msgmsg "test_inrelease_to_invalid_inrelease"
+test_inrelease_to_invalid_inrelease
+
+# ensure we revert to last good state if Release/Release.gpg does not verify
+msgmsg "test_release_gpg_to_invalid_release_release_gpg"
+test_release_gpg_to_invalid_release_release_gpg
+
+# ensure we can override the downgrade error
+msgmsg "test_from_inrelease_to_unsigned_with_override"
+test_from_inrelease_to_unsigned_with_override
diff --git a/test/integration/test-apt-update-rollback b/test/integration/test-apt-update-rollback
new file mode 100755 (executable)
index 0000000..9efc194
--- /dev/null
@@ -0,0 +1,203 @@
+#!/bin/sh
+#
+# test that apt-get update is transactional
+# 
+set -e
+
+avoid_ims_hit() {
+    touch -d '+1hour' aptarchive/dists/unstable/main/binary-i386/Packages*
+    touch -d '+1hour' aptarchive/dists/unstable/main/source/Sources*
+    touch -d '+1hour' aptarchive/dists/unstable/*Release*
+
+    touch -d '-1hour' rootdir/var/lib/apt/lists/*
+}
+
+create_fresh_archive()
+{
+    rm -rf aptarchive/*
+    rm -f rootdir/var/lib/apt/lists/_* rootdir/var/lib/apt/lists/partial/*
+
+    insertpackage 'unstable' 'old' 'all' '1.0'
+
+    setupaptarchive --no-update
+}
+
+add_new_package() {
+    insertpackage "unstable" "new" "all" "1.0"
+    insertsource "unstable" "new" "all" "1.0"
+
+    setupaptarchive --no-update "$@"
+}
+
+break_repository_sources_index() {
+    printf 'xxx' > $APTARCHIVE/dists/unstable/main/source/Sources
+    compressfile "$APTARCHIVE/dists/unstable/main/source/Sources" "$@"
+}
+
+start_with_good_inrelease() {
+    create_fresh_archive
+    testsuccess aptget update
+    listcurrentlistsdirectory > lists.before
+    testequal "old/unstable 1.0 all" apt list -q
+}
+
+test_inrelease_to_new_inrelease() {
+    msgmsg 'Test InRelease to new InRelease works fine'
+    start_with_good_inrelease
+
+    add_new_package '+1hour'
+    testsuccess aptget update -o Debug::Acquire::Transaction=1
+    testequal "new/unstable 1.0 all
+old/unstable 1.0 all" apt list -q
+}
+
+test_inrelease_to_broken_hash_reverts_all() {
+    msgmsg 'Test InRelease to broken InRelease reverts everything'
+    start_with_good_inrelease
+
+    add_new_package '+1hour'
+    # break the Sources file
+    break_repository_sources_index '+1hour'
+
+    # test the error condition
+    testequal "W: Failed to fetch file:${APTARCHIVE}/dists/unstable/main/source/Sources  Hash Sum mismatch
+
+E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
+    # ensure that the Packages file is also rolled back
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    testequal "E: Unable to locate package new" aptget install new -s -qq
+}
+
+test_inrelease_to_valid_release() {
+    msgmsg 'Test InRelease to valid Release'
+    start_with_good_inrelease
+
+    add_new_package '+1hour'
+    # switch to a unsigned repo now
+    rm $APTARCHIVE/dists/unstable/InRelease
+    rm $APTARCHIVE/dists/unstable/Release.gpg
+
+    # update fails
+    testequal "E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update -qq
+
+    # test that security downgrade was not successful
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    testsuccess aptget install old -s
+    testfailure aptget install new -s
+    testsuccess ls $ROOTDIR/var/lib/apt/lists/*_InRelease
+    testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release
+}
+
+test_inrelease_to_release_reverts_all() {
+    msgmsg 'Test InRelease to broken Release reverts everything'
+    start_with_good_inrelease
+
+    # switch to a unsigned repo now
+    add_new_package '+1hour'
+    rm $APTARCHIVE/dists/unstable/InRelease
+    rm $APTARCHIVE/dists/unstable/Release.gpg
+
+    # break it
+    break_repository_sources_index '+1hour'
+
+    # ensure error
+    testequal "E: The repository 'file: unstable Release.gpg' is no longer signed." aptget update -qq # -o Debug::acquire::transaction=1
+
+    # ensure that the Packages file is also rolled back
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    testsuccess aptget install old -s
+    testfailure aptget install new -s
+    testsuccess ls $ROOTDIR/var/lib/apt/lists/*_InRelease
+    testfailure ls $ROOTDIR/var/lib/apt/lists/*_Release
+}
+
+test_unauthenticated_to_invalid_inrelease() {
+    msgmsg 'Test UnAuthenticated to invalid InRelease reverts everything'
+    create_fresh_archive
+    rm $APTARCHIVE/dists/unstable/InRelease
+    rm $APTARCHIVE/dists/unstable/Release.gpg
+
+    testwarning aptget update --allow-insecure-repositories
+    listcurrentlistsdirectory > lists.before
+    testequal "WARNING: The following packages cannot be authenticated!
+  old
+E: There are problems and -y was used without --force-yes" aptget install -qq -y old
+
+    # go to authenticated but not correct
+    add_new_package '+1hour'
+    break_repository_sources_index '+1hour'
+
+    testequal "W: Failed to fetch file:$APTARCHIVE/dists/unstable/main/source/Sources  Hash Sum mismatch
+
+E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
+
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    testfailure ls rootdir/var/lib/apt/lists/*_InRelease
+    testequal "WARNING: The following packages cannot be authenticated!
+  old
+E: There are problems and -y was used without --force-yes" aptget install -qq -y old
+}
+
+test_inrelease_to_unauth_inrelease() {
+    msgmsg 'Test InRelease to InRelease without good sig'
+    start_with_good_inrelease
+
+    signreleasefiles 'Marvin Paranoid'
+
+    testequal "W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: file: unstable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2
+
+W: Failed to fetch file:$APTARCHIVE/dists/unstable/InRelease  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY E8525D47528144E2
+
+W: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
+
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+    testsuccess ls rootdir/var/lib/apt/lists/*_InRelease
+}
+
+test_inrelease_to_broken_gzip() {
+    msgmsg "Test InRelease to broken gzip"
+    start_with_good_inrelease
+
+    # append junk at the end of the compressed file
+    echo "lala" >> $APTARCHIVE/dists/unstable/main/source/Sources.gz
+    touch -d '+2min' $APTARCHIVE/dists/unstable/main/source/Sources.gz
+    # remove uncompressed file to avoid fallback
+    rm $APTARCHIVE/dists/unstable/main/source/Sources
+
+    testfailure aptget update
+    testfileequal lists.before "$(listcurrentlistsdirectory)"
+}
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+# setup the archive and ensure we have a single package that installs fine
+setupaptarchive
+APTARCHIVE=$(readlink -f ./aptarchive)
+ROOTDIR=${TMPWORKINGDIRECTORY}/rootdir
+APTARCHIVE_LISTS="$(echo $APTARCHIVE | tr "/" "_" )"
+
+# test the following cases:
+# - InRelease -> broken InRelease revert to previous state
+# - empty lists dir and broken remote leaves nothing on the system
+# - InRelease -> hashsum mismatch for one file reverts all files to previous state
+# - Release/Release.gpg -> hashsum mismatch
+# - InRelease -> Release with hashsum mismatch revert entire state and kills Release
+# - Release -> InRelease with broken Sig/Hash removes InRelease
+# going from Release/Release.gpg -> InRelease and vice versa
+# - unauthenticated -> invalid InRelease
+
+# stuff to do:
+# - ims-hit
+# - gzip-index tests
+
+test_inrelease_to_new_inrelease
+test_inrelease_to_broken_hash_reverts_all
+test_inrelease_to_valid_release
+test_inrelease_to_release_reverts_all
+test_unauthenticated_to_invalid_inrelease
+test_inrelease_to_unauth_inrelease
+test_inrelease_to_broken_gzip
index 780ff79afd9a9ac7a012e54d4c87339089e31dfd..277aa5b09e9d2e54f2185e2f3ae2a60dc36516de 100755 (executable)
@@ -14,9 +14,12 @@ configarchitecture "i386"
 
 insertpackage 'unstable' 'foo' 'all' '1.0'
 
-setupaptarchive
+setupaptarchive --no-update
 changetowebserver
-aptget update -qq
+
+echo "Acquire::Languages \"none\";" > rootdir/etc/apt/apt.conf.d/00nolanguages
+testsuccess aptget update
+listcurrentlistsdirectory > lists.before
 
 # insert new version
 mkdir aptarchive/dists/unstable/main/binary-i386/saved
@@ -24,23 +27,19 @@ cp -p aptarchive/dists/unstable/main/binary-i386/Packages* \
      aptarchive/dists/unstable/main/binary-i386/saved
 insertpackage 'unstable' 'foo' 'all' '2.0'
 
-# not using compressfile for compat with older apt releases
-gzip -c aptarchive/dists/unstable/main/binary-i386/Packages > \
-  aptarchive/dists/unstable/main/binary-i386/Packages.gz
-generatereleasefiles
-signreleasefiles
-
+compressfile aptarchive/dists/unstable/main/binary-i386/Packages
 # ensure that we do not get a I-M-S hit for the Release file
-touch -d "+1hour" aptarchive/dists/unstable/*Release*
+
+generatereleasefiles '+1hour'
+signreleasefiles
 
 # but now only deliver the previous Packages file instead of the new one
 # (simulating a stale attack)
 cp -p aptarchive/dists/unstable/main/binary-i386/saved/Packages* \
      aptarchive/dists/unstable/main/binary-i386/
 
-# ensure this raises a error
+# ensure this raises an error
 testequal "W: Failed to fetch http://localhost:8080/dists/unstable/main/binary-i386/Packages  Hash Sum mismatch
 
 E: Some index files failed to download. They have been ignored, or old ones used instead." aptget update -qq
-
-
+testfileequal lists.before "$(listcurrentlistsdirectory)"
diff --git a/test/integration/test-apt-update-transactions b/test/integration/test-apt-update-transactions
new file mode 100755 (executable)
index 0000000..b325733
--- /dev/null
@@ -0,0 +1,64 @@
+#!/bin/sh
+set -e
+
+# ensure that an update will only succeed entirely or not at all
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'i386'
+
+insertpackage 'unstable' 'foo' 'all' '1.0'
+insertsource 'unstable' 'foo' 'all' '1.0'
+
+setupaptarchive --no-update
+
+breakfile() {
+       mv "$1" "${1}.bak"
+       cat > "$1" <<EOF
+Package: bar
+EOF
+       compressfile "$1"
+}
+restorefile() {
+       mv "${1}.bak" "$1"
+}
+
+testrun() {
+       # produce an unsigned repository
+       find aptarchive \( -name 'Release.gpg' -o -name 'InRelease' \) -delete
+       testfailure aptget update --no-allow-insecure-repositories
+       testfileequal "$1" "$(listcurrentlistsdirectory)"
+
+       # signed but broken
+       signreleasefiles
+
+       breakfile aptarchive/dists/unstable/main/binary-i386/Packages
+       testfailure aptget update
+       testfileequal "$1" "$(listcurrentlistsdirectory)"
+       restorefile aptarchive/dists/unstable/main/binary-i386/Packages
+
+       breakfile aptarchive/dists/unstable/main/source/Sources
+       testfailure aptget update
+       testfileequal "$1" "$(listcurrentlistsdirectory)"
+       restorefile aptarchive/dists/unstable/main/source/Sources
+}
+
+testsetup() {
+       msgmsg 'Test with no initial data over' "$1"
+       rm -rf rootdir/var/lib/apt/lists
+       mkdir -p rootdir/var/lib/apt/lists/partial
+       listcurrentlistsdirectory > listsdir.lst
+       testrun 'listsdir.lst'
+
+       msgmsg 'Test with initial data over' "$1"
+       testsuccess aptget update
+       listcurrentlistsdirectory > listsdir.lst
+       testrun 'listsdir.lst'
+}
+
+testsetup 'file'
+changetowebserver
+testsetup 'http'
+
index 13487603cd04858bae2e432f44dea503a22138b3..7347f7d10ebb3eb82a7aa87fbf6ad5f976a72579 100755 (executable)
@@ -8,32 +8,61 @@ set -e
 TESTDIR=$(readlink -f $(dirname $0))
 . $TESTDIR/framework
 
+umask 022
+
 setupenvironment
 configarchitecture "i386"
 
 insertpackage 'unstable' 'foo' 'all' '1.0'
 insertsource 'unstable' 'foo' 'all' '1.0'
 
-setupaptarchive
+setupaptarchive --no-update
 changetowebserver
 
+# FIXME: 
+#  - also check the unauth -> auth success case, i.e. that all files are
+#    reverified
 runtest() {
     # start unauthenticated
-    find rootdir/var/lib/apt/lists/ -type f | xargs rm -f
-    rm -f aptarchive/dists/unstable/*Release*
-    aptget update -qq
+    rm -rf rootdir/var/lib/apt/lists/
+    find aptarchive/ -name '*Release*' -delete
+
+    testwarning aptget update --allow-insecure-repositories
 
     # become authenticated
     generatereleasefiles
     signreleasefiles
 
-    # and ensure we do download the data again
-    msgtest "Check that the data is check when going to authenticated"
-    if aptget update |grep -q Hit; then
-        msgfail
-    else
+    # move uncompressed away
+    mv aptarchive/dists/unstable/main/binary-i386/Packages \
+        aptarchive/dists/unstable/main/binary-i386/Packages.uncompressed
+
+    # and ensure we re-check the downloaded data
+
+    # change the local packages file
+    PKGS=$(ls rootdir/var/lib/apt/lists/*Packages*)
+    echo "meep" > $PKGS
+    listcurrentlistsdirectory > lists.before
+
+    # update and ensure all is reverted on the hashsum failure
+    testfailure aptget update -o Debug::Acquire::Transaction=0 -o Debug::pkgAcquire::Auth=1 -o Debug::pkgAcquire::worker=0 -o Debug::acquire::http=0
+
+    # ensure we have before what we have after
+    msgtest 'Check rollback on going from' 'unauth -> auth'
+    listcurrentlistsdirectory > lists.after
+    if cmp lists.before lists.after; then
         msgpass
+    else
+       echo >&2 '### Output of previous apt-get update ###'
+       cat >&2 rootdir/tmp/testfailure.output
+       echo >&2 '### Changes in the lists-directory: ###'
+       diff -u >&2 lists.before lists.after
+       msgfail
     fi
+
+    # move uncompressed back for release file
+    mv aptarchive/dists/unstable/main/binary-i386/Packages.uncompressed \
+        aptarchive/dists/unstable/main/binary-i386/Packages
 }
 
 for COMPRESSEDINDEXES in 'false' 'true'; do
@@ -43,6 +72,5 @@ for COMPRESSEDINDEXES in 'false' 'true'; do
        else
                msgmsg 'Run tests with GzipIndexes disabled'
        fi
-
-        runtest
+       runtest
 done
diff --git a/test/integration/test-authentication-basic b/test/integration/test-authentication-basic
new file mode 100755 (executable)
index 0000000..7e74726
--- /dev/null
@@ -0,0 +1,106 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'i386'
+
+insertpackage 'unstable' 'foo' 'all' '1'
+setupaptarchive --no-update
+
+changetohttpswebserver --authorization="$(printf '%s' 'star:hunter2' | base64 )"
+
+echo 'See, when YOU type hunter2, it shows to us as *******' > aptarchive/bash
+
+testauthfailure() {
+       testfailure apthelper download-file "${1}/bash" ./downloaded/bash
+       # crappy test, but http and https output are wastely different…
+       testsuccess grep 401 rootdir/tmp/testfailure.output
+       testfailure test -s ./downloaded/bash
+}
+
+testauthsuccess() {
+       testsuccess apthelper download-file "${1}/bash" ./downloaded/bash
+       testfileequal ./downloaded/bash "$(cat aptarchive/bash)"
+       testfilestats ./downloaded/bash '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:644"
+       rm -f ./downloaded/bash
+
+       # lets see if got/retains acceptable permissions
+       if [ -n "$AUTHCONF" ]; then
+               if [ "$(id -u)" = '0' ]; then
+                       testfilestats "$AUTHCONF" '%U:%G:%a' '=' "_apt:root:600"
+               else
+                       testfilestats "$AUTHCONF" '%U:%G:%a' '=' "${TEST_DEFAULT_USER}:${TEST_DEFAULT_GROUP}:600"
+               fi
+       fi
+
+       rm -rf rootdir/var/lib/apt/lists
+       testsuccess aptget update
+       testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  foo
+0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
+Inst foo (1 unstable [all])
+Conf foo (1 unstable [all])' aptget install foo -s
+}
+
+authfile() {
+       local AUTHCONF='rootdir/etc/apt/auth.conf'
+       rm -f "$AUTHCONF"
+       printf '%s' "$1" > "$AUTHCONF"
+       chmod 600 "$AUTHCONF"
+}
+
+runtest() {
+       # unauthorized fails
+       authfile ''
+       testauthfailure "$1"
+
+       # good auth
+       authfile 'machine localhost
+login star
+password hunter2'
+       testauthsuccess "$1"
+
+       # bad auth
+       authfile 'machine localhost
+login anonymous
+password hunter2'
+       testauthfailure "$1"
+
+       # 2 stanzas: unmatching + good auth
+       authfile 'machine debian.org
+login debian
+password jessie
+
+machine localhost
+login star
+password hunter2'
+       testauthsuccess "$1"
+}
+
+msgmsg 'server basic auth'
+rewritesourceslist 'http://localhost:8080'
+runtest 'http://localhost:8080'
+rewritesourceslist 'https://localhost:4433'
+runtest 'https://localhost:4433'
+rewritesourceslist 'http://localhost:8080'
+
+msgmsg 'proxy to server basic auth'
+webserverconfig 'aptwebserver::request::absolute' 'uri'
+export http_proxy='http://localhost:8080'
+runtest 'http://localhost:8080'
+unset http_proxy
+
+msgmsg 'proxy basic auth to server basic auth'
+webserverconfig 'aptwebserver::proxy-authorization' "$(printf 'moon:deer2' | base64)"
+export http_proxy='http://moon:deer2@localhost:8080'
+runtest 'http://localhost:8080'
+
+msgmsg 'proxy basic auth to server'
+authfile ''
+webserverconfig 'aptwebserver::authorization' ''
+testauthsuccess 'http://localhost:8080'
index 59102ddc9d1bece7e124e4facd0ad3046f7e9c5e..6ae8944b2a64d3f4d583cc9372d6eeec225f1af9 100755 (executable)
@@ -3,17 +3,25 @@ set -e
 
 TESTDIR=$(readlink -f $(dirname $0))
 . $TESTDIR/framework
+
+msgtest 'Test run as' 'non-root'
+if [ "$(id -u)" = '0' ]; then
+       msgskip 'root has by definition no problems accessing files'
+       exit 0
+else
+       msgpass
+fi
+
 setupenvironment
 configarchitecture "i386"
 setupaptarchive
 
-CURRENTTRAP="chmod a+x rootdir/var/lib/dpkg; $CURRENTTRAP"
-trap "$CURRENTTRAP" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
+addtrap 'prefix' 'chmod a+x rootdir/var/lib/dpkg;'
 chmod a-x rootdir/var/lib/dpkg
 
 testsegfault() {
        msgtest "No segfault in" "$*"
-       local TEST="$($* 2>&1 | grep -v 'E:')"
+       local TEST="$("$@" 2>&1 | grep -v 'E:')"
        if [ -z "$TEST" ]; then
                msgpass
        else
index 513421a94d353d80f20bbf23f9f324a7d12b8cfb..f3b4e04fbd323b5905d728f47620a047396ca389 100755 (executable)
@@ -16,6 +16,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   tshark wireshark-common
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
index e1c0b42d179302ce94a3366ef6aa34f885d54d45..891ddb8b7dd4fe6b9ba7530f9278fe4584767074 100755 (executable)
@@ -9,6 +9,7 @@ setupaptarchive
 
 UPGRADEFAIL="Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   conkeror libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9
 The following NEW packages will be installed:
@@ -40,6 +41,7 @@ E: Trivial Only specified but this is not a trivial operation."
 
 UPGRADESUCCESS="Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   libdatrie0 libkrb53 libxcb-xlib0 xulrunner-1.9
 The following NEW packages will be installed:
index aea340203c0230663f07ead866c6f27cc2c4045f..bca07268cb012064e667b7b6e70dd48e800c0bd7 100755 (executable)
@@ -13,7 +13,7 @@ setupflataptarchive
 testaptgetupdate() {
        rm -rf rootdir/var/lib/apt
        aptget update 2>> testaptgetupdate.diff >> testaptgetupdate.diff || true
-       sed -i -e '/^Fetched / d' -e '/Ign / d' -e '/Release/ d' -e 's#Get:[0-9]\+ #Get: #' -e 's#\[[0-9]* [kMGTPY]*B\]#\[\]#' testaptgetupdate.diff
+       sed -i -e '/Ign /,+1d' -e '/Release/ d' -e 's#Get:[0-9]\+ #Get: #' -e 's#\[[0-9]* [kMGTPY]*B\]#\[\]#' testaptgetupdate.diff
        GIVEN="$1"
        shift
        msgtest "Test for correctness of" "apt-get update with $*"
@@ -73,16 +73,6 @@ E: Some index files failed to download. They have been ignored, or old ones used
 testoverhttp() {
        forcecompressor "$1"
 
-       createemptyfile 'en'
-       testaptgetupdate "Get: http://localhost:8080  Packages []
-Get: http://localhost:8080  Translation-en
-Reading package lists..." "empty file en.$COMPRESS over http"
-
-       createemptyarchive 'en'
-       testaptgetupdate "Get: http://localhost:8080  Packages []
-Get: http://localhost:8080  Translation-en []
-Reading package lists..." "empty archive en.$COMPRESS over http"
-
        createemptyarchive 'Packages'
        testaptgetupdate "Get: http://localhost:8080  Packages []
 Reading package lists..." "empty archive Packages.$COMPRESS over http"
index 06c9c82854e09a198a5aceffa86ef103c7489347..1e5e75b0e836291de2c1cb901fa708abcdd3a45e 100755 (executable)
@@ -12,7 +12,7 @@ setupaptarchive
 
 aptgetupdate() {
        rm -rf rootdir/var/lib/apt/ rootdir/var/cache/apt/*.bin
-       aptget update -qq
+       ${1:-testwarning} aptget update --allow-insecure-repositories
 }
 
 PKGTEXT="$(aptget install cool --assume-no -d | head -n 7)"
@@ -25,7 +25,7 @@ testequal "$PKGTEXT
 Download complete and in download only mode" aptget install cool --assume-no -d --allow-unauthenticated
 
 sed -i -e 's#deb#deb [trusted=no]#' $DEBFILE
-aptgetupdate
+aptgetupdate 'testsuccess'
 
 testequal "$PKGTEXT
 WARNING: The following packages cannot be authenticated!
index e6913edcffe5505242aa59929da51ad3ebf4fa96..fe0ccc7837e04fbb12fd7b8d41a4235a2bf7ee3d 100755 (executable)
@@ -57,7 +57,7 @@ echo 'Package: apt
 Pin: release a=now
 Pin-Value: 1000' > rootdir/etc/apt/good-link.pref
 ln -s rootdir/etc/apt/good-link.pref rootdir/etc/apt/preferences
-test -n "$(aptcache policy | grep 1000)" && msgfail || msgpass
+test -n "$(aptcache policy | grep '1000 ')" && msgfail || msgpass
 rm rootdir/etc/apt/preferences
 
 msgtest "Broken link instead of a file as preferences ignored"
index 0f09d29279b0dbae9cb4282f22afa6edbc0a8a4d..bb72d59e329c3f193644bbece223ed728a05a72c 100755 (executable)
@@ -9,6 +9,7 @@ setupaptarchive
 
 testequal "Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   php5 php5-cgi
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
index 20dc3a7e576b2fba5560ff1283c19dd6b148d879..c32600037997473fbdae67b0f5e5a7e97ff79647 100755 (executable)
@@ -70,6 +70,7 @@ Conf foobar (1.0 stable [i386])' aptget install foobar/stable libc6 -st testing
 testequal 'Reading package lists...
 Building dependency tree...
 Reading state information...
+Calculating upgrade...
 The following packages will be upgraded:
   libc6
 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
@@ -168,6 +169,7 @@ Conf libc6-same:amd64 (1.0 stable [amd64])' aptget install libc6-same:amd64 -s -
 testequal 'Reading package lists...
 Building dependency tree...
 Reading state information...
+Calculating upgrade...
 The following packages will be upgraded:
   libc6-same
 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
index f93510fd76ed0083dcf927b16565a7c02318fadf..582e1bf5eec0e7e1b1413e3c2c0c8f43f615dbea 100755 (executable)
@@ -24,15 +24,19 @@ testfilemissing() {
 
 testrun() {
        rm -rf rootdir/var/lib/apt
-       testsuccess aptget update
+       cd downloaded
 
        if [ "$1" = 'trusted' ]; then
+               testsuccess aptget update
+
                testsuccess aptget download cool
                testfileexists 'cool_1.0_i386.deb'
 
                testsuccess aptget download cool --allow-unauthenticated
                testfileexists 'cool_1.0_i386.deb'
        else
+                testwarning aptget update --allow-insecure-repositories
+
                testfailure aptget download cool
                testfilemissing 'cool_1.0_i386.deb'
 
@@ -40,18 +44,19 @@ testrun() {
                testfileexists 'cool_1.0_i386.deb'
        fi
 
-       mv aptarchive/pool/cool_1.0_i386.deb aptarchive/pool/cool_1.0_i386.deb.bak
-       echo 'this is not a good package' > aptarchive/pool/cool_1.0_i386.deb
+       mv ../aptarchive/pool/cool_1.0_i386.deb ../aptarchive/pool/cool_1.0_i386.deb.bak
+       echo 'this is not a good package' > ../aptarchive/pool/cool_1.0_i386.deb
        testfailure aptget download cool
        testfilemissing cool_1.0_i386.deb
 
        testfailure aptget download cool --allow-unauthenticated  # unauthenticated doesn't mean unchecked
        testfilemissing cool_1.0_i386.deb
 
-       rm -f aptarchive/pool/cool_1.0_i386.deb
-       mv aptarchive/pool/cool_1.0_i386.deb.bak aptarchive/pool/cool_1.0_i386.deb
+       rm -f ../aptarchive/pool/cool_1.0_i386.deb
+       mv ../aptarchive/pool/cool_1.0_i386.deb.bak ../aptarchive/pool/cool_1.0_i386.deb
        testsuccess aptget download cool --allow-unauthenticated
        testfileexists 'cool_1.0_i386.deb'
+       cd - >/dev/null
 }
 
 testrun 'trusted'
index d3c5b08ac2ad65b2a6424131f943ed5cd0eea2ea..652386892d67aca931cbe5f2e162c2768fb101ce 100755 (executable)
@@ -8,86 +8,101 @@ configarchitecture 'i386'
 
 buildsimplenativepackage 'coolstuff' 'all' '1.0' 'unstable'
 
-setupaptarchive
+setupaptarchive --no-update
 
 changetowebserver
-
 rm -rf rootdir/var/lib/apt/lists
 
 translationslisted() {
        msgtest 'No download of non-existent locals' "$1"
-       LC_ALL="" aptget update -o Acquire::Languages=en | grep -q -e 'Translation-[^e][^n] ' && msgfail || msgpass
+       export LC_ALL=""
+       testsuccess --nomsg aptget update -o Acquire::Languages=en
+       testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
 
        msgtest 'Download of existent locals' "$1"
-       LC_ALL="" aptget update | grep -q -e 'Translation-en ' && msgpass || msgfail
+       testsuccess --nomsg aptget update
+       cp rootdir/tmp/testsuccess.output testsuccess.output
+       testsuccess grep -q -e 'Translation-en ' testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
 
        msgtest 'Download of en in LC_ALL=C' "$1"
-       LC_ALL=C aptget update | grep -q -e 'Translation-en ' && msgpass || msgfail
+       export LC_ALL=C
+       testsuccess --nomsg aptget update
+       cp rootdir/tmp/testsuccess.output testsuccess.output
+       testsuccess grep -q -e 'Translation-en ' testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
+       unset LC_ALL
 
        msgtest 'Download of en as forced language' "$1"
-       aptget update -o Acquire::Languages=en | grep -q -e 'Translation-en ' && msgpass || msgfail
+       testsuccess --nomsg aptget update -o Acquire::Languages=en
+       cp rootdir/tmp/testsuccess.output testsuccess.output
+       testsuccess grep -q -e 'Translation-en ' testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
 
        msgtest 'Download of nothing else in forced language' "$1"
-       aptget update -o Acquire::Languages=en | grep -q -e 'Translation-[^e][^n] ' && msgfail || msgpass
+       testsuccess --nomsg aptget update -o Acquire::Languages=en
+       testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
 
        msgtest 'Download no Translation- if forced language is non-existent' "$1"
-       aptget update -o Acquire::Languages=ast_DE | grep -q -e 'Translation-' && msgfail || msgpass
+       testsuccess --nomsg aptget update -o Acquire::Languages=ast_DE
+       testfailure grep -q -e 'Translation-' rootdir/tmp/testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
 
        msgtest 'Download of nothing if none is forced' "$1"
-       aptget update -o Acquire::Languages=none | grep -q -e 'Translation' && msgfail || msgpass
+       testsuccess --nomsg aptget update -o Acquire::Languages=none
+       testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output
        rm -rf rootdir/var/lib/apt/lists
 }
 
 translationslisted 'with full Index'
 
-
-# only compressed files available (as it happens on CD-ROM)
-sed -i '/i18n\/Translation-[^.]*$/ d' $(find aptarchive -name 'Release')
-signreleasefiles
-
-translationslisted 'with partial Index'
-
-
-# no records at all about Translation files (fallback to guessing)
-sed -i '/i18n\/Translation-.*$/ d' $(find aptarchive -name 'Release')
-signreleasefiles
+# No Release file at all, so no records about Translation files
+# (fallback to guessing)
+find aptarchive \( -name 'Release' -o -name 'InRelease' \) -delete
+configallowinsecurerepositories "true";
 
 msgtest 'Download of en as forced language' 'without Index'
-aptget update -o Acquire::Languages=en | grep -q -e 'Translation-en ' && msgpass || msgfail
+testwarning --nomsg aptget update -o Acquire::Languages=en
+cp rootdir/tmp/testsuccess.output testsuccess.output
+testsuccess grep -q -e 'Translation-en ' testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
 
 msgtest 'Download of nothing else in forced language' 'without Index'
-aptget update -o Acquire::Languages=en | grep -q -e 'Translation-[^e][^n] ' && msgfail || msgpass
+testwarning --nomsg aptget update -o Acquire::Languages=en
+testfailure grep -q -e 'Translation-[^e][^n] ' rootdir/tmp/testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
 
 msgtest 'Download of ast_DE as forced language' 'without Index'
-aptget update -o Acquire::Languages=ast_DE | grep -q -e 'Translation-ast_DE$' && msgpass || msgfail
+testwarning --nomsg aptget update -o Acquire::Languages=ast_DE
+cp rootdir/tmp/testsuccess.output testsuccess.output
+testsuccess grep -q -e 'Translation-ast_DE$' testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
 
 msgtest 'Download of nothing else in forced language' 'without Index'
-aptget update -o Acquire::Languages=ast_DE | grep -q -e 'Translation-[^a][^s]' && msgfail || msgpass
+testwarning --nomsg aptget update -o Acquire::Languages=ast_DE
+testfailure grep -q -e 'Translation-[^a][^s]' rootdir/tmp/testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
 
 msgtest 'Download of nothing if none is forced' 'without Index'
-aptget update -o Acquire::Languages=none | grep -q -e 'Translation' && msgfail || msgpass
+testwarning --nomsg aptget update -o Acquire::Languages=none
+testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
 
 mkdir -p rootdir/var/lib/apt/lists
 touch rootdir/var/lib/apt/lists/localhost:8080_dists_unstable_main_i18n_Translation-ast_DE
 
 msgtest 'Download of builtin files' 'without Index'
-aptget update | grep -q -e 'Translation-ast_DE' && msgpass || msgfail
+testwarning --nomsg aptget update
+cp rootdir/tmp/testsuccess.output testsuccess.output
+testsuccess grep -q -e 'Translation-ast_DE' testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
 
 mkdir -p rootdir/var/lib/apt/lists
 touch rootdir/var/lib/apt/lists/localhost:8080_dists_unstable_main_i18n_Translation-ast_DE
 
 msgtest 'Download of nothing (even builtin) if none is forced' 'without Index'
-aptget update -o Acquire::Languages=none | grep -q -e 'Translation' && msgfail || msgpass
+testwarning --nomsg aptget update -o Acquire::Languages=none
+testfailure grep -q -e 'Translation' rootdir/tmp/testsuccess.output
 rm -rf rootdir/var/lib/apt/lists
index 9a9e7be10e162a0b763155d82993041e2d130b5b..9e6c223a8ca5671028f119fb6110a097ac0afcae 100755 (executable)
@@ -21,6 +21,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   oldcrap
 The following NEW packages will be installed:
@@ -35,6 +36,7 @@ testsuccess aptmark hold apt
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   apt
 The following packages will be upgraded:
index e9b27cfcd04a0497f104d5d775ff02d880e95314..1b92a04feea180009cc3844d49153b6f22e1f116 100755 (executable)
@@ -18,6 +18,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   xserver-xorg-video-driver1 xserver-xorg-video-driver10
   xserver-xorg-video-driver11 xserver-xorg-video-driver12
index 21bd5e065798964acc8a562697da5c24e8d0a8a9..eb47553dcd8da71e9a7b27ab9c1f886d14d3e14e 100755 (executable)
@@ -24,12 +24,11 @@ testloopbreak() {
        cp -a dpkg.status.backup rootdir/var/lib/dpkg/status
        rm -f rootdir/var/lib/apt/extended_states
 
-
-       testsuccess aptget install advanced=1 -y -t "$1" -o Debug::pkgPackageManager=1
+       testsuccess aptget install advanced=1 -y -t "$1"
        testdpkginstalled advanced
        testdpkgnotinstalled basic common
 
-       testsuccess aptget dist-upgrade -y -t "$1" -o Debug::pkgPackageManager=1
+       testsuccess aptget dist-upgrade -y -t "$1"
        testdpkginstalled advanced basic common
 }
 
index 7d8cc3484cd3c84e3312f750efd671a10f1ea6d6..2a27c62b183cea66e1d3c6c54d78a3be873aaab9 100755 (executable)
@@ -69,6 +69,7 @@ Purg pkg-none-foreign:i386 [1]' aptget purge pkg-none-foreign:i386 -s
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following NEW packages will be installed:
   pkg-depends-new:i386 pkg-none-new
 The following packages will be upgraded:
index 2e5e39c8ed39e72f47060a6fb81d82c6503c1d0e..3f40c23dce883273b8eea3e76b832e4c33c9a321 100755 (executable)
@@ -19,6 +19,7 @@ runtests() {
 
        testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   pkgall pkgarch
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
@@ -30,6 +31,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgr
 
        testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   pkgarch
 The following packages will be upgraded:
@@ -43,6 +45,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgr
 
        testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   pkgall pkgarch
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
@@ -54,6 +57,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget dist-upgr
 
        testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   pkgall
 The following packages will be upgraded:
index 879d6a3bce2b97f25bdefe6a2a1aa78207d9adb3..65862c572b55b465d781bd4a157277a40579dba0 100755 (executable)
@@ -38,8 +38,8 @@ Building dependency tree...
 The following NEW packages will be installed:
   po-debconf
 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
-Inst po-debconf (1 unstable, unstable [all])
-Conf po-debconf (1 unstable, unstable [all])' aptget build-dep dash -s
+Inst po-debconf (1 unstable [all])
+Conf po-debconf (1 unstable [all])' aptget build-dep dash -s
 
 testequal 'Reading package lists...
 Building dependency tree...
index dc51861ab276386b52785b062a2368bc1829ef7f..8024f81dae56f573ba48b243142e92a43671b554 100755 (executable)
@@ -53,6 +53,7 @@ testnopackage pkge:*
 # this difference seems so important that it has to be maintained …
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade -s
 
 # pkgd has no update with an architecture
index 53ecbbeb3afedaf630ea4d18834f2985e2b11a5f..7a35187452482e209557d3032c87be4ed5679ac4 100755 (executable)
@@ -87,13 +87,10 @@ $DESCRIPTION
 Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 " aptcache show apt-normal
 
-# displaying the translated Description would be equally valid,
-# but we assume only one description is in a Packages file and
-# so we prefer "Description" over "Description-*" currently.
 for variant in 'below' 'middle' 'top'; do
        testequal "Package: apt-both-$variant
 $PACKAGESTANZA
-$DESCRIPTION
+$TRANSDESCRIPTION
 Description-md5: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
 " aptcache show apt-both-$variant
 done
@@ -122,7 +119,7 @@ X-Some-Flag: yes
 
 testequal "Package: apt-intermixed2
 $PACKAGESTANZA
-$DESCRIPTION
+$TRANSDESCRIPTION
 Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 X-Some-Flag: yes
 X-Foo-Flag: Something with a Description
@@ -131,7 +128,7 @@ X-Bar-Flag: no
 
 testequal "Package: apt-intermixed3
 $PACKAGESTANZA
-$DESCRIPTION
+$TRANSDESCRIPTION
 Description-md5: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
 X-Some-Flag: yes
 X-Foo-Flag: Something with a Description
index ac1d6ec11c91c1bacfc3cded114d30c344e42d85..54a61668633ab46dbe14af9944b84a66bffb052b 100755 (executable)
@@ -12,7 +12,7 @@ setupaptarchive
 changetowebserver --request-absolute='uri'
 
 msgtest 'Check that absolute paths are' 'not accepted'
-testfailure --nomsg aptget update
+testfailure --nomsg aptget update --allow-insecure-repositories
 
 echo 'Acquire::http::Proxy "http://localhost:8080";' > rootdir/etc/apt/apt.conf.d/99proxy
 
index f2d95da19d03e0b64be7b8c8bc7a0434f6d37f9f..9a5685703e6b2fbb01f12a64739500ef29c36107 100755 (executable)
@@ -16,10 +16,10 @@ setupaptarchive
 
 APTARCHIVE=$(readlink -f ./aptarchive)
 
-testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget upgrade -qq --print-uris
-testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget dist-upgrade -qq --print-uris
-testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget install apt -qq --print-uris
-testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 MD5Sum:" aptget download apt -qq --print-uris
+testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget upgrade -qq --print-uris
+testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget dist-upgrade -qq --print-uris
+testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget install apt -qq --print-uris
+testequal "'file://${APTARCHIVE}/pool/main/apt/apt_2_all.deb' apt_2_all.deb 0 " aptget download apt -qq --print-uris
 testequal "'file://${APTARCHIVE}/apt_2.dsc' apt_2.dsc 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e
 'file://${APTARCHIVE}/apt_2.tar.gz' apt_2.tar.gz 0 MD5Sum:d41d8cd98f00b204e9800998ecf8427e" aptget source apt -qq --print-uris
 testequal "'http://packages.debian.org/changelogs/pool/main/apt/apt_2/changelog'" aptget changelog apt -qq --print-uris
index 0451fc1ed97ca3e0d11fbef4800b38caa85e1c6a..37e5a013e04a9f2db9069dbd574a3577fc5198e9 100755 (executable)
@@ -17,7 +17,7 @@ msgtest 'Test apt-get update with incorrect' 'TMPDIR'
 OUTPUT=$(mktemp)
 addtrap "rm $OUTPUT;"
 export TMPDIR=/does-not-exists
-if aptget update >${OUTPUT} 2>&1; then
+if aptget update -o Debug::Acquire::gpg=1 >${OUTPUT} 2>&1; then
        msgpass
 else
        echo
@@ -27,3 +27,4 @@ fi
 unset TMPDIR
 
 testequal 'coolstuff' aptcache pkgnames
+testsuccess ls rootdir/var/lib/apt/lists/*InRelease
diff --git a/test/integration/test-bug-733028-gpg-resource-limit b/test/integration/test-bug-733028-gpg-resource-limit
new file mode 100755 (executable)
index 0000000..7040856
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+insertpackage 'unstable' 'foobar' 'all' '1'
+
+setupaptarchive --no-update
+
+for i in $(seq 1 50); do
+       touch rootdir/etc/apt/trusted.gpg.d/emptykey-${i}.gpg
+done
+
+aptkey list | grep '^pub' > aptkey.list
+testfileequal ./aptkey.list 'pub   2048R/DBAC8DAE 2010-08-18'
+
+testsuccess aptget update
+msgtest 'Test for no gpg errors/warnings in' 'apt-get update'
+if grep -iq 'GPG' rootdir/tmp/testsuccess.output; then
+       cat rootdir/tmp/testsuccess.output
+       msgfail
+else
+       msgpass
+fi
index e9f3bf96dde0dabd743d7e88aeeb8fea5cc8cbbd..826931fe45d1e34beb00699d60f2ee793d7c2ae4 100755 (executable)
@@ -33,6 +33,7 @@ testsuccess aptget update
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   lib32nss-mdns
 The following packages will be upgraded:
@@ -60,6 +61,7 @@ testsuccess aptget update
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following NEW packages will be installed:
   libnss-mdns:i386 libnss-mdns-i386:i386
 The following packages will be upgraded:
index 1e5748eae12048acd152ded4b76ad5e2dbe1b524..0f458e099b285d0a02af404e140e42b93b02bfbb 100755 (executable)
@@ -25,6 +25,7 @@ downloadfile 'http://localhost:8080/pool/apt_1.0/changelog' changelog >/dev/null
 echo 'Apt::Changelogs::Server "http://localhost:8080/redirectme";' > rootdir/etc/apt/apt.conf.d/changelog.conf
 testequal "'http://localhost:8080/redirectme/pool/apt_1.0/changelog'" aptget changelog apt --print-uris
 
+cd downloaded
 testsuccess aptget changelog apt -d
 testsuccess test -s apt.changelog
 rm -f apt.changelog
@@ -32,6 +33,7 @@ rm -f apt.changelog
 testsuccess aptget download apt
 testsuccess test -s apt_1.0_all.deb
 rm apt_1.0_all.deb
+cd - >/dev/null
 
 testsuccess aptget install apt -y
 testdpkginstalled 'apt'
@@ -49,9 +51,11 @@ rm https
 cd - >/dev/null
 echo "Dir::Bin::Methods \"${COPYMETHODS}\";" >> aptconfig.conf
 
-testequal "E: The method driver $(pwd)/rootdir/usr/lib/apt/methods/https could not be found.
+cd downloaded
+testequal "E: The method driver $(readlink -f './../')/rootdir/usr/lib/apt/methods/https could not be found.
 N: Is the package apt-transport-https installed?" aptget download apt -q=0
-testsuccess test ! -e apt_1.0_all.deb
+testfailure test -e apt_1.0_all.deb
+cd - >/dev/null
 
 # revert to all methods
 rm -rf rootdir/$COPYMETHODS
@@ -60,4 +64,4 @@ mv rootdir/${COPYMETHODS}.bak rootdir/${COPYMETHODS}
 # check that downgrades from https to http are not allowed
 webserverconfig 'aptwebserver::support::http' 'true'
 sed -i -e 's#:8080/redirectme#:4433/downgrademe#' -e 's# http:# https:#' rootdir/etc/apt/sources.list.d/*
-testfailure aptget update
+testfailure aptget update --allow-insecure-repositories
index cb035a71f444c2761c63087731a61897d565a77a..9426ffad1491731973408bf87290ddb6db0e4b20 100755 (executable)
@@ -24,6 +24,7 @@ setupaptarchive
 
 testequalor2 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   foo-driver libfoo libfoo:i386 libgl1-foo-glx libgl1-foo-glx:i386
 5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
@@ -38,6 +39,7 @@ Conf libgl1-foo-glx:i386 (2 stable [i386])
 Conf libgl1-foo-glx (2 stable [amd64])
 Conf foo-driver (2 stable [amd64])' 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   foo-driver libfoo libfoo:i386 libgl1-foo-glx libgl1-foo-glx:i386
 5 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
diff --git a/test/integration/test-bug-745036-new-foreign-invalidates-cache b/test/integration/test-bug-745036-new-foreign-invalidates-cache
new file mode 100755 (executable)
index 0000000..2b7ee06
--- /dev/null
@@ -0,0 +1,27 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'amd64'
+
+insertpackage 'unstable,installed' 'cool-foo' 'amd64' '1.0' 'Depends: foo'
+insertpackage 'unstable,installed' 'foo' 'amd64' '1.0' 'Multi-Arch: foreign'
+
+setupaptarchive
+
+testsuccess aptget check -s
+
+configarchitecture 'amd64' 'i386'
+testequal 'E: The package cache was built for different architectures: amd64 vs amd64,i386' aptget check -s -o pkgCacheFile::Generate=false
+
+testsuccess aptget check -s
+
+insertinstalledpackage 'awesome-foo' 'i386' '1.0' 'Depends: foo'
+
+testsuccess aptget check -s
+
+testsuccess aptget update --no-download
+
+testsuccess aptget check -s
index 068704b3e73a1ad11ff74556c4ff8faf2b0415e4..01395a095aa98a0520ab1cf82c8bc705a4d579cc 100755 (executable)
@@ -16,8 +16,7 @@ Pin: release unstable
 Pin-Priority: 1
 EOF
 
-insertinstalledpackage 'foo' 'all' '1'
-insertpackage 'testing' 'foo' 'all' '1'
+insertpackage 'testing,installed' 'foo' 'all' '1'
 insertpackage 'testing-updates' 'foo' 'all' '2'
 insertpackage 'unstable' 'foo' 'all' '3'
 
index 2904ae5a14b3ad5540f83d0c86f9d1201f0969cd..21f9123c94375ec03a00d96e89906201dda2e339 100755 (executable)
@@ -28,6 +28,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   webapp webserver
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
diff --git a/test/integration/test-bug-770291-reinstall b/test/integration/test-bug-770291-reinstall
new file mode 100755 (executable)
index 0000000..ea1f57e
--- /dev/null
@@ -0,0 +1,98 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+setupenvironment
+configarchitecture 'i386'
+
+insertpackage 'unstable,installed' 'libc6' 'i386' '1'
+insertpackage 'unstable,installed' 'libselinux1' 'i386' '1'
+
+cp rootdir/var/lib/dpkg/status dpkg.status
+
+insertpackage 'unstable,installed' 'init' 'i386' '1' 'Depends: systemd-sysv
+Essential: yes'
+insertpackage 'unstable,installed' 'systemd-sysv' 'i386' '215-5+b1' 'Depends: systemd (= 215-5+b1)
+Pre-Depends: systemd'
+# fun fact: we need these two pre-depends to get systemd ordered before systemd-sysv as
+# many pre-depends mean: do early (as they are a pain, so get them out of the way early)
+insertpackage 'unstable,installed' 'systemd' 'i386' '215-5+b1' 'Pre-Depends: libc6, libselinux1'
+
+# depends loop
+insertpackage 'unstable,installed' 'dependsA' 'i386' '1' 'Depends: dependsB
+Essential: yes'
+insertpackage 'unstable,installed' 'dependsB' 'i386' '1' 'Depends: dependsA
+Essential: yes'
+
+# pre-depends loop
+insertpackage 'unstable,installed' 'predependsA' 'i386' '1' 'Pre-Depends: predependsB
+Essential: yes'
+insertpackage 'unstable,installed' 'predependsB' 'i386' '1' 'Pre-Depends: predependsA
+Essential: yes'
+
+# pre-depends-to-depends loop
+insertpackage 'unstable,installed' 'predependsdependsA' 'i386' '1' 'Pre-Depends: predependsdependsB
+Essential: yes'
+insertpackage 'unstable,installed' 'predependsdependsB' 'i386' '1' 'Depends: predependsdependsA
+Essential: yes'
+
+setupaptarchive
+
+testequal 'Reading package lists...
+Building dependency tree...
+0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded.
+Inst systemd [215-5+b1] (215-5+b1 unstable [i386])
+Conf systemd (215-5+b1 unstable [i386])
+Inst systemd-sysv [215-5+b1] (215-5+b1 unstable [i386])
+Conf systemd-sysv (215-5+b1 unstable [i386])' aptget install --reinstall systemd systemd-sysv -s
+
+testequal 'Reading package lists...
+Building dependency tree...
+0 upgraded, 0 newly installed, 2 reinstalled, 0 to remove and 0 not upgraded.
+Inst dependsA [1] (1 unstable [i386])
+Inst dependsB [1] (1 unstable [i386])
+Conf dependsB (1 unstable [i386])
+Conf dependsA (1 unstable [i386])' aptget install --reinstall dependsA dependsB -s
+
+# there is a chance dpkg can actually do these, BUT this depends on the maintainerscripts (not) present
+# which is very very risky to depend on (and apt doesn't know about that anyhow).
+testfailure aptget install --reinstall predependsA predependsB -s -o Debug::pkgPackageManager=1
+testequal "E: Couldn't configure predependsA:i386, probably a dependency cycle." tail -n1 rootdir/tmp/testfailure.output
+
+# FIXME: the error message is a catch all here, not like the one above
+testfailure aptget install --reinstall predependsdependsA predependsdependsB -s -o Debug::pkgPackageManager=1
+testequal "E: Could not configure 'predependsdependsB:i386'. " tail -n1 rootdir/tmp/testfailure.output
+
+
+msgmsg 'While we are at it, lets try these loops without reinstall as well'
+cp dpkg.status rootdir/var/lib/dpkg/status
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  systemd systemd-sysv
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst systemd (215-5+b1 unstable [i386])
+Conf systemd (215-5+b1 unstable [i386])
+Inst systemd-sysv (215-5+b1 unstable [i386])
+Conf systemd-sysv (215-5+b1 unstable [i386])' aptget install systemd systemd-sysv -s
+
+testequal 'Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+  dependsA dependsB
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst dependsA (1 unstable [i386]) []
+Inst dependsB (1 unstable [i386])
+Conf dependsB (1 unstable [i386])
+Conf dependsA (1 unstable [i386])' aptget install dependsA dependsB -s
+
+# there is a chance dpkg can actually do these, BUT this depends on the maintainerscripts (not) present
+# which is very very risky to depend on (and apt doesn't know about that anyhow).
+testfailure aptget install predependsA predependsB -s -o Debug::pkgPackageManager=1
+testequal "E: Couldn't configure predependsA:i386, probably a dependency cycle." tail -n1 rootdir/tmp/testfailure.output
+
+# FIXME: the error message is a catch all here, not like the one above
+testfailure aptget install predependsdependsA predependsdependsB -s -o Debug::pkgPackageManager=1
+testequal "E: Could not configure 'predependsdependsB:i386'. " tail -n1 rootdir/tmp/testfailure.output
index 805ed5964c9298e1f2b78ea78c0bdec19d25a278..92e7c0e84c97c98f2091b689608ff77435865aaf 100755 (executable)
@@ -39,10 +39,10 @@ testrun() {
                test -e rootdir/var/lib/apt/lists/*_Translation-en.${COMPRESS} || F=1
                # there is no point in trying pdiff if we have compressed indexes
                # as we can't patch compressed files (well, we can, but what is the point?)
-               ! test -e rootdir/var/lib/apt/lists/*.IndexDiff || F=1
+               ! test -e rootdir/var/lib/apt/lists/*diff_Index || F=1
        else
                # clear the faked pdiff indexes so the glob below works
-               rm -f rootdir/var/lib/apt/lists/*.IndexDiff
+               rm -f rootdir/var/lib/apt/lists/*diff_Index
                test -e rootdir/var/lib/apt/lists/*_Packages || F=1
                test -e rootdir/var/lib/apt/lists/*_Sources || F=1
                test -e rootdir/var/lib/apt/lists/*_Translation-en || F=1
@@ -51,15 +51,18 @@ testrun() {
                ! test -e rootdir/var/lib/apt/lists/*_Translation-en.* || F=1
        fi
        if [ -n "$F" ]; then
+               cat rootdir/tmp/testsuccess.output
                ls -laR rootdir/var/lib/apt/lists/
                msgfail
        else
                msgpass
        fi
        msgtest 'Check if package is downloadable'
+       cd downloaded
        testsuccess --nomsg aptget download testpkg
        msgtest '\tdeb file is present'; testsuccess --nomsg test -f testpkg_1.0_i386.deb
        rm testpkg_1.0_i386.deb
+       cd - >/dev/null
        testequal 'Reading package lists...
 Building dependency tree...
 The following NEW packages will be installed:
@@ -78,17 +81,20 @@ Conf testpkg (1.0 unstable [i386])' aptget install testpkg -s
        testequal "$GOODSHOWSRC" aptcache showsrc testpkg
        aptget clean
        msgtest 'Check if the source is aptgetable'
+       cd downloaded
        testsuccess --nomsg aptget source testpkg
-       msgtest '\tdsc file is present'; testsuccess --nomsg test -f testpkg_1.0.dsc
-       msgtest '\tdirectory is present'; testsuccess --nomsg test -d testpkg-1.0
+       testsuccess test -s testpkg_1.0.dsc
+       testsuccess test -d testpkg-1.0
        rm -rf testpkg-1.0*
+       cd - >/dev/null
        testequal "$(aptcache show testpkg -o Acquire::Languages=none)
 " aptcache dumpavail
 }
 
 echo 'Debug::pkgAcquire::worker "true";
 debug::pkgAcquire::Auth "true";
-Debug::pkgAcquire::Diffs "true";' > rootdir/etc/apt/apt.conf.d/99debugconf
+Debug::pkgAcquire::Diffs "true";
+Debug::Acquire::http "true";' > rootdir/etc/apt/apt.conf.d/99debugconf
 
 testovermethod() {
        forcecompressor $2
@@ -97,23 +103,28 @@ testovermethod() {
                rm -rf rootdir/var/lib/apt/lists
                echo "Acquire::GzipIndexes \"${INDEX}\";" > rootdir/etc/apt/apt.conf.d/02compressindex
                local INDCOMP
-               if [ "$INDEX" = 'false' ]; then
+               if [ "$INDEX" = 'false' -o "$1" = 'cdrom' ]; then
                        INDCOMP='uncompressed'
                else
                        INDCOMP='compressed'
                fi
 
+               msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX"
+               if [ "${1}" = 'cdrom' ]; then
+                       testsuccess aptcdrom add </dev/null
+               fi
                testsuccess aptget update
-               msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes"
                testrun "$INDCOMP"
 
-               testsuccess aptget update -o Acquire::Pdiffs=1
-               msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes (update unchanged with pdiffs)"
-               testrun "$INDCOMP"
+               if [ "${1}" != 'cdrom' ]; then
+                       testsuccess aptget update -o Acquire::Pdiffs=1
+                       msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX (update unchanged with pdiffs)"
+                       testrun "$INDCOMP"
 
-               testsuccess aptget update -o Acquire::Pdiffs=0
-               msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes (update unchanged without pdiffs)"
-               testrun "$INDCOMP"
+                       testsuccess aptget update -o Acquire::Pdiffs=0
+                       msgmsg "${1}: ${COMPRESSOR}: Test with $INDCOMP indexes gzip=$INDEX (update unchanged without pdiffs)"
+                       testrun "$INDCOMP"
+               fi
 
                rm rootdir/etc/apt/apt.conf.d/02compressindex
        done
@@ -142,3 +153,12 @@ test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^  Candidate:' -e '^  Instal
 testequal "$GOODPOLICY" aptcache policy testpkg
 
 for COMPRESSOR in 'gzip' 'bzip2' 'lzma' 'xz'; do testovermethod 'http' $COMPRESSOR; done
+
+changetocdrom 'Debian APT Testdisk 0.8.15'
+rm -rf rootdir/var/lib/apt/lists
+testsuccess aptcdrom add </dev/null
+GOODPOLICY="$(aptcache policy testpkg)"
+test $(echo "$GOODPOLICY" | grep -e '^testpkg:' -e '^  Candidate:' -e '^  Installed: (none)' -e '500 cdrom://' | wc -l) -eq 4 || msgdie 'policy is broken'
+testequal "$GOODPOLICY" aptcache policy testpkg
+
+for COMPRESSOR in 'gzip' 'bzip2' 'lzma' 'xz'; do testovermethod 'cdrom' $COMPRESSOR; done
index a2c411aafacb112130f54728dca719690e69706b..81731dfe4f642f6cab914033bd7cccf907c0851a 100755 (executable)
@@ -17,6 +17,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   openjdk-6-jre openjdk-6-jre-headless openjdk-6-jre-lib
 3 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
@@ -29,4 +30,4 @@ Conf openjdk-6-jre (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386])
 Inst openjdk-6-jre-headless [6b16-1.8-0ubuntu1] (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386])
 Conf openjdk-6-jre-headless (6b20-1.9.8-0ubuntu1~10.04.1 unstable [i386])' aptget dist-upgrade -s -o APT::Immediate-Configure-All=true
 
-testsuccess aptget dist-upgrade -s -o Debug::pkgPackageManager=1
+testsuccess aptget dist-upgrade -s
index 41b27f6917c78b797ee2d40576608852dcfc47f1..8f980399157951776cb653fa9b63214d6d27acd8 100755 (executable)
@@ -42,7 +42,7 @@ touch -d '+1hour' aptarchive/dists/stable/InRelease
 # ensure the update fails
 # useful for debugging to add "-o Debug::pkgAcquire::auth=true"
 msgtest 'apt-get update for should fail with the modified' 'InRelease'
-aptget update 2>&1 | grep -q 'Hash Sum mismatch' > /dev/null && msgpass || msgfail
+aptget update 2>&1 | grep -E -q '(Writing more data than expected|Hash Sum mismatch)' > /dev/null && msgpass || msgfail
 
 # ensure there is no package
 testequal 'Reading package lists...
index ac8fc6d2833f264329ae861860c186d969f15775..1493430d85c24175413695e31edebdad83ccabd4 100755 (executable)
@@ -37,13 +37,13 @@ The following packages will be upgraded:
 E: This installation run will require temporarily removing the essential package sysvinit:$(getarchitecture 'native') due to a Conflicts/Pre-Depends loop. This is often bad, but if you really want to do it, activate the APT::Force-LoopBreak option.
 E: Internal Error, Could not early remove sysvinit:$(dpkg --print-architecture) (2)" aptget install systemd-sysv -t "$1" -s
        # ensure that really nothing happens
-       testfailure aptget install systemd-sysv -y -t "$1" -o Debug::pkgPackageManager=1
+       testfailure aptget install systemd-sysv -y -t "$1"
        testdpkginstalled 'sysvinit'
        testdpkgnotinstalled 'systemd-sysv'
 
        # with enough force however …
        cp -a dpkg.status.backup rootdir/var/lib/dpkg/status
-       testsuccess aptget install systemd-sysv -y -t "$1" -o Debug::pkgPackageManager=1 -o APT::Force-LoopBreak=1
+       testsuccess aptget install systemd-sysv -y -t "$1" -o APT::Force-LoopBreak=1
        testdpkginstalled 'sysvinit' 'systemd-sysv'
 }
 
index 07d2441b6200d85a4844e6e6ddedefc563a5f21c..fd68578c5c666019a79f4c8d9c5c1ad7ec164de2 100755 (executable)
@@ -12,7 +12,10 @@ insertinstalledpackage 'stuff' 'all' '1'
 insertpackage 'unstable' 'cool' 'all' '2' 'Multi-Arch: foreign'
 insertpackage 'unstable' 'stuff' 'all' '2' 'Multi-Arch: foreign'
 insertpackage 'unstable' 'coolstuff' 'i386,amd64' '2' 'Depends: cool, stuff'
-insertpackage 'unstable' 'awesome' 'all' '2' 'Multi-Arch: foreign'
+insertpackage 'unstable' 'awesome' 'all' '2' 'Multi-Arch: foreign
+Conflicts: badstuff'
+insertpackage 'unstable' 'badstuff' 'all' '2' 'Multi-Arch: foreign
+Conflicts: awesome'
 insertpackage 'unstable' 'awesomecoolstuff' 'i386' '2' 'Depends: coolstuff, awesome'
 
 insertpackage 'experimental' 'cool' 'all' '3' 'Multi-Arch: foreign'
@@ -44,6 +47,14 @@ The following NEW packages will be installed:
 Inst coolstuff (3 experimental [amd64])
 Conf coolstuff (3 experimental [amd64])' aptget install --solver apt coolstuff -s
 
+testequal 'Reading package lists...
+Building dependency tree...
+Execute external solver...
+The following packages will be REMOVED:
+  cool*
+0 upgraded, 0 newly installed, 1 to remove and 1 not upgraded.
+Purg cool [1]' aptget purge --solver apt cool -s
+
 testsuccess aptget install awesomecoolstuff:i386 -s
 testsuccess aptget install --solver apt awesomecoolstuff:i386 -s
 
@@ -57,9 +68,13 @@ testsuccess aptget dist-upgrade -s --solver apt
 testsuccess aptget upgrade -s
 testsuccess aptget upgrade -s --solver apt
 
+testfailure aptget install awesome badstuff -s
+testfailure aptget install awesome badstuff -s --solver apt
+testsuccess grep 'ERR_UNSOLVABLE' rootdir/tmp/testfailure.output
+
 configarchitecture 'armel'
 msgtest 'Test direct calling is okay for' 'apt-internal-solver'
-cat /tmp/dump.edsp | aptinternalsolver > solver.result 2>&1 || true
+cat /tmp/dump.edsp | aptinternalsolver -q=0 > solver.result 2>&1 || true
 if [ "$(tail -n2 solver.result | head -n1 )" = "Message: Done" ]; then
        msgpass
 else
@@ -69,3 +84,16 @@ fi
 rm -f /tmp/dump.edsp
 
 testfailure aptget install --solver apt awesomecoolstuff:i386 -s
+
+testsuccess aptinternalsolver scenario
+testequal 'Package: stuff
+Source: stuff
+Architecture: all
+Version: 1
+Installed: yes
+APT-ID: 2
+Priority: optional
+Section: other
+APT-Pin: 100
+APT-Candidate: yes
+' aptinternalsolver scenario stuff
index 2a400dcb47417717eba670c3fad1db456e1e05f0..5f88110b3f13cdc2f55c53460be57dcf301d5272 100755 (executable)
@@ -70,9 +70,13 @@ runtest() {
         rm -rf rootdir/var/lib/apt/lists
         rm aptarchive/InRelease aptarchive/Release.gpg
         msgtest 'unsigned apt-get update gets the expected hashsum mismatch'
-       aptget update 2>&1 | grep "Hash Sum mismatch" > /dev/null && msgpass || msgfail
-
-
+       aptget update --allow-insecure-repositories >output.log 2>&1 || true
+        if grep -q "Hash Sum mismatch" output.log; then
+            msgpass
+        else
+            cat output.log
+            msgfail
+        fi
 }
 
 for COMPRESSEDINDEXES in 'false' 'true'; do
diff --git a/test/integration/test-http-pipeline-messup b/test/integration/test-http-pipeline-messup
new file mode 100755 (executable)
index 0000000..dda8ef7
--- /dev/null
@@ -0,0 +1,47 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+# try a little harder to create a size mismatch
+buildsimplenativepackage 'pkga' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none'
+buildsimplenativepackage 'pkgb' 'all' '1.0' 'stable' "Depends: foo" '' '' '' '' 'none'
+buildsimplenativepackage 'pkgc' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none'
+buildsimplenativepackage 'pkgd' 'all' '1.0' 'stable' "Depends: f$(for i in $(seq 0 1000); do printf 'o'; done)" '' '' '' '' 'none'
+
+setupaptarchive --no-update
+
+# simulate (and be a predictable) pipeline mess-up by the server/proxy
+changetowebserver \
+       -o 'aptwebserver::overwrite::.*pkga.*::filename=/pool/pkgd_1.0_all.deb' \
+       -o 'aptwebserver::overwrite::.*pkgc.*::filename=/pool/pkgb_1.0_all.deb' \
+       -o 'aptwebserver::overwrite::.*pkgb.*::filename=/pool/pkgc_1.0_all.deb' \
+       -o 'aptwebserver::overwrite::.*pkgd.*::filename=/pool/pkga_1.0_all.deb'
+
+echo 'Debug::Acquire::http "true";
+Debug::pkgAcquire::Worker "true";' > rootdir/etc/apt/apt.conf.d/99debug
+
+testsuccess aptget update
+
+# messup is bigger than pipeline: checks if fixup isn't trying to hard
+testfailure aptget download pkga pkgb pkgc pkgd -o Acquire::http::Pipeline-Depth=2
+testfailure test -f pkga_1.0_all.deb
+
+# ensure that pipeling is enabled for rest of this test
+echo 'Acquire::http::Pipeline-Depth 10;' > rootdir/etc/apt/apt.conf.d/99enable-pipeline
+
+# the output is a bit strange: it looks like it has downloaded pkga 4 times
+testwarning aptget download pkga pkgb pkgc pkgd
+for pkg in 'pkga' 'pkgb' 'pkgc' 'pkgd'; do
+       testsuccess test -f ${pkg}_1.0_all.deb
+       testsuccess cmp incoming/${pkg}_1.0_all.deb ${pkg}_1.0_all.deb
+       rm -f ${pkg}_1.0_all.deb
+done
+
+# while hashes will pass (as none are available), sizes will not match, so failure
+# checks that no hashes means that pipeline depth is ignored as we can't fixup
+testfailure aptget download pkga pkgb pkgc pkgd --allow-unauthenticated -o Acquire::ForceHash=ROT26
index c51caa7581f345971281f3b01283aca1fcaeb739..1524ed4c7d51358078f6f5b08508957467ad2220 100755 (executable)
@@ -9,7 +9,7 @@ configarchitecture 'amd64'
 # the executed script would use the installed apt-config,
 # which is outside of our control
 msgtest 'Check that the installed apt-config supports' '--no-empty'
-if apt-config dump --no-empty >/dev/null 2>&1; then
+if /usr/bin/apt-config dump --no-empty >/dev/null 2>&1; then
        msgpass
 else
        msgskip
@@ -26,13 +26,6 @@ insertinstalledpackage 'linux-headers-1000000-1-generic' 'amd64' '100.0.0-1'
 
 testsuccess aptmark auto "$CURRENTKERNEL" 'linux-image-1.0.0-2-generic' 'linux-image-100.0.0-1-generic' 'linux-headers-1000000-1-generic'
 
-cat > ./fake-dpkg <<EOF
-#!/bin/sh
-exec $(aptconfig dump --no-empty --format='%v ' 'DPKG::options') "\$@"
-EOF
-chmod +x ./fake-dpkg
-echo 'Dir::Bin::dpkg "./fake-dpkg";' > rootdir/etc/apt/apt.conf.d/99fakedpkg
-
 # install fake-dpkg into it
 catfail() {
        echo >&2
index 160d451b6c85dc9b2a4906d5c3654009d18ecd89..b6b305d25289d41f6b266898263b17862256d107 100755 (executable)
@@ -72,7 +72,7 @@ cp -a ${TESTDIR}/framework $TESTFILE
 cp -a ${TESTDIR}/framework "${TESTFILE}2"
 
 followuprequest() {
-       local DOWN='./testfile'
+       local DOWN='./downloaded/testfile'
 
        copysource $TESTFILE 1M $DOWN
        testdownloadfile 'completely downloaded file' "${1}/testfile" "$DOWN" '='
@@ -90,17 +90,18 @@ followuprequest() {
 
 testrun() {
        webserverconfig 'aptwebserver::support::range' 'true'
+       local DOWN='./downloaded/testfile'
 
-       copysource $TESTFILE 0 ./testfile
-       testdownloadfile 'no data' "${1}/testfile" './testfile' '='
+       copysource $TESTFILE 0 $DOWN
+       testdownloadfile 'no data' "${1}/testfile" "$DOWN" '='
        testwebserverlaststatuscode '200' "$DOWNLOADLOG"
 
-       copysource $TESTFILE 20 ./testfile
-       testdownloadfile 'valid partial data' "${1}/testfile" './testfile' '='
+       copysource $TESTFILE 20 $DOWN
+       testdownloadfile 'valid partial data' "${1}/testfile" "$DOWN" '='
        testwebserverlaststatuscode '206' "$DOWNLOADLOG"
 
-       copysource /dev/zero 20 ./testfile
-       testdownloadfile 'invalid partial data' "${1}/testfile" './testfile' '!='
+       copysource /dev/zero 20 $DOWN
+       testdownloadfile 'invalid partial data' "${1}/testfile" "$DOWN" '!='
        testwebserverlaststatuscode '206' "$DOWNLOADLOG"
 
        webserverconfig 'aptwebserver::closeOnError' 'false'
@@ -109,19 +110,19 @@ testrun() {
        followuprequest "$1"
        webserverconfig 'aptwebserver::closeOnError' 'false'
 
-       copysource /dev/zero 1M ./testfile
-       testdownloadfile 'too-big partial file' "${1}/testfile" './testfile' '='
+       copysource /dev/zero 1M $DOWN
+       testdownloadfile 'too-big partial file' "${1}/testfile" "$DOWN" '='
        testwebserverlaststatuscode '200' "$DOWNLOADLOG"
 
-       copysource /dev/zero 20 ./testfile
-       touch ./testfile
-       testdownloadfile 'old data' "${1}/testfile" './testfile' '='
+       copysource /dev/zero 20 $DOWN
+       touch $DOWN
+       testdownloadfile 'old data' "${1}/testfile" "$DOWN" '='
        testwebserverlaststatuscode '200' "$DOWNLOADLOG"
 
        webserverconfig 'aptwebserver::support::range' 'false'
 
-       copysource $TESTFILE 20 ./testfile
-       testdownloadfile 'no server support' "${1}/testfile" './testfile' '='
+       copysource $TESTFILE 20 $DOWN
+       testdownloadfile 'no server support' "${1}/testfile" "$DOWN" '='
        testwebserverlaststatuscode '200' "$DOWNLOADLOG"
 }
 
index afe1ad443d2e4d09a0b1ffa4ebe64cc7b084173d..d773dcd66dffb680ffcc4d0eb3e643f479810de7 100755 (executable)
@@ -13,12 +13,6 @@ changetowebserver
 
 PKGFILE="${TESTDIR}/$(echo "$(basename $0)" | sed 's#^test-#Packages-#')"
 
-echo '#!/bin/sh
-touch merge-was-used
-/usr/bin/diffindex-rred "$@"' > extrred
-chmod +x extrred
-echo 'Dir::Bin::rred "./extrred";' > rootdir/etc/apt/apt.conf.d/99rred
-
 wasmergeused() {
        msgtest 'Test for successful execution of' "$*"
        local OUTPUT=$(mktemp)
@@ -82,8 +76,15 @@ SHA1-History:
  9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28
  $(sha1sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
 SHA1-Patches:
- 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28
- $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX
+ 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28
+ $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)
+SHA256-Current: $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new)
+SHA256-History:
+ 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28
+ $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
+SHA256-Patches:
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28
+ $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX
        generatereleasefiles '+1hour'
        signreleasefiles
        find aptarchive -name 'Packages*' -type f -delete
@@ -93,7 +94,7 @@ SHA1-Patches:
 " aptcache show apt newstuff
 
        msgmsg "Testcase: index is already up-to-date: $*"
-       find rootdir/var/lib/apt/lists -name '*.IndexDiff' -type f -delete
+       find rootdir/var/lib/apt/lists -name '*diff_Index' -type f -delete
        testsuccess aptget update "$@"
        testequal "$(cat ${PKGFILE}-new)
 " aptcache show apt newstuff
@@ -125,9 +126,18 @@ SHA1-History:
  $(sha1sum ${PKGFILE} | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}) $(basename ${PATCHFILE})
  $(sha1sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) $(basename ${PATCHFILE2})
 SHA1-Patches:
- 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28
+ 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28
  $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)
- $(sha1sum ${PATCHFILE2} | cut -d' ' -f 1) $(stat -c%s ${PATCHFILE2}) $(basename ${PATCHFILE2})" > $PATCHINDEX
+ $(sha1sum ${PATCHFILE2} | cut -d' ' -f 1) $(stat -c%s ${PATCHFILE2}) $(basename ${PATCHFILE2})
+SHA256-Current: $(sha256sum aptarchive/Packages | cut -d' ' -f 1) $(stat -c%s aptarchive/Packages)
+SHA256-History:
+ 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28
+ $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
+ $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new) $(basename ${PATCHFILE2})
+SHA256-Patches:
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28
+ $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)
+ $(sha256sum ${PATCHFILE2} | cut -d' ' -f 1) $(stat -c%s ${PATCHFILE2}) $(basename ${PATCHFILE2})" > $PATCHINDEX
        generatereleasefiles '+2hour'
        signreleasefiles
        cp -a aptarchive/Packages Packages-future
@@ -153,8 +163,15 @@ SHA1-History:
  9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28
  $(sha1sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
 SHA1-Patches:
- 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-0814.28
- $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX
+ 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28
+ $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)
+SHA256-Current: $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new)
+SHA256-History:
+ 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28
+ $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
+SHA256-Patches:
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28
+ $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE) $(basename $PATCHFILE)" > $PATCHINDEX
        echo 'I am Mallory and I change files' >> $PATCHFILE
        cat $PATCHFILE | gzip > ${PATCHFILE}.gz
        generatereleasefiles '+1hour'
@@ -163,11 +180,59 @@ SHA1-Patches:
        testnopackage oldstuff
        testequal "$(cat ${PKGFILE}-new)
 " aptcache show apt newstuff
+
+       msgmsg "Testcase: pdiff patch bigger than index itself: $*"
+       rm -rf rootdir/var/lib/apt/lists
+       cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists
+       cp ${PKGFILE}-new aptarchive/Packages
+       compressfile 'aptarchive/Packages'
+       mkdir -p aptarchive/Packages.diff
+       PATCHFILE="aptarchive/Packages.diff/$(date +%Y-%m-%d-%H%M.%S)"
+       diff -e ${PKGFILE} ${PKGFILE}-new > ${PATCHFILE} || true
+       cat $PATCHFILE | gzip > ${PATCHFILE}.gz
+       PATCHINDEX='aptarchive/Packages.diff/Index'
+       echo "SHA1-Current: $(sha1sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new)
+SHA1-History:
+ 9f4148e06d7faa37062994ff10d0c842d7017513 33053002 2010-08-18-2013.28
+ $(sha1sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
+SHA1-Patches:
+ 7651fc0ac57cd83d41c63195a9342e2db5650257 19722 2010-08-18-2013.28
+ $(sha1sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE)000 $(basename $PATCHFILE)
+SHA256-Current: $(sha256sum ${PKGFILE}-new | cut -d' ' -f 1) $(stat -c%s ${PKGFILE}-new)
+SHA256-History:
+ 01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b 33053002 2010-08-18-2013.28
+ $(sha256sum $PKGFILE | cut -d' ' -f 1) $(stat -c%s $PKGFILE) $(basename $PATCHFILE)
+SHA256-Patches:
+ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 19722 2010-08-18-2013.28
+ $(sha256sum $PATCHFILE | cut -d' ' -f 1) $(stat -c%s $PATCHFILE)000 $(basename $PATCHFILE)" > $PATCHINDEX
+       generatereleasefiles '+1hour'
+       signreleasefiles
+       #find aptarchive -name 'Packages*' -type f -delete
+       testsuccess aptget update -o Debug::pkgAcquire::Diffs=1 "$@"
+       cp -f rootdir/tmp/testsuccess.output rootdir/tmp/aptgetupdate.output
+       testsuccess grep 'bytes (Limit is' rootdir/tmp/aptgetupdate.output
+       testnopackage oldstuff
+       testequal "$(cat ${PKGFILE}-new)
+" aptcache show apt newstuff
 }
 echo 'Debug::pkgAcquire::Diffs "true";
+Debug::Acquire::Transaction "true";
 Debug::pkgAcquire::rred "true";' > rootdir/etc/apt/apt.conf.d/rreddebug.conf
 
 testrun -o Acquire::PDiffs::Merge=0 -o APT::Get::List-Cleanup=1
 testrun -o Acquire::PDiffs::Merge=1 -o APT::Get::List-Cleanup=1
 testrun -o Acquire::PDiffs::Merge=0 -o APT::Get::List-Cleanup=0
 testrun -o Acquire::PDiffs::Merge=1 -o APT::Get::List-Cleanup=0
+
+sha256sum() {
+       echo '01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546b -'
+}
+testrun -o Acquire::PDiffs::Merge=0 -o Acquire::ForceHash=SHA1
+testrun -o Acquire::PDiffs::Merge=1 -o Acquire::ForceHash=SHA1
+
+unset -f sha256sum
+sha1sum() {
+       echo 'adc83b19e793491b1c6ea0fd8b46cd9f32e592fc -'
+}
+testrun -o Acquire::PDiffs::Merge=0 -o Acquire::ForceHash=SHA256
+testrun -o Acquire::PDiffs::Merge=1 -o Acquire::ForceHash=SHA256
index 35de221155ea30b6cbff0edccf0fae9cb746490c..c567e528569fe2ff7b62f60734f0a6fc43b218fd 100755 (executable)
@@ -26,6 +26,7 @@ testcandidate rapt '0.8.15'
 testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist -q=0
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only
 
 echo 'Package: rapt
@@ -36,6 +37,7 @@ testcandidate rapt '(none)'
 testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist -q=0
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only
 
 echo '
@@ -55,6 +57,7 @@ testequal 'N: Unable to locate package doesntexist' aptcache policy doesntexist
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.' aptget dist-upgrade --trivial-only
 
 echo 'Package: arch:amd64
index 8eb4bcbadffc7b2a0d02560855392bf935505e3c..c08a2f103d3fd611b696b6b28f625b971f224c51 100755 (executable)
@@ -28,7 +28,7 @@ Pinned packages:" aptcache policy $*
 aptgetupdate() {
        # just to be sure that no old files are used
        rm -rf rootdir/var/lib/apt
-       if aptget update -qq 2>&1 | grep '^E: '; then
+       if aptget update  --allow-insecure-repositories -qq 2>&1 | grep '^E: '; then
                msgwarn 'apt-get update failed with an error'
        fi
 }
@@ -36,6 +36,7 @@ aptgetupdate() {
 ### not signed archive
 
 aptgetupdate
+
 testequalpolicy 100 500
 testequalpolicy 990 500 -t now
 
index d647856cb844bee54b0a76c7b14e4919e1ebcaf7..db97687ce0276af89c78af9e88a3c426fb00ca68 100755 (executable)
@@ -9,20 +9,17 @@ configarchitecture 'amd64' 'i386' 'armel'
 insertpackage 'stable' 'allarchs' 'all' '1'
 insertpackage 'unstable' 'allarchs' 'all' '2'
 
-insertinstalledpackage 'fine' 'i386,amd64' '1' 'Multi-Arch: same'
-insertpackage 'stable' 'fine' 'i386,amd64' '1' 'Multi-Arch: same'
+insertpackage 'stable,installed' 'fine' 'i386,amd64' '1' 'Multi-Arch: same'
 insertpackage 'unstable' 'fine' 'amd64,i386' '2' 'Multi-Arch: same'
 
 insertinstalledpackage 'fine-installed' 'i386,amd64' '1' 'Multi-Arch: same'
 insertpackage 'stable' 'fine-installed' 'i386,amd64,armel' '1' 'Multi-Arch: same'
 insertpackage 'unstable' 'fine-installed' 'i386,amd64' '2' 'Multi-Arch: same'
 
-insertinstalledpackage 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same'
-insertpackage 'stable' 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same'
+insertpackage 'stable,installed' 'out-of-sync-native' 'i386,amd64' '1' 'Multi-Arch: same'
 insertpackage 'unstable' 'out-of-sync-native' 'amd64' '2' 'Multi-Arch: same'
 
-insertinstalledpackage 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same'
-insertpackage 'stable' 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same'
+insertpackage 'stable,installed' 'out-of-sync-foreign' 'i386,amd64' '1' 'Multi-Arch: same'
 insertpackage 'unstable' 'out-of-sync-foreign' 'i386' '2' 'Multi-Arch: same'
 
 insertinstalledpackage 'out-of-sync-gone-native' 'i386,amd64' '1' 'Multi-Arch: same'
@@ -43,6 +40,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   out-of-sync-gone-foreign:i386 out-of-sync-gone-native
 The following packages have been kept back:
index 70384ce297dbc7209a620751af33e268ee1fb586..3b4bc2d045d71c6395679832815b2fcf51e919b0 100755 (executable)
@@ -15,6 +15,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following NEW packages will be installed:
   libapt-pkg4.10
 The following packages will be upgraded:
index e673d5f716aab9f4a4ad5582c8029ac21c8940b6..0d9a9125476371bc440e662de4497954b0201517 100755 (executable)
@@ -12,84 +12,38 @@ getlabelfromsuite() {
        echo -n 'Testcases'
 }
 
+setupaptarchive --no-update
 
-setupaptarchive
-
-setupreleasefile() {
+runtest() {
+       local MSG="$1"
+       msgtest "$1" "$2"
        rm -rf rootdir/var/lib/apt/lists
        aptget clean
-       generatereleasefiles "$1" "$2"
+       generatereleasefiles "$3" "$4"
        signreleasefiles
-}
-
-aptgetupdate() {
-       if aptget update $* 2>&1 | grep -q 'is expired'; then
-               return 1
+       shift 4
+       if expr match "$MSG" '.*accepted.*' >/dev/null; then
+               testsuccess --nomsg aptget update "$@"
+               testfailure grep -q 'is expired' rootdir/tmp/testsuccess.output
        else
-               return 0
+               testfailure --nomsg aptget update "$@"
+               testsuccess grep -q 'is expired' rootdir/tmp/testfailure.output
        fi
 }
 
-setupreleasefile
-msgtest 'Release file is accepted as it has' 'no Until'
-testsuccess --nomsg aptgetupdate
-
-setupreleasefile
-msgtest 'Release file is accepted as it has' 'no Until and good Max-Valid'
-testsuccess --nomsg aptgetupdate -o Acquire::Max-ValidTime=3600
-
-setupreleasefile 'now - 2 days'
-msgtest 'Release file is rejected as it has' 'no Until, but bad Max-Valid'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=3600
-
-setupreleasefile 'now - 3 days' 'now + 1 day'
-msgtest 'Release file is accepted as it has' 'good Until'
-testsuccess --nomsg aptgetupdate
-
-setupreleasefile 'now - 7 days' 'now - 4 days'
-msgtest 'Release file is rejected as it has' 'bad Until'
-testfailure --nomsg aptgetupdate
-
-setupreleasefile 'now - 7 days' 'now - 4 days'
-msgtest 'Release file is rejected as it has' 'bad Until (ignore good Max-Valid)'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=1209600
-
-setupreleasefile 'now - 7 days' 'now - 4 days'
-msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until)'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=86400
-
-setupreleasefile 'now - 7 days' 'now + 4 days'
-msgtest 'Release file is rejected as it has' 'bad Max-Valid (good Until)'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=86400
-
-setupreleasefile 'now - 7 days' 'now + 4 days'
-msgtest 'Release file is accepted as it has' 'good labeled Max-Valid'
-testsuccess --nomsg aptgetupdate -o Acquire::Max-ValidTime=86400 -o Acquire::Max-ValidTime::Testcases=1209600
-
-setupreleasefile 'now - 7 days' 'now + 4 days'
-msgtest 'Release file is rejected as it has' 'bad labeled Max-Valid'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=1209600 -o Acquire::Max-ValidTime::Testcases=86400
-
-setupreleasefile 'now - 7 days' 'now + 1 days'
-msgtest 'Release file is accepted as it has' 'good Until (good Min-Valid, no Max-Valid)'
-testsuccess --nomsg aptgetupdate -o Acquire::Min-ValidTime=1209600
-
-setupreleasefile 'now - 7 days' 'now - 4 days'
-msgtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, no Max-Valid)'
-testsuccess --nomsg aptgetupdate -o Acquire::Min-ValidTime=1209600
-
-setupreleasefile 'now - 7 days' 'now - 2 days'
-msgtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, good Max-Valid) <'
-testsuccess --nomsg aptgetupdate -o Acquire::Min-ValidTime=1209600 -o Acquire::Max-ValidTime=2419200
-
-setupreleasefile 'now - 7 days' 'now - 2 days'
-msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, good Min-Valid) >'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=2419200
-
-setupreleasefile 'now - 7 days' 'now - 2 days'
-msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) <'
-testfailure --nomsg aptgetupdate -o Acquire::Min-ValidTime=12096 -o Acquire::Max-ValidTime=241920
-
-setupreleasefile 'now - 7 days' 'now - 2 days'
-msgtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) >'
-testfailure --nomsg aptgetupdate -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=241920
+runtest 'Release file is accepted as it has' 'no Until' '' ''
+runtest 'Release file is accepted as it has' 'no Until and good Max-Valid' '' '' -o Acquire::Max-ValidTime=3600
+runtest 'Release file is rejected as it has' 'no Until, but bad Max-Valid' 'now - 2 days' '' -o Acquire::Max-ValidTime=3600
+runtest 'Release file is accepted as it has' 'good Until' 'now - 3 days' 'now + 1 day'
+runtest 'Release file is rejected as it has' 'bad Until' 'now - 7 days' 'now - 4 days'
+runtest 'Release file is rejected as it has' 'bad Until (ignore good Max-Valid)' 'now - 7 days' 'now - 4 days' -o Acquire::Max-ValidTime=1209600
+runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until)' 'now - 7 days' 'now - 4 days' -o Acquire::Max-ValidTime=86400
+runtest 'Release file is rejected as it has' 'bad Max-Valid (good Until)' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=86400
+runtest 'Release file is accepted as it has' 'good labeled Max-Valid' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=86400 -o Acquire::Max-ValidTime::Testcases=1209600
+runtest 'Release file is rejected as it has' 'bad labeled Max-Valid' 'now - 7 days' 'now + 4 days' -o Acquire::Max-ValidTime=1209600 -o Acquire::Max-ValidTime::Testcases=86400
+runtest 'Release file is accepted as it has' 'good Until (good Min-Valid, no Max-Valid)' 'now - 7 days' 'now + 1 days' -o Acquire::Min-ValidTime=1209600
+runtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, no Max-Valid)' 'now - 7 days' 'now - 4 days' -o Acquire::Min-ValidTime=1209600
+runtest 'Release file is accepted as it has' 'good Min-Valid (bad Until, good Max-Valid) <' 'now - 7 days' 'now - 2 days' -o Acquire::Min-ValidTime=1209600 -o Acquire::Max-ValidTime=2419200
+runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, good Min-Valid) >' 'now - 7 days' 'now - 2 days' -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=2419200
+runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) <' 'now - 7 days' 'now - 2 days' -o Acquire::Min-ValidTime=12096 -o Acquire::Max-ValidTime=241920
+runtest 'Release file is rejected as it has' 'bad Max-Valid (bad Until, bad Min-Valid) >' 'now - 7 days' 'now - 2 days' -o Acquire::Max-ValidTime=12096 -o Acquire::Min-ValidTime=241920
index e558b83e8384fa639a3fd9666b7c6fc197aa8368..3765a4b1f42071a40c552789649d40705e62c770 100755 (executable)
@@ -235,10 +235,21 @@ runtest2() {
 " aptcache show apt
        failaptnew
 }
-runtest2
 
+# diable some protection by default and ensure we still do the verification
+# correctly
+cat > rootdir/etc/apt/apt.conf.d/weaken-security <<EOF
+Acquire::AllowInsecureRepositories "1";
+Acquire::AllowDowngradeToInsecureRepositories "1";
+EOF
+
+msgmsg "Runing base test"
+runtest2
 
 DELETEFILE="InRelease"
+msgmsg "Running test with deletion of $DELETEFILE"
 runtest
+
 DELETEFILE="Release.gpg"
+msgmsg "Running test with deletion of $DELETEFILE"
 runtest
index 8134b76aaac84a6d7f2a286c35e970480c0a96b4..6b177287718150516ad25a4c83d56628fbbbbe92 100755 (executable)
@@ -13,6 +13,7 @@ setupaptarchive
 
 UPGRADE_KEEP="Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   foo
 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded."
diff --git a/test/integration/test-sourceslist-trusted-options b/test/integration/test-sourceslist-trusted-options
new file mode 100755 (executable)
index 0000000..55d4e02
--- /dev/null
@@ -0,0 +1,201 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+buildsimplenativepackage 'foo' 'amd64' '1' 'stable'
+buildsimplenativepackage 'foo' 'amd64' '2' 'testing'
+
+setupaptarchive --no-update
+
+APTARCHIVE=$(readlink -f ./aptarchive)
+
+everythingsucceeds() {
+       testequal 'Listing...
+foo/testing 2 amd64
+foo/stable 1 amd64
+' apt list foo -a
+
+       cd downloaded
+       rm -f foo_1_amd64.deb foo_2_amd64.deb
+       testsuccess aptget download foo "$@"
+       testsuccess test -s foo_1_amd64.deb -o -s foo_2_amd64.deb
+
+       rm -f foo_1.dsc foo_2.dsc
+       testsuccess aptget source foo --dsc-only -d "$@"
+       testsuccess test -s foo_1.dsc -o -s foo_2.dsc
+       cd - >/dev/null
+}
+
+everythingfails() {
+       testequal 'Listing...
+foo/testing 2 amd64
+foo/stable 1 amd64
+' apt list foo -a
+
+       local WARNING='WARNING: The following packages cannot be authenticated!
+  foo
+E: Some packages could not be authenticated'
+
+       cd downloaded
+       rm -f foo_1_amd64.deb foo_2_amd64.deb
+       testfailure aptget download foo "$@"
+       testequal "$WARNING" tail -n 3 ../rootdir/tmp/testfailure.output
+       testfailure test -s foo_1_amd64.deb -o -s foo_2_amd64.deb
+
+       rm -f foo_1.dsc foo_2.dsc
+       testfailure aptget source foo --dsc-only -d "$@"
+       testequal "$WARNING" tail -n 3 ../rootdir/tmp/testfailure.output
+       testfailure test -s foo_1.dsc -o -s foo_2.dsc
+       cd - >/dev/null
+}
+
+cp -a rootdir/etc/apt/sources.list.d/ rootdir/etc/apt/sources.list.d.bak/
+echo 'Debug::Acquire::Transaction "true";
+Debug::pkgAcquire::Worker "true";' > rootdir/etc/apt/apt.conf.d/00debugging
+
+aptgetupdate() {
+       rm -rf rootdir/var/lib/apt/lists
+       # note that insecure with trusted=yes are allowed
+       # as the trusted=yes indicates that security is provided by
+       # something above the understanding of apt
+       ${1:-testsuccess} aptget update --no-allow-insecure-repositories
+}
+
+insecureaptgetupdate() {
+       rm -rf rootdir/var/lib/apt/lists
+       testfailure aptget update --no-allow-insecure-repositories
+       rm -rf rootdir/var/lib/apt/lists
+       testwarning aptget update --allow-insecure-repositories
+}
+
+msgmsg 'Test without trusted option and good sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+aptgetupdate
+everythingsucceeds
+everythingsucceeds -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=yes option and good sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/*
+aptgetupdate
+everythingsucceeds
+everythingsucceeds -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=no option and good sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/*
+# we want the warnings on the actions, but for 'update' everything is fine
+aptgetupdate
+everythingfails
+everythingfails -t stable
+everythingfails -t testing
+
+find aptarchive/dists/stable \( -name 'InRelease' -o -name 'Release.gpg' \) -delete
+
+msgmsg 'Test without trusted option and good and unsigned sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+insecureaptgetupdate
+everythingsucceeds
+everythingfails -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=yes option and good and unsigned sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/*
+aptgetupdate 'testwarning'
+everythingsucceeds
+everythingsucceeds -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=no option and good and unsigned sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/*
+insecureaptgetupdate
+everythingfails
+everythingfails -t stable
+everythingfails -t testing
+
+signreleasefiles 'Marvin Paranoid' 'aptarchive/dists/stable'
+
+msgmsg 'Test without trusted option and good and unknown sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+insecureaptgetupdate
+everythingsucceeds
+everythingfails -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=yes option and good and unknown sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/*
+aptgetupdate 'testwarning'
+everythingsucceeds
+everythingsucceeds -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=no option and good and unknown sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/*
+insecureaptgetupdate
+everythingfails
+everythingfails -t stable
+everythingfails -t testing
+
+signreleasefiles 'Rex Expired' 'aptarchive/dists/stable'
+cp -a keys/rexexpired.pub rootdir/etc/apt/trusted.gpg.d/rexexpired.gpg
+
+msgmsg 'Test without trusted option and good and expired sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+insecureaptgetupdate
+everythingsucceeds
+everythingfails -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=yes option and good and expired sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/*
+aptgetupdate 'testwarning'
+everythingsucceeds
+everythingsucceeds -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=no option and good and expired sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/*
+insecureaptgetupdate
+everythingfails
+everythingfails -t stable
+everythingfails -t testing
+
+# same as the one further above, but this time testing is unsigned
+find aptarchive/ \( -name 'InRelease' -o -name 'Release.gpg' \) -delete
+signreleasefiles 'Joe Sixpack' 'aptarchive/dists/stable'
+
+msgmsg 'Test without trusted option and unsigned and good sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+insecureaptgetupdate
+everythingfails
+everythingsucceeds -t stable
+everythingfails -t testing
+
+msgmsg 'Test with trusted=yes option and unsigned and good sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=yes] #' rootdir/etc/apt/sources.list.d/*
+aptgetupdate 'testwarning'
+everythingsucceeds
+everythingsucceeds -t stable
+everythingsucceeds -t testing
+
+msgmsg 'Test with trusted=no option and unsigned and good sources'
+cp -a rootdir/etc/apt/sources.list.d.bak/* rootdir/etc/apt/sources.list.d/
+sed -i 's#^deb\(-src\)\? #deb\1 [trusted=no] #' rootdir/etc/apt/sources.list.d/*
+insecureaptgetupdate
+everythingfails
+everythingfails -t stable
+everythingfails -t testing
index d55d250aad260241606b17115103e29f4452d747..89640a30cbb21c9513a37c86e26af192e699c189 100755 (executable)
@@ -9,8 +9,7 @@ configarchitecture 'amd64' 'i386' 'armel'
 insertinstalledpackage 'foo' 'i386' '1'
 insertpackage 'unstable' 'foo' 'amd64,i386' '1'
 
-insertinstalledpackage 'foo2' 'i386' '1'
-insertpackage 'unstable' 'foo2' 'i386' '1'
+insertpackage 'unstable,installed' 'foo2' 'i386' '1'
 
 insertinstalledpackage 'foo3' 'amd64' '1'
 insertpackage 'unstable' 'foo3' 'amd64,i386' '1'
index 9bdc812647624549274ef23d18a1cb06d2cf5095..574183b0a422d744518aa16046c778b7bcae7c5c 100755 (executable)
@@ -14,8 +14,8 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Files:
d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-ok_1.0.dsc
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-ok_1.0.tar.gz
9604ba9427a280db542279d9ed78400b 3 pkg-md5-ok_1.0.dsc
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-ok_1.0.tar.gz
 
 Package: pkg-sha256-ok
 Binary: pkg-sha256-ok
@@ -23,14 +23,14 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Files:
d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-ok_1.0.dsc
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-ok_1.0.tar.gz
9604ba9427a280db542279d9ed78400b 3 pkg-sha256-ok_1.0.dsc
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-ok_1.0.tar.gz
 Checksums-Sha1:
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-ok_1.0.dsc
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-ok_1.0.tar.gz
324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-ok_1.0.dsc
680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-ok_1.0.tar.gz
 Checksums-Sha256:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-ok_1.0.dsc
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-ok_1.0.tar.gz
943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-sha256-ok_1.0.dsc
90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-sha256-ok_1.0.tar.gz
 
 Package: pkg-sha256-bad
 Binary: pkg-sha256-bad
@@ -38,14 +38,14 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Files:
d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-bad_1.0.dsc
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-bad_1.0.tar.gz
9604ba9427a280db542279d9ed78400b 3 pkg-sha256-bad_1.0.dsc
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-bad_1.0.tar.gz
 Checksums-Sha1:
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-bad_1.0.dsc
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-bad_1.0.tar.gz
324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-bad_1.0.dsc
680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-bad_1.0.tar.gz
 Checksums-Sha256:
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-sha256-bad_1.0.dsc
- bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-sha256-bad_1.0.tar.gz
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-sha256-bad_1.0.dsc
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-sha256-bad_1.0.tar.gz
 
 Package: pkg-no-md5
 Binary: pkg-no-md5
@@ -53,11 +53,11 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Checksums-Sha1:
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-no-md5_1.0.dsc
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-no-md5_1.0.tar.gz
324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-no-md5_1.0.dsc
680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-no-md5_1.0.tar.gz
 Checksums-Sha256:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-no-md5_1.0.dsc
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-no-md5_1.0.tar.gz
943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-no-md5_1.0.dsc
90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-no-md5_1.0.tar.gz
 
 Package: pkg-mixed-ok
 Binary: pkg-mixed-ok
@@ -65,9 +65,9 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Checksums-Sha1:
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-mixed-ok_1.0.tar.gz
680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-mixed-ok_1.0.tar.gz
 Checksums-Sha256:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-mixed-ok_1.0.dsc
943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-mixed-ok_1.0.dsc
 
 Package: pkg-mixed-sha1-bad
 Binary: pkg-mixed-sha1-bad
@@ -75,9 +75,9 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Checksums-Sha1:
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-mixed-sha1-bad_1.0.dsc
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-mixed-sha1-bad_1.0.dsc
 Checksums-Sha256:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-mixed-sha1-bad_1.0.tar.gz
90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-mixed-sha1-bad_1.0.tar.gz
 
 Package: pkg-mixed-sha2-bad
 Binary: pkg-mixed-sha2-bad
@@ -85,9 +85,9 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Checksums-Sha1:
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-mixed-sha2-bad_1.0.dsc
324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-mixed-sha2-bad_1.0.dsc
 Checksums-Sha256:
- bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-mixed-sha2-bad_1.0.tar.gz
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-mixed-sha2-bad_1.0.tar.gz
 
 Package: pkg-md5-disagree
 Binary: pkg-md5-disagree
@@ -95,10 +95,10 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Files:
d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-disagree_1.0.dsc
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-disagree_1.0.tar.gz
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-md5-disagree_1.0.dsc
- bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-md5-disagree_1.0.tar.gz
9604ba9427a280db542279d9ed78400b 3 pkg-md5-disagree_1.0.dsc
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-disagree_1.0.tar.gz
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-md5-disagree_1.0.dsc
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-md5-disagree_1.0.tar.gz
 
 Package: pkg-md5-agree
 Binary: pkg-md5-agree
@@ -106,10 +106,10 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Files:
d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.dsc
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.tar.gz
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.tar.gz
d41d8cd98f00b204e9800998ecf8427e 0 pkg-md5-agree_1.0.dsc
9604ba9427a280db542279d9ed78400b 3 pkg-md5-agree_1.0.dsc
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-agree_1.0.tar.gz
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-md5-agree_1.0.tar.gz
9604ba9427a280db542279d9ed78400b 3 pkg-md5-agree_1.0.dsc
 
 Package: pkg-sha256-disagree
 Binary: pkg-sha256-disagree
@@ -117,36 +117,39 @@ Version: 1.0
 Maintainer: Joe Sixpack <joe@example.org>
 Architecture: all
 Files:
d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-disagree_1.0.dsc
- d41d8cd98f00b204e9800998ecf8427e 0 pkg-sha256-disagree_1.0.tar.gz
9604ba9427a280db542279d9ed78400b 3 pkg-sha256-disagree_1.0.dsc
+ db5570bf61464b46e2bde31ed61a7dc6 3 pkg-sha256-disagree_1.0.tar.gz
 Checksums-Sha1:
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-disagree_1.0.dsc
da39a3ee5e6b4b0d3255bfef95601890afd80709 0 pkg-sha256-disagree_1.0.tar.gz
324f464e6151a92cf57b26ef95dcfcf2059a8c44 3 pkg-sha256-disagree_1.0.dsc
680254bad1d7ca0d65ec46aaa315d363abf6a50a 3 pkg-sha256-disagree_1.0.tar.gz
 Checksums-Sha256:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-disagree_1.0.dsc
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 pkg-sha256-disagree_1.0.tar.gz
- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 0 pkg-sha256-disagree_1.0.dsc
- bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 pkg-sha256-disagree_1.0.tar.gz
943d3bf22ac661fb0f59bc4ff68cc12b04ff17a838dfcc2537008eb9c7f3770a 3 pkg-sha256-disagree_1.0.dsc
90aebae315675cbf04612de4f7d5874850f48e0b8dd82becbeaa47ca93f5ebfb 3 pkg-sha256-disagree_1.0.tar.gz
+ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa 3 pkg-sha256-disagree_1.0.dsc
+ bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 3 pkg-sha256-disagree_1.0.tar.gz
 EOF
 
 # create fetchable files
 for x in 'pkg-md5-ok' 'pkg-sha256-ok' 'pkg-sha256-bad' 'pkg-no-md5' \
         'pkg-mixed-ok' 'pkg-mixed-sha1-bad' 'pkg-mixed-sha2-bad' \
         'pkg-md5-agree' 'pkg-md5-disagree' 'pkg-sha256-disagree'; do
-       touch aptarchive/${x}_1.0.dsc aptarchive/${x}_1.0.tar.gz
+       echo -n 'dsc' > aptarchive/${x}_1.0.dsc
+       echo -n 'tar' > aptarchive/${x}_1.0.tar.gz
 done
 
 setupaptarchive
 changetowebserver
 testsuccess aptget update
 
+cd downloaded
+
 testok() {
        rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz
        testequal "Reading package lists...
 Building dependency tree...
-Need to get 0 B of source archives.
-Get:1 http://localhost:8080/  $1 1.0 (dsc)
-Get:2 http://localhost:8080/  $1 1.0 (tar)
+Need to get 6 B of source archives.
+Get:1 http://localhost:8080/  $1 1.0 (dsc) [3 B]
+Get:2 http://localhost:8080/  $1 1.0 (tar) [3 B]
 Download complete and in download only mode" aptget source -d "$@"
        msgtest 'Files were successfully downloaded for' "$1"
        testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz
@@ -154,7 +157,8 @@ Download complete and in download only mode" aptget source -d "$@"
 }
 
 testkeep() {
-       touch ${1}_1.0.dsc ${1}_1.0.tar.gz
+       echo -n 'dsc' > ${1}_1.0.dsc
+       echo -n 'tar' > ${1}_1.0.tar.gz
        testequal "Reading package lists...
 Building dependency tree...
 Skipping already downloaded file '${1}_1.0.dsc'
@@ -170,9 +174,9 @@ testmismatch() {
        rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz
        testequal "Reading package lists...
 Building dependency tree...
-Need to get 0 B of source archives.
-Get:1 http://localhost:8080/  $1 1.0 (dsc)
-Get:2 http://localhost:8080/  $1 1.0 (tar)
+Need to get 6 B of source archives.
+Get:1 http://localhost:8080/  $1 1.0 (dsc) [3 B]
+Get:2 http://localhost:8080/  $1 1.0 (tar) [3 B]
 E: Failed to fetch http://localhost:8080/${1}_1.0.dsc  Hash Sum mismatch
 
 E: Failed to fetch http://localhost:8080/${1}_1.0.tar.gz  Hash Sum mismatch
@@ -194,9 +198,9 @@ Download complete and in download only mode" aptget source -d "$@" -o Acquire::F
        rm -f ${1}_1.0.dsc ${1}_1.0.tar.gz
        testequal "Reading package lists...
 Building dependency tree...
-Need to get 0 B of source archives.
-Get:1 http://localhost:8080/  $1 1.0 (dsc)
-Get:2 http://localhost:8080/  $1 1.0 (tar)
+Need to get 6 B of source archives.
+Get:1 http://localhost:8080/  $1 1.0 (dsc) [3 B]
+Get:2 http://localhost:8080/  $1 1.0 (tar) [3 B]
 Download complete and in download only mode" aptget source --allow-unauthenticated -d "$@" -o Acquire::ForceHash=ROT26
        msgtest 'Files were downloaded unauthenticated as user allowed it' "$1"
        testsuccess --nomsg test -e ${1}_1.0.dsc -a -e ${1}_1.0.tar.gz
@@ -231,9 +235,9 @@ testfailure --nomsg test -e pkg-no-md5_1.0.dsc -a -e pkg-no-md5_1.0.tar.gz
 testok pkg-mixed-ok
 testequal 'Reading package lists...
 Building dependency tree...
-Need to get 0 B of source archives.
-Get:1 http://localhost:8080/  pkg-mixed-sha1-bad 1.0 (tar)
-Get:2 http://localhost:8080/  pkg-mixed-sha1-bad 1.0 (dsc)
+Need to get 6 B of source archives.
+Get:1 http://localhost:8080/  pkg-mixed-sha1-bad 1.0 (tar) [3 B]
+Get:2 http://localhost:8080/  pkg-mixed-sha1-bad 1.0 (dsc) [3 B]
 E: Failed to fetch http://localhost:8080/pkg-mixed-sha1-bad_1.0.dsc  Hash Sum mismatch
 
 E: Failed to fetch some archives.' aptget source -d pkg-mixed-sha1-bad
@@ -241,9 +245,9 @@ msgtest 'Only tar file is downloaded as the dsc has hashsum mismatch' 'pkg-mixed
 testsuccess --nomsg test ! -e pkg-mixed-sha1-bad_1.0.dsc -a -e pkg-mixed-sha1-bad_1.0.tar.gz
 testequal 'Reading package lists...
 Building dependency tree...
-Need to get 0 B of source archives.
-Get:1 http://localhost:8080/  pkg-mixed-sha2-bad 1.0 (tar)
-Get:2 http://localhost:8080/  pkg-mixed-sha2-bad 1.0 (dsc)
+Need to get 6 B of source archives.
+Get:1 http://localhost:8080/  pkg-mixed-sha2-bad 1.0 (tar) [3 B]
+Get:2 http://localhost:8080/  pkg-mixed-sha2-bad 1.0 (dsc) [3 B]
 E: Failed to fetch http://localhost:8080/pkg-mixed-sha2-bad_1.0.tar.gz  Hash Sum mismatch
 
 E: Failed to fetch some archives.' aptget source -d pkg-mixed-sha2-bad
index 2f2d384e1d3b58915551e44f1fd13360929c7e07..45f70a898aec9b6e5cf7b784a74b87aa94d6d66c 100755 (executable)
@@ -27,6 +27,7 @@ setupaptarchive
 # discourage keeping obsolete high-priority packages …
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be REMOVED:
   not-downloadable
 The following packages will be upgraded:
@@ -43,6 +44,7 @@ done
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages have been kept back:
   upgradable
 0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.' aptget -s dist-upgrade
index a773660d2b9f3b34a5c5a3758e3e1e1fdf33deed..ea516fc12b0ba4c01a68d2e55d1efafab0e56b07 100755 (executable)
@@ -21,6 +21,7 @@ if downloadfile http://localhost:8080/holygrail ./knights-talking >/dev/null; th
 else
     msgfail
 fi
+
 testfileequal knights-talking 'ni ni ni'
 
 ensure_n_canary_strings_in_dir() {
@@ -35,19 +36,20 @@ ensure_n_canary_strings_in_dir() {
 
 LISTS='rootdir/var/lib/apt/lists'
 rm -rf rootdir/var/lib/apt/lists
-msgtest 'Got expected NODATA failure in' 'apt-get update'
-aptget update -qq 2>&1 | grep -q 'E: GPG error.*NODATA' && msgpass || msgfail
+msgtest 'Got expected failure message' 'apt-get update'
+aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail
 
 ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0
-testequal 'partial' ls $LISTS
+testequal 'lock
+partial' ls $LISTS
 
 # and again with pre-existing files with "valid data" which should remain
 for f in Release Release.gpg main_binary-amd64_Packages main_source_Sources; do
     echo 'peng neee-wom' > $LISTS/localhost:8080_dists_stable_${f}
 done
 
-msgtest 'Got expected NODATA failure in' 'apt-get update'
-aptget update -qq 2>&1 | grep -q 'E: GPG error.*NODATA' && msgpass || msgfail
+msgtest 'Got expected failure message in' 'apt-get update'
+aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail
 
 ensure_n_canary_strings_in_dir $LISTS 'peng neee-wom' 4
 ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0
@@ -56,7 +58,7 @@ ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0
 echo 'peng neee-wom' > $LISTS/localhost:8080_dists_stable_InRelease
 rm -f $LISTS/localhost:8080_dists_stable_Release $LISTS/localhost:8080_dists_stable_Release.gpg
 msgtest 'excpected failure of' 'apt-get update'
-aptget update -qq 2>&1 | grep -q 'E: GPG error.*NODATA' && msgpass || msgfail
+aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail
 
 ensure_n_canary_strings_in_dir $LISTS 'peng neee-wom' 3
 ensure_n_canary_strings_in_dir $LISTS 'ni ni ni' 0
index 14648e9b8533f4e7346f8c0b9fe8fd98b1a7055d..0b5a91246275cb4e0a29644178505ad89492a2ff 100755 (executable)
@@ -4,33 +4,53 @@ set -e
 TESTDIR=$(readlink -f $(dirname $0))
 . $TESTDIR/framework
 setupenvironment
-configarchitecture 'native'
-
-setupsimplenativepackage 'compiz-core' 'native' '1.0' 'unstable'
-BUILDDIR='incoming/compiz-core-1.0'
-mkdir -p ${BUILDDIR}/debian/compiz-core/etc
-echo 'foo=bar;' > ${BUILDDIR}/compiz.conf
-echo 'compiz.conf      /etc/compiz.conf' >> ${BUILDDIR}/debian/install
-buildpackage "$BUILDDIR" 'unstable' 'main' 'native'
-rm -rf "$BUILDDIR"
+configarchitecture 'amd64' 'i386'
+
+buildcompizpkg() {
+       setupsimplenativepackage "compiz-core-$1" "$2" "$3" "$4"
+       BUILDDIR="incoming/compiz-core-$1-$3"
+       mkdir -p ${BUILDDIR}/debian/compiz-core/etc
+       echo 'foo=bar;' > ${BUILDDIR}/compiz.conf
+       echo 'compiz.conf       /etc/compiz.conf' >> ${BUILDDIR}/debian/install
+       buildpackage "$BUILDDIR" "$4" 'main' "$2"
+       rm -rf "$BUILDDIR"
+}
+buildcompizpkg 'native' 'all' '1.0' 'stable'
+buildcompizpkg 'all' 'native' '1.0' 'stable'
+buildcompizpkg 'native' 'native' '2.0' 'unstable'
+buildcompizpkg 'all' 'all' '2.0' 'unstable'
 
 setupaptarchive
 
+runtests() {
+       testdpkgnotinstalled compiz-core-$1
+       testsuccess aptget install compiz-core-$1 -t "${2:-unstable}"
+       testdpkginstalled compiz-core-$1
 
-testdpkgnotinstalled compiz-core
-testsuccess aptget install compiz-core
-testdpkginstalled compiz-core
-
-testsuccess aptget remove compiz-core -y
-testdpkgnotinstalled compiz-core
-
-msgtest 'Check that conffiles are still around for' 'compiz-core'
-dpkg -l compiz-core | grep -q '^rc' && msgpass || msgfail
+       testsuccess aptget remove compiz-core-$1 -y
+       testdpkgnotinstalled compiz-core-$1
+       testdpkgstatus 'rc' '1' "compiz-core-$1"
 
-testequal 'Reading package lists...
+       testequal "Reading package lists...
 Building dependency tree...
 Reading state information...
 The following packages will be REMOVED:
-  compiz-core*
+  compiz-core-$1*
 0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
-Purg compiz-core' aptget purge compiz-core -s
+Purg compiz-core-$1" aptget purge compiz-core-$1 -s
+       testsuccess aptget purge compiz-core-$1 -y
+       testequal "dpkg-query: no packages found matching compiz-core-$1" dpkg -l compiz-core-$1
+}
+
+msgmsg 'Test in multi arch environment'
+runtests 'native'
+runtests 'all'
+runtests 'native' 'stable'
+runtests 'all' 'stable'
+
+msgmsg 'Test in single arch environment'
+configarchitecture 'amd64'
+runtests 'native'
+runtests 'all'
+runtests 'native' 'stable'
+runtests 'all' 'stable'
index 50ca2bf57666dc7f343570bd1080732fec367a47..09315868bd7a51833bac34ae0a14d5496706d3f9 100755 (executable)
@@ -28,12 +28,10 @@ MD5Sum:
 done
 
 msgtest 'The unsigned garbage before signed block is' 'ignored'
-testsuccess --nomsg aptget update
+aptget update -qq 2>&1 | grep -q 'W:.*Does not start with a cleartext signature' && msgpass || msgfail
 
 ROOTDIR="$(readlink -f .)"
 testequal "Package files:
  100 ${ROOTDIR}/rootdir/var/lib/dpkg/status
      release a=now
- 500 file:${ROOTDIR}/aptarchive/ unstable/main i386 Packages
-     release a=unstable,n=sid,c=main
 Pinned packages:" aptcache policy
index 462acad00c025166309b6ca5c595a99e471b6c95..d2b6b9bad1e85eb6faee49304dc85ed95ca3590e 100755 (executable)
@@ -14,6 +14,7 @@ setupaptarchive
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   custom
 1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
index c1d454f883cf8067c537807768aebdd5dfb91453..409d1212ca0ce16b21cb55e9da7c6122482c4d98 100755 (executable)
@@ -28,6 +28,7 @@ setupaptarchive
 
 testequalor2 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following NEW packages will be installed:
   ure
 The following packages will be upgraded:
@@ -44,6 +45,7 @@ Conf libreoffice-core (4 sid [amd64])
 Conf libreoffice-style-galaxy (4 sid [amd64])
 Conf libreoffice (4 sid [amd64])' 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following NEW packages will be installed:
   ure
 The following packages will be upgraded:
index 139d2c915326fef9649f0375010f1787bec4a234..0be57d97937e2e41dad01a24692455b786aee44f 100755 (executable)
@@ -26,6 +26,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget install x
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   xserver-xorg-core xserver-xorg-video-intel
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
@@ -35,6 +36,7 @@ E: Trivial Only specified but this is not a trivial operation.' aptget upgrade -
 
 testequal 'Reading package lists...
 Building dependency tree...
+Calculating upgrade...
 The following packages will be upgraded:
   xserver-xorg-core xserver-xorg-video-intel
 2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
index cd52da692a8339cffdbab68ff61b039ea72275a8..3403bbdd284f963f6d4e436bbd7304a2adb05d20 100644 (file)
@@ -417,22 +417,87 @@ static bool parseFirstLine(int const client, std::string const &request,/*{{{*/
 
    // Proxies require absolute uris, so this is a simple proxy-fake option
    std::string const absolute = _config->Find("aptwebserver::request::absolute", "uri,path");
-   if (strncmp(host.c_str(), filename.c_str(), host.length()) == 0)
+   if (strncmp(host.c_str(), filename.c_str(), host.length()) == 0 && APT::String::Startswith(filename, "/_config/") == false)
    {
       if (absolute.find("uri") == std::string::npos)
       {
         sendError(client, 400, request, sendContent, "Request is absoluteURI, but configured to not accept that", headers);
         return false;
       }
+
       // strip the host from the request to make it an absolute path
       filename.erase(0, host.length());
+
+      std::string const authConf = _config->Find("aptwebserver::proxy-authorization", "");
+      std::string auth = LookupTag(request, "Proxy-Authorization", "");
+      if (authConf.empty() != auth.empty())
+      {
+        if (auth.empty())
+           sendError(client, 407, request, sendContent, "Proxy requires authentication", headers);
+        else
+           sendError(client, 407, request, sendContent, "Client wants to authenticate to proxy, but proxy doesn't need it", headers);
+       return false;
+      }
+      if (authConf.empty() == false)
+      {
+        char const * const basic = "Basic ";
+        if (strncmp(auth.c_str(), basic, strlen(basic)) == 0)
+        {
+           auth.erase(0, strlen(basic));
+           if (auth != authConf)
+           {
+              sendError(client, 407, request, sendContent, "Proxy-Authentication doesn't match", headers);
+              return false;
+           }
+        }
+        else
+        {
+           std::list<std::string> headers;
+           headers.push_back("Proxy-Authenticate: Basic");
+           sendError(client, 407, request, sendContent, "Unsupported Proxy-Authentication Scheme", headers);
+           return false;
+        }
+      }
    }
-   else if (absolute.find("path") == std::string::npos)
+   else if (absolute.find("path") == std::string::npos && APT::String::Startswith(filename, "/_config/") == false)
    {
       sendError(client, 400, request, sendContent, "Request is absolutePath, but configured to not accept that", headers);
       return false;
    }
 
+   if (APT::String::Startswith(filename, "/_config/") == false)
+   {
+      std::string const authConf = _config->Find("aptwebserver::authorization", "");
+      std::string auth = LookupTag(request, "Authorization", "");
+      if (authConf.empty() != auth.empty())
+      {
+        if (auth.empty())
+           sendError(client, 401, request, sendContent, "Server requires authentication", headers);
+        else
+           sendError(client, 401, request, sendContent, "Client wants to authenticate to server, but server doesn't need it", headers);
+        return false;
+      }
+      if (authConf.empty() == false)
+      {
+        char const * const basic = "Basic ";
+        if (strncmp(auth.c_str(), basic, strlen(basic)) == 0)
+        {
+           auth.erase(0, strlen(basic));
+           if (auth != authConf)
+           {
+              sendError(client, 401, request, sendContent, "Authentication doesn't match", headers);
+              return false;
+           }
+        }
+        else
+        {
+           headers.push_back("WWW-Authenticate: Basic");
+           sendError(client, 401, request, sendContent, "Unsupported Authentication Scheme", headers);
+           return false;
+        }
+      }
+   }
+
    size_t paramspos = filename.find('?');
    if (paramspos != std::string::npos)
    {
@@ -489,6 +554,8 @@ static bool handleOnTheFlyReconfiguration(int const client, std::string const &r
       std::vector<std::string> parts, std::list<std::string> &headers)
 {
    size_t const pcount = parts.size();
+   for (size_t i = 0; i < pcount; ++i)
+      parts[i] = DeQuoteString(parts[i]);
    if (pcount == 4 && parts[1] == "set")
    {
       _config->Set(parts[2], parts[3]);
@@ -707,6 +774,8 @@ int main(int const argc, const char * argv[])
    CommandLine::Args Args[] = {
       {0, "port", "aptwebserver::port", CommandLine::HasArg},
       {0, "request-absolute", "aptwebserver::request::absolute", CommandLine::HasArg},
+      {0, "authorization", "aptwebserver::authorization", CommandLine::HasArg},
+      {0, "proxy-authorization", "aptwebserver::proxy-authorization", CommandLine::HasArg},
       {'c',"config-file",0,CommandLine::ConfigFile},
       {'o',"option",0,CommandLine::ArbItem},
       {0,0,0,0}
@@ -792,7 +861,8 @@ int main(int const argc, const char * argv[])
 
    std::clog << "Serving ANY file on port: " << port << std::endl;
 
-   int const slaves = _config->FindB("aptwebserver::slaves", SOMAXCONN);
+   int const slaves = _config->FindI("aptwebserver::slaves", SOMAXCONN);
+   std::cerr << "SLAVES: " << slaves << std::endl;
    listen(sock, slaves);
    /*}}}*/
 
index 8dc014b9883f229669f34d316b883151ec959a93..4633b78ce66bd33c87d589c001d1a4df6a55aa99 100644 (file)
@@ -39,7 +39,7 @@ include $(PROGRAM_H)
 #SOURCE = rpmver.cc
 #include $(PROGRAM_H)
 
-# Program for testing udevcdrom
+# very simple webserver for APT testing
 PROGRAM=aptwebserver
 SLIBS = -lapt-pkg -lpthread
 LIB_MAKES = apt-pkg/makefile
index 5cf3b353cf1f450e7d7832867b838319389ed99d..7257eaf1b5aabb4179641ed949cda9f3f356346b 100644 (file)
@@ -109,6 +109,7 @@ TEST(CDROMTest, FindMountPointForDevice)
    EXPECT_EQ("/boot/efi", FindMountPointForDevice("/dev/sda1"));
    EXPECT_EQ("/tmp", FindMountPointForDevice("tmpfs"));
 
-   unlink(tempfile);
+   if (tempfile !=  NULL)
+      unlink(tempfile);
    free(tempfile);
 }
index 643c02297fbc2e8851775cceb84fb36582beea9f..a2c303768e4c6af042e3ea241610f0c52c844c73 100644 (file)
@@ -53,11 +53,16 @@ static void TestFileFd(mode_t const a_umask, mode_t const ExpectedFilePermission
    // ensure the memory is as predictably messed up
 #define APT_INIT_READBACK \
    char readback[20]; \
-   memset(readback, 'D', sizeof(readback)/sizeof(readback[0])); \
+   memset(readback, 'D', sizeof(readback)*sizeof(readback[0])); \
    readback[19] = '\0';
 #define EXPECT_N_STR(expect, actual) \
    EXPECT_EQ(0, strncmp(expect, actual, strlen(expect)));
-
+   {
+      APT_INIT_READBACK
+      char const * const expect = "DDDDDDDDDDDDDDDDDDD";
+      EXPECT_STREQ(expect,readback);
+      EXPECT_N_STR(expect, readback);
+   }
    {
       APT_INIT_READBACK
       char const * const expect = "This";
@@ -217,10 +222,79 @@ TEST(FileUtlTest, GetTempDir)
    setenv("TMPDIR", "/not-there-no-really-not", 1);
    EXPECT_EQ("/tmp", GetTempDir());
 
+   // here but not accessible for non-roots
    setenv("TMPDIR", "/usr", 1);
-   EXPECT_EQ("/usr", GetTempDir());
+   EXPECT_EQ("/tmp", GetTempDir());
+
+   // files are no good for tmpdirs, too
+   setenv("TMPDIR", "/dev/null", 1);
+   EXPECT_EQ("/tmp", GetTempDir());
+
+   setenv("TMPDIR", "/var/tmp", 1);
+   EXPECT_EQ("/var/tmp", GetTempDir());
 
    unsetenv("TMPDIR");
    if (old_tmpdir.empty() == false)
       setenv("TMPDIR", old_tmpdir.c_str(), 1);
 }
+TEST(FileUtlTest, Popen)
+{
+   FileFd Fd;
+   pid_t Child;
+   char buf[1024];
+   std::string s;
+   unsigned long long n = 0;
+   std::vector<std::string> OpenFds;
+
+   // count Fds to ensure we don't have a resource leak
+   if(FileExists("/proc/self/fd"))
+      OpenFds = Glob("/proc/self/fd/*");
+
+   // output something
+   const char* Args[10] = {"/bin/echo", "meepmeep", NULL};
+   EXPECT_TRUE(Popen(Args, Fd, Child, FileFd::ReadOnly));
+   EXPECT_TRUE(Fd.Read(buf, sizeof(buf)-1, &n));
+   buf[n] = 0;
+   EXPECT_NE(n, 0);
+   EXPECT_STREQ(buf, "meepmeep\n");
+
+   // wait for the child to exit and cleanup
+   EXPECT_TRUE(ExecWait(Child, "PopenRead"));
+   EXPECT_TRUE(Fd.Close());
+
+   // ensure that after a close all is good again
+   if(FileExists("/proc/self/fd"))
+      EXPECT_EQ(Glob("/proc/self/fd/*").size(), OpenFds.size());
+
+   // ReadWrite is not supported
+   _error->PushToStack();
+   EXPECT_FALSE(Popen(Args, Fd, Child, FileFd::ReadWrite));
+   EXPECT_FALSE(Fd.IsOpen());
+   EXPECT_FALSE(Fd.Failed());
+   EXPECT_TRUE(_error->PendingError());
+   _error->RevertToStack();
+
+   // write something
+   Args[0] = "/bin/bash";
+   Args[1] = "-c";
+   Args[2] = "read";
+   Args[3] = NULL;
+   EXPECT_TRUE(Popen(Args, Fd, Child, FileFd::WriteOnly));
+   s = "\n";
+   EXPECT_TRUE(Fd.Write(s.c_str(), s.length()));
+   EXPECT_TRUE(Fd.Close());
+   EXPECT_FALSE(Fd.IsOpen());
+   EXPECT_FALSE(Fd.Failed());
+   EXPECT_TRUE(ExecWait(Child, "PopenWrite"));
+}
+TEST(FileUtlTest, flAbsPath)
+{
+   std::string cwd = SafeGetCWD();
+   int res = chdir("/bin/");
+   EXPECT_EQ(res, 0);
+   std::string p = flAbsPath("ls");
+   EXPECT_EQ(p, "/bin/ls");
+
+   res = chdir(cwd.c_str());
+   EXPECT_EQ(res, 0);
+}
index ac7d4158276e1e4b33f74b29439fb095526d7cab..a19a0befd36c2e3e3c4ad009389389fe6b473982 100644 (file)
@@ -1,5 +1,6 @@
 #include <config.h>
 
+#include <apt-pkg/configuration.h>
 #include <apt-pkg/md5.h>
 #include <apt-pkg/sha1.h>
 #include <apt-pkg/sha2.h>
@@ -162,24 +163,34 @@ TEST(HashSumsTest, FileBased)
 
    FileFd fd(__FILE__, FileFd::ReadOnly);
    EXPECT_TRUE(fd.IsOpen());
+   std::string FileSize;
+   strprintf(FileSize, "%llu", fd.FileSize());
 
    {
       Hashes hashes;
       hashes.AddFD(fd.Fd());
-      EXPECT_EQ(md5.Value(), hashes.MD5.Result().Value());
-      EXPECT_EQ(sha1.Value(), hashes.SHA1.Result().Value());
-      EXPECT_EQ(sha256.Value(), hashes.SHA256.Result().Value());
-      EXPECT_EQ(sha512.Value(), hashes.SHA512.Result().Value());
+      HashStringList list = hashes.GetHashStringList();
+      EXPECT_FALSE(list.empty());
+      EXPECT_EQ(5, list.size());
+      EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue());
+      EXPECT_EQ(sha1.Value(), list.find("SHA1")->HashValue());
+      EXPECT_EQ(sha256.Value(), list.find("SHA256")->HashValue());
+      EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue());
+      EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue());
    }
-   unsigned long sz = fd.FileSize();
+   unsigned long long sz = fd.FileSize();
    fd.Seek(0);
    {
       Hashes hashes;
       hashes.AddFD(fd.Fd(), sz);
-      EXPECT_EQ(md5.Value(), hashes.MD5.Result().Value());
-      EXPECT_EQ(sha1.Value(), hashes.SHA1.Result().Value());
-      EXPECT_EQ(sha256.Value(), hashes.SHA256.Result().Value());
-      EXPECT_EQ(sha512.Value(), hashes.SHA512.Result().Value());
+      HashStringList list = hashes.GetHashStringList();
+      EXPECT_FALSE(list.empty());
+      EXPECT_EQ(5, list.size());
+      EXPECT_EQ(md5.Value(), list.find("MD5Sum")->HashValue());
+      EXPECT_EQ(sha1.Value(), list.find("SHA1")->HashValue());
+      EXPECT_EQ(sha256.Value(), list.find("SHA256")->HashValue());
+      EXPECT_EQ(sha512.Value(), list.find("SHA512")->HashValue());
+      EXPECT_EQ(FileSize, list.find("Checksum-FileSize")->HashValue());
    }
    fd.Seek(0);
    {
@@ -260,3 +271,74 @@ TEST(HashSumsTest, FileBased)
    EXPECT_FALSE(similar == hashes);
    EXPECT_TRUE(similar != hashes);
 }
+TEST(HashSumsTest, HashStringList)
+{
+   _config->Clear("Acquire::ForceHash");
+
+   HashStringList list;
+   EXPECT_TRUE(list.empty());
+   EXPECT_FALSE(list.usable());
+   EXPECT_EQ(0, list.size());
+   EXPECT_EQ(NULL, list.find(NULL));
+   EXPECT_EQ(NULL, list.find(""));
+   EXPECT_EQ(NULL, list.find("MD5Sum"));
+
+   // empty lists aren't equal
+   HashStringList list2;
+   EXPECT_FALSE(list == list2);
+   EXPECT_TRUE(list != list2);
+
+   // some hashes don't really contribute to usability
+   list.push_back(HashString("Checksum-FileSize", "29"));
+   EXPECT_FALSE(list.empty());
+   EXPECT_FALSE(list.usable());
+
+   Hashes hashes;
+   hashes.Add("The quick brown fox jumps over the lazy dog");
+   list = hashes.GetHashStringList();
+   EXPECT_FALSE(list.empty());
+   EXPECT_TRUE(list.usable());
+   EXPECT_EQ(5, list.size());
+   EXPECT_TRUE(NULL != list.find(NULL));
+   EXPECT_TRUE(NULL != list.find(""));
+   EXPECT_TRUE(NULL != list.find("MD5Sum"));
+   EXPECT_TRUE(NULL != list.find("Checksum-FileSize"));
+   EXPECT_TRUE(NULL == list.find("ROT26"));
+
+   _config->Set("Acquire::ForceHash", "MD5Sum");
+   EXPECT_FALSE(list.empty());
+   EXPECT_TRUE(list.usable());
+   EXPECT_EQ(5, list.size());
+   EXPECT_TRUE(NULL != list.find(NULL));
+   EXPECT_TRUE(NULL != list.find(""));
+   EXPECT_TRUE(NULL != list.find("MD5Sum"));
+   EXPECT_TRUE(NULL != list.find("Checksum-FileSize"));
+   EXPECT_TRUE(NULL == list.find("ROT26"));
+
+   _config->Set("Acquire::ForceHash", "ROT26");
+   EXPECT_FALSE(list.empty());
+   EXPECT_FALSE(list.usable());
+   EXPECT_EQ(5, list.size());
+   EXPECT_TRUE(NULL == list.find(NULL));
+   EXPECT_TRUE(NULL == list.find(""));
+   EXPECT_TRUE(NULL != list.find("MD5Sum"));
+   EXPECT_TRUE(NULL != list.find("Checksum-FileSize"));
+   EXPECT_TRUE(NULL == list.find("ROT26"));
+
+   _config->Clear("Acquire::ForceHash");
+
+   list2.push_back(*list.find("MD5Sum"));
+   EXPECT_TRUE(list == list2);
+   EXPECT_FALSE(list != list2);
+
+   // introduce a mismatch to the list
+   list2.push_back(HashString("SHA1", "cacecbd74968bc90ea3342767e6b94f46ddbcafc"));
+   EXPECT_FALSE(list == list2);
+   EXPECT_TRUE(list != list2);
+
+   _config->Set("Acquire::ForceHash", "MD5Sum");
+   EXPECT_TRUE(list == list2);
+   EXPECT_FALSE(list != list2);
+
+   _config->Clear("Acquire::ForceHash");
+}
index eb2d76c43d71d01883a41629c30d3be269470699..747ab4957f7eb374616ef00b1a6251aeb433ee63 100644 (file)
@@ -20,7 +20,7 @@ class SourceList : public pkgSourceList {
 TEST(SourceListTest,ParseFileDeb822)
 {
    FileFd fd;
-   char * tempfile;
+   char * tempfile = NULL;
    createTemporaryFile("parsefiledeb822", fd, &tempfile,
       "Types: deb\n"
       "URIs: http://ftp.debian.org/debian\n"
index 194c9c074056f3ae0e1172840e2f9d48ceca44f4..9bc3c76fdd12d86b1279b358762ed1081a968bc3 100644 (file)
@@ -1,10 +1,13 @@
 #include <config.h>
 #include <apt-pkg/strutl.h>
+#include <apt-pkg/fileutl.h>
 #include <string>
 #include <vector>
 
 #include <gtest/gtest.h>
 
+#include "file-helpers.h"
+
 TEST(StrUtilTest,DeEscapeString)
 {
    // nothing special
@@ -85,6 +88,15 @@ TEST(StrUtilTest,EndsWith)
    EXPECT_FALSE(Endswith("abcd", "x"));
    EXPECT_FALSE(Endswith("abcd", "abcndefg"));
 }
+TEST(StrUtilTest,StartsWith)
+{
+   using APT::String::Startswith;
+   EXPECT_TRUE(Startswith("abcd", "a"));
+   EXPECT_TRUE(Startswith("abcd", "ab"));
+   EXPECT_TRUE(Startswith("abcd", "abcd"));
+   EXPECT_FALSE(Startswith("abcd", "x"));
+   EXPECT_FALSE(Startswith("abcd", "abcndefg"));
+}
 TEST(StrUtilTest,SubstVar)
 {
    EXPECT_EQ("", SubstVar("", "fails", "passes"));
@@ -120,3 +132,84 @@ TEST(StrUtilTest,SubstVar)
    EXPECT_EQ(" bb a bb a bb a bb ", SubstVar(" aaa a aaa a aaa a aaa ", "aaa", "bb"));
 
 }
+TEST(StrUtilTest,Base64Encode)
+{
+   EXPECT_EQ("QWxhZGRpbjpvcGVuIHNlc2FtZQ==", Base64Encode("Aladdin:open sesame"));
+   EXPECT_EQ("cGxlYXN1cmUu", Base64Encode("pleasure."));
+   EXPECT_EQ("bGVhc3VyZS4=", Base64Encode("leasure."));
+   EXPECT_EQ("ZWFzdXJlLg==", Base64Encode("easure."));
+   EXPECT_EQ("YXN1cmUu", Base64Encode("asure."));
+   EXPECT_EQ("c3VyZS4=", Base64Encode("sure."));
+   EXPECT_EQ("dXJlLg==", Base64Encode("ure."));
+   EXPECT_EQ("cmUu", Base64Encode("re."));
+   EXPECT_EQ("ZS4=", Base64Encode("e."));
+   EXPECT_EQ("Lg==", Base64Encode("."));
+   EXPECT_EQ("", Base64Encode(""));
+}
+void ReadMessagesTestWithNewLine(char const * const nl, char const * const ab)
+{
+   SCOPED_TRACE(SubstVar(SubstVar(nl, "\n", "n"), "\r", "r") + " # " + ab);
+   FileFd fd;
+   std::string pkgA = "Package: pkgA\n"
+      "Version: 1\n"
+      "Size: 100\n"
+      "Description: aaa\n"
+      " aaa";
+   std::string pkgB = "Package: pkgB\n"
+      "Version: 1\n"
+      "Flag: no\n"
+      "Description: bbb";
+   std::string pkgC = "Package: pkgC\n"
+      "Version: 2\n"
+      "Flag: yes\n"
+      "Description:\n"
+      " ccc";
+
+   createTemporaryFile("readmessage", fd, NULL, (pkgA + nl + pkgB + nl + pkgC + nl).c_str());
+   std::vector<std::string> list;
+   EXPECT_TRUE(ReadMessages(fd.Fd(), list));
+   EXPECT_EQ(3, list.size());
+   EXPECT_EQ(pkgA, list[0]);
+   EXPECT_EQ(pkgB, list[1]);
+   EXPECT_EQ(pkgC, list[2]);
+
+   size_t const msgsize = 63990;
+   createTemporaryFile("readmessage", fd, NULL, NULL);
+   for (size_t j = 0; j < msgsize; ++j)
+      fd.Write(ab, strlen(ab));
+   for (size_t i = 0; i < 21; ++i)
+   {
+      std::string msg;
+      strprintf(msg, "msgsize=%zu  i=%zu", msgsize, i);
+      SCOPED_TRACE(msg);
+      fd.Seek((msgsize + (i - 1)) * strlen(ab));
+      fd.Write(ab, strlen(ab));
+      fd.Write(nl, strlen(nl));
+      fd.Seek(0);
+      list.clear();
+      EXPECT_TRUE(ReadMessages(fd.Fd(), list));
+      EXPECT_EQ(1, list.size());
+      EXPECT_EQ((msgsize + i) * strlen(ab), list[0].length());
+      EXPECT_EQ(std::string::npos, list[0].find_first_not_of(ab));
+   }
+
+   list.clear();
+   fd.Write(pkgA.c_str(), pkgA.length());
+   fd.Write(nl, strlen(nl));
+   fd.Seek(0);
+   EXPECT_TRUE(ReadMessages(fd.Fd(), list));
+   EXPECT_EQ(2, list.size());
+   EXPECT_EQ((msgsize + 20) * strlen(ab), list[0].length());
+   EXPECT_EQ(std::string::npos, list[0].find_first_not_of(ab));
+   EXPECT_EQ(pkgA, list[1]);
+
+
+   fd.Close();
+}
+TEST(StrUtilTest,ReadMessages)
+{
+   ReadMessagesTestWithNewLine("\n\n", "a");
+   ReadMessagesTestWithNewLine("\r\n\r\n", "a");
+   ReadMessagesTestWithNewLine("\n\n", "ab");
+   ReadMessagesTestWithNewLine("\r\n\r\n", "ab");
+}
index 1bac75b55add725a26022f8ef5fe2bad065c798b..df618ea1617183f64e5963b5e2b3fb5b870edd71 100644 (file)
@@ -7,6 +7,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sstream>
 
 #include <gtest/gtest.h>
 
@@ -34,3 +35,181 @@ TEST(TagFileTest,SingleField)
    // There is only one section in this tag file
    EXPECT_FALSE(tfile.Step(section));
 }
+
+TEST(TagFileTest,MultipleSections)
+{
+   FileFd fd;
+   createTemporaryFile("bigsection", fd, NULL, "Package: pkgA\n"
+        "Version: 1\n"
+        "Size: 100\n"
+        "Description: aaa\n"
+        " aaa\n"
+        "\n"
+        "Package: pkgB\n"
+        "Version: 1\n"
+        "Flag: no\n"
+        "Description: bbb\n"
+        "\n"
+        "Package: pkgC\n"
+        "Version: 2\n"
+        "Flag: yes\n"
+        "Description:\n"
+        " ccc\n"
+        );
+
+   pkgTagFile tfile(&fd);
+   pkgTagSection section;
+   EXPECT_FALSE(section.Exists("Version"));
+
+   EXPECT_TRUE(tfile.Step(section));
+   EXPECT_EQ(4, section.Count());
+   EXPECT_TRUE(section.Exists("Version"));
+   EXPECT_TRUE(section.Exists("Package"));
+   EXPECT_TRUE(section.Exists("Size"));
+   EXPECT_FALSE(section.Exists("Flag"));
+   EXPECT_TRUE(section.Exists("Description"));
+   EXPECT_EQ("pkgA", section.FindS("Package"));
+   EXPECT_EQ("1", section.FindS("Version"));
+   EXPECT_EQ(1, section.FindULL("Version"));
+   EXPECT_EQ(100, section.FindULL("Size"));
+   unsigned long Flags = 1;
+   EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
+   EXPECT_EQ(1, Flags);
+   Flags = 0;
+   EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
+   EXPECT_EQ(0, Flags);
+   EXPECT_EQ("aaa\n aaa", section.FindS("Description"));
+
+
+   EXPECT_TRUE(tfile.Step(section));
+   EXPECT_EQ(4, section.Count());
+   EXPECT_TRUE(section.Exists("Version"));
+   EXPECT_TRUE(section.Exists("Package"));
+   EXPECT_FALSE(section.Exists("Size"));
+   EXPECT_TRUE(section.Exists("Flag"));
+   EXPECT_TRUE(section.Exists("Description"));
+   EXPECT_EQ("pkgB", section.FindS("Package"));
+   EXPECT_EQ("1", section.FindS("Version"));
+   EXPECT_EQ(1, section.FindULL("Version"));
+   EXPECT_EQ(0, section.FindULL("Size"));
+   Flags = 1;
+   EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
+   EXPECT_EQ(0, Flags);
+   Flags = 0;
+   EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
+   EXPECT_EQ(0, Flags);
+   EXPECT_EQ("bbb", section.FindS("Description"));
+
+   EXPECT_TRUE(tfile.Step(section));
+   EXPECT_EQ(4, section.Count());
+   EXPECT_TRUE(section.Exists("Version"));
+   EXPECT_TRUE(section.Exists("Package"));
+   EXPECT_FALSE(section.Exists("Size"));
+   EXPECT_TRUE(section.Exists("Flag"));
+   EXPECT_TRUE(section.Exists("Description"));
+   EXPECT_EQ("pkgC", section.FindS("Package"));
+   EXPECT_EQ("2", section.FindS("Version"));
+   EXPECT_EQ(2, section.FindULL("Version"));
+   Flags = 0;
+   EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
+   EXPECT_EQ(1, Flags);
+   Flags = 1;
+   EXPECT_TRUE(section.FindFlag("Flag", Flags, 1));
+   EXPECT_EQ(1, Flags);
+   EXPECT_EQ("ccc", section.FindS("Description"));
+
+   // There is no section left in this tag file
+   EXPECT_FALSE(tfile.Step(section));
+}
+
+TEST(TagFileTest,BigSection)
+{
+   size_t const count = 500;
+   std::stringstream content;
+   for (size_t i = 0; i < count; ++i)
+      content << "Field-" << i << ": " << (2000 + i) << std::endl;
+
+   FileFd fd;
+   createTemporaryFile("bigsection", fd, NULL, content.str().c_str());
+
+   pkgTagFile tfile(&fd);
+   pkgTagSection section;
+   EXPECT_TRUE(tfile.Step(section));
+
+   EXPECT_EQ(count, section.Count());
+   for (size_t i = 0; i < count; ++i)
+   {
+      std::stringstream name;
+      name << "Field-" << i;
+      EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist";
+      EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str()));
+   }
+
+   // There is only one section in this tag file
+   EXPECT_FALSE(tfile.Step(section));
+}
+
+TEST(TagFileTest, PickedUpFromPreviousCall)
+{
+   size_t const count = 500;
+   std::stringstream contentstream;
+   for (size_t i = 0; i < count; ++i)
+      contentstream << "Field-" << i << ": " << (2000 + i) << std::endl;
+   contentstream << std::endl << std::endl;
+   std::string content = contentstream.str();
+
+   pkgTagSection section;
+   EXPECT_FALSE(section.Scan(content.c_str(), content.size()/2));
+   EXPECT_NE(0, section.Count());
+   EXPECT_NE(count, section.Count());
+   EXPECT_TRUE(section.Scan(content.c_str(), content.size(), false));
+   EXPECT_EQ(count, section.Count());
+
+   for (size_t i = 0; i < count; ++i)
+   {
+      std::stringstream name;
+      name << "Field-" << i;
+      EXPECT_TRUE(section.Exists(name.str().c_str())) << name.str() << " does not exist";
+      EXPECT_EQ((2000 + i), section.FindULL(name.str().c_str()));
+   }
+}
+
+TEST(TagFileTest, SpacesEverywhere)
+{
+   std::string content =
+      "Package: pkgA\n"
+      "Package: pkgB\n"
+      "NoSpaces:yes\n"
+      "TagSpaces\t    :yes\n"
+      "ValueSpaces:   \tyes\n"
+      "BothSpaces     \t:\t   yes\n"
+      "TrailingSpaces: yes\t   \n"
+      "Naming Space: yes\n"
+      "Naming  Spaces: yes\n"
+      "Package    :   pkgC    \n"
+      "Multi-Colon::yes:\n"
+      "\n\n";
+
+   pkgTagSection section;
+   EXPECT_TRUE(section.Scan(content.c_str(), content.size()));
+   EXPECT_TRUE(section.Exists("Package"));
+   EXPECT_TRUE(section.Exists("NoSpaces"));
+   EXPECT_TRUE(section.Exists("TagSpaces"));
+   EXPECT_TRUE(section.Exists("ValueSpaces"));
+   EXPECT_TRUE(section.Exists("BothSpaces"));
+   EXPECT_TRUE(section.Exists("TrailingSpaces"));
+   EXPECT_TRUE(section.Exists("Naming Space"));
+   EXPECT_TRUE(section.Exists("Naming  Spaces"));
+   EXPECT_TRUE(section.Exists("Multi-Colon"));
+   EXPECT_EQ("pkgC", section.FindS("Package"));
+   EXPECT_EQ("yes", section.FindS("NoSpaces"));
+   EXPECT_EQ("yes", section.FindS("TagSpaces"));
+   EXPECT_EQ("yes", section.FindS("ValueSpaces"));
+   EXPECT_EQ("yes", section.FindS("BothSpaces"));
+   EXPECT_EQ("yes", section.FindS("TrailingSpaces"));
+   EXPECT_EQ("yes", section.FindS("Naming Space"));
+   EXPECT_EQ("yes", section.FindS("Naming  Spaces"));
+   EXPECT_EQ(":yes:", section.FindS("Multi-Colon"));
+   // overridden values are still present, but not really accessible
+   EXPECT_EQ(11, section.Count());
+}