summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2011-06-29 12:45:30 +0100
committerMichael Vogt <michael.vogt@ubuntu.com>2011-06-29 12:45:30 +0100
commit9abccf4a63b6c887b213678d940fe912233f04c3 (patch)
tree8a22c910a0c8258f29784614aca9c0ebd2cc32d6
parentc56c4b82dd77258da5640bf9f63a8db10424b59a (diff)
parent627e99b0328e05b13600134655253d36575f314d (diff)
merge lp:~mvo/apt/abi-break
-rw-r--r--apt-inst/makefile2
-rw-r--r--apt-pkg/acquire-item.cc6
-rw-r--r--apt-pkg/acquire-method.cc7
-rw-r--r--apt-pkg/acquire-method.h1
-rw-r--r--apt-pkg/acquire-worker.h5
-rw-r--r--apt-pkg/acquire.h27
-rw-r--r--apt-pkg/algorithms.cc55
-rw-r--r--apt-pkg/algorithms.h6
-rw-r--r--apt-pkg/cachefile.h3
-rw-r--r--apt-pkg/cachefilter.h2
-rw-r--r--apt-pkg/cacheiterators.h8
-rw-r--r--apt-pkg/cacheset.h2
-rw-r--r--apt-pkg/clean.h3
-rw-r--r--apt-pkg/contrib/hashes.cc9
-rw-r--r--apt-pkg/contrib/hashes.h5
-rw-r--r--apt-pkg/contrib/hashsum_template.h87
-rw-r--r--apt-pkg/contrib/md5.cc57
-rw-r--r--apt-pkg/contrib/md5.h23
-rw-r--r--apt-pkg/contrib/progress.cc27
-rw-r--r--apt-pkg/contrib/progress.h3
-rw-r--r--apt-pkg/contrib/sha1.cc65
-rw-r--r--apt-pkg/contrib/sha1.h23
-rw-r--r--apt-pkg/contrib/sha2.cc43
-rw-r--r--apt-pkg/contrib/sha2.h114
-rw-r--r--apt-pkg/contrib/sha256.cc424
-rw-r--r--apt-pkg/contrib/sha256.h68
-rw-r--r--apt-pkg/contrib/sha2_internal.cc1065
-rw-r--r--apt-pkg/contrib/sha2_internal.h197
-rw-r--r--apt-pkg/deb/debindexfile.h20
-rw-r--r--apt-pkg/deb/deblistparser.cc11
-rw-r--r--apt-pkg/deb/deblistparser.h10
-rw-r--r--apt-pkg/deb/debmetaindex.h4
-rw-r--r--apt-pkg/deb/debrecords.cc10
-rw-r--r--apt-pkg/deb/debrecords.h5
-rw-r--r--apt-pkg/deb/debsrcrecords.h5
-rw-r--r--apt-pkg/deb/debsystem.cc62
-rw-r--r--apt-pkg/deb/debsystem.h13
-rw-r--r--apt-pkg/deb/dpkgpm.cc108
-rw-r--r--apt-pkg/deb/dpkgpm.h11
-rw-r--r--apt-pkg/depcache.cc118
-rw-r--r--apt-pkg/depcache.h28
-rw-r--r--apt-pkg/edsp.cc564
-rw-r--r--apt-pkg/edsp.h222
-rw-r--r--apt-pkg/edsp/edspindexfile.cc78
-rw-r--r--apt-pkg/edsp/edspindexfile.h28
-rw-r--r--apt-pkg/edsp/edsplistparser.cc90
-rw-r--r--apt-pkg/edsp/edsplistparser.h38
-rw-r--r--apt-pkg/edsp/edspsystem.cc124
-rw-r--r--apt-pkg/edsp/edspsystem.h41
-rw-r--r--apt-pkg/indexcopy.h8
-rw-r--r--apt-pkg/init.cc2
-rw-r--r--apt-pkg/init.h4
-rw-r--r--apt-pkg/makefile18
-rw-r--r--apt-pkg/packagemanager.cc4
-rw-r--r--apt-pkg/pkgcache.cc3
-rw-r--r--apt-pkg/pkgcache.h17
-rw-r--r--apt-pkg/pkgcachegen.cc2
-rw-r--r--apt-pkg/pkgrecords.h6
-rw-r--r--apt-pkg/policy.cc4
-rw-r--r--apt-pkg/policy.h7
-rw-r--r--apt-pkg/srcrecords.h4
-rw-r--r--apt-pkg/tagfile.cc124
-rw-r--r--apt-pkg/tagfile.h21
-rw-r--r--cmdline/apt-dump-solver.cc50
-rw-r--r--cmdline/apt-get.cc13
-rw-r--r--cmdline/apt-internal-solver.cc190
-rw-r--r--cmdline/makefile14
-rw-r--r--debian/apt-doc.docs1
-rw-r--r--debian/apt-utils.dirs2
-rw-r--r--debian/apt-utils.links1
-rw-r--r--debian/apt.dirs1
-rw-r--r--debian/changelog109
-rw-r--r--debian/control6
-rw-r--r--debian/libapt-inst1.3.install (renamed from debian/libapt-inst1.2.install)0
-rw-r--r--debian/libapt-inst1.3.symbols (renamed from debian/libapt-inst1.2.symbols)0
-rw-r--r--debian/libapt-pkg4.11.install (renamed from debian/libapt-pkg4.10.install)0
-rw-r--r--debian/libapt-pkg4.11.symbols (renamed from debian/libapt-pkg4.10.symbols)0
-rwxr-xr-xdebian/rules6
-rw-r--r--doc/external-dependency-solver-protocol.txt299
-rw-r--r--doc/po/de.po735
-rw-r--r--ftparchive/cachedb.cc40
-rw-r--r--ftparchive/cachedb.h20
-rw-r--r--ftparchive/writer.cc37
-rw-r--r--ftparchive/writer.h2
-rw-r--r--po/apt-all.pot973
-rw-r--r--test/hash.cc26
-rwxr-xr-xtest/integration/test-handling-broken-orgroups4
-rwxr-xr-xtest/integration/test-release-candidate-switching2
88 files changed, 4948 insertions, 1734 deletions
diff --git a/apt-inst/makefile b/apt-inst/makefile
index 785dc62ba..32d231240 100644
--- a/apt-inst/makefile
+++ b/apt-inst/makefile
@@ -14,7 +14,7 @@ include ../buildlib/libversion.mak
# The library name
LIBRARY=apt-inst
-MAJOR=1.2
+MAJOR=1.3
MINOR=0
SLIBS=$(PTHREADLIB) -lapt-pkg
APT_DOMAIN:=libapt-inst$(MAJOR)
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index c3817f6ee..d790bd898 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -1730,6 +1730,8 @@ bool pkgAcqArchive::QueueNext()
string PkgFile = Parse.FileName();
if (ForceHash.empty() == false)
{
+ if(stringcasecmp(ForceHash, "sha512") == 0)
+ ExpectedHash = HashString("SHA512", Parse.SHA512Hash());
if(stringcasecmp(ForceHash, "sha256") == 0)
ExpectedHash = HashString("SHA256", Parse.SHA256Hash());
else if (stringcasecmp(ForceHash, "sha1") == 0)
@@ -1740,7 +1742,9 @@ bool pkgAcqArchive::QueueNext()
else
{
string Hash;
- if ((Hash = Parse.SHA256Hash()).empty() == false)
+ 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);
diff --git a/apt-pkg/acquire-method.cc b/apt-pkg/acquire-method.cc
index e9e102488..8c353beb2 100644
--- a/apt-pkg/acquire-method.cc
+++ b/apt-pkg/acquire-method.cc
@@ -166,6 +166,8 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
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";
if (UsedMirror.empty() == false)
std::cout << "UsedMirror: " << UsedMirror << "\n";
if (Res.GPGVOutput.empty() == false)
@@ -199,7 +201,9 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
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";
+
if (Alt->IMSHit == true)
std::cout << "Alt-IMS-Hit: true\n";
}
@@ -460,5 +464,6 @@ void pkgAcqMethod::FetchResult::TakeHashes(Hashes &Hash)
MD5Sum = Hash.MD5.Result();
SHA1Sum = Hash.SHA1.Result();
SHA256Sum = Hash.SHA256.Result();
+ SHA512Sum = Hash.SHA512.Result();
}
/*}}}*/
diff --git a/apt-pkg/acquire-method.h b/apt-pkg/acquire-method.h
index 72efa8065..2d0fa4590 100644
--- a/apt-pkg/acquire-method.h
+++ b/apt-pkg/acquire-method.h
@@ -46,6 +46,7 @@ class pkgAcqMethod
string MD5Sum;
string SHA1Sum;
string SHA256Sum;
+ string SHA512Sum;
vector<string> GPGVOutput;
time_t LastModified;
bool IMSHit;
diff --git a/apt-pkg/acquire-worker.h b/apt-pkg/acquire-worker.h
index 06283922e..62545829a 100644
--- a/apt-pkg/acquire-worker.h
+++ b/apt-pkg/acquire-worker.h
@@ -44,6 +44,9 @@
*/
class pkgAcquire::Worker : public WeakPointable
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
friend class pkgAcquire;
protected:
@@ -314,7 +317,7 @@ class pkgAcquire::Worker : public WeakPointable
* Closes the file descriptors; if MethodConfig::NeedsCleanup is
* \b false, also rudely interrupts the worker with a SIGINT.
*/
- ~Worker();
+ virtual ~Worker();
};
/** @} */
diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h
index e3a4435b8..7db7a9958 100644
--- a/apt-pkg/acquire.h
+++ b/apt-pkg/acquire.h
@@ -91,6 +91,12 @@ class pkgAcquireStatus;
*/
class pkgAcquire
{
+ private:
+ /** \brief FD of the Lock file we acquire in Setup (if any) */
+ int LockFD;
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
public:
class Item;
@@ -359,9 +365,6 @@ class pkgAcquire
*/
virtual ~pkgAcquire();
- private:
- /** \brief FD of the Lock file we acquire in Setup (if any) */
- int LockFD;
};
/** \brief Represents a single download source from which an item
@@ -391,6 +394,9 @@ class pkgAcquire::Queue
friend class pkgAcquire::UriIterator;
friend class pkgAcquire::Worker;
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
/** \brief The next queue in the pkgAcquire object's list of queues. */
Queue *Next;
@@ -540,12 +546,15 @@ class pkgAcquire::Queue
/** Shut down all the worker processes associated with this queue
* and empty the queue.
*/
- ~Queue();
+ virtual ~Queue();
};
/*}}}*/
/** \brief Iterates over all the URIs being fetched by a pkgAcquire object. {{{*/
class pkgAcquire::UriIterator
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
/** The next queue to iterate over. */
pkgAcquire::Queue *CurQ;
/** The item that we currently point at. */
@@ -581,11 +590,15 @@ class pkgAcquire::UriIterator
CurQ = CurQ->Next;
}
}
+ virtual ~UriIterator() {};
};
/*}}}*/
/** \brief Information about the properties of a single acquire method. {{{*/
struct pkgAcquire::MethodConfig
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
/** \brief The next link on the acquire method list.
*
* \todo Why not an STL container?
@@ -634,6 +647,9 @@ struct pkgAcquire::MethodConfig
* appropriate.
*/
MethodConfig();
+
+ /* \brief Destructor, empty currently */
+ virtual ~MethodConfig() {};
};
/*}}}*/
/** \brief A monitor object for downloads controlled by the pkgAcquire class. {{{
@@ -644,6 +660,9 @@ struct pkgAcquire::MethodConfig
*/
class pkgAcquireStatus
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
protected:
/** \brief The last time at which this monitor object was updated. */
diff --git a/apt-pkg/algorithms.cc b/apt-pkg/algorithms.cc
index 2dae4258a..47bdd4aba 100644
--- a/apt-pkg/algorithms.cc
+++ b/apt-pkg/algorithms.cc
@@ -20,12 +20,15 @@
#include <apt-pkg/version.h>
#include <apt-pkg/sptr.h>
#include <apt-pkg/acquire-item.h>
-
+#include <apt-pkg/edsp.h>
+
#include <apti18n.h>
#include <sys/types.h>
#include <cstdlib>
#include <algorithm>
#include <iostream>
+
+#include <stdio.h>
/*}}}*/
using namespace std;
@@ -327,6 +330,12 @@ bool pkgFixBroken(pkgDepCache &Cache)
*/
bool pkgDistUpgrade(pkgDepCache &Cache)
{
+ 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);
+ }
+
pkgDepCache::ActionGroup group(Cache);
/* Upgrade all installed packages first without autoinst to help the resolver
@@ -379,6 +388,12 @@ bool pkgDistUpgrade(pkgDepCache &Cache)
to install packages not marked for install */
bool pkgAllUpgrade(pkgDepCache &Cache)
{
+ 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);
+ }
+
pkgDepCache::ActionGroup group(Cache);
pkgProblemResolver Fix(&Cache);
@@ -725,7 +740,20 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
return true;
}
/*}}}*/
-// ProblemResolver::Resolve - Run the resolution pass /*{{{*/
+// ProblemResolver::Resolve - calls a resolver to fix the situation /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool pkgProblemResolver::Resolve(bool BrokenFix)
+{
+ 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);
+ }
+ return ResolveInternal(BrokenFix);
+}
+ /*}}}*/
+// ProblemResolver::ResolveInternal - Run the resolution pass /*{{{*/
// ---------------------------------------------------------------------
/* This routines works by calculating a score for each package. The score
is derived by considering the package's priority and all reverse
@@ -739,12 +767,10 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
The BrokenFix flag enables a mode where the algorithm tries to
upgrade packages to advoid problems. */
-bool pkgProblemResolver::Resolve(bool BrokenFix)
+bool pkgProblemResolver::ResolveInternal(bool const BrokenFix)
{
pkgDepCache::ActionGroup group(Cache);
- unsigned long Size = Cache.Head().PackageCount;
-
// Record which packages are marked for install
bool Again = false;
do
@@ -774,7 +800,9 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
clog << "Starting" << endl;
MakeScores();
-
+
+ unsigned long const Size = Cache.Head().PackageCount;
+
/* We have to order the packages so that the broken fixing pass
operates from highest score to lowest. This prevents problems when
high score packages cause the removal of lower score packages that
@@ -1183,6 +1211,21 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
system was non-broken previously. */
bool pkgProblemResolver::ResolveByKeep()
{
+ 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);
+ }
+ return ResolveByKeepInternal();
+}
+ /*}}}*/
+// ProblemResolver::ResolveByKeepInternal - Resolve problems using keep /*{{{*/
+// ---------------------------------------------------------------------
+/* 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. */
+bool pkgProblemResolver::ResolveByKeepInternal()
+{
pkgDepCache::ActionGroup group(Cache);
unsigned long Size = Cache.Head().PackageCount;
diff --git a/apt-pkg/algorithms.h b/apt-pkg/algorithms.h
index ebe31cc10..050934bad 100644
--- a/apt-pkg/algorithms.h
+++ b/apt-pkg/algorithms.h
@@ -78,6 +78,9 @@ private:
/*}}}*/
class pkgProblemResolver /*{{{*/
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
pkgDepCache &Cache;
typedef pkgCache::PkgIterator PkgIterator;
typedef pkgCache::VerIterator VerIterator;
@@ -105,6 +108,9 @@ class pkgProblemResolver /*{{{*/
void MakeScores();
bool DoUpgrade(pkgCache::PkgIterator Pkg);
+
+ bool ResolveInternal(bool const BrokenFix = false);
+ bool ResolveByKeepInternal();
public:
diff --git a/apt-pkg/cachefile.h b/apt-pkg/cachefile.h
index 09d3ec267..d07337d38 100644
--- a/apt-pkg/cachefile.h
+++ b/apt-pkg/cachefile.h
@@ -25,6 +25,9 @@
class pkgCacheFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
protected:
MMap *Map;
diff --git a/apt-pkg/cachefilter.h b/apt-pkg/cachefilter.h
index e7ab1723f..5d426008b 100644
--- a/apt-pkg/cachefilter.h
+++ b/apt-pkg/cachefilter.h
@@ -16,6 +16,8 @@ namespace APT {
namespace CacheFilter {
// PackageNameMatchesRegEx /*{{{*/
class PackageNameMatchesRegEx {
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
regex_t* pattern;
public:
PackageNameMatchesRegEx(std::string const &Pattern);
diff --git a/apt-pkg/cacheiterators.h b/apt-pkg/cacheiterators.h
index 0c9813c6d..b97a1a589 100644
--- a/apt-pkg/cacheiterators.h
+++ b/apt-pkg/cacheiterators.h
@@ -206,15 +206,10 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
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;};
inline const char *Arch() const {
- if (S->MultiArch == pkgCache::Version::All ||
- S->MultiArch == pkgCache::Version::AllForeign ||
- S->MultiArch == pkgCache::Version::AllAllowed)
+ if (S->MultiArch == pkgCache::Version::All)
return "all";
return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
};
- __deprecated inline const char *Arch(bool const pseudo) const {
- return S->ParentPkg == 0?0:Owner->StrP + ParentPkg()->Arch;
- };
inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + S->ParentPkg);};
inline DescIterator DescriptionList() const;
@@ -227,7 +222,6 @@ class pkgCache::VerIterator : public Iterator<Version, VerIterator> {
string RelStr() const;
bool Automatic() const;
- __deprecated bool Pseudo() const;
VerFileIterator NewestFile() const;
inline VerIterator(pkgCache &Owner,Version *Trg = 0) : Iterator<Version, VerIterator>(Owner, Trg) {
diff --git a/apt-pkg/cacheset.h b/apt-pkg/cacheset.h
index eb4f04d72..061d0a2f4 100644
--- a/apt-pkg/cacheset.h
+++ b/apt-pkg/cacheset.h
@@ -257,7 +257,6 @@ public: /*{{{*/
inline const char *VerStr() const { return (**this).VerStr(); };
inline const char *Section() const { return (**this).Section(); };
inline const char *Arch() const { return (**this).Arch(); };
- __deprecated inline const char *Arch(bool const pseudo) const { return (**this).Arch(); };
inline pkgCache::PkgIterator ParentPkg() const { return (**this).ParentPkg(); };
inline pkgCache::DescIterator DescriptionList() const { return (**this).DescriptionList(); };
inline pkgCache::DescIterator TranslatedDescription() const { return (**this).TranslatedDescription(); };
@@ -268,7 +267,6 @@ public: /*{{{*/
inline const char *PriorityType() const { return (**this).PriorityType(); };
inline string RelStr() const { return (**this).RelStr(); };
inline bool Automatic() const { return (**this).Automatic(); };
- __deprecated inline bool Pseudo() const { return false; };
inline pkgCache::VerFileIterator NewestFile() const { return (**this).NewestFile(); };
};
/*}}}*/
diff --git a/apt-pkg/clean.h b/apt-pkg/clean.h
index 2aee2bf54..1ebf68dc9 100644
--- a/apt-pkg/clean.h
+++ b/apt-pkg/clean.h
@@ -15,6 +15,9 @@
class pkgArchiveCleaner
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
protected:
virtual void Erase(const char * /*File*/,string /*Pkg*/,string /*Ver*/,struct stat & /*St*/) {};
diff --git a/apt-pkg/contrib/hashes.cc b/apt-pkg/contrib/hashes.cc
index 985d89d90..66ae33146 100644
--- a/apt-pkg/contrib/hashes.cc
+++ b/apt-pkg/contrib/hashes.cc
@@ -23,7 +23,7 @@
const char* HashString::_SupportedHashes[] =
{
- "SHA256", "SHA1", "MD5Sum", NULL
+ "SHA512", "SHA256", "SHA1", "MD5Sum", NULL
};
HashString::HashString()
@@ -57,6 +57,7 @@ bool HashString::VerifyFile(string filename) const /*{{{*/
MD5Summation MD5;
SHA1Summation SHA1;
SHA256Summation SHA256;
+ SHA256Summation SHA512;
string fileHash;
FileFd Fd(filename, FileFd::ReadOnly);
@@ -75,6 +76,11 @@ bool HashString::VerifyFile(string filename) const /*{{{*/
SHA256.AddFD(Fd.Fd(), Fd.Size());
fileHash = (string)SHA256.Result();
}
+ else if (Type == "SHA512")
+ {
+ SHA512.AddFD(Fd.Fd(), Fd.Size());
+ fileHash = (string)SHA512.Result();
+ }
Fd.Close();
if(_config->FindB("Debug::Hashes",false) == true)
@@ -119,6 +125,7 @@ bool Hashes::AddFD(int Fd,unsigned long Size)
MD5.Add(Buf,Res);
SHA1.Add(Buf,Res);
SHA256.Add(Buf,Res);
+ SHA512.Add(Buf,Res);
}
return true;
}
diff --git a/apt-pkg/contrib/hashes.h b/apt-pkg/contrib/hashes.h
index 264f7fe90..4b6a08b1f 100644
--- a/apt-pkg/contrib/hashes.h
+++ b/apt-pkg/contrib/hashes.h
@@ -16,7 +16,7 @@
#include <apt-pkg/md5.h>
#include <apt-pkg/sha1.h>
-#include <apt-pkg/sha256.h>
+#include <apt-pkg/sha2.h>
#include <algorithm>
#include <vector>
@@ -60,10 +60,11 @@ class Hashes
MD5Summation MD5;
SHA1Summation SHA1;
SHA256Summation SHA256;
+ SHA512Summation SHA512;
inline bool Add(const unsigned char *Data,unsigned long Size)
{
- return MD5.Add(Data,Size) && SHA1.Add(Data,Size) && SHA256.Add(Data,Size);
+ return MD5.Add(Data,Size) && SHA1.Add(Data,Size) && SHA256.Add(Data,Size) && SHA512.Add(Data,Size);
};
inline bool Add(const char *Data) {return Add((unsigned char *)Data,strlen(Data));};
bool AddFD(int Fd,unsigned long Size);
diff --git a/apt-pkg/contrib/hashsum_template.h b/apt-pkg/contrib/hashsum_template.h
new file mode 100644
index 000000000..7667baf92
--- /dev/null
+++ b/apt-pkg/contrib/hashsum_template.h
@@ -0,0 +1,87 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+// $Id: hashsum_template.h,v 1.3 2001/05/07 05:05:47 jgg Exp $
+/* ######################################################################
+
+ HashSumValueTemplate - Generic Storage for a hash value
+
+ ##################################################################### */
+ /*}}}*/
+#ifndef APTPKG_HASHSUM_TEMPLATE_H
+#define APTPKG_HASHSUM_TEMPLATE_H
+
+#include <string>
+#include <cstring>
+#include <algorithm>
+#include <stdint.h>
+
+using std::string;
+using std::min;
+
+template<int N>
+class HashSumValue
+{
+ unsigned char Sum[N/8];
+
+ public:
+
+ // Accessors
+ bool operator ==(const HashSumValue &rhs) const
+ {
+ return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
+ };
+
+ string Value() const
+ {
+ char Conv[16] =
+ { '0','1','2','3','4','5','6','7','8','9','a','b',
+ 'c','d','e','f'
+ };
+ char Result[((N/8)*2)+1];
+ Result[(N/8)*2] = 0;
+
+ // Convert each char into two letters
+ int J = 0;
+ int I = 0;
+ for (; I != (N/8)*2; J++,I += 2)
+ {
+ Result[I] = Conv[Sum[J] >> 4];
+ Result[I + 1] = Conv[Sum[J] & 0xF];
+ }
+ return string(Result);
+ };
+
+ inline void Value(unsigned char S[N/8])
+ {
+ for (int I = 0; I != sizeof(Sum); I++)
+ S[I] = Sum[I];
+ };
+
+ inline operator string() const
+ {
+ return Value();
+ };
+
+ bool Set(string Str)
+ {
+ return Hex2Num(Str,Sum,sizeof(Sum));
+ };
+
+ inline void Set(unsigned char S[N/8])
+ {
+ for (int I = 0; I != sizeof(Sum); I++)
+ Sum[I] = S[I];
+ };
+
+ HashSumValue(string Str)
+ {
+ memset(Sum,0,sizeof(Sum));
+ Set(Str);
+ }
+ HashSumValue()
+ {
+ memset(Sum,0,sizeof(Sum));
+ }
+};
+
+#endif
diff --git a/apt-pkg/contrib/md5.cc b/apt-pkg/contrib/md5.cc
index c0fa8493d..6c60ffd74 100644
--- a/apt-pkg/contrib/md5.cc
+++ b/apt-pkg/contrib/md5.cc
@@ -165,61 +165,6 @@ static void MD5Transform(uint32_t buf[4], uint32_t const in[16])
buf[3] += d;
}
/*}}}*/
-// MD5SumValue::MD5SumValue - Constructs the summation from a string /*{{{*/
-// ---------------------------------------------------------------------
-/* The string form of a MD5 is a 32 character hex number */
-MD5SumValue::MD5SumValue(string Str)
-{
- memset(Sum,0,sizeof(Sum));
- Set(Str);
-}
- /*}}}*/
-// MD5SumValue::MD5SumValue - Default constructor /*{{{*/
-// ---------------------------------------------------------------------
-/* Sets the value to 0 */
-MD5SumValue::MD5SumValue()
-{
- memset(Sum,0,sizeof(Sum));
-}
- /*}}}*/
-// MD5SumValue::Set - Set the sum from a string /*{{{*/
-// ---------------------------------------------------------------------
-/* Converts the hex string into a set of chars */
-bool MD5SumValue::Set(string Str)
-{
- return Hex2Num(Str,Sum,sizeof(Sum));
-}
- /*}}}*/
-// MD5SumValue::Value - Convert the number into a string /*{{{*/
-// ---------------------------------------------------------------------
-/* Converts the set of chars into a hex string in lower case */
-string MD5SumValue::Value() const
-{
- char Conv[16] = {'0','1','2','3','4','5','6','7','8','9','a','b',
- 'c','d','e','f'};
- char Result[33];
- Result[32] = 0;
-
- // Convert each char into two letters
- int J = 0;
- int I = 0;
- for (; I != 32; J++, I += 2)
- {
- Result[I] = Conv[Sum[J] >> 4];
- Result[I + 1] = Conv[Sum[J] & 0xF];
- }
-
- return string(Result);
-}
- /*}}}*/
-// MD5SumValue::operator == - Comparitor /*{{{*/
-// ---------------------------------------------------------------------
-/* Call memcmp on the buffer */
-bool MD5SumValue::operator ==(const MD5SumValue &rhs) const
-{
- return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
-}
- /*}}}*/
// MD5Summation::MD5Summation - Initialize the summer /*{{{*/
// ---------------------------------------------------------------------
/* This assigns the deep magic initial values */
@@ -353,7 +298,7 @@ MD5SumValue MD5Summation::Result()
}
MD5SumValue V;
- memcpy(V.Sum,buf,16);
+ V.Set((char *)buf);
return V;
}
/*}}}*/
diff --git a/apt-pkg/contrib/md5.h b/apt-pkg/contrib/md5.h
index 96c8975b4..9cc88cfbe 100644
--- a/apt-pkg/contrib/md5.h
+++ b/apt-pkg/contrib/md5.h
@@ -32,28 +32,11 @@
using std::string;
using std::min;
-class MD5Summation;
+#include "hashsum_template.h"
-class MD5SumValue
-{
- friend class MD5Summation;
- unsigned char Sum[4*4];
-
- public:
-
- // Accessors
- bool operator ==(const MD5SumValue &rhs) const;
- string Value() const;
- inline void Value(unsigned char S[16])
- {for (int I = 0; I != sizeof(Sum); I++) S[I] = Sum[I];};
- inline operator string() const {return Value();};
- bool Set(string Str);
- inline void Set(unsigned char S[16])
- {for (int I = 0; I != sizeof(Sum); I++) Sum[I] = S[I];};
+class MD5Summation;
- MD5SumValue(string Str);
- MD5SumValue();
-};
+typedef HashSumValue<128> MD5SumValue;
class MD5Summation
{
diff --git a/apt-pkg/contrib/progress.cc b/apt-pkg/contrib/progress.cc
index 45e81edcb..84ee4c124 100644
--- a/apt-pkg/contrib/progress.cc
+++ b/apt-pkg/contrib/progress.cc
@@ -65,27 +65,18 @@ void OpProgress::OverallProgress(unsigned long Current, unsigned long Total,
// OpProgress::SubProgress - Set the sub progress state /*{{{*/
// ---------------------------------------------------------------------
/* */
-void OpProgress::SubProgress(unsigned long SubTotal,const string &Op)
+void OpProgress::SubProgress(unsigned long SubTotal,const string &Op,
+ float const Percent)
{
this->SubTotal = SubTotal;
- SubOp = Op;
- if (Total == 0)
- Percent = 0;
+ if (Op.empty() == false)
+ SubOp = Op;
+ if (Total == 0 || Percent == 0)
+ this->Percent = 0;
+ else if (Percent != -1)
+ this->Percent = this->Current += (Size*Percent)/SubTotal;
else
- Percent = Current*100.0/Total;
- Update();
-}
- /*}}}*/
-// OpProgress::SubProgress - Set the sub progress state /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-void OpProgress::SubProgress(unsigned long SubTotal)
-{
- this->SubTotal = SubTotal;
- if (Total == 0)
- Percent = 0;
- else
- Percent = Current*100.0/Total;
+ this->Percent = Current*100.0/Total;
Update();
}
/*}}}*/
diff --git a/apt-pkg/contrib/progress.h b/apt-pkg/contrib/progress.h
index 7dd004f7e..3a914d17f 100644
--- a/apt-pkg/contrib/progress.h
+++ b/apt-pkg/contrib/progress.h
@@ -55,8 +55,7 @@ class OpProgress
public:
void Progress(unsigned long Current);
- void SubProgress(unsigned long SubTotal);
- void SubProgress(unsigned long SubTotal,const string &Op);
+ void SubProgress(unsigned long SubTotal, const string &Op = "", float const Percent = -1);
void OverallProgress(unsigned long Current,unsigned long Total,
unsigned long Size,const string &Op);
virtual void Done() {};
diff --git a/apt-pkg/contrib/sha1.cc b/apt-pkg/contrib/sha1.cc
index eae52d52f..0b1c16dc3 100644
--- a/apt-pkg/contrib/sha1.cc
+++ b/apt-pkg/contrib/sha1.cc
@@ -178,67 +178,6 @@ static void SHA1Transform(uint32_t state[5],uint8_t const buffer[64])
}
/*}}}*/
-// SHA1SumValue::SHA1SumValue - Constructs the summation from a string /*{{{*/
-// ---------------------------------------------------------------------
-/* The string form of a SHA1 is a 40 character hex number */
-SHA1SumValue::SHA1SumValue(string Str)
-{
- memset(Sum,0,sizeof(Sum));
- Set(Str);
-}
-
- /*}}} */
-// SHA1SumValue::SHA1SumValue - Default constructor /*{{{*/
-// ---------------------------------------------------------------------
-/* Sets the value to 0 */
-SHA1SumValue::SHA1SumValue()
-{
- memset(Sum,0,sizeof(Sum));
-}
-
- /*}}} */
-// SHA1SumValue::Set - Set the sum from a string /*{{{*/
-// ---------------------------------------------------------------------
-/* Converts the hex string into a set of chars */
-bool SHA1SumValue::Set(string Str)
-{
- return Hex2Num(Str,Sum,sizeof(Sum));
-}
-
- /*}}} */
-// SHA1SumValue::Value - Convert the number into a string /*{{{*/
-// ---------------------------------------------------------------------
-/* Converts the set of chars into a hex string in lower case */
-string SHA1SumValue::Value() const
-{
- char Conv[16] =
- { '0','1','2','3','4','5','6','7','8','9','a','b',
- 'c','d','e','f'
- };
- char Result[41];
- Result[40] = 0;
-
- // Convert each char into two letters
- int J = 0;
- int I = 0;
- for (; I != 40; J++,I += 2)
- {
- Result[I] = Conv[Sum[J] >> 4];
- Result[I + 1] = Conv[Sum[J] & 0xF];
- }
-
- return string(Result);
-}
-
- /*}}} */
-// SHA1SumValue::operator == - Comparator /*{{{*/
-// ---------------------------------------------------------------------
-/* Call memcmp on the buffer */
-bool SHA1SumValue::operator == (const SHA1SumValue & rhs) const
-{
- return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
-}
- /*}}}*/
// SHA1Summation::SHA1Summation - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -290,11 +229,13 @@ SHA1SumValue SHA1Summation::Result()
// Transfer over the result
SHA1SumValue Value;
+ char res[20];
for (unsigned i = 0; i < 20; i++)
{
- Value.Sum[i] = (unsigned char)
+ res[i] = (unsigned char)
((state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);
}
+ Value.Set(res);
return Value;
}
/*}}}*/
diff --git a/apt-pkg/contrib/sha1.h b/apt-pkg/contrib/sha1.h
index 8ddd889f1..e7683fa7b 100644
--- a/apt-pkg/contrib/sha1.h
+++ b/apt-pkg/contrib/sha1.h
@@ -21,28 +21,11 @@
using std::string;
using std::min;
-class SHA1Summation;
+#include "hashsum_template.h"
-class SHA1SumValue
-{
- friend class SHA1Summation;
- unsigned char Sum[20];
-
- public:
-
- // Accessors
- bool operator ==(const SHA1SumValue &rhs) const;
- string Value() const;
- inline void Value(unsigned char S[20])
- {for (int I = 0; I != sizeof(Sum); I++) S[I] = Sum[I];};
- inline operator string() const {return Value();};
- bool Set(string Str);
- inline void Set(unsigned char S[20])
- {for (int I = 0; I != sizeof(Sum); I++) Sum[I] = S[I];};
+class SHA1Summation;
- SHA1SumValue(string Str);
- SHA1SumValue();
-};
+typedef HashSumValue<160> SHA1SumValue;
class SHA1Summation
{
diff --git a/apt-pkg/contrib/sha2.cc b/apt-pkg/contrib/sha2.cc
new file mode 100644
index 000000000..4604d3167
--- /dev/null
+++ b/apt-pkg/contrib/sha2.cc
@@ -0,0 +1,43 @@
+/*
+ * Cryptographic API. {{{
+ *
+ * SHA-512, as specified in
+ * http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf
+ *
+ * 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.
+ *
+ */ /*}}}*/
+
+#ifdef __GNUG__
+#pragma implementation "apt-pkg/sha2.h"
+#endif
+
+#include <apt-pkg/sha2.h>
+#include <apt-pkg/strutl.h>
+
+// SHA2Summation::AddFD - Add content of file into the checksum /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool SHA2SummationBase::AddFD(int Fd,unsigned long Size){
+ unsigned char Buf[64 * 64];
+ int Res = 0;
+ int ToEOF = (Size == 0);
+ while (Size != 0 || ToEOF)
+ {
+ unsigned n = sizeof(Buf);
+ if (!ToEOF) n = min(Size,(unsigned long)n);
+ Res = read(Fd,Buf,n);
+ if (Res < 0 || (!ToEOF && (unsigned) Res != n)) // error, or short read
+ return false;
+ if (ToEOF && Res == 0) // EOF
+ break;
+ Size -= Res;
+ Add(Buf,Res);
+ }
+ return true;
+}
+ /*}}}*/
+
diff --git a/apt-pkg/contrib/sha2.h b/apt-pkg/contrib/sha2.h
new file mode 100644
index 000000000..bd5472527
--- /dev/null
+++ b/apt-pkg/contrib/sha2.h
@@ -0,0 +1,114 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+// $Id: sha512.h,v 1.3 2001/05/07 05:05:47 jgg Exp $
+/* ######################################################################
+
+ SHA{512,256}SumValue - Storage for a SHA-{512,256} hash.
+ SHA{512,256}Summation - SHA-{512,256} Secure Hash Algorithm.
+
+ This is a C++ interface to a set of SHA{512,256}Sum functions, that mirrors
+ the equivalent MD5 & SHA1 classes.
+
+ ##################################################################### */
+ /*}}}*/
+#ifndef APTPKG_SHA2_H
+#define APTPKG_SHA2_H
+
+#include <string>
+#include <cstring>
+#include <algorithm>
+#include <stdint.h>
+
+#include "sha2_internal.h"
+#include "hashsum_template.h"
+
+using std::string;
+using std::min;
+
+class SHA512Summation;
+class SHA256Summation;
+
+typedef HashSumValue<512> SHA512SumValue;
+typedef HashSumValue<256> SHA256SumValue;
+
+class SHA2SummationBase
+{
+ protected:
+ bool Done;
+ public:
+ virtual bool Add(const unsigned char *inbuf,unsigned long inlen) = 0;
+ virtual bool AddFD(int Fd,unsigned long Size);
+
+ inline bool Add(const char *Data)
+ {
+ return Add((unsigned char *)Data,strlen(Data));
+ };
+ inline bool Add(const unsigned char *Beg,const unsigned char *End)
+ {
+ return Add(Beg,End-Beg);
+ };
+ void Result();
+};
+
+class SHA256Summation : public SHA2SummationBase
+{
+ SHA256_CTX ctx;
+ unsigned char Sum[32];
+
+ public:
+ virtual bool Add(const unsigned char *inbuf, unsigned long len)
+ {
+ if (Done)
+ return false;
+ SHA256_Update(&ctx, inbuf, len);
+ return true;
+ };
+ SHA256SumValue Result()
+ {
+ if (!Done) {
+ SHA256_Final(Sum, &ctx);
+ Done = true;
+ }
+ SHA256SumValue res;
+ res.Set(Sum);
+ return res;
+ };
+ SHA256Summation()
+ {
+ SHA256_Init(&ctx);
+ Done = false;
+ };
+};
+
+class SHA512Summation : public SHA2SummationBase
+{
+ SHA512_CTX ctx;
+ unsigned char Sum[64];
+
+ public:
+ virtual bool Add(const unsigned char *inbuf, unsigned long len)
+ {
+ if (Done)
+ return false;
+ SHA512_Update(&ctx, inbuf, len);
+ return true;
+ };
+ SHA512SumValue Result()
+ {
+ if (!Done) {
+ SHA512_Final(Sum, &ctx);
+ Done = true;
+ }
+ SHA512SumValue res;
+ res.Set(Sum);
+ return res;
+ };
+ SHA512Summation()
+ {
+ SHA512_Init(&ctx);
+ Done = false;
+ };
+};
+
+
+#endif
diff --git a/apt-pkg/contrib/sha256.cc b/apt-pkg/contrib/sha256.cc
deleted file mode 100644
index e380c13ae..000000000
--- a/apt-pkg/contrib/sha256.cc
+++ /dev/null
@@ -1,424 +0,0 @@
-/*
- * Cryptographic API. {{{
- *
- * SHA-256, as specified in
- * http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf
- *
- * SHA-256 code by Jean-Luc Cooke <jlcooke@certainkey.com>.
- *
- * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com>
- * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- *
- * Ported from the Linux kernel to Apt by Anthony Towns <ajt@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.
- *
- */ /*}}}*/
-
-#ifdef __GNUG__
-#pragma implementation "apt-pkg/sha256.h"
-#endif
-
-
-#define SHA256_DIGEST_SIZE 32
-#define SHA256_HMAC_BLOCK_SIZE 64
-
-#define ror32(value,bits) (((value) >> (bits)) | ((value) << (32 - (bits))))
-
-#include <apt-pkg/sha256.h>
-#include <apt-pkg/strutl.h>
-#include <string.h>
-#include <unistd.h>
-#include <stdint.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <arpa/inet.h>
-
-typedef uint32_t u32;
-typedef uint8_t u8;
-
-static inline u32 Ch(u32 x, u32 y, u32 z)
-{
- return z ^ (x & (y ^ z));
-}
-
-static inline u32 Maj(u32 x, u32 y, u32 z)
-{
- return (x & y) | (z & (x | y));
-}
-
-#define e0(x) (ror32(x, 2) ^ ror32(x,13) ^ ror32(x,22))
-#define e1(x) (ror32(x, 6) ^ ror32(x,11) ^ ror32(x,25))
-#define s0(x) (ror32(x, 7) ^ ror32(x,18) ^ (x >> 3))
-#define s1(x) (ror32(x,17) ^ ror32(x,19) ^ (x >> 10))
-
-#define H0 0x6a09e667
-#define H1 0xbb67ae85
-#define H2 0x3c6ef372
-#define H3 0xa54ff53a
-#define H4 0x510e527f
-#define H5 0x9b05688c
-#define H6 0x1f83d9ab
-#define H7 0x5be0cd19
-
-static inline void LOAD_OP(int I, u32 *W, const u8 *input) /*{{{*/
-{
- W[I] = ( ((u32) input[I * 4 + 0] << 24)
- | ((u32) input[I * 4 + 1] << 16)
- | ((u32) input[I * 4 + 2] << 8)
- | ((u32) input[I * 4 + 3]));
-}
- /*}}}*/
-static inline void BLEND_OP(int I, u32 *W)
-{
- W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
-}
-
-static void sha256_transform(u32 *state, const u8 *input) /*{{{*/
-{
- u32 a, b, c, d, e, f, g, h, t1, t2;
- u32 W[64];
- int i;
-
- /* load the input */
- for (i = 0; i < 16; i++)
- LOAD_OP(i, W, input);
-
- /* now blend */
- for (i = 16; i < 64; i++)
- BLEND_OP(i, W);
-
- /* load the state into our registers */
- a=state[0]; b=state[1]; c=state[2]; d=state[3];
- e=state[4]; f=state[5]; g=state[6]; h=state[7];
-
- /* now iterate */
- t1 = h + e1(e) + Ch(e,f,g) + 0x428a2f98 + W[ 0];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0x71374491 + W[ 1];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0xb5c0fbcf + W[ 2];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0xe9b5dba5 + W[ 3];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0x3956c25b + W[ 4];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0x59f111f1 + W[ 5];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0x923f82a4 + W[ 6];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0xab1c5ed5 + W[ 7];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0xd807aa98 + W[ 8];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0x12835b01 + W[ 9];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0x243185be + W[10];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0x550c7dc3 + W[11];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0x72be5d74 + W[12];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0x80deb1fe + W[13];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0x9bdc06a7 + W[14];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0xc19bf174 + W[15];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0xe49b69c1 + W[16];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0xefbe4786 + W[17];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0x0fc19dc6 + W[18];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0x240ca1cc + W[19];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0x2de92c6f + W[20];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0x4a7484aa + W[21];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0x5cb0a9dc + W[22];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0x76f988da + W[23];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0x983e5152 + W[24];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0xa831c66d + W[25];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0xb00327c8 + W[26];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0xbf597fc7 + W[27];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0xc6e00bf3 + W[28];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0xd5a79147 + W[29];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0x06ca6351 + W[30];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0x14292967 + W[31];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0x27b70a85 + W[32];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0x2e1b2138 + W[33];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0x4d2c6dfc + W[34];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0x53380d13 + W[35];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0x650a7354 + W[36];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0x766a0abb + W[37];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0x81c2c92e + W[38];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0x92722c85 + W[39];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0xa2bfe8a1 + W[40];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0xa81a664b + W[41];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0xc24b8b70 + W[42];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0xc76c51a3 + W[43];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0xd192e819 + W[44];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0xd6990624 + W[45];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0xf40e3585 + W[46];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0x106aa070 + W[47];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0x19a4c116 + W[48];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0x1e376c08 + W[49];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0x2748774c + W[50];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0x34b0bcb5 + W[51];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0x391c0cb3 + W[52];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0x4ed8aa4a + W[53];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0x5b9cca4f + W[54];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0x682e6ff3 + W[55];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- t1 = h + e1(e) + Ch(e,f,g) + 0x748f82ee + W[56];
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
- t1 = g + e1(d) + Ch(d,e,f) + 0x78a5636f + W[57];
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
- t1 = f + e1(c) + Ch(c,d,e) + 0x84c87814 + W[58];
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
- t1 = e + e1(b) + Ch(b,c,d) + 0x8cc70208 + W[59];
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
- t1 = d + e1(a) + Ch(a,b,c) + 0x90befffa + W[60];
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
- t1 = c + e1(h) + Ch(h,a,b) + 0xa4506ceb + W[61];
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
- t1 = b + e1(g) + Ch(g,h,a) + 0xbef9a3f7 + W[62];
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
- t1 = a + e1(f) + Ch(f,g,h) + 0xc67178f2 + W[63];
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
-
- state[0] += a; state[1] += b; state[2] += c; state[3] += d;
- state[4] += e; state[5] += f; state[6] += g; state[7] += h;
-
- /* clear any sensitive info... */
- a = b = c = d = e = f = g = h = t1 = t2 = 0;
- memset(W, 0, 64 * sizeof(u32));
-}
- /*}}}*/
-SHA256Summation::SHA256Summation() /*{{{*/
-{
- Sum.state[0] = H0;
- Sum.state[1] = H1;
- Sum.state[2] = H2;
- Sum.state[3] = H3;
- Sum.state[4] = H4;
- Sum.state[5] = H5;
- Sum.state[6] = H6;
- Sum.state[7] = H7;
- Sum.count[0] = Sum.count[1] = 0;
- memset(Sum.buf, 0, sizeof(Sum.buf));
- Done = false;
-}
- /*}}}*/
-bool SHA256Summation::Add(const u8 *data, unsigned long len) /*{{{*/
-{
- struct sha256_ctx *sctx = &Sum;
- unsigned int i, index, part_len;
-
- if (Done) return false;
-
- /* Compute number of bytes mod 128 */
- index = (unsigned int)((sctx->count[0] >> 3) & 0x3f);
-
- /* Update number of bits */
- if ((sctx->count[0] += (len << 3)) < (len << 3)) {
- sctx->count[1]++;
- sctx->count[1] += (len >> 29);
- }
-
- part_len = 64 - index;
-
- /* Transform as many times as possible. */
- if (len >= part_len) {
- memcpy(&sctx->buf[index], data, part_len);
- sha256_transform(sctx->state, sctx->buf);
-
- for (i = part_len; i + 63 < len; i += 64)
- sha256_transform(sctx->state, &data[i]);
- index = 0;
- } else {
- i = 0;
- }
-
- /* Buffer remaining input */
- memcpy(&sctx->buf[index], &data[i], len-i);
-
- return true;
-}
- /*}}}*/
-SHA256SumValue SHA256Summation::Result() /*{{{*/
-{
- struct sha256_ctx *sctx = &Sum;
- if (!Done) {
- u8 bits[8];
- unsigned int index, pad_len, t;
- static const u8 padding[64] = { 0x80, };
-
- /* Save number of bits */
- t = sctx->count[0];
- bits[7] = t; t >>= 8;
- bits[6] = t; t >>= 8;
- bits[5] = t; t >>= 8;
- bits[4] = t;
- t = sctx->count[1];
- bits[3] = t; t >>= 8;
- bits[2] = t; t >>= 8;
- bits[1] = t; t >>= 8;
- bits[0] = t;
-
- /* Pad out to 56 mod 64. */
- index = (sctx->count[0] >> 3) & 0x3f;
- pad_len = (index < 56) ? (56 - index) : ((64+56) - index);
- Add(padding, pad_len);
-
- /* Append length (before padding) */
- Add(bits, 8);
- }
-
- Done = true;
-
- /* Store state in digest */
-
- SHA256SumValue res;
- u8 *out = res.Sum;
-
- int i, j;
- unsigned int t;
- for (i = j = 0; i < 8; i++, j += 4) {
- t = sctx->state[i];
- out[j+3] = t; t >>= 8;
- out[j+2] = t; t >>= 8;
- out[j+1] = t; t >>= 8;
- out[j ] = t;
- }
-
- return res;
-}
- /*}}}*/
-// SHA256SumValue::SHA256SumValue - Constructs the sum from a string /*{{{*/
-// ---------------------------------------------------------------------
-/* The string form of a SHA256 is a 64 character hex number */
-SHA256SumValue::SHA256SumValue(string Str)
-{
- memset(Sum,0,sizeof(Sum));
- Set(Str);
-}
- /*}}}*/
-// SHA256SumValue::SHA256SumValue - Default constructor /*{{{*/
-// ---------------------------------------------------------------------
-/* Sets the value to 0 */
-SHA256SumValue::SHA256SumValue()
-{
- memset(Sum,0,sizeof(Sum));
-}
- /*}}}*/
-// SHA256SumValue::Set - Set the sum from a string /*{{{*/
-// ---------------------------------------------------------------------
-/* Converts the hex string into a set of chars */
-bool SHA256SumValue::Set(string Str)
-{
- return Hex2Num(Str,Sum,sizeof(Sum));
-}
- /*}}}*/
-// SHA256SumValue::Value - Convert the number into a string /*{{{*/
-// ---------------------------------------------------------------------
-/* Converts the set of chars into a hex string in lower case */
-string SHA256SumValue::Value() const
-{
- char Conv[16] =
- { '0','1','2','3','4','5','6','7','8','9','a','b',
- 'c','d','e','f'
- };
- char Result[65];
- Result[64] = 0;
-
- // Convert each char into two letters
- int J = 0;
- int I = 0;
- for (; I != 64; J++,I += 2)
- {
- Result[I] = Conv[Sum[J] >> 4];
- Result[I + 1] = Conv[Sum[J] & 0xF];
- }
-
- return string(Result);
-}
- /*}}}*/
-// SHA256SumValue::operator == - Comparator /*{{{*/
-// ---------------------------------------------------------------------
-/* Call memcmp on the buffer */
-bool SHA256SumValue::operator == (const SHA256SumValue & rhs) const
-{
- return memcmp(Sum,rhs.Sum,sizeof(Sum)) == 0;
-}
- /*}}}*/
-// SHA256Summation::AddFD - Add content of file into the checksum /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool SHA256Summation::AddFD(int Fd,unsigned long Size)
-{
- unsigned char Buf[64 * 64];
- int Res = 0;
- int ToEOF = (Size == 0);
- while (Size != 0 || ToEOF)
- {
- unsigned n = sizeof(Buf);
- if (!ToEOF) n = min(Size,(unsigned long)n);
- Res = read(Fd,Buf,n);
- if (Res < 0 || (!ToEOF && (unsigned) Res != n)) // error, or short read
- return false;
- if (ToEOF && Res == 0) // EOF
- break;
- Size -= Res;
- Add(Buf,Res);
- }
- return true;
-}
- /*}}}*/
-
diff --git a/apt-pkg/contrib/sha256.h b/apt-pkg/contrib/sha256.h
index 5934b5641..fe2b30ac2 100644
--- a/apt-pkg/contrib/sha256.h
+++ b/apt-pkg/contrib/sha256.h
@@ -1,72 +1,8 @@
-// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/
-// $Id: sha1.h,v 1.3 2001/05/07 05:05:47 jgg Exp $
-/* ######################################################################
-
- SHA256SumValue - Storage for a SHA-256 hash.
- SHA256Summation - SHA-256 Secure Hash Algorithm.
-
- This is a C++ interface to a set of SHA256Sum functions, that mirrors
- the equivalent MD5 & SHA1 classes.
-
- ##################################################################### */
- /*}}}*/
#ifndef APTPKG_SHA256_H
#define APTPKG_SHA256_H
-#include <string>
-#include <cstring>
-#include <algorithm>
-#include <stdint.h>
-
-using std::string;
-using std::min;
-
-class SHA256Summation;
-
-class SHA256SumValue
-{
- friend class SHA256Summation;
- unsigned char Sum[32];
-
- public:
-
- // Accessors
- bool operator ==(const SHA256SumValue &rhs) const;
- string Value() const;
- inline void Value(unsigned char S[32])
- {for (int I = 0; I != sizeof(Sum); I++) S[I] = Sum[I];};
- inline operator string() const {return Value();};
- bool Set(string Str);
- inline void Set(unsigned char S[32])
- {for (int I = 0; I != sizeof(Sum); I++) Sum[I] = S[I];};
-
- SHA256SumValue(string Str);
- SHA256SumValue();
-};
-
-struct sha256_ctx {
- uint32_t count[2];
- uint32_t state[8];
- uint8_t buf[128];
-};
-
-class SHA256Summation
-{
- struct sha256_ctx Sum;
-
- bool Done;
-
- public:
+#include "sha2.h"
- bool Add(const unsigned char *inbuf,unsigned long inlen);
- inline bool Add(const char *Data) {return Add((unsigned char *)Data,strlen(Data));};
- bool AddFD(int Fd,unsigned long Size);
- inline bool Add(const unsigned char *Beg,const unsigned char *End)
- {return Add(Beg,End-Beg);};
- SHA256SumValue Result();
-
- SHA256Summation();
-};
+#warn "This header is deprecated, please include sha2.h instead"
#endif
diff --git a/apt-pkg/contrib/sha2_internal.cc b/apt-pkg/contrib/sha2_internal.cc
new file mode 100644
index 000000000..10b82dec4
--- /dev/null
+++ b/apt-pkg/contrib/sha2_internal.cc
@@ -0,0 +1,1065 @@
+/*
+ * FILE: sha2.c
+ * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/
+ *
+ * Copyright (c) 2000-2001, Aaron D. Gifford
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id: sha2.c,v 1.1 2001/11/08 00:01:51 adg Exp adg $
+ */
+
+#include <string.h> /* memcpy()/memset() or bcopy()/bzero() */
+#include <assert.h> /* assert() */
+#include "sha2_internal.h"
+
+/*
+ * ASSERT NOTE:
+ * Some sanity checking code is included using assert(). On my FreeBSD
+ * system, this additional code can be removed by compiling with NDEBUG
+ * defined. Check your own systems manpage on assert() to see how to
+ * compile WITHOUT the sanity checking code on your system.
+ *
+ * UNROLLED TRANSFORM LOOP NOTE:
+ * You can define SHA2_UNROLL_TRANSFORM to use the unrolled transform
+ * loop version for the hash transform rounds (defined using macros
+ * later in this file). Either define on the command line, for example:
+ *
+ * cc -DSHA2_UNROLL_TRANSFORM -o sha2 sha2.c sha2prog.c
+ *
+ * or define below:
+ *
+ * #define SHA2_UNROLL_TRANSFORM
+ *
+ */
+
+
+/*** SHA-256/384/512 Machine Architecture Definitions *****************/
+/*
+ * BYTE_ORDER NOTE:
+ *
+ * Please make sure that your system defines BYTE_ORDER. If your
+ * architecture is little-endian, make sure it also defines
+ * LITTLE_ENDIAN and that the two (BYTE_ORDER and LITTLE_ENDIAN) are
+ * equivilent.
+ *
+ * If your system does not define the above, then you can do so by
+ * hand like this:
+ *
+ * #define LITTLE_ENDIAN 1234
+ * #define BIG_ENDIAN 4321
+ *
+ * And for little-endian machines, add:
+ *
+ * #define BYTE_ORDER LITTLE_ENDIAN
+ *
+ * Or for big-endian machines:
+ *
+ * #define BYTE_ORDER BIG_ENDIAN
+ *
+ * The FreeBSD machine this was written on defines BYTE_ORDER
+ * appropriately by including <sys/types.h> (which in turn includes
+ * <machine/endian.h> where the appropriate definitions are actually
+ * made).
+ */
+#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
+#error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN
+#endif
+
+/*
+ * Define the followingsha2_* types to types of the correct length on
+ * the native archtecture. Most BSD systems and Linux define u_intXX_t
+ * types. Machines with very recent ANSI C headers, can use the
+ * uintXX_t definintions from inttypes.h by defining SHA2_USE_INTTYPES_H
+ * during compile or in the sha.h header file.
+ *
+ * Machines that support neither u_intXX_t nor inttypes.h's uintXX_t
+ * will need to define these three typedefs below (and the appropriate
+ * ones in sha.h too) by hand according to their system architecture.
+ *
+ * Thank you, Jun-ichiro itojun Hagino, for suggesting using u_intXX_t
+ * types and pointing out recent ANSI C support for uintXX_t in inttypes.h.
+ */
+#ifdef SHA2_USE_INTTYPES_H
+
+typedef uint8_t sha2_byte; /* Exactly 1 byte */
+typedef uint32_t sha2_word32; /* Exactly 4 bytes */
+typedef uint64_t sha2_word64; /* Exactly 8 bytes */
+
+#else /* SHA2_USE_INTTYPES_H */
+
+typedef u_int8_t sha2_byte; /* Exactly 1 byte */
+typedef u_int32_t sha2_word32; /* Exactly 4 bytes */
+typedef u_int64_t sha2_word64; /* Exactly 8 bytes */
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+
+/*** SHA-256/384/512 Various Length Definitions ***********************/
+/* NOTE: Most of these are in sha2.h */
+#define SHA256_SHORT_BLOCK_LENGTH (SHA256_BLOCK_LENGTH - 8)
+#define SHA384_SHORT_BLOCK_LENGTH (SHA384_BLOCK_LENGTH - 16)
+#define SHA512_SHORT_BLOCK_LENGTH (SHA512_BLOCK_LENGTH - 16)
+
+
+/*** ENDIAN REVERSAL MACROS *******************************************/
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define REVERSE32(w,x) { \
+ sha2_word32 tmp = (w); \
+ tmp = (tmp >> 16) | (tmp << 16); \
+ (x) = ((tmp & 0xff00ff00UL) >> 8) | ((tmp & 0x00ff00ffUL) << 8); \
+}
+#define REVERSE64(w,x) { \
+ sha2_word64 tmp = (w); \
+ tmp = (tmp >> 32) | (tmp << 32); \
+ tmp = ((tmp & 0xff00ff00ff00ff00ULL) >> 8) | \
+ ((tmp & 0x00ff00ff00ff00ffULL) << 8); \
+ (x) = ((tmp & 0xffff0000ffff0000ULL) >> 16) | \
+ ((tmp & 0x0000ffff0000ffffULL) << 16); \
+}
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+/*
+ * Macro for incrementally adding the unsigned 64-bit integer n to the
+ * unsigned 128-bit integer (represented using a two-element array of
+ * 64-bit words):
+ */
+#define ADDINC128(w,n) { \
+ (w)[0] += (sha2_word64)(n); \
+ if ((w)[0] < (n)) { \
+ (w)[1]++; \
+ } \
+}
+
+/*
+ * Macros for copying blocks of memory and for zeroing out ranges
+ * of memory. Using these macros makes it easy to switch from
+ * using memset()/memcpy() and using bzero()/bcopy().
+ *
+ * Please define either SHA2_USE_MEMSET_MEMCPY or define
+ * SHA2_USE_BZERO_BCOPY depending on which function set you
+ * choose to use:
+ */
+#if !defined(SHA2_USE_MEMSET_MEMCPY) && !defined(SHA2_USE_BZERO_BCOPY)
+/* Default to memset()/memcpy() if no option is specified */
+#define SHA2_USE_MEMSET_MEMCPY 1
+#endif
+#if defined(SHA2_USE_MEMSET_MEMCPY) && defined(SHA2_USE_BZERO_BCOPY)
+/* Abort with an error if BOTH options are defined */
+#error Define either SHA2_USE_MEMSET_MEMCPY or SHA2_USE_BZERO_BCOPY, not both!
+#endif
+
+#ifdef SHA2_USE_MEMSET_MEMCPY
+#define MEMSET_BZERO(p,l) memset((p), 0, (l))
+#define MEMCPY_BCOPY(d,s,l) memcpy((d), (s), (l))
+#endif
+#ifdef SHA2_USE_BZERO_BCOPY
+#define MEMSET_BZERO(p,l) bzero((p), (l))
+#define MEMCPY_BCOPY(d,s,l) bcopy((s), (d), (l))
+#endif
+
+
+/*** THE SIX LOGICAL FUNCTIONS ****************************************/
+/*
+ * Bit shifting and rotation (used by the six SHA-XYZ logical functions:
+ *
+ * NOTE: The naming of R and S appears backwards here (R is a SHIFT and
+ * S is a ROTATION) because the SHA-256/384/512 description document
+ * (see http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf) uses this
+ * same "backwards" definition.
+ */
+/* Shift-right (used in SHA-256, SHA-384, and SHA-512): */
+#define R(b,x) ((x) >> (b))
+/* 32-bit Rotate-right (used in SHA-256): */
+#define S32(b,x) (((x) >> (b)) | ((x) << (32 - (b))))
+/* 64-bit Rotate-right (used in SHA-384 and SHA-512): */
+#define S64(b,x) (((x) >> (b)) | ((x) << (64 - (b))))
+
+/* Two of six logical functions used in SHA-256, SHA-384, and SHA-512: */
+#define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
+#define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
+
+/* Four of six logical functions used in SHA-256: */
+#define Sigma0_256(x) (S32(2, (x)) ^ S32(13, (x)) ^ S32(22, (x)))
+#define Sigma1_256(x) (S32(6, (x)) ^ S32(11, (x)) ^ S32(25, (x)))
+#define sigma0_256(x) (S32(7, (x)) ^ S32(18, (x)) ^ R(3 , (x)))
+#define sigma1_256(x) (S32(17, (x)) ^ S32(19, (x)) ^ R(10, (x)))
+
+/* Four of six logical functions used in SHA-384 and SHA-512: */
+#define Sigma0_512(x) (S64(28, (x)) ^ S64(34, (x)) ^ S64(39, (x)))
+#define Sigma1_512(x) (S64(14, (x)) ^ S64(18, (x)) ^ S64(41, (x)))
+#define sigma0_512(x) (S64( 1, (x)) ^ S64( 8, (x)) ^ R( 7, (x)))
+#define sigma1_512(x) (S64(19, (x)) ^ S64(61, (x)) ^ R( 6, (x)))
+
+/*** INTERNAL FUNCTION PROTOTYPES *************************************/
+/* NOTE: These should not be accessed directly from outside this
+ * library -- they are intended for private internal visibility/use
+ * only.
+ */
+void SHA512_Last(SHA512_CTX*);
+void SHA256_Transform(SHA256_CTX*, const sha2_word32*);
+void SHA512_Transform(SHA512_CTX*, const sha2_word64*);
+
+
+/*** SHA-XYZ INITIAL HASH VALUES AND CONSTANTS ************************/
+/* Hash constant words K for SHA-256: */
+const static sha2_word32 K256[64] = {
+ 0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
+ 0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
+ 0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
+ 0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
+ 0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
+ 0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
+ 0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
+ 0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
+ 0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
+ 0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
+ 0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
+ 0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
+ 0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
+ 0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
+ 0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
+ 0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
+};
+
+/* Initial hash value H for SHA-256: */
+const static sha2_word32 sha256_initial_hash_value[8] = {
+ 0x6a09e667UL,
+ 0xbb67ae85UL,
+ 0x3c6ef372UL,
+ 0xa54ff53aUL,
+ 0x510e527fUL,
+ 0x9b05688cUL,
+ 0x1f83d9abUL,
+ 0x5be0cd19UL
+};
+
+/* Hash constant words K for SHA-384 and SHA-512: */
+const static sha2_word64 K512[80] = {
+ 0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
+ 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
+ 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
+ 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
+ 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
+ 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
+ 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
+ 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
+ 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
+ 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
+ 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
+ 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
+ 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
+ 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
+ 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
+ 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
+ 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
+ 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
+ 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
+ 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
+ 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
+ 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
+ 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
+ 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
+ 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
+ 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
+ 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
+ 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
+ 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
+ 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
+ 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
+ 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
+ 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
+ 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
+ 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
+ 0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
+ 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
+ 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
+ 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
+ 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
+};
+
+/* Initial hash value H for SHA-384 */
+const static sha2_word64 sha384_initial_hash_value[8] = {
+ 0xcbbb9d5dc1059ed8ULL,
+ 0x629a292a367cd507ULL,
+ 0x9159015a3070dd17ULL,
+ 0x152fecd8f70e5939ULL,
+ 0x67332667ffc00b31ULL,
+ 0x8eb44a8768581511ULL,
+ 0xdb0c2e0d64f98fa7ULL,
+ 0x47b5481dbefa4fa4ULL
+};
+
+/* Initial hash value H for SHA-512 */
+const static sha2_word64 sha512_initial_hash_value[8] = {
+ 0x6a09e667f3bcc908ULL,
+ 0xbb67ae8584caa73bULL,
+ 0x3c6ef372fe94f82bULL,
+ 0xa54ff53a5f1d36f1ULL,
+ 0x510e527fade682d1ULL,
+ 0x9b05688c2b3e6c1fULL,
+ 0x1f83d9abfb41bd6bULL,
+ 0x5be0cd19137e2179ULL
+};
+
+/*
+ * Constant used by SHA256/384/512_End() functions for converting the
+ * digest to a readable hexadecimal character string:
+ */
+static const char *sha2_hex_digits = "0123456789abcdef";
+
+
+/*** SHA-256: *********************************************************/
+void SHA256_Init(SHA256_CTX* context) {
+ if (context == (SHA256_CTX*)0) {
+ return;
+ }
+ MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH);
+ MEMSET_BZERO(context->buffer, SHA256_BLOCK_LENGTH);
+ context->bitcount = 0;
+}
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-256 round macros: */
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
+ REVERSE32(*data++, W256[j]); \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+ K256[j] + W256[j]; \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256_0_TO_15(a,b,c,d,e,f,g,h) \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + \
+ K256[j] + (W256[j] = *data++); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND256(a,b,c,d,e,f,g,h) \
+ s0 = W256[(j+1)&0x0f]; \
+ s0 = sigma0_256(s0); \
+ s1 = W256[(j+14)&0x0f]; \
+ s1 = sigma1_256(s1); \
+ T1 = (h) + Sigma1_256(e) + Ch((e), (f), (g)) + K256[j] + \
+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_256(a) + Maj((a), (b), (c)); \
+ j++
+
+void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
+ sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word32 T1, *W256;
+ int j;
+
+ W256 = (sha2_word32*)context->buffer;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+ /* Rounds 0 to 15 (unrolled): */
+ ROUND256_0_TO_15(a,b,c,d,e,f,g,h);
+ ROUND256_0_TO_15(h,a,b,c,d,e,f,g);
+ ROUND256_0_TO_15(g,h,a,b,c,d,e,f);
+ ROUND256_0_TO_15(f,g,h,a,b,c,d,e);
+ ROUND256_0_TO_15(e,f,g,h,a,b,c,d);
+ ROUND256_0_TO_15(d,e,f,g,h,a,b,c);
+ ROUND256_0_TO_15(c,d,e,f,g,h,a,b);
+ ROUND256_0_TO_15(b,c,d,e,f,g,h,a);
+ } while (j < 16);
+
+ /* Now for the remaining rounds to 64: */
+ do {
+ ROUND256(a,b,c,d,e,f,g,h);
+ ROUND256(h,a,b,c,d,e,f,g);
+ ROUND256(g,h,a,b,c,d,e,f);
+ ROUND256(f,g,h,a,b,c,d,e);
+ ROUND256(e,f,g,h,a,b,c,d);
+ ROUND256(d,e,f,g,h,a,b,c);
+ ROUND256(c,d,e,f,g,h,a,b);
+ ROUND256(b,c,d,e,f,g,h,a);
+ } while (j < 64);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+void SHA256_Transform(SHA256_CTX* context, const sha2_word32* data) {
+ sha2_word32 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word32 T1, T2, *W256;
+ int j;
+
+ W256 = (sha2_word32*)context->buffer;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Copy data while converting to host byte order */
+ REVERSE32(*data++,W256[j]);
+ /* Apply the SHA-256 compression function to update a..h */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + W256[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+ /* Apply the SHA-256 compression function to update a..h with copy */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] + (W256[j] = *data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+ T2 = Sigma0_256(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 16);
+
+ do {
+ /* Part of the message block expansion: */
+ s0 = W256[(j+1)&0x0f];
+ s0 = sigma0_256(s0);
+ s1 = W256[(j+14)&0x0f];
+ s1 = sigma1_256(s1);
+
+ /* Apply the SHA-256 compression function to update a..h */
+ T1 = h + Sigma1_256(e) + Ch(e, f, g) + K256[j] +
+ (W256[j&0x0f] += s1 + W256[(j+9)&0x0f] + s0);
+ T2 = Sigma0_256(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 64);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
+ unsigned int freespace, usedspace;
+
+ if (len == 0) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ assert(context != (SHA256_CTX*)0 && data != (sha2_byte*)0);
+
+ usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+ if (usedspace > 0) {
+ /* Calculate how much free space is available in the buffer */
+ freespace = SHA256_BLOCK_LENGTH - usedspace;
+
+ if (len >= freespace) {
+ /* Fill the buffer completely and process it */
+ MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace);
+ context->bitcount += freespace << 3;
+ len -= freespace;
+ data += freespace;
+ SHA256_Transform(context, (sha2_word32*)context->buffer);
+ } else {
+ /* The buffer is not yet full */
+ MEMCPY_BCOPY(&context->buffer[usedspace], data, len);
+ context->bitcount += len << 3;
+ /* Clean up: */
+ usedspace = freespace = 0;
+ return;
+ }
+ }
+ while (len >= SHA256_BLOCK_LENGTH) {
+ /* Process as many complete blocks as we can */
+ SHA256_Transform(context, (sha2_word32*)data);
+ context->bitcount += SHA256_BLOCK_LENGTH << 3;
+ len -= SHA256_BLOCK_LENGTH;
+ data += SHA256_BLOCK_LENGTH;
+ }
+ if (len > 0) {
+ /* There's left-overs, so save 'em */
+ MEMCPY_BCOPY(context->buffer, data, len);
+ context->bitcount += len << 3;
+ }
+ /* Clean up: */
+ usedspace = freespace = 0;
+}
+
+void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
+ sha2_word32 *d = (sha2_word32*)digest;
+ unsigned int usedspace;
+
+ /* Sanity check: */
+ assert(context != (SHA256_CTX*)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (sha2_byte*)0) {
+ usedspace = (context->bitcount >> 3) % SHA256_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert FROM host byte order */
+ REVERSE64(context->bitcount,context->bitcount);
+#endif
+ if (usedspace > 0) {
+ /* Begin padding with a 1 bit: */
+ context->buffer[usedspace++] = 0x80;
+
+ if (usedspace <= SHA256_SHORT_BLOCK_LENGTH) {
+ /* Set-up for the last transform: */
+ MEMSET_BZERO(&context->buffer[usedspace], SHA256_SHORT_BLOCK_LENGTH - usedspace);
+ } else {
+ if (usedspace < SHA256_BLOCK_LENGTH) {
+ MEMSET_BZERO(&context->buffer[usedspace], SHA256_BLOCK_LENGTH - usedspace);
+ }
+ /* Do second-to-last transform: */
+ SHA256_Transform(context, (sha2_word32*)context->buffer);
+
+ /* And set-up for the last transform: */
+ MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
+ }
+ } else {
+ /* Set-up for the last transform: */
+ MEMSET_BZERO(context->buffer, SHA256_SHORT_BLOCK_LENGTH);
+
+ /* Begin padding with a 1 bit: */
+ *context->buffer = 0x80;
+ }
+ /* Set the bit count: */
+ *(sha2_word64*)&context->buffer[SHA256_SHORT_BLOCK_LENGTH] = context->bitcount;
+
+ /* Final transform: */
+ SHA256_Transform(context, (sha2_word32*)context->buffer);
+
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 8; j++) {
+ REVERSE32(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ MEMCPY_BCOPY(d, context->state, SHA256_DIGEST_LENGTH);
+#endif
+ }
+
+ /* Clean up state data: */
+ MEMSET_BZERO(context, sizeof(context));
+ usedspace = 0;
+}
+
+char *SHA256_End(SHA256_CTX* context, char buffer[]) {
+ sha2_byte digest[SHA256_DIGEST_LENGTH], *d = digest;
+ int i;
+
+ /* Sanity check: */
+ assert(context != (SHA256_CTX*)0);
+
+ if (buffer != (char*)0) {
+ SHA256_Final(digest, context);
+
+ for (i = 0; i < SHA256_DIGEST_LENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ MEMSET_BZERO(context, sizeof(context));
+ }
+ MEMSET_BZERO(digest, SHA256_DIGEST_LENGTH);
+ return buffer;
+}
+
+char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_STRING_LENGTH]) {
+ SHA256_CTX context;
+
+ SHA256_Init(&context);
+ SHA256_Update(&context, data, len);
+ return SHA256_End(&context, digest);
+}
+
+
+/*** SHA-512: *********************************************************/
+void SHA512_Init(SHA512_CTX* context) {
+ if (context == (SHA512_CTX*)0) {
+ return;
+ }
+ MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH);
+ MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH);
+ context->bitcount[0] = context->bitcount[1] = 0;
+}
+
+#ifdef SHA2_UNROLL_TRANSFORM
+
+/* Unrolled SHA-512 round macros: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
+ REVERSE64(*data++, W512[j]); \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+ K512[j] + W512[j]; \
+ (d) += T1, \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)), \
+ j++
+
+
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512_0_TO_15(a,b,c,d,e,f,g,h) \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + \
+ K512[j] + (W512[j] = *data++); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+ j++
+
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+
+#define ROUND512(a,b,c,d,e,f,g,h) \
+ s0 = W512[(j+1)&0x0f]; \
+ s0 = sigma0_512(s0); \
+ s1 = W512[(j+14)&0x0f]; \
+ s1 = sigma1_512(s1); \
+ T1 = (h) + Sigma1_512(e) + Ch((e), (f), (g)) + K512[j] + \
+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0); \
+ (d) += T1; \
+ (h) = T1 + Sigma0_512(a) + Maj((a), (b), (c)); \
+ j++
+
+void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
+ sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word64 T1, *W512 = (sha2_word64*)context->buffer;
+ int j;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+ ROUND512_0_TO_15(a,b,c,d,e,f,g,h);
+ ROUND512_0_TO_15(h,a,b,c,d,e,f,g);
+ ROUND512_0_TO_15(g,h,a,b,c,d,e,f);
+ ROUND512_0_TO_15(f,g,h,a,b,c,d,e);
+ ROUND512_0_TO_15(e,f,g,h,a,b,c,d);
+ ROUND512_0_TO_15(d,e,f,g,h,a,b,c);
+ ROUND512_0_TO_15(c,d,e,f,g,h,a,b);
+ ROUND512_0_TO_15(b,c,d,e,f,g,h,a);
+ } while (j < 16);
+
+ /* Now for the remaining rounds up to 79: */
+ do {
+ ROUND512(a,b,c,d,e,f,g,h);
+ ROUND512(h,a,b,c,d,e,f,g);
+ ROUND512(g,h,a,b,c,d,e,f);
+ ROUND512(f,g,h,a,b,c,d,e);
+ ROUND512(e,f,g,h,a,b,c,d);
+ ROUND512(d,e,f,g,h,a,b,c);
+ ROUND512(c,d,e,f,g,h,a,b);
+ ROUND512(b,c,d,e,f,g,h,a);
+ } while (j < 80);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = 0;
+}
+
+#else /* SHA2_UNROLL_TRANSFORM */
+
+void SHA512_Transform(SHA512_CTX* context, const sha2_word64* data) {
+ sha2_word64 a, b, c, d, e, f, g, h, s0, s1;
+ sha2_word64 T1, T2, *W512 = (sha2_word64*)context->buffer;
+ int j;
+
+ /* Initialize registers with the prev. intermediate value */
+ a = context->state[0];
+ b = context->state[1];
+ c = context->state[2];
+ d = context->state[3];
+ e = context->state[4];
+ f = context->state[5];
+ g = context->state[6];
+ h = context->state[7];
+
+ j = 0;
+ do {
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert TO host byte order */
+ REVERSE64(*data++, W512[j]);
+ /* Apply the SHA-512 compression function to update a..h */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + W512[j];
+#else /* BYTE_ORDER == LITTLE_ENDIAN */
+ /* Apply the SHA-512 compression function to update a..h with copy */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] + (W512[j] = *data++);
+#endif /* BYTE_ORDER == LITTLE_ENDIAN */
+ T2 = Sigma0_512(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 16);
+
+ do {
+ /* Part of the message block expansion: */
+ s0 = W512[(j+1)&0x0f];
+ s0 = sigma0_512(s0);
+ s1 = W512[(j+14)&0x0f];
+ s1 = sigma1_512(s1);
+
+ /* Apply the SHA-512 compression function to update a..h */
+ T1 = h + Sigma1_512(e) + Ch(e, f, g) + K512[j] +
+ (W512[j&0x0f] += s1 + W512[(j+9)&0x0f] + s0);
+ T2 = Sigma0_512(a) + Maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = d + T1;
+ d = c;
+ c = b;
+ b = a;
+ a = T1 + T2;
+
+ j++;
+ } while (j < 80);
+
+ /* Compute the current intermediate hash value */
+ context->state[0] += a;
+ context->state[1] += b;
+ context->state[2] += c;
+ context->state[3] += d;
+ context->state[4] += e;
+ context->state[5] += f;
+ context->state[6] += g;
+ context->state[7] += h;
+
+ /* Clean up */
+ a = b = c = d = e = f = g = h = T1 = T2 = 0;
+}
+
+#endif /* SHA2_UNROLL_TRANSFORM */
+
+void SHA512_Update(SHA512_CTX* context, const sha2_byte *data, size_t len) {
+ unsigned int freespace, usedspace;
+
+ if (len == 0) {
+ /* Calling with no data is valid - we do nothing */
+ return;
+ }
+
+ /* Sanity check: */
+ assert(context != (SHA512_CTX*)0 && data != (sha2_byte*)0);
+
+ usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
+ if (usedspace > 0) {
+ /* Calculate how much free space is available in the buffer */
+ freespace = SHA512_BLOCK_LENGTH - usedspace;
+
+ if (len >= freespace) {
+ /* Fill the buffer completely and process it */
+ MEMCPY_BCOPY(&context->buffer[usedspace], data, freespace);
+ ADDINC128(context->bitcount, freespace << 3);
+ len -= freespace;
+ data += freespace;
+ SHA512_Transform(context, (sha2_word64*)context->buffer);
+ } else {
+ /* The buffer is not yet full */
+ MEMCPY_BCOPY(&context->buffer[usedspace], data, len);
+ ADDINC128(context->bitcount, len << 3);
+ /* Clean up: */
+ usedspace = freespace = 0;
+ return;
+ }
+ }
+ while (len >= SHA512_BLOCK_LENGTH) {
+ /* Process as many complete blocks as we can */
+ SHA512_Transform(context, (sha2_word64*)data);
+ ADDINC128(context->bitcount, SHA512_BLOCK_LENGTH << 3);
+ len -= SHA512_BLOCK_LENGTH;
+ data += SHA512_BLOCK_LENGTH;
+ }
+ if (len > 0) {
+ /* There's left-overs, so save 'em */
+ MEMCPY_BCOPY(context->buffer, data, len);
+ ADDINC128(context->bitcount, len << 3);
+ }
+ /* Clean up: */
+ usedspace = freespace = 0;
+}
+
+void SHA512_Last(SHA512_CTX* context) {
+ unsigned int usedspace;
+
+ usedspace = (context->bitcount[0] >> 3) % SHA512_BLOCK_LENGTH;
+#if BYTE_ORDER == LITTLE_ENDIAN
+ /* Convert FROM host byte order */
+ REVERSE64(context->bitcount[0],context->bitcount[0]);
+ REVERSE64(context->bitcount[1],context->bitcount[1]);
+#endif
+ if (usedspace > 0) {
+ /* Begin padding with a 1 bit: */
+ context->buffer[usedspace++] = 0x80;
+
+ if (usedspace <= SHA512_SHORT_BLOCK_LENGTH) {
+ /* Set-up for the last transform: */
+ MEMSET_BZERO(&context->buffer[usedspace], SHA512_SHORT_BLOCK_LENGTH - usedspace);
+ } else {
+ if (usedspace < SHA512_BLOCK_LENGTH) {
+ MEMSET_BZERO(&context->buffer[usedspace], SHA512_BLOCK_LENGTH - usedspace);
+ }
+ /* Do second-to-last transform: */
+ SHA512_Transform(context, (sha2_word64*)context->buffer);
+
+ /* And set-up for the last transform: */
+ MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH - 2);
+ }
+ } else {
+ /* Prepare for final transform: */
+ MEMSET_BZERO(context->buffer, SHA512_SHORT_BLOCK_LENGTH);
+
+ /* Begin padding with a 1 bit: */
+ *context->buffer = 0x80;
+ }
+ /* Store the length of input data (in bits): */
+ *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH] = context->bitcount[1];
+ *(sha2_word64*)&context->buffer[SHA512_SHORT_BLOCK_LENGTH+8] = context->bitcount[0];
+
+ /* Final transform: */
+ SHA512_Transform(context, (sha2_word64*)context->buffer);
+}
+
+void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
+ sha2_word64 *d = (sha2_word64*)digest;
+
+ /* Sanity check: */
+ assert(context != (SHA512_CTX*)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (sha2_byte*)0) {
+ SHA512_Last(context);
+
+ /* Save the hash data for output: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 8; j++) {
+ REVERSE64(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ MEMCPY_BCOPY(d, context->state, SHA512_DIGEST_LENGTH);
+#endif
+ }
+
+ /* Zero out state data */
+ MEMSET_BZERO(context, sizeof(context));
+}
+
+char *SHA512_End(SHA512_CTX* context, char buffer[]) {
+ sha2_byte digest[SHA512_DIGEST_LENGTH], *d = digest;
+ int i;
+
+ /* Sanity check: */
+ assert(context != (SHA512_CTX*)0);
+
+ if (buffer != (char*)0) {
+ SHA512_Final(digest, context);
+
+ for (i = 0; i < SHA512_DIGEST_LENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ MEMSET_BZERO(context, sizeof(context));
+ }
+ MEMSET_BZERO(digest, SHA512_DIGEST_LENGTH);
+ return buffer;
+}
+
+char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) {
+ SHA512_CTX context;
+
+ SHA512_Init(&context);
+ SHA512_Update(&context, data, len);
+ return SHA512_End(&context, digest);
+}
+
+
+/*** SHA-384: *********************************************************/
+void SHA384_Init(SHA384_CTX* context) {
+ if (context == (SHA384_CTX*)0) {
+ return;
+ }
+ MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH);
+ MEMSET_BZERO(context->buffer, SHA384_BLOCK_LENGTH);
+ context->bitcount[0] = context->bitcount[1] = 0;
+}
+
+void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) {
+ SHA512_Update((SHA512_CTX*)context, data, len);
+}
+
+void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
+ sha2_word64 *d = (sha2_word64*)digest;
+
+ /* Sanity check: */
+ assert(context != (SHA384_CTX*)0);
+
+ /* If no digest buffer is passed, we don't bother doing this: */
+ if (digest != (sha2_byte*)0) {
+ SHA512_Last((SHA512_CTX*)context);
+
+ /* Save the hash data for output: */
+#if BYTE_ORDER == LITTLE_ENDIAN
+ {
+ /* Convert TO host byte order */
+ int j;
+ for (j = 0; j < 6; j++) {
+ REVERSE64(context->state[j],context->state[j]);
+ *d++ = context->state[j];
+ }
+ }
+#else
+ MEMCPY_BCOPY(d, context->state, SHA384_DIGEST_LENGTH);
+#endif
+ }
+
+ /* Zero out state data */
+ MEMSET_BZERO(context, sizeof(context));
+}
+
+char *SHA384_End(SHA384_CTX* context, char buffer[]) {
+ sha2_byte digest[SHA384_DIGEST_LENGTH], *d = digest;
+ int i;
+
+ /* Sanity check: */
+ assert(context != (SHA384_CTX*)0);
+
+ if (buffer != (char*)0) {
+ SHA384_Final(digest, context);
+
+ for (i = 0; i < SHA384_DIGEST_LENGTH; i++) {
+ *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4];
+ *buffer++ = sha2_hex_digits[*d & 0x0f];
+ d++;
+ }
+ *buffer = (char)0;
+ } else {
+ MEMSET_BZERO(context, sizeof(context));
+ }
+ MEMSET_BZERO(digest, SHA384_DIGEST_LENGTH);
+ return buffer;
+}
+
+char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_STRING_LENGTH]) {
+ SHA384_CTX context;
+
+ SHA384_Init(&context);
+ SHA384_Update(&context, data, len);
+ return SHA384_End(&context, digest);
+}
+
diff --git a/apt-pkg/contrib/sha2_internal.h b/apt-pkg/contrib/sha2_internal.h
new file mode 100644
index 000000000..bf759ad45
--- /dev/null
+++ b/apt-pkg/contrib/sha2_internal.h
@@ -0,0 +1,197 @@
+/*
+ * FILE: sha2.h
+ * AUTHOR: Aaron D. Gifford - http://www.aarongifford.com/
+ *
+ * Copyright (c) 2000-2001, Aaron D. Gifford
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTOR(S) ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTOR(S) BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $
+ */
+
+#ifndef __SHA2_H__
+#define __SHA2_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Import u_intXX_t size_t type definitions from system headers. You
+ * may need to change this, or define these things yourself in this
+ * file.
+ */
+#include <sys/types.h>
+
+#ifdef SHA2_USE_INTTYPES_H
+
+#include <inttypes.h>
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+
+/*** SHA-256/384/512 Various Length Definitions ***********************/
+#define SHA256_BLOCK_LENGTH 64
+#define SHA256_DIGEST_LENGTH 32
+#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1)
+#define SHA384_BLOCK_LENGTH 128
+#define SHA384_DIGEST_LENGTH 48
+#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1)
+#define SHA512_BLOCK_LENGTH 128
+#define SHA512_DIGEST_LENGTH 64
+#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1)
+
+
+/*** SHA-256/384/512 Context Structures *******************************/
+/* NOTE: If your architecture does not define either u_intXX_t types or
+ * uintXX_t (from inttypes.h), you may need to define things by hand
+ * for your system:
+ */
+#if 0
+typedef unsigned char u_int8_t; /* 1-byte (8-bits) */
+typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */
+typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */
+#endif
+/*
+ * Most BSD systems already define u_intXX_t types, as does Linux.
+ * Some systems, however, like Compaq's Tru64 Unix instead can use
+ * uintXX_t types defined by very recent ANSI C standards and included
+ * in the file:
+ *
+ * #include <inttypes.h>
+ *
+ * If you choose to use <inttypes.h> then please define:
+ *
+ * #define SHA2_USE_INTTYPES_H
+ *
+ * Or on the command line during compile:
+ *
+ * cc -DSHA2_USE_INTTYPES_H ...
+ */
+#ifdef SHA2_USE_INTTYPES_H
+
+typedef struct _SHA256_CTX {
+ uint32_t state[8];
+ uint64_t bitcount;
+ uint8_t buffer[SHA256_BLOCK_LENGTH];
+} SHA256_CTX;
+typedef struct _SHA512_CTX {
+ uint64_t state[8];
+ uint64_t bitcount[2];
+ uint8_t buffer[SHA512_BLOCK_LENGTH];
+} SHA512_CTX;
+
+#else /* SHA2_USE_INTTYPES_H */
+
+typedef struct _SHA256_CTX {
+ u_int32_t state[8];
+ u_int64_t bitcount;
+ u_int8_t buffer[SHA256_BLOCK_LENGTH];
+} SHA256_CTX;
+typedef struct _SHA512_CTX {
+ u_int64_t state[8];
+ u_int64_t bitcount[2];
+ u_int8_t buffer[SHA512_BLOCK_LENGTH];
+} SHA512_CTX;
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+typedef SHA512_CTX SHA384_CTX;
+
+
+/*** SHA-256/384/512 Function Prototypes ******************************/
+#ifndef NOPROTO
+#ifdef SHA2_USE_INTTYPES_H
+
+void SHA256_Init(SHA256_CTX *);
+void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t);
+void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
+char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
+char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
+
+void SHA384_Init(SHA384_CTX*);
+void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t);
+void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
+char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
+char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
+
+void SHA512_Init(SHA512_CTX*);
+void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t);
+void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
+char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
+char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
+
+#else /* SHA2_USE_INTTYPES_H */
+
+void SHA256_Init(SHA256_CTX *);
+void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t);
+void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
+char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
+char* SHA256_Data(const u_int8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
+
+void SHA384_Init(SHA384_CTX*);
+void SHA384_Update(SHA384_CTX*, const u_int8_t*, size_t);
+void SHA384_Final(u_int8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
+char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
+char* SHA384_Data(const u_int8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
+
+void SHA512_Init(SHA512_CTX*);
+void SHA512_Update(SHA512_CTX*, const u_int8_t*, size_t);
+void SHA512_Final(u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
+char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
+char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
+
+#endif /* SHA2_USE_INTTYPES_H */
+
+#else /* NOPROTO */
+
+void SHA256_Init();
+void SHA256_Update();
+void SHA256_Final();
+char* SHA256_End();
+char* SHA256_Data();
+
+void SHA384_Init();
+void SHA384_Update();
+void SHA384_Final();
+char* SHA384_End();
+char* SHA384_Data();
+
+void SHA512_Init();
+void SHA512_Update();
+void SHA512_Final();
+char* SHA512_End();
+char* SHA512_Data();
+
+#endif /* NOPROTO */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __SHA2_H__ */
+
diff --git a/apt-pkg/deb/debindexfile.h b/apt-pkg/deb/debindexfile.h
index b5085992d..678c22473 100644
--- a/apt-pkg/deb/debindexfile.h
+++ b/apt-pkg/deb/debindexfile.h
@@ -22,8 +22,12 @@
class debStatusIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
+ protected:
string File;
-
+
public:
virtual const Type *GetType() const;
@@ -36,13 +40,18 @@ class debStatusIndex : public pkgIndexFile
virtual bool HasPackages() const {return true;};
virtual unsigned long Size() const;
virtual bool Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const;
+ bool Merge(pkgCacheGenerator &Gen,OpProgress *Prog, unsigned long const Flag) const;
virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
debStatusIndex(string File);
+ virtual ~debStatusIndex() {};
};
class debPackagesIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
string URI;
string Dist;
string Section;
@@ -72,10 +81,14 @@ class debPackagesIndex : public pkgIndexFile
debPackagesIndex(string const &URI, string const &Dist, string const &Section,
bool const &Trusted, string const &Arch = "native");
+ virtual ~debPackagesIndex() {};
};
class debTranslationsIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
string URI;
string Dist;
string Section;
@@ -103,10 +116,14 @@ class debTranslationsIndex : public pkgIndexFile
virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
debTranslationsIndex(string URI,string Dist,string Section, char const * const Language);
+ virtual ~debTranslationsIndex() {};
};
class debSourcesIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
string URI;
string Dist;
string Section;
@@ -136,6 +153,7 @@ class debSourcesIndex : public pkgIndexFile
virtual unsigned long Size() const;
debSourcesIndex(string URI,string Dist,string Section,bool Trusted);
+ virtual ~debSourcesIndex() {};
};
#endif
diff --git a/apt-pkg/deb/deblistparser.cc b/apt-pkg/deb/deblistparser.cc
index 9ae1065a4..b708296d3 100644
--- a/apt-pkg/deb/deblistparser.cc
+++ b/apt-pkg/deb/deblistparser.cc
@@ -128,12 +128,7 @@ bool debListParser::NewVersion(pkgCache::VerIterator &Ver)
}
if (ArchitectureAll() == true)
- switch (Ver->MultiArch)
- {
- case pkgCache::Version::Foreign: Ver->MultiArch = pkgCache::Version::AllForeign; break;
- case pkgCache::Version::Allowed: Ver->MultiArch = pkgCache::Version::AllAllowed; break;
- default: Ver->MultiArch = pkgCache::Version::All;
- }
+ Ver->MultiArch |= pkgCache::Version::All;
// Archive Size
Ver->Size = Section.FindULL("Size");
@@ -687,12 +682,12 @@ bool debListParser::ParseProvides(pkgCache::VerIterator &Ver)
if (MultiArchEnabled == false)
return true;
- else if (Ver->MultiArch == pkgCache::Version::Allowed || Ver->MultiArch == pkgCache::Version::AllAllowed)
+ else if ((Ver->MultiArch & pkgCache::Version::Allowed) == pkgCache::Version::Allowed)
{
string const Package = string(Ver.ParentPkg().Name()).append(":").append("any");
return NewProvidesAllArch(Ver, Package, Ver.VerStr());
}
- else if (Ver->MultiArch == pkgCache::Version::Foreign || Ver->MultiArch == pkgCache::Version::AllForeign)
+ else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign)
return NewProvidesAllArch(Ver, Ver.ParentPkg().Name(), Ver.VerStr());
return true;
diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h
index d62ce641c..41d712fbf 100644
--- a/apt-pkg/deb/deblistparser.h
+++ b/apt-pkg/deb/deblistparser.h
@@ -25,9 +25,12 @@ class debListParser : public pkgCacheGenerator::ListParser
const char *Str;
unsigned char Val;
};
-
+
private:
-
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
+ protected:
pkgTagFile Tags;
pkgTagSection Section;
unsigned long iOffset;
@@ -36,7 +39,7 @@ class debListParser : public pkgCacheGenerator::ListParser
bool MultiArchEnabled;
unsigned long UniqFindTagWrite(const char *Tag);
- bool ParseStatus(pkgCache::PkgIterator &Pkg,pkgCache::VerIterator &Ver);
+ 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);
@@ -74,6 +77,7 @@ class debListParser : public pkgCacheGenerator::ListParser
static const char *ConvertRelation(const char *I,unsigned int &Op);
debListParser(FileFd *File, string const &Arch = "");
+ virtual ~debListParser() {};
};
#endif
diff --git a/apt-pkg/deb/debmetaindex.h b/apt-pkg/deb/debmetaindex.h
index 1561c6e00..0aaf7f14a 100644
--- a/apt-pkg/deb/debmetaindex.h
+++ b/apt-pkg/deb/debmetaindex.h
@@ -19,12 +19,14 @@ class debReleaseIndex : public metaIndex {
};
private:
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
std::map<string, vector<debSectionEntry const*> > ArchEntries;
public:
debReleaseIndex(string const &URI, string const &Dist);
- ~debReleaseIndex();
+ virtual ~debReleaseIndex();
virtual string ArchiveURI(string const &File) const {return URI + File;};
virtual bool GetIndexes(pkgAcquire *Owner, bool const &GetAll=false) const;
diff --git a/apt-pkg/deb/debrecords.cc b/apt-pkg/deb/debrecords.cc
index ec9e395ef..1ca9ae1d2 100644
--- a/apt-pkg/deb/debrecords.cc
+++ b/apt-pkg/deb/debrecords.cc
@@ -77,7 +77,7 @@ string debRecordParser::SHA1Hash()
return Section.FindS("SHA1");
}
/*}}}*/
-// RecordParser::SHA1Hash - Return the archive hash /*{{{*/
+// RecordParser::SHA256Hash - Return the archive hash /*{{{*/
// ---------------------------------------------------------------------
/* */
string debRecordParser::SHA256Hash()
@@ -85,6 +85,14 @@ string debRecordParser::SHA256Hash()
return Section.FindS("SHA256");
}
/*}}}*/
+// RecordParser::SHA512Hash - Return the archive hash /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string debRecordParser::SHA512Hash()
+{
+ return Section.FindS("SHA512");
+}
+ /*}}}*/
// RecordParser::Maintainer - Return the maintainer email /*{{{*/
// ---------------------------------------------------------------------
/* */
diff --git a/apt-pkg/deb/debrecords.h b/apt-pkg/deb/debrecords.h
index 6f358abfa..9692ac94c 100644
--- a/apt-pkg/deb/debrecords.h
+++ b/apt-pkg/deb/debrecords.h
@@ -20,6 +20,9 @@
class debRecordParser : public pkgRecords::Parser
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
FileFd File;
pkgTagFile Tags;
pkgTagSection Section;
@@ -36,6 +39,7 @@ class debRecordParser : public pkgRecords::Parser
virtual string MD5Hash();
virtual string SHA1Hash();
virtual string SHA256Hash();
+ virtual string SHA512Hash();
virtual string SourcePkg();
virtual string SourceVer();
@@ -49,6 +53,7 @@ class debRecordParser : public pkgRecords::Parser
virtual void GetRec(const char *&Start,const char *&Stop);
debRecordParser(string FileName,pkgCache &Cache);
+ virtual ~debRecordParser() {};
};
#endif
diff --git a/apt-pkg/deb/debsrcrecords.h b/apt-pkg/deb/debsrcrecords.h
index 905264daa..aa859b0e6 100644
--- a/apt-pkg/deb/debsrcrecords.h
+++ b/apt-pkg/deb/debsrcrecords.h
@@ -18,6 +18,9 @@
class debSrcRecordParser : public pkgSrcRecords::Parser
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
FileFd Fd;
pkgTagFile Tags;
pkgTagSection Sect;
@@ -50,7 +53,7 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
debSrcRecordParser(string const &File,pkgIndexFile const *Index)
: Parser(Index), Fd(File,FileFd::ReadOnlyGzip), Tags(&Fd,102400),
Buffer(0), BufSize(0) {}
- ~debSrcRecordParser();
+ virtual ~debSrcRecordParser();
};
#endif
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc
index 8619822df..7644bc66b 100644
--- a/apt-pkg/deb/debsystem.cc
+++ b/apt-pkg/deb/debsystem.cc
@@ -26,15 +26,24 @@
debSystem debSys;
+class debSystemPrivate {
+public:
+ debSystemPrivate() : LockFD(-1), LockCount(0), StatusFile(0)
+ {
+ }
+ // For locking support
+ int LockFD;
+ unsigned LockCount;
+
+ debStatusIndex *StatusFile;
+};
+
// System::debSystem - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
debSystem::debSystem()
{
- LockFD = -1;
- LockCount = 0;
- StatusFile = 0;
-
+ d = new debSystemPrivate();
Label = "Debian dpkg interface";
VS = &debVS;
}
@@ -44,7 +53,8 @@ debSystem::debSystem()
/* */
debSystem::~debSystem()
{
- delete StatusFile;
+ delete d->StatusFile;
+ delete d;
}
/*}}}*/
// System::Lock - Get the lock /*{{{*/
@@ -54,16 +64,16 @@ debSystem::~debSystem()
bool debSystem::Lock()
{
// Disable file locking
- if (_config->FindB("Debug::NoLocking",false) == true || LockCount > 1)
+ if (_config->FindB("Debug::NoLocking",false) == true || d->LockCount > 1)
{
- LockCount++;
+ d->LockCount++;
return true;
}
// Create the lockfile
string AdminDir = flNotFile(_config->Find("Dir::State::status"));
- LockFD = GetLock(AdminDir + "lock");
- if (LockFD == -1)
+ d->LockFD = GetLock(AdminDir + "lock");
+ if (d->LockFD == -1)
{
if (errno == EACCES || errno == EAGAIN)
return _error->Error(_("Unable to lock the administration directory (%s), "
@@ -76,8 +86,8 @@ bool debSystem::Lock()
// See if we need to abort with a dirty journal
if (CheckUpdates() == true)
{
- close(LockFD);
- LockFD = -1;
+ close(d->LockFD);
+ d->LockFD = -1;
const char *cmd;
if (getenv("SUDO_USER") != NULL)
cmd = "sudo dpkg --configure -a";
@@ -89,7 +99,7 @@ bool debSystem::Lock()
"run '%s' to correct the problem. "), cmd);
}
- LockCount++;
+ d->LockCount++;
return true;
}
@@ -99,15 +109,15 @@ bool debSystem::Lock()
/* */
bool debSystem::UnLock(bool NoErrors)
{
- if (LockCount == 0 && NoErrors == true)
+ if (d->LockCount == 0 && NoErrors == true)
return false;
- if (LockCount < 1)
+ if (d->LockCount < 1)
return _error->Error(_("Not locked"));
- if (--LockCount == 0)
+ if (--d->LockCount == 0)
{
- close(LockFD);
- LockCount = 0;
+ close(d->LockFD);
+ d->LockCount = 0;
}
return true;
@@ -168,9 +178,9 @@ bool debSystem::Initialize(Configuration &Cnf)
Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status");
Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg");
- if (StatusFile) {
- delete StatusFile;
- StatusFile = 0;
+ if (d->StatusFile) {
+ delete d->StatusFile;
+ d->StatusFile = 0;
}
return true;
@@ -208,9 +218,9 @@ signed debSystem::Score(Configuration const &Cnf)
/* */
bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
{
- if (StatusFile == 0)
- StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status"));
- List.push_back(StatusFile);
+ if (d->StatusFile == 0)
+ d->StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status"));
+ List.push_back(d->StatusFile);
return true;
}
/*}}}*/
@@ -220,11 +230,11 @@ bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
bool debSystem::FindIndex(pkgCache::PkgFileIterator File,
pkgIndexFile *&Found) const
{
- if (StatusFile == 0)
+ if (d->StatusFile == 0)
return false;
- if (StatusFile->FindInCache(*File.Cache()) == File)
+ if (d->StatusFile->FindInCache(*File.Cache()) == File)
{
- Found = StatusFile;
+ Found = d->StatusFile;
return true;
}
diff --git a/apt-pkg/deb/debsystem.h b/apt-pkg/deb/debsystem.h
index 5f9995e5d..232155256 100644
--- a/apt-pkg/deb/debsystem.h
+++ b/apt-pkg/deb/debsystem.h
@@ -12,16 +12,15 @@
#include <apt-pkg/pkgsystem.h>
+class debSystemPrivate;
+
class debStatusIndex;
class debSystem : public pkgSystem
{
- // For locking support
- int LockFD;
- unsigned LockCount;
+ // private d-pointer
+ debSystemPrivate *d;
bool CheckUpdates();
-
- debStatusIndex *StatusFile;
-
+
public:
virtual bool Lock();
@@ -35,7 +34,7 @@ class debSystem : public pkgSystem
pkgIndexFile *&Found) const;
debSystem();
- ~debSystem();
+ virtual ~debSystem();
};
extern debSystem debSys;
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 5fbd1801a..019b72bb8 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -46,6 +46,21 @@
using namespace std;
+class pkgDPkgPMPrivate
+{
+public:
+ pkgDPkgPMPrivate() : dpkgbuf_pos(0), term_out(NULL), history_out(NULL)
+ {
+ }
+ bool stdin_is_dev_null;
+ // the buffer we use for the dpkg status-fd reading
+ char dpkgbuf[1024];
+ int dpkgbuf_pos;
+ FILE *term_out;
+ FILE *history_out;
+ string dpkg_error;
+};
+
namespace
{
// Maps the dpkg "processing" info to human readable names. Entry 0
@@ -110,9 +125,9 @@ ionice(int PID)
// ---------------------------------------------------------------------
/* */
pkgDPkgPM::pkgDPkgPM(pkgDepCache *Cache)
- : pkgPackageManager(Cache), dpkgbuf_pos(0),
- term_out(NULL), history_out(NULL), PackagesDone(0), PackagesTotal(0)
+ : pkgPackageManager(Cache), PackagesDone(0), PackagesTotal(0)
{
+ d = new pkgDPkgPMPrivate();
}
/*}}}*/
// DPkgPM::pkgDPkgPM - Destructor /*{{{*/
@@ -120,6 +135,7 @@ pkgDPkgPM::pkgDPkgPM(pkgDepCache *Cache)
/* */
pkgDPkgPM::~pkgDPkgPM()
{
+ delete d;
}
/*}}}*/
// DPkgPM::Install - Install a package /*{{{*/
@@ -376,7 +392,7 @@ void pkgDPkgPM::DoStdin(int master)
if (len)
write(master, input_buf, len);
else
- stdin_is_dev_null = true;
+ d->stdin_is_dev_null = true;
}
/*}}}*/
// DPkgPM::DoTerminalPty - Read the terminal pty and write log /*{{{*/
@@ -401,8 +417,8 @@ void pkgDPkgPM::DoTerminalPty(int master)
if(len <= 0)
return;
write(1, term_buf, len);
- if(term_out)
- fwrite(term_buf, len, sizeof(char), term_out);
+ if(d->term_out)
+ fwrite(term_buf, len, sizeof(char), d->term_out);
}
/*}}}*/
// DPkgPM::ProcessDpkgStatusBuf /*{{{*/
@@ -606,14 +622,14 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd)
char *p, *q;
int len;
- len=read(statusfd, &dpkgbuf[dpkgbuf_pos], sizeof(dpkgbuf)-dpkgbuf_pos);
- dpkgbuf_pos += len;
+ len=read(statusfd, &d->dpkgbuf[d->dpkgbuf_pos], sizeof(d->dpkgbuf)-d->dpkgbuf_pos);
+ d->dpkgbuf_pos += len;
if(len <= 0)
return;
// process line by line if we have a buffer
- p = q = dpkgbuf;
- while((q=(char*)memchr(p, '\n', dpkgbuf+dpkgbuf_pos-p)) != NULL)
+ p = q = d->dpkgbuf;
+ while((q=(char*)memchr(p, '\n', d->dpkgbuf+d->dpkgbuf_pos-p)) != NULL)
{
*q = 0;
ProcessDpkgStatusLine(OutStatusFd, p);
@@ -621,8 +637,8 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd)
}
// now move the unprocessed bits (after the final \n that is now a 0x0)
- // to the start and update dpkgbuf_pos
- p = (char*)memrchr(dpkgbuf, 0, dpkgbuf_pos);
+ // to the start and update d->dpkgbuf_pos
+ p = (char*)memrchr(d->dpkgbuf, 0, d->dpkgbuf_pos);
if(p == NULL)
return;
@@ -630,8 +646,8 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd)
p++;
// move the unprocessed tail to the start and update pos
- memmove(dpkgbuf, p, p-dpkgbuf);
- dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p;
+ memmove(d->dpkgbuf, p, p-d->dpkgbuf);
+ d->dpkgbuf_pos = d->dpkgbuf+d->dpkgbuf_pos-p;
}
/*}}}*/
// DPkgPM::WriteHistoryTag /*{{{*/
@@ -643,7 +659,7 @@ void pkgDPkgPM::WriteHistoryTag(string const &tag, string value)
// poor mans rstrip(", ")
if (value[length-2] == ',' && value[length-1] == ' ')
value.erase(length - 2, 2);
- fprintf(history_out, "%s: %s\n", tag.c_str(), value.c_str());
+ fprintf(d->history_out, "%s: %s\n", tag.c_str(), value.c_str());
} /*}}}*/
// DPkgPM::OpenLog /*{{{*/
bool pkgDPkgPM::OpenLog()
@@ -664,11 +680,11 @@ bool pkgDPkgPM::OpenLog()
_config->Find("Dir::Log::Terminal"));
if (!logfile_name.empty())
{
- term_out = fopen(logfile_name.c_str(),"a");
- if (term_out == NULL)
+ d->term_out = fopen(logfile_name.c_str(),"a");
+ if (d->term_out == NULL)
return _error->WarningE("OpenLog", _("Could not open file '%s'"), logfile_name.c_str());
- setvbuf(term_out, NULL, _IONBF, 0);
- SetCloseExec(fileno(term_out), true);
+ setvbuf(d->term_out, NULL, _IONBF, 0);
+ SetCloseExec(fileno(d->term_out), true);
struct passwd *pw;
struct group *gr;
pw = getpwnam("root");
@@ -676,7 +692,7 @@ bool pkgDPkgPM::OpenLog()
if (pw != NULL && gr != NULL)
chown(logfile_name.c_str(), pw->pw_uid, gr->gr_gid);
chmod(logfile_name.c_str(), 0644);
- fprintf(term_out, "\nLog started: %s\n", timestr);
+ fprintf(d->term_out, "\nLog started: %s\n", timestr);
}
// write your history
@@ -684,11 +700,11 @@ bool pkgDPkgPM::OpenLog()
_config->Find("Dir::Log::History"));
if (!history_name.empty())
{
- history_out = fopen(history_name.c_str(),"a");
- if (history_out == NULL)
+ d->history_out = fopen(history_name.c_str(),"a");
+ if (d->history_out == NULL)
return _error->WarningE("OpenLog", _("Could not open file '%s'"), history_name.c_str());
chmod(history_name.c_str(), 0644);
- fprintf(history_out, "\nStart-Date: %s\n", timestr);
+ fprintf(d->history_out, "\nStart-Date: %s\n", timestr);
string remove, purge, install, reinstall, upgrade, downgrade;
for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
{
@@ -729,7 +745,7 @@ bool pkgDPkgPM::OpenLog()
WriteHistoryTag("Downgrade",downgrade);
WriteHistoryTag("Remove",remove);
WriteHistoryTag("Purge",purge);
- fflush(history_out);
+ fflush(d->history_out);
}
return true;
@@ -743,16 +759,16 @@ bool pkgDPkgPM::CloseLog()
struct tm *tmp = localtime(&t);
strftime(timestr, sizeof(timestr), "%F %T", tmp);
- if(term_out)
+ if(d->term_out)
{
- fprintf(term_out, "Log ended: ");
- fprintf(term_out, "%s", timestr);
- fprintf(term_out, "\n");
- fclose(term_out);
+ fprintf(d->term_out, "Log ended: ");
+ fprintf(d->term_out, "%s", timestr);
+ fprintf(d->term_out, "\n");
+ fclose(d->term_out);
}
- term_out = NULL;
+ d->term_out = NULL;
- if(history_out)
+ if(d->history_out)
{
if (disappearedPkgs.empty() == false)
{
@@ -769,12 +785,12 @@ bool pkgDPkgPM::CloseLog()
}
WriteHistoryTag("Disappeared", disappear);
}
- if (dpkg_error.empty() == false)
- fprintf(history_out, "Error: %s\n", dpkg_error.c_str());
- fprintf(history_out, "End-Date: %s\n", timestr);
- fclose(history_out);
+ if (d->dpkg_error.empty() == false)
+ fprintf(d->history_out, "Error: %s\n", d->dpkg_error.c_str());
+ fprintf(d->history_out, "End-Date: %s\n", timestr);
+ fclose(d->history_out);
}
- history_out = NULL;
+ d->history_out = NULL;
return true;
}
@@ -882,7 +898,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
}
}
- stdin_is_dev_null = false;
+ d->stdin_is_dev_null = false;
// create log
OpenLog();
@@ -1082,8 +1098,8 @@ bool pkgDPkgPM::Go(int OutStatusFd)
const char *s = _("Can not write log, openpty() "
"failed (/dev/pts not mounted?)\n");
fprintf(stderr, "%s",s);
- if(term_out)
- fprintf(term_out, "%s",s);
+ if(d->term_out)
+ fprintf(d->term_out, "%s",s);
master = slave = -1;
} else {
struct termios rtt;
@@ -1213,7 +1229,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
// wait for input or output here
FD_ZERO(&rfds);
- if (master >= 0 && !stdin_is_dev_null)
+ if (master >= 0 && !d->stdin_is_dev_null)
FD_SET(0, &rfds);
FD_SET(_dpkgin, &rfds);
if(master >= 0)
@@ -1267,14 +1283,14 @@ bool pkgDPkgPM::Go(int OutStatusFd)
RunScripts("DPkg::Post-Invoke");
if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV)
- strprintf(dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]);
+ strprintf(d->dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]);
else if (WIFEXITED(Status) != 0)
- strprintf(dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
+ strprintf(d->dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
else
- strprintf(dpkg_error, "Sub-process %s exited unexpectedly",Args[0]);
+ strprintf(d->dpkg_error, "Sub-process %s exited unexpectedly",Args[0]);
- if(dpkg_error.size() > 0)
- _error->Error("%s", dpkg_error.c_str());
+ if(d->dpkg_error.size() > 0)
+ _error->Error("%s", d->dpkg_error.c_str());
if(stopOnError)
{
@@ -1438,8 +1454,8 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
fprintf(report, "ErrorMessage:\n %s\n", errormsg);
// ensure that the log is flushed
- if(term_out)
- fflush(term_out);
+ if(d->term_out)
+ fflush(d->term_out);
// attach terminal log it if we have it
string logfile_name = _config->FindFile("Dir::Log::Terminal");
diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h
index b7b5a6def..ddf9485c7 100644
--- a/apt-pkg/deb/dpkgpm.h
+++ b/apt-pkg/deb/dpkgpm.h
@@ -18,19 +18,12 @@
using std::vector;
using std::map;
+class pkgDPkgPMPrivate;
class pkgDPkgPM : public pkgPackageManager
{
private:
-
- bool stdin_is_dev_null;
-
- // the buffer we use for the dpkg status-fd reading
- char dpkgbuf[1024];
- int dpkgbuf_pos;
- FILE *term_out;
- FILE *history_out;
- string dpkg_error;
+ pkgDPkgPMPrivate *d;
/** \brief record the disappear action and handle accordingly
diff --git a/apt-pkg/depcache.cc b/apt-pkg/depcache.cc
index e9fa097aa..1d905df2e 100644
--- a/apt-pkg/depcache.cc
+++ b/apt-pkg/depcache.cc
@@ -406,60 +406,8 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
/*}}}*/
// DepCache::AddSizes - Add the packages sizes to the counters /*{{{*/
// ---------------------------------------------------------------------
-/* Call with Mult = -1 to preform the inverse opration
- The Mult increases the complexity of the calulations here and is unused -
- or do we really have a usecase for removing the size of a package two
- times? So let us replace it with a simple bool and be done with it… */
-__deprecated void pkgDepCache::AddSizes(const PkgIterator &Pkg,signed long Mult)
-{
- StateCache &P = PkgState[Pkg->ID];
-
- if (Pkg->VersionList == 0)
- return;
-
- if (Pkg.State() == pkgCache::PkgIterator::NeedsConfigure &&
- P.Keep() == true)
- return;
-
- // Compute the size data
- if (P.NewInstall() == true)
- {
- iUsrSize += (signed long long)(Mult*P.InstVerIter(*this)->InstalledSize);
- iDownloadSize += (signed long long)(Mult*P.InstVerIter(*this)->Size);
- return;
- }
-
- // Upgrading
- if (Pkg->CurrentVer != 0 &&
- (P.InstallVer != (Version *)Pkg.CurrentVer() ||
- (P.iFlags & ReInstall) == ReInstall) && P.InstallVer != 0)
- {
- iUsrSize += (signed long long)(Mult*((signed long long)P.InstVerIter(*this)->InstalledSize -
- (signed long long)Pkg.CurrentVer()->InstalledSize));
- iDownloadSize += (signed long long)(Mult*P.InstVerIter(*this)->Size);
- return;
- }
-
- // Reinstall
- if (Pkg.State() == pkgCache::PkgIterator::NeedsUnpack &&
- P.Delete() == false)
- {
- iDownloadSize += (signed long long)(Mult*P.InstVerIter(*this)->Size);
- return;
- }
-
- // Removing
- if (Pkg->CurrentVer != 0 && P.InstallVer == 0)
- {
- iUsrSize -= (signed long long)(Mult*Pkg.CurrentVer()->InstalledSize);
- return;
- }
-}
- /*}}}*/
-// DepCache::AddSizes - Add the packages sizes to the counters /*{{{*/
-// ---------------------------------------------------------------------
/* Call with Inverse = true to preform the inverse opration */
-void pkgDepCache::AddSizes(const PkgIterator &Pkg, bool const &Inverse)
+void pkgDepCache::AddSizes(const PkgIterator &Pkg, bool const Inverse)
{
StateCache &P = PkgState[Pkg->ID];
@@ -530,8 +478,9 @@ void pkgDepCache::AddSizes(const PkgIterator &Pkg, bool const &Inverse)
calld Remove/Add itself. Remember, dependencies can be circular so
while processing a dep for Pkg it is possible that Add/Remove
will be called on Pkg */
-void pkgDepCache::AddStates(const PkgIterator &Pkg,int Add)
+void pkgDepCache::AddStates(const PkgIterator &Pkg, bool const Invert)
{
+ signed char const Add = (Invert == false) ? 1 : -1;
StateCache &State = PkgState[Pkg->ID];
// The Package is broken (either minimal dep or policy dep)
@@ -806,17 +755,17 @@ void pkgDepCache::Update(PkgIterator const &Pkg)
// DepCache::MarkKeep - Put the package in the keep state /*{{{*/
// ---------------------------------------------------------------------
/* */
-void pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser,
+bool pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser,
unsigned long Depth)
{
if (IsModeChangeOk(ModeKeep, Pkg, Depth, FromUser) == false)
- return;
+ return false;
/* Reject an attempt to keep a non-source broken installed package, those
must be upgraded */
if (Pkg.State() == PkgIterator::NeedsUnpack &&
Pkg.CurrentVer().Downloadable() == false)
- return;
+ return false;
/* We changed the soft state all the time so the UI is a bit nicer
to use */
@@ -824,7 +773,7 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser,
// Check that it is not already kept
if (P.Mode == ModeKeep)
- return;
+ return true;
if (Soft == true)
P.iFlags |= AutoKept;
@@ -857,31 +806,31 @@ void pkgDepCache::MarkKeep(PkgIterator const &Pkg, bool Soft, bool FromUser,
P.InstallVer = Pkg.CurrentVer();
AddStates(Pkg);
-
Update(Pkg);
-
AddSizes(Pkg);
+
+ return true;
}
/*}}}*/
// DepCache::MarkDelete - Put the package in the delete state /*{{{*/
// ---------------------------------------------------------------------
/* */
-void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
+bool pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
unsigned long Depth, bool FromUser)
{
if (IsModeChangeOk(ModeDelete, Pkg, Depth, FromUser) == false)
- return;
+ return false;
StateCache &P = PkgState[Pkg->ID];
// Check that it is not already marked for delete
if ((P.Mode == ModeDelete || P.InstallVer == 0) &&
(Pkg.Purge() == true || rPurge == false))
- return;
+ return true;
// check if we are allowed to remove the package
if (IsDeleteOk(Pkg,rPurge,Depth,FromUser) == false)
- return;
+ return false;
P.iFlags &= ~(AutoKept | Purge);
if (rPurge == true)
@@ -905,6 +854,7 @@ void pkgDepCache::MarkDelete(PkgIterator const &Pkg, bool rPurge,
Update(Pkg);
AddSizes(Pkg);
+ return true;
}
/*}}}*/
// DepCache::IsDeleteOk - check if it is ok to remove this package /*{{{*/
@@ -985,18 +935,18 @@ bool pkgDepCache::IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
// DepCache::MarkInstall - Put the package in the install state /*{{{*/
// ---------------------------------------------------------------------
/* */
-void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
+bool pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
unsigned long Depth, bool FromUser,
bool ForceImportantDeps)
{
if (IsModeChangeOk(ModeInstall, Pkg, Depth, FromUser) == false)
- return;
+ return false;
StateCache &P = PkgState[Pkg->ID];
// See if there is even any possible instalation candidate
if (P.CandidateVer == 0)
- return;
+ return false;
/* Check that it is not already marked for install and that it can be
installed */
@@ -1005,13 +955,13 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
P.CandidateVer == (Version *)Pkg.CurrentVer()))
{
if (P.CandidateVer == (Version *)Pkg.CurrentVer() && P.InstallVer == 0)
- MarkKeep(Pkg, false, FromUser, Depth+1);
- return;
+ return MarkKeep(Pkg, false, FromUser, Depth+1);
+ return true;
}
// check if we are allowed to install the package
if (IsInstallOk(Pkg,AutoInst,Depth,FromUser) == false)
- return;
+ return false;
ActionGroup group(*this);
P.iFlags &= ~AutoKept;
@@ -1046,8 +996,8 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
Update(Pkg);
AddSizes(Pkg);
- if (AutoInst == false)
- return;
+ if (AutoInst == false || _config->Find("APT::Solver", "internal") != "internal")
+ return true;
if (DebugMarker == true)
std::clog << OutputInDepth(Depth) << "MarkInstall " << Pkg << " FU=" << FromUser << std::endl;
@@ -1091,7 +1041,7 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
continue;
// if the dependency was critical, we can't install it, so remove it again
MarkDelete(Pkg,false,Depth + 1, false);
- return;
+ return false;
}
/* Check if any ImportantDep() (but not Critical) were added
@@ -1222,14 +1172,17 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
continue;
if (PkgState[Pkg->ID].CandidateVer != *I &&
- Start->Type == Dep::DpkgBreaks)
- MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps);
- else
- MarkDelete(Pkg,false,Depth + 1, false);
+ Start->Type == Dep::DpkgBreaks &&
+ MarkInstall(Pkg,true,Depth + 1, false, ForceImportantDeps) == true)
+ continue;
+ else if (MarkDelete(Pkg,false,Depth + 1, false) == false)
+ break;
}
continue;
}
}
+
+ return Dep.end() == true;
}
/*}}}*/
// DepCache::IsInstallOk - check if it is ok to install this package /*{{{*/
@@ -1268,7 +1221,7 @@ void pkgDepCache::SetReInstall(PkgIterator const &Pkg,bool To)
// DepCache::SetCandidateVersion - Change the candidate version /*{{{*/
// ---------------------------------------------------------------------
/* */
-void pkgDepCache::SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo)
+void pkgDepCache::SetCandidateVersion(VerIterator TargetVer)
{
pkgCache::PkgIterator Pkg = TargetVer.ParentPkg();
StateCache &P = PkgState[Pkg->ID];
@@ -1574,6 +1527,12 @@ bool pkgDepCache::Policy::IsImportantDep(DepIterator const &Dep)
return false;
}
/*}}}*/
+// Policy::GetPriority - Get the priority of the package pin /*{{{*/
+signed short pkgDepCache::Policy::GetPriority(pkgCache::PkgIterator const &Pkg)
+{ return 0; };
+signed short pkgDepCache::Policy::GetPriority(pkgCache::PkgFileIterator const &File)
+{ return 0; };
+ /*}}}*/
pkgDepCache::InRootSetFunc *pkgDepCache::GetRootSetFunc() /*{{{*/
{
DefaultRootSetFunc *f = new DefaultRootSetFunc;
@@ -1599,6 +1558,9 @@ bool pkgDepCache::MarkFollowsSuggests()
// pkgDepCache::MarkRequired - the main mark algorithm /*{{{*/
bool pkgDepCache::MarkRequired(InRootSetFunc &userFunc)
{
+ if (_config->Find("APT::Solver", "internal") != "internal")
+ return true;
+
bool follow_recommends;
bool follow_suggests;
bool debug_autoremove = _config->FindB("Debug::pkgAutoRemove",false);
diff --git a/apt-pkg/depcache.h b/apt-pkg/depcache.h
index 9efe110f5..adc010c28 100644
--- a/apt-pkg/depcache.h
+++ b/apt-pkg/depcache.h
@@ -233,6 +233,7 @@ class pkgDepCache : protected pkgCache::Namespace
inline bool Delete() const {return Mode == ModeDelete;};
inline bool Purge() const {return Delete() == true && (iFlags & pkgDepCache::Purge) == pkgDepCache::Purge; };
inline bool Keep() const {return Mode == ModeKeep;};
+ inline bool Protect() const {return (iFlags & Protected) == Protected;};
inline bool Upgrade() const {return Status > 0 && Mode == ModeInstall;};
inline bool Upgradable() const {return Status >= 1;};
inline bool Downgrade() const {return Status < 0 && Mode == ModeInstall;};
@@ -260,7 +261,9 @@ class pkgDepCache : protected pkgCache::Namespace
virtual VerIterator GetCandidateVer(PkgIterator const &Pkg);
virtual bool IsImportantDep(DepIterator const &Dep);
-
+ virtual signed short GetPriority(PkgIterator const &Pkg);
+ virtual signed short GetPriority(PkgFileIterator const &File);
+
virtual ~Policy() {};
};
@@ -315,11 +318,10 @@ class pkgDepCache : protected pkgCache::Namespace
void Update(PkgIterator const &P);
// Count manipulators
- void AddSizes(const PkgIterator &Pkg, bool const &Invert = false);
+ void AddSizes(const PkgIterator &Pkg, bool const Invert = false);
inline void RemoveSizes(const PkgIterator &Pkg) {AddSizes(Pkg, true);};
- void AddSizes(const PkgIterator &Pkg,signed long Mult) __deprecated;
- void AddStates(const PkgIterator &Pkg,int Add = 1);
- inline void RemoveStates(const PkgIterator &Pkg) {AddStates(Pkg,-1);};
+ void AddStates(const PkgIterator &Pkg, bool const Invert = false);
+ inline void RemoveStates(const PkgIterator &Pkg) {AddStates(Pkg,true);};
public:
@@ -388,18 +390,17 @@ class pkgDepCache : protected pkgCache::Namespace
/** \name State Manipulators
*/
// @{
- void MarkKeep(PkgIterator const &Pkg, bool Soft = false,
+ bool MarkKeep(PkgIterator const &Pkg, bool Soft = false,
bool FromUser = true, unsigned long Depth = 0);
- void MarkDelete(PkgIterator const &Pkg, bool Purge = false,
+ bool MarkDelete(PkgIterator const &Pkg, bool Purge = false,
unsigned long Depth = 0, bool FromUser = true);
- void MarkInstall(PkgIterator const &Pkg,bool AutoInst = true,
+ bool MarkInstall(PkgIterator const &Pkg,bool AutoInst = true,
unsigned long Depth = 0, bool FromUser = true,
bool ForceImportantDeps = false);
void MarkProtected(PkgIterator const &Pkg) { PkgState[Pkg->ID].iFlags |= Protected; };
void SetReInstall(PkgIterator const &Pkg,bool To);
- // FIXME: Remove the unused boolean parameter on abi break
- void SetCandidateVersion(VerIterator TargetVer, bool const &Pseudo = true);
+ void SetCandidateVersion(VerIterator TargetVer);
bool SetCandidateRelease(pkgCache::VerIterator TargetVer,
std::string const &TargetRel);
/** Set the candidate version for dependencies too if needed.
@@ -484,13 +485,6 @@ class pkgDepCache : protected pkgCache::Namespace
virtual ~pkgDepCache();
private:
- // Helper for Update(OpProgress) to remove pseudoinstalled arch all packages
- // FIXME: they are private so shouldn't affect abi, but just in case…
- __deprecated bool RemovePseudoInstalledPkg(PkgIterator &Pkg, std::set<unsigned long> &recheck) { return true; };
- __deprecated bool ReInstallPseudoForGroup(unsigned long const &Grp, std::set<unsigned long> &recheck) { return true; };
- __deprecated bool ReInstallPseudoForGroup(pkgCache::PkgIterator const &P, std::set<unsigned long> &recheck) { return true; };
-
-
bool IsModeChangeOk(ModeList const mode, PkgIterator const &Pkg,
unsigned long const Depth, bool const FromUser);
};
diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc
new file mode 100644
index 000000000..4d2230613
--- /dev/null
+++ b/apt-pkg/edsp.cc
@@ -0,0 +1,564 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+ Set of methods to help writing and reading everything needed for EDSP
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/edsp.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/version.h>
+#include <apt-pkg/policy.h>
+#include <apt-pkg/tagfile.h>
+
+#include <apti18n.h>
+#include <limits>
+
+#include <stdio.h>
+ /*}}}*/
+
+// we could use pkgCache::DepType and ::Priority, but these would be localized strings…
+const char * const EDSP::PrioMap[] = {0, "important", "required", "standard",
+ "optional", "extra"};
+const char * const EDSP::DepMap[] = {"", "Depends", "Pre-Depends", "Suggests",
+ "Recommends" , "Conflicts", "Replaces",
+ "Obsoletes", "Breaks", "Enhances"};
+
+// EDSP::WriteScenario - to the given file descriptor /*{{{*/
+bool EDSP::WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress)
+{
+ if (Progress != NULL)
+ Progress->SubProgress(Cache.Head().VersionCount, _("Send scenario to solver"));
+ unsigned long p = 0;
+ for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
+ for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver, ++p)
+ {
+ WriteScenarioVersion(Cache, output, Pkg, Ver);
+ WriteScenarioDependency(Cache, output, Pkg, Ver);
+ fprintf(output, "\n");
+ if (Progress != NULL && p % 100 == 0)
+ Progress->Progress(p);
+ }
+ return true;
+}
+ /*}}}*/
+// EDSP::WriteLimitedScenario - to the given file descriptor /*{{{*/
+bool EDSP::WriteLimitedScenario(pkgDepCache &Cache, FILE* output,
+ APT::PackageSet const &pkgset,
+ OpProgress *Progress)
+{
+ if (Progress != NULL)
+ Progress->SubProgress(Cache.Head().VersionCount, _("Send scenario to solver"));
+ unsigned long p = 0;
+ for (APT::PackageSet::const_iterator Pkg = pkgset.begin(); Pkg != pkgset.end(); ++Pkg, ++p)
+ for (pkgCache::VerIterator Ver = Pkg.VersionList(); Ver.end() == false; ++Ver)
+ {
+ WriteScenarioVersion(Cache, output, Pkg, Ver);
+ WriteScenarioLimitedDependency(Cache, output, Pkg, Ver, pkgset);
+ fprintf(output, "\n");
+ if (Progress != NULL && p % 100 == 0)
+ Progress->Progress(p);
+ }
+ if (Progress != NULL)
+ Progress->Done();
+ return true;
+}
+ /*}}}*/
+// EDSP::WriteScenarioVersion /*{{{*/
+void EDSP::WriteScenarioVersion(pkgDepCache &Cache, FILE* output, pkgCache::PkgIterator const &Pkg,
+ pkgCache::VerIterator const &Ver)
+{
+ fprintf(output, "Package: %s\n", Pkg.Name());
+ fprintf(output, "Architecture: %s\n", Ver.Arch());
+ fprintf(output, "Version: %s\n", Ver.VerStr());
+ if (Pkg.CurrentVer() == Ver)
+ fprintf(output, "Installed: yes\n");
+ if (Pkg->SelectedState == pkgCache::State::Hold ||
+ (Cache[Pkg].Keep() == true && Cache[Pkg].Protect() == true))
+ fprintf(output, "Hold: yes\n");
+ fprintf(output, "APT-ID: %d\n", Ver->ID);
+ fprintf(output, "Priority: %s\n", PrioMap[Ver->Priority]);
+ if ((Pkg->Flags & pkgCache::Flag::Essential) == pkgCache::Flag::Essential)
+ fprintf(output, "Essential: yes\n");
+ fprintf(output, "Section: %s\n", Ver.Section());
+ if ((Ver->MultiArch & pkgCache::Version::Allowed) == pkgCache::Version::Allowed)
+ fprintf(output, "Multi-Arch: allowed\n");
+ else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign)
+ fprintf(output, "Multi-Arch: foreign\n");
+ else if ((Ver->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
+ fprintf(output, "Multi-Arch: same\n");
+ signed short Pin = std::numeric_limits<signed short>::min();
+ for (pkgCache::VerFileIterator File = Ver.FileList(); File.end() == false; ++File) {
+ signed short const p = Cache.GetPolicy().GetPriority(File.File());
+ if (Pin < p)
+ Pin = p;
+ }
+ fprintf(output, "APT-Pin: %d\n", Pin);
+ if (Cache.GetCandidateVer(Pkg) == Ver)
+ fprintf(output, "APT-Candidate: yes\n");
+ if ((Cache[Pkg].Flags & pkgCache::Flag::Auto) == pkgCache::Flag::Auto)
+ fprintf(output, "APT-Automatic: yes\n");
+}
+ /*}}}*/
+// EDSP::WriteScenarioDependency /*{{{*/
+void EDSP::WriteScenarioDependency(pkgDepCache &Cache, FILE* output, pkgCache::PkgIterator const &Pkg,
+ pkgCache::VerIterator const &Ver)
+{
+ std::string dependencies[pkgCache::Dep::Enhances + 1];
+ bool orGroup = false;
+ for (pkgCache::DepIterator Dep = Ver.DependsList(); Dep.end() == false; ++Dep)
+ {
+ // Ignore implicit dependencies for multiarch here
+ if (strcmp(Pkg.Arch(), Dep.TargetPkg().Arch()) != 0)
+ continue;
+ if (orGroup == false)
+ dependencies[Dep->Type].append(", ");
+ dependencies[Dep->Type].append(Dep.TargetPkg().Name());
+ if (Dep->Version != 0)
+ dependencies[Dep->Type].append(" (").append(pkgCache::CompTypeDeb(Dep->CompareOp)).append(" ").append(Dep.TargetVer()).append(")");
+ if ((Dep->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
+ {
+ dependencies[Dep->Type].append(" | ");
+ orGroup = true;
+ }
+ else
+ orGroup = false;
+ }
+ for (int i = 1; i < pkgCache::Dep::Enhances + 1; ++i)
+ if (dependencies[i].empty() == false)
+ fprintf(output, "%s: %s\n", DepMap[i], dependencies[i].c_str()+2);
+ string provides;
+ for (pkgCache::PrvIterator Prv = Ver.ProvidesList(); Prv.end() == false; ++Prv)
+ {
+ // Ignore implicit provides for multiarch here
+ if (strcmp(Pkg.Arch(), Prv.ParentPkg().Arch()) != 0 || strcmp(Pkg.Name(),Prv.Name()) == 0)
+ continue;
+ provides.append(", ").append(Prv.Name());
+ }
+ if (provides.empty() == false)
+ fprintf(output, "Provides: %s\n", provides.c_str()+2);
+}
+ /*}}}*/
+// EDSP::WriteScenarioLimitedDependency /*{{{*/
+void EDSP::WriteScenarioLimitedDependency(pkgDepCache &Cache, FILE* output,
+ pkgCache::PkgIterator const &Pkg,
+ pkgCache::VerIterator const &Ver,
+ APT::PackageSet const &pkgset)
+{
+ std::string dependencies[pkgCache::Dep::Enhances + 1];
+ bool orGroup = false;
+ for (pkgCache::DepIterator Dep = Ver.DependsList(); Dep.end() == false; ++Dep)
+ {
+ // Ignore implicit dependencies for multiarch here
+ if (strcmp(Pkg.Arch(), Dep.TargetPkg().Arch()) != 0)
+ continue;
+ if (orGroup == false)
+ {
+ if (pkgset.find(Dep.TargetPkg()) == pkgset.end())
+ continue;
+ dependencies[Dep->Type].append(", ");
+ }
+ else if (pkgset.find(Dep.TargetPkg()) == pkgset.end())
+ {
+ if ((Dep->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
+ continue;
+ dependencies[Dep->Type].erase(dependencies[Dep->Type].end()-3, dependencies[Dep->Type].end());
+ orGroup = false;
+ continue;
+ }
+ dependencies[Dep->Type].append(Dep.TargetPkg().Name());
+ if (Dep->Version != 0)
+ dependencies[Dep->Type].append(" (").append(pkgCache::CompTypeDeb(Dep->CompareOp)).append(" ").append(Dep.TargetVer()).append(")");
+ if ((Dep->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or)
+ {
+ dependencies[Dep->Type].append(" | ");
+ orGroup = true;
+ }
+ else
+ orGroup = false;
+ }
+ for (int i = 1; i < pkgCache::Dep::Enhances + 1; ++i)
+ if (dependencies[i].empty() == false)
+ fprintf(output, "%s: %s\n", DepMap[i], dependencies[i].c_str()+2);
+ string provides;
+ for (pkgCache::PrvIterator Prv = Ver.ProvidesList(); Prv.end() == false; ++Prv)
+ {
+ // Ignore implicit provides for multiarch here
+ if (strcmp(Pkg.Arch(), Prv.ParentPkg().Arch()) != 0 || strcmp(Pkg.Name(),Prv.Name()) == 0)
+ continue;
+ if (pkgset.find(Prv.ParentPkg()) == pkgset.end())
+ continue;
+ provides.append(", ").append(Prv.Name());
+ }
+ if (provides.empty() == false)
+ fprintf(output, "Provides: %s\n", provides.c_str()+2);
+}
+ /*}}}*/
+// EDSP::WriteRequest - to the given file descriptor /*{{{*/
+bool EDSP::WriteRequest(pkgDepCache &Cache, FILE* output, bool const Upgrade,
+ bool const DistUpgrade, bool const AutoRemove,
+ OpProgress *Progress)
+{
+ if (Progress != NULL)
+ Progress->SubProgress(Cache.Head().PackageCount, _("Send request to solver"));
+ unsigned long p = 0;
+ string del, inst;
+ for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg, ++p)
+ {
+ if (Progress != NULL && p % 100 == 0)
+ Progress->Progress(p);
+ string* req;
+ if (Cache[Pkg].Delete() == true)
+ req = &del;
+ else if (Cache[Pkg].NewInstall() == true || Cache[Pkg].Upgrade() == true)
+ req = &inst;
+ else
+ continue;
+ req->append(" ").append(Pkg.FullName());
+ }
+ fprintf(output, "Request: EDSP 0.4\n");
+ if (del.empty() == false)
+ fprintf(output, "Remove: %s\n", del.c_str()+1);
+ if (inst.empty() == false)
+ fprintf(output, "Install: %s\n", inst.c_str()+1);
+ if (Upgrade == true)
+ fprintf(output, "Upgrade: yes\n");
+ if (DistUpgrade == true)
+ fprintf(output, "Dist-Upgrade: yes\n");
+ if (AutoRemove == true)
+ fprintf(output, "Autoremove: yes\n");
+ if (_config->FindB("APT::Solver::Strict-Pinning", true) == false)
+ fprintf(output, "Strict-Pinning: no\n");
+ string solverpref("APT::Solver::");
+ solverpref.append(_config->Find("APT::Solver", "internal")).append("::Preferences");
+ if (_config->Exists(solverpref) == true)
+ fprintf(output, "Preferences: %s\n", _config->Find(solverpref,"").c_str());
+ fprintf(output, "\n");
+
+ return true;
+}
+ /*}}}*/
+// EDSP::ReadResponse - from the given file descriptor /*{{{*/
+bool EDSP::ReadResponse(int const input, pkgDepCache &Cache, OpProgress *Progress) {
+ /* We build an map id to mmap offset here
+ In theory we could use the offset as ID, but then VersionCount
+ couldn't be used to create other versionmappings anymore and it
+ would be too easy for a (buggy) solver to segfault APT… */
+ unsigned long long const VersionCount = Cache.Head().VersionCount;
+ unsigned long VerIdx[VersionCount];
+ for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; ++P) {
+ for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; ++V)
+ VerIdx[V->ID] = V.Index();
+ Cache[P].Marked = true;
+ Cache[P].Garbage = false;
+ }
+
+ FileFd in;
+ in.OpenDescriptor(input, FileFd::ReadOnly);
+ pkgTagFile response(&in, 100);
+ pkgTagSection section;
+
+ while (response.Step(section) == true) {
+ std::string type;
+ if (section.Exists("Install") == true)
+ type = "Install";
+ else if (section.Exists("Remove") == true)
+ type = "Remove";
+ else if (section.Exists("Progress") == true) {
+ if (Progress != NULL) {
+ string msg = section.FindS("Message");
+ if (msg.empty() == true)
+ msg = _("Prepare for receiving solution");
+ Progress->SubProgress(100, msg, section.FindI("Percentage", 0));
+ }
+ continue;
+ } else if (section.Exists("Error") == true) {
+ std::string msg = SubstVar(SubstVar(section.FindS("Message"), "\n .\n", "\n\n"), "\n ", "\n");
+ if (msg.empty() == true) {
+ msg = _("External solver failed without a proper error message");
+ _error->Error(msg.c_str());
+ } else
+ _error->Error("External solver failed with: %s", msg.substr(0,msg.find('\n')).c_str());
+ if (Progress != NULL)
+ Progress->Done();
+ std::cerr << "The solver encountered an error of type: " << section.FindS("Error") << std::endl;
+ std::cerr << "The following information might help you to understand what is wrong:" << std::endl;
+ std::cerr << msg << std::endl << std::endl;
+ return false;
+ } else if (section.Exists("Autoremove") == true)
+ type = "Autoremove";
+ else
+ continue;
+
+ size_t const id = section.FindULL(type.c_str(), VersionCount);
+ if (id == VersionCount) {
+ _error->Warning("Unable to parse %s request with id value '%s'!", type.c_str(), section.FindS(type.c_str()).c_str());
+ continue;
+ } else if (id > Cache.Head().VersionCount) {
+ _error->Warning("ID value '%s' in %s request stanza is to high to refer to a known version!", section.FindS(type.c_str()).c_str(), type.c_str());
+ continue;
+ }
+
+ pkgCache::VerIterator Ver(Cache.GetCache(), Cache.GetCache().VerP + VerIdx[id]);
+ Cache.SetCandidateVersion(Ver);
+ if (type == "Install")
+ Cache.MarkInstall(Ver.ParentPkg(), false, 0, false);
+ else if (type == "Remove")
+ Cache.MarkDelete(Ver.ParentPkg(), false);
+ else if (type == "Autoremove") {
+ Cache[Ver.ParentPkg()].Marked = false;
+ Cache[Ver.ParentPkg()].Garbage = true;
+ }
+ }
+ return true;
+}
+ /*}}}*/
+// EDSP::ReadLine - first line from the given file descriptor /*{{{*/
+// ---------------------------------------------------------------------
+/* Little helper method to read a complete line into a string. Similar to
+ fgets but we need to use the low-level read() here as otherwise the
+ listparser will be confused later on as mixing of fgets and read isn't
+ a supported action according to the manpages and results are undefined */
+bool EDSP::ReadLine(int const input, std::string &line) {
+ char one;
+ ssize_t data = 0;
+ line.erase();
+ line.reserve(100);
+ while ((data = read(input, &one, sizeof(one))) != -1) {
+ if (data != 1)
+ continue;
+ if (one == '\n')
+ return true;
+ if (one == '\r')
+ continue;
+ if (line.empty() == true && isblank(one) != 0)
+ continue;
+ line += one;
+ }
+ return false;
+}
+ /*}}}*/
+// EDSP::StringToBool - convert yes/no to bool /*{{{*/
+// ---------------------------------------------------------------------
+/* we are not as lazy as we are in the global StringToBool as we really
+ only accept yes/no here - but we will ignore leading spaces */
+bool EDSP::StringToBool(char const *answer, bool const defValue) {
+ for (; isspace(*answer) != 0; ++answer);
+ if (strncasecmp(answer, "yes", 3) == 0)
+ return true;
+ else if (strncasecmp(answer, "no", 2) == 0)
+ return false;
+ else
+ _error->Warning("Value '%s' is not a boolean 'yes' or 'no'!", answer);
+ return defValue;
+}
+ /*}}}*/
+// EDSP::ReadRequest - first stanza from the given file descriptor /*{{{*/
+bool EDSP::ReadRequest(int const input, std::list<std::string> &install,
+ std::list<std::string> &remove, bool &upgrade,
+ bool &distUpgrade, bool &autoRemove)
+{
+ install.clear();
+ remove.clear();
+ upgrade = false;
+ distUpgrade = false;
+ autoRemove = false;
+ std::string line;
+ while (ReadLine(input, line) == true)
+ {
+ // Skip empty lines before request
+ if (line.empty() == true)
+ continue;
+ // The first Tag must be a request, so search for it
+ if (line.compare(0, 8, "Request:") != 0)
+ continue;
+
+ while (ReadLine(input, line) == true)
+ {
+ // empty lines are the end of the request
+ if (line.empty() == true)
+ return true;
+
+ std::list<std::string> *request = NULL;
+ if (line.compare(0, 8, "Install:") == 0)
+ {
+ line.erase(0, 8);
+ request = &install;
+ }
+ else if (line.compare(0, 7, "Remove:") == 0)
+ {
+ line.erase(0, 7);
+ request = &remove;
+ }
+ else if (line.compare(0, 8, "Upgrade:") == 0)
+ upgrade = EDSP::StringToBool(line.c_str() + 9, false);
+ else if (line.compare(0, 13, "Dist-Upgrade:") == 0)
+ distUpgrade = EDSP::StringToBool(line.c_str() + 14, false);
+ else if (line.compare(0, 11, "Autoremove:") == 0)
+ autoRemove = EDSP::StringToBool(line.c_str() + 12, false);
+ else
+ _error->Warning("Unknown line in EDSP Request stanza: %s", line.c_str());
+
+ if (request == NULL)
+ continue;
+ size_t end = line.length();
+ do {
+ size_t begin = line.rfind(' ');
+ if (begin == std::string::npos)
+ {
+ request->push_back(line.substr(0, end));
+ break;
+ }
+ else if (begin < end)
+ request->push_back(line.substr(begin + 1, end));
+ line.erase(begin);
+ end = line.find_last_not_of(' ');
+ } while (end != std::string::npos);
+ }
+ }
+ return false;
+}
+ /*}}}*/
+// EDSP::ApplyRequest - first stanza from the given file descriptor /*{{{*/
+bool EDSP::ApplyRequest(std::list<std::string> const &install,
+ std::list<std::string> const &remove,
+ pkgDepCache &Cache)
+{
+ for (std::list<std::string>::const_iterator i = install.begin();
+ i != install.end(); ++i) {
+ pkgCache::PkgIterator P = Cache.FindPkg(*i);
+ if (P.end() == true)
+ _error->Warning("Package %s is not known, so can't be installed", i->c_str());
+ else
+ Cache.MarkInstall(P, false);
+ }
+
+ for (std::list<std::string>::const_iterator i = remove.begin();
+ i != remove.end(); ++i) {
+ pkgCache::PkgIterator P = Cache.FindPkg(*i);
+ if (P.end() == true)
+ _error->Warning("Package %s is not known, so can't be installed", i->c_str());
+ else
+ Cache.MarkDelete(P);
+ }
+ return true;
+}
+ /*}}}*/
+// EDSP::WriteSolution - to the given file descriptor /*{{{*/
+bool EDSP::WriteSolution(pkgDepCache &Cache, FILE* output)
+{
+ bool const Debug = _config->FindB("Debug::EDSP::WriteSolution", false);
+ for (pkgCache::PkgIterator Pkg = Cache.PkgBegin(); Pkg.end() == false; ++Pkg)
+ {
+ if (Cache[Pkg].Delete() == true)
+ {
+ fprintf(output, "Remove: %d\n", Pkg.CurrentVer()->ID);
+ if (Debug == true)
+ fprintf(output, "Package: %s\nVersion: %s\n", Pkg.FullName().c_str(), Pkg.CurrentVer().VerStr());
+ }
+ else if (Cache[Pkg].NewInstall() == true || Cache[Pkg].Upgrade() == true)
+ {
+ fprintf(output, "Install: %d\n", Cache.GetCandidateVer(Pkg)->ID);
+ if (Debug == true)
+ fprintf(output, "Package: %s\nVersion: %s\n", Pkg.FullName().c_str(), Cache.GetCandidateVer(Pkg).VerStr());
+ }
+ else if (Cache[Pkg].Garbage == true)
+ {
+ fprintf(output, "Autoremove: %d\n", Pkg.CurrentVer()->ID);
+ if (Debug == true)
+ fprintf(output, "Package: %s\nVersion: %s\n", Pkg.FullName().c_str(), Pkg.CurrentVer().VerStr());
+ fprintf(stderr, "Autoremove: %s\nVersion: %s\n", Pkg.FullName().c_str(), Pkg.CurrentVer().VerStr());
+ }
+ else
+ continue;
+ fprintf(output, "\n");
+ }
+
+ return true;
+}
+ /*}}}*/
+// EDSP::WriteProgess - pulse to the given file descriptor /*{{{*/
+bool EDSP::WriteProgress(unsigned short const percent, const char* const message, FILE* output) {
+ fprintf(output, "Progress: %s\n", TimeRFC1123(time(NULL)).c_str());
+ fprintf(output, "Percentage: %d\n", percent);
+ fprintf(output, "Message: %s\n\n", message);
+ fflush(output);
+ return true;
+}
+ /*}}}*/
+// EDSP::WriteError - format an error message to be send to file descriptor /*{{{*/
+bool EDSP::WriteError(char const * const uuid, std::string const &message, FILE* output) {
+ fprintf(output, "Error: %s\n", uuid);
+ fprintf(output, "Message: %s\n\n", SubstVar(SubstVar(message, "\n\n", "\n.\n"), "\n", "\n ").c_str());
+ return true;
+}
+ /*}}}*/
+// EDSP::ExecuteSolver - fork requested solver and setup ipc pipes {{{*/
+bool EDSP::ExecuteSolver(const char* const solver, int *solver_in, int *solver_out) {
+ std::vector<std::string> const solverDirs = _config->FindVector("Dir::Bin::Solvers");
+ std::string file;
+ for (std::vector<std::string>::const_iterator dir = solverDirs.begin();
+ dir != solverDirs.end(); ++dir) {
+ file = flCombine(*dir, solver);
+ if (RealFileExists(file.c_str()) == true)
+ break;
+ file.clear();
+ }
+
+ if (file.empty() == true)
+ return _error->Error("Can't call external solver '%s' as it is not in a configured directory!", solver);
+ int external[4] = {-1, -1, -1, -1};
+ if (pipe(external) != 0 || pipe(external + 2) != 0)
+ return _error->Errno("Resolve", "Can't create needed IPC pipes for EDSP");
+ for (int i = 0; i < 4; ++i)
+ SetCloseExec(external[i], true);
+
+ pid_t Solver = ExecFork();
+ if (Solver == 0) {
+ dup2(external[0], STDIN_FILENO);
+ dup2(external[3], STDOUT_FILENO);
+ const char* calling[2] = { file.c_str(), 0 };
+ execv(calling[0], (char**) calling);
+ std::cerr << "Failed to execute solver '" << solver << "'!" << std::endl;
+ _exit(100);
+ }
+ close(external[0]);
+ close(external[3]);
+
+ if (WaitFd(external[1], true, 5) == false)
+ return _error->Errno("Resolve", "Timed out while Waiting on availability of solver stdin");
+
+ *solver_in = external[1];
+ *solver_out = external[2];
+ return true;
+}
+ /*}}}*/
+// EDSP::ResolveExternal - resolve problems by asking external for help {{{*/
+bool EDSP::ResolveExternal(const char* const solver, pkgDepCache &Cache,
+ bool const upgrade, bool const distUpgrade,
+ bool const autoRemove, OpProgress *Progress) {
+ int solver_in, solver_out;
+ if (EDSP::ExecuteSolver(solver, &solver_in, &solver_out) == false)
+ return false;
+
+ FILE* output = fdopen(solver_in, "w");
+ if (output == NULL)
+ return _error->Errno("Resolve", "fdopen on solver stdin failed");
+
+ if (Progress != NULL)
+ Progress->OverallProgress(0, 100, 5, _("Execute external solver"));
+ EDSP::WriteRequest(Cache, output, upgrade, distUpgrade, autoRemove, Progress);
+ if (Progress != NULL)
+ Progress->OverallProgress(5, 100, 20, _("Execute external solver"));
+ EDSP::WriteScenario(Cache, output, Progress);
+ fclose(output);
+
+ if (Progress != NULL)
+ Progress->OverallProgress(25, 100, 75, _("Execute external solver"));
+ if (EDSP::ReadResponse(solver_out, Cache, Progress) == false)
+ return false;
+
+ return true;
+}
+ /*}}}*/
diff --git a/apt-pkg/edsp.h b/apt-pkg/edsp.h
new file mode 100644
index 000000000..743c3f5d1
--- /dev/null
+++ b/apt-pkg/edsp.h
@@ -0,0 +1,222 @@
+// -*- mode: cpp; mode: fold -*-
+/** Description \file edsp.h {{{
+ ######################################################################
+ Set of methods to help writing and reading everything needed for EDSP
+ with the noteable exception of reading a scenario for conversion into
+ a Cache as this is handled by edsp interface for listparser and friends
+ ##################################################################### */
+ /*}}}*/
+#ifndef PKGLIB_EDSP_H
+#define PKGLIB_EDSP_H
+
+#include <apt-pkg/depcache.h>
+#include <apt-pkg/cacheset.h>
+#include <apt-pkg/progress.h>
+
+#include <string>
+
+class EDSP /*{{{*/
+{
+ // we could use pkgCache::DepType and ::Priority, but these would be localized strings…
+ static const char * const PrioMap[];
+ static const char * const DepMap[];
+
+ bool static ReadLine(int const input, std::string &line);
+ bool static StringToBool(char const *answer, bool const defValue);
+
+ void static WriteScenarioVersion(pkgDepCache &Cache, FILE* output,
+ pkgCache::PkgIterator const &Pkg,
+ pkgCache::VerIterator const &Ver);
+ void static WriteScenarioDependency(pkgDepCache &Cache, FILE* output,
+ pkgCache::PkgIterator const &Pkg,
+ pkgCache::VerIterator const &Ver);
+ void static WriteScenarioLimitedDependency(pkgDepCache &Cache, FILE* output,
+ pkgCache::PkgIterator const &Pkg,
+ pkgCache::VerIterator const &Ver,
+ APT::PackageSet const &pkgset);
+public:
+ /** \brief creates the EDSP request stanza
+ *
+ * In the EDSP protocol the first thing send to the resolver is a stanza
+ * encoding the request. This method will write this stanza by looking at
+ * the given Cache and requests the installation of all packages which were
+ * marked for installation in it (equally for remove).
+ *
+ * \param Cache in which the request is encoded
+ * \param output is written to this "file"
+ * \param upgrade is true if it is an request like apt-get upgrade
+ * \param distUpgrade is true if it is a request like apt-get dist-upgrade
+ * \param autoRemove is true if removal of unneeded packages should be performed
+ * \param Progress is an instance to report progress to
+ *
+ * \return true if request was composed successfully, otherwise false
+ */
+ bool static WriteRequest(pkgDepCache &Cache, FILE* output,
+ bool const upgrade = false,
+ bool const distUpgrade = false,
+ bool const autoRemove = false,
+ OpProgress *Progress = NULL);
+
+ /** \brief creates the scenario representing the package universe
+ *
+ * After the request all known information about a package are send
+ * to the solver. The output looks similar to a Packages or status file
+ *
+ * All packages and version included in this Cache are send, even if
+ * it doesn't make sense from an APT resolver point of view like versions
+ * with a negative pin to enable the solver to propose even that as a
+ * solution or at least to be able to give a hint what can be done to
+ * statisfy a request.
+ *
+ * \param Cache is the known package universe
+ * \param output is written to this "file"
+ * \param Progress is an instance to report progress to
+ *
+ * \return true if universe was composed successfully, otherwise false
+ */
+ bool static WriteScenario(pkgDepCache &Cache, FILE* output, OpProgress *Progress = NULL);
+
+ /** \brief creates a limited scenario representing the package universe
+ *
+ * This method works similar to #WriteScenario as it works in the same
+ * way but doesn't send the complete universe to the solver but only
+ * packages included in the pkgset which will have only dependencies
+ * on packages which are in the given set. All other dependencies will
+ * be removed, so that this method can be used to create testcases
+ *
+ * \param Cache is the known package universe
+ * \param output is written to this "file"
+ * \param pkgset is a set of packages the universe should be limited to
+ * \param Progress is an instance to report progress to
+ *
+ * \return true if universe was composed successfully, otherwise false
+ */
+ bool static WriteLimitedScenario(pkgDepCache &Cache, FILE* output,
+ APT::PackageSet const &pkgset,
+ OpProgress *Progress = NULL);
+
+ /** \brief waits and acts on the information returned from the solver
+ *
+ * This method takes care of interpreting whatever the solver sends
+ * through the standard output like a solution, progress or an error.
+ * The main thread should handle his control over to this method to
+ * wait for the solver to finish the given task
+ *
+ * \param input file descriptor with the response from the solver
+ * \param Cache the solution should be applied on if any
+ * \param Progress is an instance to report progress to
+ *
+ * \return true if a solution is found and applied correctly, otherwise false
+ */
+ bool static ReadResponse(int const input, pkgDepCache &Cache, OpProgress *Progress = NULL);
+
+ /** \brief search and read the request stanza for action later
+ *
+ * This method while ignore the input up to the point it finds the
+ * Request: line as an indicator for the Request stanza.
+ * The request is stored in the parameters install and remove then,
+ * as the cache isn't build yet as the scenario follows the request.
+ *
+ * \param input file descriptor with the edsp input for the solver
+ * \param[out] install is a list which gets populated with requested installs
+ * \param[out] remove is a list which gets populated with requested removals
+ * \param[out] upgrade is true if it is a request like apt-get upgrade
+ * \param[out] distUpgrade is true if it is a request like apt-get dist-upgrade
+ * \param[out] autoRemove is true if removal of uneeded packages should be performed
+ *
+ * \return true if the request could be found and worked on, otherwise false
+ */
+ bool static ReadRequest(int const input, std::list<std::string> &install,
+ std::list<std::string> &remove, bool &upgrade,
+ bool &distUpgrade, bool &autoRemove);
+
+ /** \brief takes the request lists and applies it on the cache
+ *
+ * The lists as created by #ReadRequest will be used to find the
+ * packages in question and mark them for install/remove.
+ * No solving is done and no auto-install/-remove.
+ *
+ * \param install is a list of packages to mark for installation
+ * \param remove is a list of packages to mark for removal
+ * \param Cache is there the markers should be set
+ *
+ * \return false if the request couldn't be applied, true otherwise
+ */
+ bool static ApplyRequest(std::list<std::string> const &install,
+ std::list<std::string> const &remove,
+ pkgDepCache &Cache);
+
+ /** \brief encodes the changes in the Cache as a EDSP solution
+ *
+ * The markers in the Cache are observed and send to given
+ * file. The solution isn't checked for consistency or alike,
+ * so even broken solutions can be written successfully,
+ * but the front-end revicing it will properly fail then.
+ *
+ * \param Cache which represents the solution
+ * \param output to write the stanzas forming the solution to
+ *
+ * \return true if solution could be written, otherwise false
+ */
+ bool static WriteSolution(pkgDepCache &Cache, FILE* output);
+
+ /** \brief sends a progress report
+ *
+ * \param percent of the solving completed
+ * \param message the solver wants the user to see
+ * \param output the front-end listens for progress report
+ */
+ bool static WriteProgress(unsigned short const percent, const char* const message, FILE* output);
+
+ /** \brief sends an error report
+ *
+ * Solvers are expected to execute successfully even if
+ * they were unable to calculate a solution for a given task.
+ * Obviously they can't send a solution through, so this
+ * methods deals with formatting an error message correctly
+ * so that the front-ends can recieve and display it.
+ *
+ * The first line of the message should be a short description
+ * of the error so it can be used for dialog titles or alike
+ *
+ * \param uuid of this error message
+ * \param message is free form text to discribe the error
+ * \param output the front-end listens for error messages
+ */
+ bool static WriteError(char const * const uuid, std::string const &message, FILE* output);
+
+
+ /** \brief executes the given solver and returns the pipe ends
+ *
+ * The given solver is executed if it can be found in one of the
+ * configured directories and setup for it is performed.
+ *
+ * \param solver to execute
+ * \param[out] solver_in will be the stdin of the solver
+ * \param[out] solver_out will be the stdout of the solver
+ *
+ * \return true if the solver could be started and the pipes
+ * are set up correctly, otherwise false and the pipes are invalid
+ */
+ bool static ExecuteSolver(const char* const solver, int *solver_in, int *solver_out);
+
+ /** \brief call an external resolver to handle the request
+ *
+ * This method wraps all the methods above to call an external solver
+ *
+ * \param solver to execute
+ * \param Cache with the problem and as universe to work in
+ * \param upgrade is true if it is a request like apt-get upgrade
+ * \param distUpgrade is true if it is a request like apt-get dist-upgrade
+ * \param autoRemove is true if unneeded packages should be removed
+ * \param Progress is an instance to report progress to
+ *
+ * \return true if the solver has successfully solved the problem,
+ * otherwise false
+ */
+ bool static ResolveExternal(const char* const solver, pkgDepCache &Cache,
+ bool const upgrade, bool const distUpgrade,
+ bool const autoRemove, OpProgress *Progress = NULL);
+};
+ /*}}}*/
+#endif
diff --git a/apt-pkg/edsp/edspindexfile.cc b/apt-pkg/edsp/edspindexfile.cc
new file mode 100644
index 000000000..f5881e663
--- /dev/null
+++ b/apt-pkg/edsp/edspindexfile.cc
@@ -0,0 +1,78 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+ The scenario file is designed to work as an intermediate file between
+ APT and the resolver. Its on propose very similar to a dpkg status file
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/edspindexfile.h>
+#include <apt-pkg/edsplistparser.h>
+#include <apt-pkg/sourcelist.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/progress.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/strutl.h>
+#include <apt-pkg/acquire-item.h>
+
+#include <sys/stat.h>
+ /*}}}*/
+
+// edspIndex::edspIndex - Constructor /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+edspIndex::edspIndex(string File) : debStatusIndex(File)
+{
+}
+ /*}}}*/
+// StatusIndex::Merge - Load the index file into a cache /*{{{*/
+bool edspIndex::Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const
+{
+ FileFd Pkg;
+ if (File != "stdin")
+ Pkg.Open(File, FileFd::ReadOnly);
+ else
+ Pkg.OpenDescriptor(STDIN_FILENO, FileFd::ReadOnly);
+ if (_error->PendingError() == true)
+ return false;
+ edspListParser Parser(&Pkg);
+ if (_error->PendingError() == true)
+ return false;
+
+ if (Prog != NULL)
+ Prog->SubProgress(0,File);
+ if (Gen.SelectFile(File,string(),*this) == false)
+ return _error->Error("Problem with SelectFile %s",File.c_str());
+
+ // Store the IMS information
+ pkgCache::PkgFileIterator CFile = Gen.GetCurFile();
+ struct stat St;
+ if (fstat(Pkg.Fd(),&St) != 0)
+ return _error->Errno("fstat","Failed to stat");
+ CFile->Size = St.st_size;
+ CFile->mtime = St.st_mtime;
+ CFile->Archive = Gen.WriteUniqString("edsp::scenario");
+
+ if (Gen.MergeList(Parser) == false)
+ return _error->Error("Problem with MergeList %s",File.c_str());
+ return true;
+}
+ /*}}}*/
+// Index File types for APT /*{{{*/
+class edspIFType: public pkgIndexFile::Type
+{
+ public:
+ virtual pkgRecords::Parser *CreatePkgParser(pkgCache::PkgFileIterator File) const
+ {
+ // we don't have a record parser for this type as the file is not presistent
+ return NULL;
+ };
+ edspIFType() {Label = "EDSP scenario file";};
+};
+static edspIFType _apt_Universe;
+
+const pkgIndexFile::Type *edspIndex::GetType() const
+{
+ return &_apt_Universe;
+}
+ /*}}}*/
diff --git a/apt-pkg/edsp/edspindexfile.h b/apt-pkg/edsp/edspindexfile.h
new file mode 100644
index 000000000..0053388eb
--- /dev/null
+++ b/apt-pkg/edsp/edspindexfile.h
@@ -0,0 +1,28 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+ The scenario file is designed to work as an intermediate file between
+ APT and the resolver. Its on propose very similar to a dpkg status file
+ ##################################################################### */
+ /*}}}*/
+#ifndef PKGLIB_EDSPINDEXFILE_H
+#define PKGLIB_EDSPINDEXFILE_H
+
+#include <apt-pkg/indexfile.h>
+#include <apt-pkg/debindexfile.h>
+
+class edspIndex : public debStatusIndex
+{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
+ public:
+
+ virtual const Type *GetType() const;
+
+ virtual bool Merge(pkgCacheGenerator &Gen,OpProgress *Prog) const;
+
+ edspIndex(string File);
+};
+
+#endif
diff --git a/apt-pkg/edsp/edsplistparser.cc b/apt-pkg/edsp/edsplistparser.cc
new file mode 100644
index 000000000..3349e8cce
--- /dev/null
+++ b/apt-pkg/edsp/edsplistparser.cc
@@ -0,0 +1,90 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+
+ Package Cache Generator - Generator for the cache structure.
+
+ This builds the cache structure from the abstract package list parser.
+
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/edsplistparser.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/strutl.h>
+#include <apt-pkg/md5.h>
+#include <apt-pkg/macros.h>
+ /*}}}*/
+
+// ListParser::edspListParser - Constructor /*{{{*/
+edspListParser::edspListParser(FileFd *File, string const &Arch) : debListParser(File, Arch)
+{}
+ /*}}}*/
+// ListParser::NewVersion - Fill in the version structure /*{{{*/
+bool edspListParser::NewVersion(pkgCache::VerIterator &Ver)
+{
+ Ver->ID = Section.FindI("APT-ID", Ver->ID);
+ return debListParser::NewVersion(Ver);
+}
+ /*}}}*/
+// ListParser::Description - Return the description string /*{{{*/
+// ---------------------------------------------------------------------
+/* Sorry, no description for the resolvers… */
+string edspListParser::Description()
+{
+ return "";
+}
+string edspListParser::DescriptionLanguage()
+{
+ return "";
+}
+MD5SumValue edspListParser::Description_md5()
+{
+ return MD5SumValue("");
+}
+ /*}}}*/
+// ListParser::VersionHash - Compute a unique hash for this version /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+unsigned short edspListParser::VersionHash()
+{
+ if (Section.Exists("APT-Hash") == true)
+ return Section.FindI("APT-Hash");
+ else if (Section.Exists("APT-ID") == true)
+ return Section.FindI("APT-ID");
+ return 0;
+}
+ /*}}}*/
+// ListParser::ParseStatus - Parse the status field /*{{{*/
+// ---------------------------------------------------------------------
+/* The Status: line here is not a normal dpkg one but just one which tells
+ use if the package is installed or not, where missing means not. */
+bool edspListParser::ParseStatus(pkgCache::PkgIterator &Pkg,
+ pkgCache::VerIterator &Ver)
+{
+ unsigned long state = 0;
+ if (Section.FindFlag("Hold",state,pkgCache::State::Hold) == false)
+ return false;
+ if (state != 0)
+ Pkg->SelectedState = pkgCache::State::Hold;
+
+ state = 0;
+ if (Section.FindFlag("Installed",state,pkgCache::State::Installed) == false)
+ return false;
+ if (state != 0)
+ {
+ Pkg->CurrentState = pkgCache::State::Installed;
+ Pkg->CurrentVer = Ver.Index();
+ }
+
+ return true;
+}
+ /*}}}*/
+// ListParser::LoadReleaseInfo - Load the release information /*{{{*/
+bool edspListParser::LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,
+ FileFd &File, string component)
+{
+ return true;
+}
+ /*}}}*/
diff --git a/apt-pkg/edsp/edsplistparser.h b/apt-pkg/edsp/edsplistparser.h
new file mode 100644
index 000000000..ec9f09905
--- /dev/null
+++ b/apt-pkg/edsp/edsplistparser.h
@@ -0,0 +1,38 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+
+ EDSP Package List Parser - This implements the abstract parser
+ interface for the APT specific intermediate format which is passed
+ to external resolvers
+
+ ##################################################################### */
+ /*}}}*/
+#ifndef PKGLIB_EDSPLISTPARSER_H
+#define PKGLIB_EDSPLISTPARSER_H
+
+#include <apt-pkg/deblistparser.h>
+#include <apt-pkg/pkgcachegen.h>
+#include <apt-pkg/indexfile.h>
+#include <apt-pkg/tagfile.h>
+
+class edspListParser : public debListParser
+{
+ public:
+ virtual bool NewVersion(pkgCache::VerIterator &Ver);
+ virtual string Description();
+ virtual string DescriptionLanguage();
+ virtual MD5SumValue Description_md5();
+ virtual unsigned short VersionHash();
+
+ bool LoadReleaseInfo(pkgCache::PkgFileIterator &FileI,FileFd &File,
+ string section);
+
+ edspListParser(FileFd *File, string const &Arch = "");
+
+ protected:
+ virtual bool ParseStatus(pkgCache::PkgIterator &Pkg,pkgCache::VerIterator &Ver);
+
+};
+
+#endif
diff --git a/apt-pkg/edsp/edspsystem.cc b/apt-pkg/edsp/edspsystem.cc
new file mode 100644
index 000000000..ac0bb8beb
--- /dev/null
+++ b/apt-pkg/edsp/edspsystem.cc
@@ -0,0 +1,124 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* ######################################################################
+
+ This system provides the abstraction to use the scenario file as the
+ only source of package information to be able to feed the created file
+ back to APT for its own consumption (eat your own dogfood).
+
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/edspsystem.h>
+#include <apt-pkg/debversion.h>
+#include <apt-pkg/edspindexfile.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/error.h>
+#include <apt-pkg/fileutl.h>
+#include <apti18n.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <errno.h>
+ /*}}}*/
+
+edspSystem edspSys;
+
+// System::debSystem - Constructor /*{{{*/
+edspSystem::edspSystem()
+{
+ StatusFile = 0;
+
+ Label = "Debian APT solver interface";
+ VS = &debVS;
+}
+ /*}}}*/
+// System::~debSystem - Destructor /*{{{*/
+edspSystem::~edspSystem()
+{
+ delete StatusFile;
+}
+ /*}}}*/
+// System::Lock - Get the lock /*{{{*/
+bool edspSystem::Lock()
+{
+ return true;
+}
+ /*}}}*/
+// System::UnLock - Drop a lock /*{{{*/
+bool edspSystem::UnLock(bool NoErrors)
+{
+ return true;
+}
+ /*}}}*/
+// System::CreatePM - Create the underlying package manager /*{{{*/
+// ---------------------------------------------------------------------
+/* we can't use edsp input as input for real installations - just a
+ simulation can work, but everything else will fail bigtime */
+pkgPackageManager *edspSystem::CreatePM(pkgDepCache *Cache) const
+{
+ return NULL;
+}
+ /*}}}*/
+// System::Initialize - Setup the configuration space.. /*{{{*/
+bool edspSystem::Initialize(Configuration &Cnf)
+{
+ Cnf.Set("Dir::State::extended_states", "/dev/null");
+ Cnf.Set("Dir::State::status","/dev/null");
+ Cnf.Set("Dir::State::lists","/dev/null");
+
+ Cnf.Set("Debug::NoLocking", "true");
+ Cnf.Set("APT::Get::Simulate", "true");
+
+ if (StatusFile) {
+ delete StatusFile;
+ StatusFile = 0;
+ }
+ return true;
+}
+ /*}}}*/
+// System::ArchiveSupported - Is a file format supported /*{{{*/
+bool edspSystem::ArchiveSupported(const char *Type)
+{
+ return false;
+}
+ /*}}}*/
+// System::Score - Determine if we should use the edsp system /*{{{*/
+signed edspSystem::Score(Configuration const &Cnf)
+{
+ if (Cnf.Find("edsp::scenario", "") == "stdin")
+ return 1000;
+ if (FileExists(Cnf.FindFile("edsp::scenario","")) == true)
+ return 1000;
+ return -1000;
+}
+ /*}}}*/
+// System::AddStatusFiles - Register the status files /*{{{*/
+bool edspSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
+{
+ if (StatusFile == 0)
+ {
+ if (_config->Find("edsp::scenario", "") == "stdin")
+ StatusFile = new edspIndex("stdin");
+ else
+ StatusFile = new edspIndex(_config->FindFile("edsp::scenario"));
+ }
+ List.push_back(StatusFile);
+ return true;
+}
+ /*}}}*/
+// System::FindIndex - Get an index file for status files /*{{{*/
+bool edspSystem::FindIndex(pkgCache::PkgFileIterator File,
+ pkgIndexFile *&Found) const
+{
+ if (StatusFile == 0)
+ return false;
+ if (StatusFile->FindInCache(*File.Cache()) == File)
+ {
+ Found = StatusFile;
+ return true;
+ }
+
+ return false;
+}
+ /*}}}*/
diff --git a/apt-pkg/edsp/edspsystem.h b/apt-pkg/edsp/edspsystem.h
new file mode 100644
index 000000000..ca703fa84
--- /dev/null
+++ b/apt-pkg/edsp/edspsystem.h
@@ -0,0 +1,41 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+// $Id: debsystem.h,v 1.4 2003/01/11 07:16:33 jgg Exp $
+/* ######################################################################
+
+ System - Debian version of the System Class
+
+ ##################################################################### */
+ /*}}}*/
+#ifndef PKGLIB_EDSPSYSTEM_H
+#define PKGLIB_EDSPSYSTEM_H
+
+#include <apt-pkg/pkgsystem.h>
+
+class edspIndex;
+class edspSystem : public pkgSystem
+{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
+ edspIndex *StatusFile;
+
+ public:
+
+ virtual bool Lock();
+ virtual bool UnLock(bool NoErrors = false);
+ virtual pkgPackageManager *CreatePM(pkgDepCache *Cache) const;
+ virtual bool Initialize(Configuration &Cnf);
+ virtual bool ArchiveSupported(const char *Type);
+ virtual signed Score(Configuration const &Cnf);
+ virtual bool AddStatusFiles(std::vector<pkgIndexFile *> &List);
+ virtual bool FindIndex(pkgCache::PkgFileIterator File,
+ pkgIndexFile *&Found) const;
+
+ edspSystem();
+ ~edspSystem();
+};
+
+extern edspSystem edspSys;
+
+#endif
diff --git a/apt-pkg/indexcopy.h b/apt-pkg/indexcopy.h
index 6fcd3b8ce..277fb561c 100644
--- a/apt-pkg/indexcopy.h
+++ b/apt-pkg/indexcopy.h
@@ -24,6 +24,9 @@ class pkgCdromStatus;
class IndexCopy /*{{{*/
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
protected:
pkgTagSection *Section;
@@ -55,7 +58,6 @@ class PackageCopy : public IndexCopy /*{{{*/
virtual const char *GetFileName() {return "Packages";};
virtual const char *Type() {return "Package";};
- public:
};
/*}}}*/
class SourceCopy : public IndexCopy /*{{{*/
@@ -67,7 +69,6 @@ class SourceCopy : public IndexCopy /*{{{*/
virtual const char *GetFileName() {return "Sources";};
virtual const char *Type() {return "Source";};
- public:
};
/*}}}*/
class TranslationsCopy /*{{{*/
@@ -82,6 +83,9 @@ class TranslationsCopy /*{{{*/
/*}}}*/
class SigVerify /*{{{*/
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
bool Verify(string prefix,string file, indexRecords *records);
bool CopyMetaIndex(string CDROM, string CDName,
string prefix, string file);
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index 31b2d9ccd..66b0119e6 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -72,7 +72,9 @@ bool pkgInitConfig(Configuration &Cnf)
Cnf.Set("Dir::Etc::preferencesparts","preferences.d");
Cnf.Set("Dir::Etc::trusted", "trusted.gpg");
Cnf.Set("Dir::Etc::trustedparts","trusted.gpg.d");
+
Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
+ Cnf.Set("Dir::Bin::solvers::","/usr/lib/apt/solvers");
Cnf.Set("Dir::Media::MountPath","/media/apt");
// State
diff --git a/apt-pkg/init.h b/apt-pkg/init.h
index 15a1165b9..6b92dd200 100644
--- a/apt-pkg/init.h
+++ b/apt-pkg/init.h
@@ -22,8 +22,8 @@
// Non-ABI-Breaks should only increase RELEASE number.
// See also buildlib/libversion.mak
#define APT_PKG_MAJOR 4
-#define APT_PKG_MINOR 10
-#define APT_PKG_RELEASE 1
+#define APT_PKG_MINOR 11
+#define APT_PKG_RELEASE 0
extern const char *pkgVersion;
extern const char *pkgLibVersion;
diff --git a/apt-pkg/makefile b/apt-pkg/makefile
index 4e5ec107f..b11e35250 100644
--- a/apt-pkg/makefile
+++ b/apt-pkg/makefile
@@ -3,7 +3,7 @@ BASE=..
SUBDIR=apt-pkg
# Header location
-SUBDIRS = deb contrib
+SUBDIRS = deb edsp contrib
HEADER_TARGETDIRS = apt-pkg
# Bring in the default rules
@@ -20,11 +20,15 @@ APT_DOMAIN:=libapt-pkg$(LIBAPTPKG_MAJOR)
# Source code for the contributed non-core things
SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
contrib/configuration.cc contrib/progress.cc contrib/cmndline.cc \
- contrib/md5.cc contrib/sha1.cc contrib/sha256.cc contrib/hashes.cc \
+ contrib/md5.cc contrib/sha1.cc contrib/sha2.cc \
+ contrib/sha2_internal.cc\
+ contrib/hashes.cc \
contrib/cdromutl.cc contrib/crc-16.cc contrib/netrc.cc \
contrib/fileutl.cc
HEADERS = mmap.h error.h configuration.h fileutl.h cmndline.h netrc.h\
- md5.h crc-16.h cdromutl.h strutl.h sptr.h sha1.h sha256.h hashes.h \
+ md5.h crc-16.h cdromutl.h strutl.h sptr.h sha1.h sha2.h \
+ sha2_internal.h \
+ hashes.h hashsum_template.h\
macros.h weakptr.h
# Source code for the core main library
@@ -35,7 +39,7 @@ SOURCE+= pkgcache.cc version.cc depcache.cc \
srcrecords.cc cachefile.cc versionmatch.cc policy.cc \
pkgsystem.cc indexfile.cc pkgcachegen.cc acquire-item.cc \
indexrecords.cc vendor.cc vendorlist.cc cdrom.cc indexcopy.cc \
- aptconfiguration.cc cachefilter.cc cacheset.cc
+ aptconfiguration.cc cachefilter.cc cacheset.cc edsp.cc
HEADERS+= algorithms.h depcache.h pkgcachegen.h cacheiterators.h \
orderlist.h sourcelist.h packagemanager.h tagfile.h \
init.h pkgcache.h version.h progress.h pkgrecords.h \
@@ -43,7 +47,7 @@ HEADERS+= algorithms.h depcache.h pkgcachegen.h cacheiterators.h \
clean.h srcrecords.h cachefile.h versionmatch.h policy.h \
pkgsystem.h indexfile.h metaindex.h indexrecords.h vendor.h \
vendorlist.h cdrom.h indexcopy.h aptconfiguration.h \
- cachefilter.h cacheset.h
+ cachefilter.h cacheset.h edsp.h
# Source code for the debian specific components
# In theory the deb headers do not need to be exported..
@@ -53,6 +57,10 @@ SOURCE+= deb/deblistparser.cc deb/debrecords.cc deb/dpkgpm.cc \
HEADERS+= debversion.h debsrcrecords.h dpkgpm.h debrecords.h \
deblistparser.h debsystem.h debindexfile.h debmetaindex.h
+# Source code for the APT resolver interface specific components
+SOURCE+= edsp/edsplistparser.cc edsp/edspindexfile.cc edsp/edspsystem.cc
+HEADERS+= edsplistparser.h edspindexfile.h edspsystem.h
+
HEADERS := $(addprefix apt-pkg/,$(HEADERS))
include $(LIBRARY_H)
diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index fe9f6eb68..1ae09347a 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -319,7 +319,7 @@ bool pkgPackageManager::SmartConfigure(PkgIterator Pkg)
List->Flag(Pkg,pkgOrderList::Configured,pkgOrderList::States);
}
- if (Cache[Pkg].InstVerIter(Cache)->MultiArch == pkgCache::Version::Same)
+ if ((Cache[Pkg].InstVerIter(Cache)->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
for (PkgIterator P = Pkg.Group().PackageList();
P.end() == false; P = Pkg.Group().NextPkg(P))
{
@@ -602,7 +602,7 @@ bool pkgPackageManager::SmartUnPack(PkgIterator Pkg, bool const Immediate)
List->Flag(Pkg,pkgOrderList::UnPacked,pkgOrderList::States);
- if (instVer->MultiArch == pkgCache::Version::Same)
+ if ((instVer->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same)
for (PkgIterator P = Pkg.Group().PackageList();
P.end() == false; P = Pkg.Group().NextPkg(P))
{
diff --git a/apt-pkg/pkgcache.cc b/apt-pkg/pkgcache.cc
index 38e4e904e..951caeb78 100644
--- a/apt-pkg/pkgcache.cc
+++ b/apt-pkg/pkgcache.cc
@@ -749,9 +749,6 @@ bool pkgCache::VerIterator::Automatic() const
return false;
}
/*}}}*/
-// VerIterator::Pseudo - deprecated no-op method /*{{{*/
-bool pkgCache::VerIterator::Pseudo() const { return false; }
- /*}}}*/
// VerIterator::NewestFile - Return the newest file version relation /*{{{*/
// ---------------------------------------------------------------------
/* This looks at the version numbers associated with all of the sources
diff --git a/apt-pkg/pkgcache.h b/apt-pkg/pkgcache.h
index 1b1743724..280f37bca 100644
--- a/apt-pkg/pkgcache.h
+++ b/apt-pkg/pkgcache.h
@@ -500,15 +500,18 @@ struct pkgCache::Version
map_ptrloc VerStr; // StringItem
/** \brief section this version is filled in */
map_ptrloc Section; // StringItem
+
+ /** \brief Multi-Arch capabilities of a package version */
+ enum VerMultiArch { None = 0, /*!< is the default and doesn't trigger special behaviour */
+ All = (1<<0), /*!< will cause that Ver.Arch() will report "all" */
+ Foreign = (1<<1), /*!< can satisfy dependencies in another architecture */
+ Same = (1<<2), /*!< can be co-installed with itself from other architectures */
+ Allowed = (1<<3) /*!< other packages are allowed to depend on thispkg:any */ };
/** \brief stores the MultiArch capabilities of this version
- None is the default and doesn't trigger special behaviour,
- Foreign means that this version can fulfill dependencies even
- if it is built for another architecture as the requester.
- Same indicates that builds for different architectures can
- be co-installed on the system */
- /* FIXME: A bitflag would be better with the next abibreak… */
- enum {None, All, Foreign, Same, Allowed, AllForeign, AllAllowed} MultiArch;
+ Flags used are defined in pkgCache::Version::VerMultiArch
+ */
+ unsigned char MultiArch;
/** \brief references all the PackageFile's that this version came from
diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc
index 9820fde81..8e088ba68 100644
--- a/apt-pkg/pkgcachegen.cc
+++ b/apt-pkg/pkgcachegen.cc
@@ -642,7 +642,7 @@ bool pkgCacheGenerator::FinishCache(OpProgress *Progress)
bool const coInstall = ((V->MultiArch & pkgCache::Version::Same) == pkgCache::Version::Same);
for (vector<string>::const_iterator A = archs.begin(); A != archs.end(); ++A)
{
- if (*A == Arch)
+ if (Arch == 0 || *A == Arch)
continue;
/* We allow only one installed arch at the time
per group, therefore each group member conflicts
diff --git a/apt-pkg/pkgrecords.h b/apt-pkg/pkgrecords.h
index c2c98188a..78e39e577 100644
--- a/apt-pkg/pkgrecords.h
+++ b/apt-pkg/pkgrecords.h
@@ -28,12 +28,13 @@ class pkgRecords /*{{{*/
class Parser;
private:
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
pkgCache &Cache;
std::vector<Parser *>Files;
- public:
-
+ public:
// Lookup function
Parser &Lookup(pkgCache::VerFileIterator const &Ver);
Parser &Lookup(pkgCache::DescFileIterator const &Desc);
@@ -58,6 +59,7 @@ class pkgRecords::Parser /*{{{*/
virtual string MD5Hash() {return string();};
virtual string SHA1Hash() {return string();};
virtual string SHA256Hash() {return string();};
+ virtual string SHA512Hash() {return string();};
virtual string SourcePkg() {return string();};
virtual string SourceVer() {return string();};
diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc
index 2cc2e5e39..4fc272a74 100644
--- a/apt-pkg/policy.cc
+++ b/apt-pkg/policy.cc
@@ -282,6 +282,10 @@ signed short pkgPolicy::GetPriority(pkgCache::PkgIterator const &Pkg)
return 0;
}
+signed short pkgPolicy::GetPriority(pkgCache::PkgFileIterator const &File)
+{
+ return PFPriority[File->ID];
+}
/*}}}*/
// PreferenceSection class - Overriding the default TrimRecord method /*{{{*/
// ---------------------------------------------------------------------
diff --git a/apt-pkg/policy.h b/apt-pkg/policy.h
index f8b2678de..e7f36d618 100644
--- a/apt-pkg/policy.h
+++ b/apt-pkg/policy.h
@@ -69,14 +69,13 @@ class pkgPolicy : public pkgDepCache::Policy
// Things for manipulating pins
void CreatePin(pkgVersionMatch::MatchType Type,string Pkg,
string Data,signed short Priority);
- inline signed short GetPriority(pkgCache::PkgFileIterator const &File)
- {return PFPriority[File->ID];};
- signed short GetPriority(pkgCache::PkgIterator const &Pkg);
pkgCache::VerIterator GetMatch(pkgCache::PkgIterator const &Pkg);
// Things for the cache interface.
virtual pkgCache::VerIterator GetCandidateVer(pkgCache::PkgIterator const &Pkg);
- virtual bool IsImportantDep(pkgCache::DepIterator const &Dep) {return pkgDepCache::Policy::IsImportantDep(Dep);};
+ virtual signed short GetPriority(pkgCache::PkgIterator const &Pkg);
+ virtual signed short GetPriority(pkgCache::PkgFileIterator const &File);
+
bool InitDefaults();
pkgPolicy(pkgCache *Owner);
diff --git a/apt-pkg/srcrecords.h b/apt-pkg/srcrecords.h
index a49533864..8a78d7711 100644
--- a/apt-pkg/srcrecords.h
+++ b/apt-pkg/srcrecords.h
@@ -79,6 +79,8 @@ class pkgSrcRecords
};
private:
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
// The list of files and the current parser pointer
vector<Parser*> Files;
@@ -93,7 +95,7 @@ class pkgSrcRecords
Parser *Find(const char *Package,bool const &SrcOnly = false);
pkgSrcRecords(pkgSourceList &List);
- ~pkgSrcRecords();
+ virtual ~pkgSrcRecords();
};
#endif
diff --git a/apt-pkg/tagfile.cc b/apt-pkg/tagfile.cc
index 4a2f3f7e6..a8f04b23a 100644
--- a/apt-pkg/tagfile.cc
+++ b/apt-pkg/tagfile.cc
@@ -24,26 +24,40 @@
using std::string;
+class pkgTagFilePrivate
+{
+public:
+ pkgTagFilePrivate(FileFd *pFd, unsigned long Size) : Fd(*pFd), Size(Size)
+ {
+ }
+ FileFd &Fd;
+ char *Buffer;
+ char *Start;
+ char *End;
+ bool Done;
+ unsigned long iOffset;
+ unsigned long Size;
+};
+
// TagFile::pkgTagFile - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long Size) :
- Fd(*pFd),
- Size(Size)
+pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long Size)
{
- if (Fd.IsOpen() == false)
+ d = new pkgTagFilePrivate(pFd, Size);
+
+ if (d->Fd.IsOpen() == false)
{
- Buffer = 0;
- Start = End = Buffer = 0;
- Done = true;
- iOffset = 0;
+ d->Start = d->End = d->Buffer = 0;
+ d->Done = true;
+ d->iOffset = 0;
return;
}
- Buffer = new char[Size];
- Start = End = Buffer;
- Done = false;
- iOffset = 0;
+ d->Buffer = new char[Size];
+ d->Start = d->End = d->Buffer;
+ d->Done = false;
+ d->iOffset = 0;
Fill();
}
/*}}}*/
@@ -52,7 +66,14 @@ pkgTagFile::pkgTagFile(FileFd *pFd,unsigned long Size) :
/* */
pkgTagFile::~pkgTagFile()
{
- delete [] Buffer;
+ delete [] d->Buffer;
+ delete d;
+}
+ /*}}}*/
+// TagFile::Offset - Return the current offset in the buffer /*{{{*/
+unsigned long pkgTagFile::Offset()
+{
+ return d->iOffset;
}
/*}}}*/
// TagFile::Resize - Resize the internal buffer /*{{{*/
@@ -63,22 +84,22 @@ pkgTagFile::~pkgTagFile()
bool pkgTagFile::Resize()
{
char *tmp;
- unsigned long EndSize = End - Start;
+ unsigned long EndSize = d->End - d->Start;
// fail is the buffer grows too big
- if(Size > 1024*1024+1)
+ if(d->Size > 1024*1024+1)
return false;
// get new buffer and use it
- tmp = new char[2*Size];
- memcpy(tmp, Buffer, Size);
- Size = Size*2;
- delete [] Buffer;
- Buffer = tmp;
+ tmp = new char[2*d->Size];
+ memcpy(tmp, d->Buffer, d->Size);
+ d->Size = d->Size*2;
+ delete [] d->Buffer;
+ d->Buffer = tmp;
// update the start/end pointers to the new buffer
- Start = Buffer;
- End = Start + EndSize;
+ d->Start = d->Buffer;
+ d->End = d->Start + EndSize;
return true;
}
/*}}}*/
@@ -90,20 +111,20 @@ bool pkgTagFile::Resize()
*/
bool pkgTagFile::Step(pkgTagSection &Tag)
{
- while (Tag.Scan(Start,End - Start) == false)
+ while (Tag.Scan(d->Start,d->End - d->Start) == false)
{
if (Fill() == false)
return false;
- if(Tag.Scan(Start,End - Start))
+ if(Tag.Scan(d->Start,d->End - d->Start))
break;
if (Resize() == false)
return _error->Error(_("Unable to parse package file %s (1)"),
- Fd.Name().c_str());
+ d->Fd.Name().c_str());
}
- Start += Tag.size();
- iOffset += Tag.size();
+ d->Start += Tag.size();
+ d->iOffset += Tag.size();
Tag.Trim();
return true;
@@ -115,37 +136,37 @@ bool pkgTagFile::Step(pkgTagSection &Tag)
then fills the rest from the file */
bool pkgTagFile::Fill()
{
- unsigned long EndSize = End - Start;
+ unsigned long EndSize = d->End - d->Start;
unsigned long Actual = 0;
- memmove(Buffer,Start,EndSize);
- Start = Buffer;
- End = Buffer + EndSize;
+ memmove(d->Buffer,d->Start,EndSize);
+ d->Start = d->Buffer;
+ d->End = d->Buffer + EndSize;
- if (Done == false)
+ if (d->Done == false)
{
// See if only a bit of the file is left
- if (Fd.Read(End,Size - (End - Buffer),&Actual) == false)
+ if (d->Fd.Read(d->End, d->Size - (d->End - d->Buffer),&Actual) == false)
return false;
- if (Actual != Size - (End - Buffer))
- Done = true;
- End += Actual;
+ if (Actual != d->Size - (d->End - d->Buffer))
+ d->Done = true;
+ d->End += Actual;
}
- if (Done == true)
+ if (d->Done == true)
{
if (EndSize <= 3 && Actual == 0)
return false;
- if (Size - (End - Buffer) < 4)
+ if (d->Size - (d->End - d->Buffer) < 4)
return true;
// Append a double new line if one does not exist
unsigned int LineCount = 0;
- for (const char *E = End - 1; E - End < 6 && (*E == '\n' || *E == '\r'); E--)
+ for (const char *E = d->End - 1; E - d->End < 6 && (*E == '\n' || *E == '\r'); E--)
if (*E == '\n')
LineCount++;
for (; LineCount < 2; LineCount++)
- *End++ = '\n';
+ *d->End++ = '\n';
return true;
}
@@ -160,33 +181,33 @@ bool pkgTagFile::Fill()
bool pkgTagFile::Jump(pkgTagSection &Tag,unsigned long Offset)
{
// We are within a buffer space of the next hit..
- if (Offset >= iOffset && iOffset + (End - Start) > Offset)
+ if (Offset >= d->iOffset && d->iOffset + (d->End - d->Start) > Offset)
{
- unsigned long Dist = Offset - iOffset;
- Start += Dist;
- iOffset += Dist;
+ unsigned long Dist = Offset - d->iOffset;
+ d->Start += Dist;
+ d->iOffset += Dist;
return Step(Tag);
}
// Reposition and reload..
- iOffset = Offset;
- Done = false;
- if (Fd.Seek(Offset) == false)
+ d->iOffset = Offset;
+ d->Done = false;
+ if (d->Fd.Seek(Offset) == false)
return false;
- End = Start = Buffer;
+ d->End = d->Start = d->Buffer;
if (Fill() == false)
return false;
- if (Tag.Scan(Start,End - Start) == true)
+ if (Tag.Scan(d->Start, d->End - d->Start) == true)
return true;
// This appends a double new line (for the real eof handling)
if (Fill() == false)
return false;
- if (Tag.Scan(Start,End - Start) == false)
- return _error->Error(_("Unable to parse package file %s (2)"),Fd.Name().c_str());
+ if (Tag.Scan(d->Start, d->End - d->Start) == false)
+ return _error->Error(_("Unable to parse package file %s (2)"),d->Fd.Name().c_str());
return true;
}
@@ -457,6 +478,7 @@ static const char *iTFRewritePackageOrder[] = {
"MD5Sum",
"SHA1",
"SHA256",
+ "SHA512",
"MSDOS-Filename", // Obsolete
"Description",
0};
diff --git a/apt-pkg/tagfile.h b/apt-pkg/tagfile.h
index 61491aa04..23f5c57e6 100644
--- a/apt-pkg/tagfile.h
+++ b/apt-pkg/tagfile.h
@@ -23,16 +23,16 @@
#include <apt-pkg/fileutl.h>
#include <stdio.h>
-
+
class pkgTagSection
{
const char *Section;
-
// We have a limit of 256 tags per section.
unsigned int Indexes[256];
unsigned int AlphaIndexes[0x100];
-
unsigned int TagCount;
+ // dpointer placeholder (for later in case we need it)
+ void *d;
/* This very simple hash function for the last 8 letters gives
very good performance on the debian package files */
@@ -44,7 +44,6 @@ class pkgTagSection
return Res & 0xFF;
}
-
protected:
const char *Stop;
@@ -80,17 +79,13 @@ class pkgTagSection
};
pkgTagSection() : Section(0), Stop(0) {};
+ virtual ~pkgTagSection() {};
};
+class pkgTagFilePrivate;
class pkgTagFile
{
- FileFd &Fd;
- char *Buffer;
- char *Start;
- char *End;
- bool Done;
- unsigned long iOffset;
- unsigned long Size;
+ pkgTagFilePrivate *d;
bool Fill();
bool Resize();
@@ -98,11 +93,11 @@ class pkgTagFile
public:
bool Step(pkgTagSection &Section);
- inline unsigned long Offset() {return iOffset;};
+ unsigned long Offset();
bool Jump(pkgTagSection &Tag,unsigned long Offset);
pkgTagFile(FileFd *F,unsigned long Size = 32*1024);
- ~pkgTagFile();
+ virtual ~pkgTagFile();
};
/* This is the list of things to rewrite. The rewriter
diff --git a/cmdline/apt-dump-solver.cc b/cmdline/apt-dump-solver.cc
new file mode 100644
index 000000000..dab0cc6fd
--- /dev/null
+++ b/cmdline/apt-dump-solver.cc
@@ -0,0 +1,50 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* #####################################################################
+
+ dummy solver to get quickly a scenario file out of APT
+
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/edsp.h>
+
+#include <config.h>
+
+#include <cstdio>
+ /*}}}*/
+
+// ShowHelp - Show a help screen /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool ShowHelp() {
+
+ std::cout <<
+ PACKAGE " " VERSION " for " COMMON_ARCH " compiled on " __DATE__ " " __TIME__ << std::endl <<
+ "Usage: apt-dump-resolver\n"
+ "\n"
+ "apt-dump-resolver is a dummy solver who just dumps its input to the\n"
+ "file /tmp/dump.edsp and exists with a proper EDSP error.\n"
+ "\n"
+ " This dump has lost Super Cow Powers.\n";
+ return true;
+}
+ /*}}}*/
+int main(int argc,const char *argv[]) /*{{{*/
+{
+ if (argc > 1 && (strcmp(argv[1], "--help") == 0 || strcmp(argv[1],"-h") == 0 ||
+ strcmp(argv[1],"-v") == 0 || strcmp(argv[1],"--version") == 0)) {
+ ShowHelp();
+ return 0;
+ }
+
+ FILE* input = fdopen(STDIN_FILENO, "r");
+ FILE* output = fopen("/tmp/dump.edsp", "w");
+ char buffer[400];
+ while (fgets(buffer, sizeof(buffer), input) != NULL)
+ fputs(buffer, output);
+ fclose(output);
+ fclose(input);
+
+ EDSP::WriteError("ERR_JUST_DUMPING", "I am too dumb, i can just dump!\nPlease use one of my friends instead!", stdout);
+}
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 845c92026..66ebd30b8 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1886,8 +1886,7 @@ bool DoInstall(CommandLine &CmdL)
{
// Call the scored problem resolver
Fix->InstallProtect();
- if (Fix->Resolve(true) == false)
- _error->Discard();
+ Fix->Resolve(true);
delete Fix;
}
@@ -1913,8 +1912,11 @@ bool DoInstall(CommandLine &CmdL)
c1out << _("The following information may help to resolve the situation:") << endl;
c1out << endl;
ShowBroken(c1out,Cache,false);
- return _error->Error(_("Broken packages"));
- }
+ if (_error->PendingError() == true)
+ return false;
+ else
+ return _error->Error(_("Broken packages"));
+ }
}
if (!DoAutomaticRemove(Cache))
return false;
@@ -2297,6 +2299,8 @@ bool DoDownload(CommandLine &CmdL)
strprintf(descr, _("Downloading %s %s"), Pkg.Name(), Ver.VerStr());
// get the most appropriate hash
HashString hash;
+ if (rec.SHA512Hash() != "")
+ hash = HashString("sha512", rec.SHA512Hash());
if (rec.SHA256Hash() != "")
hash = HashString("sha256", rec.SHA256Hash());
else if (rec.SHA1Hash() != "")
@@ -3270,6 +3274,7 @@ int main(int argc,const char *argv[]) /*{{{*/
{0,"install-recommends","APT::Install-Recommends",CommandLine::Boolean},
{0,"install-suggests","APT::Install-Suggests",CommandLine::Boolean},
{0,"fix-policy","APT::Get::Fix-Policy-Broken",0},
+ {0,"solver","APT::Solver",CommandLine::HasArg},
{'c',"config-file",0,CommandLine::ConfigFile},
{'o',"option",0,CommandLine::ArbItem},
{0,0,0,0}};
diff --git a/cmdline/apt-internal-solver.cc b/cmdline/apt-internal-solver.cc
new file mode 100644
index 000000000..ef6c688fe
--- /dev/null
+++ b/cmdline/apt-internal-solver.cc
@@ -0,0 +1,190 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+/* #####################################################################
+
+ cover around the internal solver to be able to run it like an external
+
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/error.h>
+#include <apt-pkg/cmndline.h>
+#include <apt-pkg/init.h>
+#include <apt-pkg/cachefile.h>
+#include <apt-pkg/strutl.h>
+#include <apt-pkg/edsp.h>
+#include <apt-pkg/algorithms.h>
+#include <apt-pkg/fileutl.h>
+
+#include <config.h>
+#include <apti18n.h>
+
+#include <unistd.h>
+#include <cstdio>
+ /*}}}*/
+
+// ShowHelp - Show a help screen /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool ShowHelp(CommandLine &CmdL) {
+ ioprintf(std::cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,VERSION,
+ COMMON_ARCH,__DATE__,__TIME__);
+
+ std::cout <<
+ _("Usage: apt-internal-resolver\n"
+ "\n"
+ "apt-internal-resolver is an interface to use the current internal\n"
+ "like an external resolver for the APT family for debugging or alike\n"
+ "\n"
+ "Options:\n"
+ " -h This help text.\n"
+ " -q Loggable output - no progress indicator\n"
+ " -c=? Read this configuration file\n"
+ " -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
+ "apt.conf(5) manual pages for more information and options.\n"
+ " This APT has Super Cow Powers.\n");
+ return true;
+}
+ /*}}}*/
+int main(int argc,const char *argv[]) /*{{{*/
+{
+ CommandLine::Args Args[] = {
+ {'h',"help","help",0},
+ {'v',"version","version",0},
+ {'q',"quiet","quiet",CommandLine::IntLevel},
+ {'q',"silent","quiet",CommandLine::IntLevel},
+ {'c',"config-file",0,CommandLine::ConfigFile},
+ {'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;
+ }
+
+ // See if the help should be shown
+ if (_config->FindB("help") == true ||
+ _config->FindB("version") == true) {
+ ShowHelp(CmdL);
+ return 1;
+ }
+
+ if (CmdL.FileList[0] != 0 && strcmp(CmdL.FileList[0], "scenario") == 0)
+ {
+ if (pkgInitSystem(*_config,_system) == false) {
+ std::cerr << "System could not be initialized!" << std::endl;
+ return 1;
+ }
+ pkgCacheFile CacheFile;
+ CacheFile.Open(NULL, false);
+ APT::PackageSet pkgset = APT::PackageSet::FromCommandLine(CacheFile, CmdL.FileList + 1);
+ FILE* output = stdout;
+ if (pkgset.empty() == true)
+ EDSP::WriteScenario(CacheFile, output);
+ else
+ EDSP::WriteLimitedScenario(CacheFile, output, pkgset);
+ fclose(output);
+ _error->DumpErrors(std::cerr);
+ return 0;
+ }
+
+ // Deal with stdout not being a tty
+ if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
+ _config->Set("quiet","1");
+
+ if (_config->FindI("quiet", 0) < 1)
+ _config->Set("Debug::EDSP::WriteSolution", true);
+
+ _config->Set("APT::Solver", "internal");
+ _config->Set("edsp::scenario", "stdin");
+ int input = STDIN_FILENO;
+ FILE* output = stdout;
+ SetNonBlock(input, false);
+
+ EDSP::WriteProgress(0, "Start up solver…", output);
+
+ if (pkgInitSystem(*_config,_system) == false) {
+ std::cerr << "System could not be initialized!" << std::endl;
+ return 1;
+ }
+
+ EDSP::WriteProgress(1, "Read request…", output);
+
+ if (WaitFd(input, false, 5) == false)
+ std::cerr << "WAIT timed out in the resolver" << std::endl;
+
+ std::list<std::string> install, remove;
+ bool upgrade, distUpgrade, autoRemove;
+ if (EDSP::ReadRequest(input, install, remove, upgrade, distUpgrade, autoRemove) == false) {
+ std::cerr << "Parsing the request failed!" << std::endl;
+ return 2;
+ }
+
+ EDSP::WriteProgress(5, "Read scenario…", output);
+
+ pkgCacheFile CacheFile;
+ CacheFile.Open(NULL, false);
+
+ EDSP::WriteProgress(50, "Apply request on scenario…", output);
+
+ if (EDSP::ApplyRequest(install, remove, CacheFile) == false) {
+ std::cerr << "Failed to apply request to depcache!" << std::endl;
+ return 3;
+ }
+
+ pkgProblemResolver Fix(CacheFile);
+ for (std::list<std::string>::const_iterator i = remove.begin();
+ i != remove.end(); ++i) {
+ pkgCache::PkgIterator P = CacheFile->FindPkg(*i);
+ Fix.Clear(P);
+ Fix.Protect(P);
+ Fix.Remove(P);
+ }
+
+ for (std::list<std::string>::const_iterator i = install.begin();
+ i != install.end(); ++i) {
+ pkgCache::PkgIterator P = CacheFile->FindPkg(*i);
+ Fix.Clear(P);
+ Fix.Protect(P);
+ }
+
+ for (std::list<std::string>::const_iterator i = install.begin();
+ i != install.end(); ++i)
+ CacheFile->MarkInstall(CacheFile->FindPkg(*i), true);
+
+ EDSP::WriteProgress(60, "Call problemresolver on current scenario…", output);
+
+ if (upgrade == true) {
+ if (pkgAllUpgrade(CacheFile) == false) {
+ EDSP::WriteError("ERR_UNSOLVABLE_UPGRADE", "An upgrade error occured", output);
+ return 0;
+ }
+ } else if (distUpgrade == true) {
+ if (pkgDistUpgrade(CacheFile) == false) {
+ EDSP::WriteError("ERR_UNSOLVABLE_DIST_UPGRADE", "An dist-upgrade error occured", output);
+ return 0;
+ }
+ } else if (Fix.Resolve() == false) {
+ EDSP::WriteError("ERR_UNSOLVABLE", "An error occured", output);
+ return 0;
+ }
+
+ EDSP::WriteProgress(95, "Write solution…", output);
+
+ if (EDSP::WriteSolution(CacheFile, output) == false) {
+ std::cerr << "Failed to output the solution!" << std::endl;
+ return 4;
+ }
+
+ EDSP::WriteProgress(100, "Done", output);
+
+ bool const Errors = _error->PendingError();
+ if (_config->FindI("quiet",0) > 0)
+ _error->DumpErrors(std::cerr);
+ else
+ _error->DumpErrors(std::cerr, GlobalError::DEBUG);
+ return Errors == true ? 100 : 0;
+}
+ /*}}}*/
diff --git a/cmdline/makefile b/cmdline/makefile
index e867dae73..6d988a8f5 100644
--- a/cmdline/makefile
+++ b/cmdline/makefile
@@ -65,3 +65,17 @@ include $(PROGRAM_H)
#TO=$(BIN)
#TARGET=program
#include $(COPY_H)
+
+# The internal solver acting as an external
+PROGRAM=apt-internal-solver
+SLIBS = -lapt-pkg $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile
+SOURCE = apt-internal-solver.cc
+include $(PROGRAM_H)
+
+# The internal solver acting as an external
+PROGRAM=apt-dump-solver
+SLIBS = -lapt-pkg $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile
+SOURCE = apt-dump-solver.cc
+include $(PROGRAM_H)
diff --git a/debian/apt-doc.docs b/debian/apt-doc.docs
index 86aa69ceb..4ec23f55d 100644
--- a/debian/apt-doc.docs
+++ b/debian/apt-doc.docs
@@ -1,2 +1,3 @@
README.progress-reporting
README.MultiArch
+doc/external-dependency-solver-protocol.txt
diff --git a/debian/apt-utils.dirs b/debian/apt-utils.dirs
index 14f5b95d7..681e55192 100644
--- a/debian/apt-utils.dirs
+++ b/debian/apt-utils.dirs
@@ -1,2 +1,2 @@
-usr/lib
+usr/lib/apt/solvers
usr/bin
diff --git a/debian/apt-utils.links b/debian/apt-utils.links
new file mode 100644
index 000000000..5bf138c4a
--- /dev/null
+++ b/debian/apt-utils.links
@@ -0,0 +1 @@
+usr/bin/apt-internal-solver usr/lib/apt/solvers/apt
diff --git a/debian/apt.dirs b/debian/apt.dirs
index 2770d79bb..f9c0b6c3e 100644
--- a/debian/apt.dirs
+++ b/debian/apt.dirs
@@ -1,5 +1,6 @@
usr/bin
usr/lib/apt/methods
+usr/lib/apt/solvers
usr/lib/dpkg/methods/apt
etc/apt
etc/apt/apt.conf.d
diff --git a/debian/changelog b/debian/changelog
index a62003a0e..701f03252 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,37 @@
+apt (0.8.16~exp2) UNRELEASEDexperimental; urgency=low
+
+ [ David Kalnischkies ]
+ * [ABI-Break] Implement EDSP in libapt-pkg so that all front-ends which
+ use the internal resolver can now be used also with external
+ ones as the usage is hidden in between the old API
+ * provide two edsp solvers in apt-utils:
+ - 'dump' to quickly output a complete scenario and
+ - 'apt' to use the internal as an external resolver
+ * apt-pkg/pkgcache.h:
+ - clean up mess with the "all" handling in MultiArch to
+ fix LP: #733741 cleanly for everyone now
+ * apt-pkg/depcache.cc:
+ - use a boolean instead of an int for Add/Remove in AddStates
+ similar to how it works with AddSizes
+ - let the Mark methods return if their marking was successful
+ - if a Breaks can't be upgraded, remove it. If it or a Conflict
+ can't be removed the installation of the breaker fails.
+ * cmdline/apt-get.cc:
+ - do not discard the error messages from the resolver and instead
+ only show the general 'Broken packages' message if nothing else
+
+ [ Stefano Zacchiroli ]
+ * doc/external-dependency-solver-protocol.txt:
+ - describe EDSP and the configuration interface around it
+
+ [ Michael Vogt ]
+ * [ABI-Break] merge lp:~mvo/apt/sha512-template to add support for sha512
+ * [ABI-Break] merge lp:~mvo/apt/dpointer to support easier extending
+ without breaking the ABI
+ * increase ABI version and update package names
+
+ -- Michael Vogt <michael.vogt@ubuntu.com> Wed, 29 Jun 2011 12:26:54 +0100
+
apt (0.8.16~exp1) experimental; urgency=low
* merged with the debian/unstable upload
@@ -217,6 +251,81 @@ apt (0.8.15~exp1) experimental; urgency=low
-- Michael Vogt <mvo@debian.org> Fri, 10 Jun 2011 15:32:07 +0200
+apt (0.8.14.2) UNRELEASED; urgency=low
+
+ [ Julian Andres Klode ]
+ * apt-pkg/depcache.cc:
+ - Really release action groups only once (Closes: #622744)
+ - Make purge work again for config-files (LP: #244598) (Closes: #150831)
+ * debian/apt.cron.daily:
+ - Check power after wait, patch by manuel-soto (LP: #705269)
+ * debian/control:
+ - Move ${shlibs:Depends} to Pre-Depends, as we do not want APT
+ unpacked if a library is too old and thus break upgrades
+ * doc/apt-key.8.xml:
+ - Document apt-key net-update (LP: #192810)
+
+ [ Christian Perrier ]
+ * Galician translation update (Miguel Anxo Bouzada). Closes: #626505
+
+ [ David Kalnischkies ]
+ * fix a bunch of cppcheck warnings/errors based on a patch by
+ Niels Thykier, thanks! (Closes: #622805)
+ * apt-pkg/depcache.cc:
+ - really include 'rc' packages in the delete count by fixing a
+ typo which exists since 1999 in the source… (LP: #761175)
+ - if critical or-group can't be satisfied, exit directly.
+ * apt-pkg/acquire-method.cc:
+ - write directly to stdout instead of creating the message in
+ memory first before writing to avoid hitting limits
+ - fix order of CurrentURI and UsedMirror in Status() and Log()
+ * apt-pkg/orderlist.cc:
+ - let VisitRProvides report if the calls were successful
+ * apt-pkg/deb/dpkgpm.cc:
+ - replace obsolete usleep with nanosleep
+ * debian/apt{,-utils}.symbols:
+ - update both experimental symbol-files to reflect 0.8.14 state
+ * debian/rules:
+ - remove unused embedded jquery by doxygen from libapt-pkg-doc
+ * cmdline/apt-mark.cc:
+ - reimplement apt-mark in c++
+ - provide a 'showmanual' command (Closes: #582791)
+ - provide a 'dpkg --set-selections' wrapper to set/release holds
+ * cmdline/apt-get.cc:
+ - deprecate mostly undocumented 'markauto' in favor of 'apt-mark'
+ * cmdline/apt-cache.cc:
+ - deprecate mostly undocumented 'showauto' in favor of 'apt-mark'
+ * apt-pkg/pkgcache.cc:
+ - really ignore :arch in FindPkg() in non-multiarch environment
+ * doc/po/de.po:
+ - undo the translation of the command 'dump' in manpage of apt-config
+ as report by Burghard Grossmann on debian-l10n-german, thanks!
+ * apt-pkg/deb/debmetaindex.cc:
+ - do not download TranslationIndex if no Translation-* will be
+ downloaded later on anyway (Closes: #624218)
+ * test/versions.lst:
+ - disable obscure version number tests with versions dpkg doesn't
+ allow any more as they don't start with a number
+ * apt-pkg/acquire-worker.cc:
+ - print filename in the unmatching size warning (Closes: #623137)
+ * apt-pkg/acquire-item.cc:
+ - apply fix for poorly worded 'locate file' error message from
+ Ben Finney, thanks! (Closes: #623171)
+ * methods/http.cc:
+ - add config option to ignore a closed stdin to be able to easily
+ use the method as a simple standalone downloader
+ - Location header in redirects should be absolute URI, but some
+ servers just send an absolute path so still deal with it properly
+ - dequote URL taken from Location in redirects as we will otherwise
+ quote an already quoted string in the request later (Closes: #602412)
+ * apt-pkg/contrib/netrc.cc:
+ - replace non-posix gnu-extension strdupa with strdup
+ * apt-pkg/packagemanager.cc:
+ - ensure for Multi-Arch:same packages that they are unpacked in
+ lock step even in immediate configuration (Closes: #618288)
+
+ -- Michael Vogt <mvo@debian.org> Mon, 16 May 2011 14:57:52 +0200
+
apt (0.8.14.1) unstable; urgency=low
* apt-pkg/acquire-item.cc:
diff --git a/debian/control b/debian/control
index 512a132f6..8d85b48e8 100644
--- a/debian/control
+++ b/debian/control
@@ -35,11 +35,10 @@ Description: APT's commandline package manager
* apt-config as an interface to the configuration settings
* apt-key as an interface to manage authentication keys
-Package: libapt-pkg4.10
+Package: libapt-pkg4.11
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Replaces: apt (<< 0.8.15)
-Breaks: apt (<< 0.8.15)
Description: APT's package managment runtime library
This library provides the common functionality for searching and
managing packages as well as information about packages.
@@ -56,11 +55,10 @@ Description: APT's package managment 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.2
+Package: libapt-inst1.3
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Replaces: apt-utils (<< 0.8.15), apt (<< 0.8.15)
-Breaks: apt (<< 0.8.15), apt-utils (<< 0.8.15)
Description: APT's deb package format runtime library
This library provides methods to query and extract information
from deb packages. This includes the control data and the package
diff --git a/debian/libapt-inst1.2.install b/debian/libapt-inst1.3.install
index b7b63be81..b7b63be81 100644
--- a/debian/libapt-inst1.2.install
+++ b/debian/libapt-inst1.3.install
diff --git a/debian/libapt-inst1.2.symbols b/debian/libapt-inst1.3.symbols
index d9ea55b3d..d9ea55b3d 100644
--- a/debian/libapt-inst1.2.symbols
+++ b/debian/libapt-inst1.3.symbols
diff --git a/debian/libapt-pkg4.10.install b/debian/libapt-pkg4.11.install
index 91b39a31b..91b39a31b 100644
--- a/debian/libapt-pkg4.10.install
+++ b/debian/libapt-pkg4.11.install
diff --git a/debian/libapt-pkg4.10.symbols b/debian/libapt-pkg4.11.symbols
index 16b630214..16b630214 100644
--- a/debian/libapt-pkg4.10.symbols
+++ b/debian/libapt-pkg4.11.symbols
diff --git a/debian/rules b/debian/rules
index b6f45a38e..ef30568d5 100755
--- a/debian/rules
+++ b/debian/rules
@@ -62,7 +62,7 @@ configure.in:
endif
# APT Programs in apt-utils
-APT_UTILS=ftparchive sortpkgs extracttemplates
+APT_UTILS=ftparchive sortpkgs extracttemplates internal-solver
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
@@ -189,7 +189,7 @@ apt: build build-doc
dh_install -p$@ --sourcedir=$(BLD)
# Remove the bits that are in apt-utils
- rm $(addprefix debian/$@/usr/bin/apt-,$(APT_UTILS))
+ rm $(addprefix debian/$@/usr/bin/apt-,$(APT_UTILS) dump-solver)
# https has its own package
rm debian/$@/usr/lib/apt/methods/https
@@ -242,8 +242,10 @@ apt-utils: build
dh_installdirs -p$@
cp $(addprefix $(BLD)/bin/apt-,$(APT_UTILS)) debian/$@/usr/bin/
+ cp $(BLD)/bin/apt-dump-solver debian/$@/usr/lib/apt/solvers/dump
dh_install -p$@ --sourcedir=$(BLD)
+ dh_link -p$@
dh_installdocs -p$@
dh_installexamples -p$@
diff --git a/doc/external-dependency-solver-protocol.txt b/doc/external-dependency-solver-protocol.txt
new file mode 100644
index 000000000..7a124d8f9
--- /dev/null
+++ b/doc/external-dependency-solver-protocol.txt
@@ -0,0 +1,299 @@
+# APT External Dependency Solver Protocol (EDSP) - version 0.4
+
+This document describes the communication protocol between APT and
+external dependency solvers. The protocol is called APT EDSP, for "APT
+External Dependency Solver Protocol".
+
+
+## Components
+
+- **APT**: we know this one.
+- APT is equipped with its own **internal solver** for dependencies,
+ which is identified by the string `internal`.
+- **External solver**: an *external* software component able to resolve
+ dependencies on behalf of APT.
+
+At each interaction with APT, a single solver is in use. When there is
+a total of 2 or more solvers, internals or externals, the user can
+choose which one to use.
+
+Each solver is identified by an unique string, the **solver
+name**. Solver names must be formed using only alphanumeric ASCII
+characters, dashes, and underscores; solver names must start with a
+lowercase ASCII letter. The special name `internal` denotes APT's
+internal solver, is reserved, and cannot be used by external solvers.
+
+
+## Installation
+
+Each external solver is installed as a file under Dir::Bin::Solvers (see
+below), which defaults to `/usr/lib/apt/solvers`. We will assume in the
+remainder of this section that such a default value is in effect.
+
+The naming scheme is `/usr/lib/apt/solvers/NAME`, where `NAME` is the
+name of the external solver.
+
+Each file under `/usr/lib/apt/solvers` corresponding to an external
+solver must be executable.
+
+No non-solver files must be installed under `/usr/lib/apt/solvers`, so
+that an index of available external solvers can be obtained by listing
+the content of that directory.
+
+
+## Configuration
+
+Several APT options can be used to affect dependency solving in APT. An
+overview of them is given below. Please refer to proper APT
+configuration documentation for more, and more up to date, information.
+
+- **APT::Solver**: the name of the solver to be used for
+ dependency solving. Defaults to `internal`
+
+- **APT::Solver::Strict-Pinning**: whether pinning must be strictly
+ respected (as the internal solver does) or can be slightly deviated
+ from. Defaults to `yes`.
+
+- **APT::Solver::NAME::Preferences** (where NAME is a solver name):
+ solver-specific user preference string used during dependency solving,
+ when the solver NAME is in use. Check solver-specific documentation
+ for what is supported here. Defaults to the empty string.
+
+- **Dir::Bin::Solvers**: absolute path of the directory where to look for
+ external solvers. Defaults to `/usr/lib/apt/solvers`.
+
+## Protocol
+
+When configured to use an external solver, APT will resort to it to
+decide which packages should be installed or removed.
+
+The interaction happens **in batch**: APT will invoke the external
+solver passing the current status of installed and available packages,
+as well as the user request to alter the set of installed packages. The
+external solver will compute a new complete set of installed packages
+and gives APT a "diff" listing of which *additional* packages should be
+installed and of which currently installed packages should be
+*removed*. (Note: the order in which those actions have to be performed
+will be up to APT to decide.)
+
+External solvers are invoked by executing them. Communications happens
+via the file descriptors: **stdin** (standard input) and **stdout**
+(standard output). stderr is not used by the EDSP protocol. Solvers can
+therefore use stderr to dump debugging information that could be
+inspected separately.
+
+After invocation, the protocol passes through a sequence of phases:
+
+1. APT invokes the external solver
+2. APT send to the solver a dependency solving **scenario**
+3. The solver solves dependencies. During this phase the solver may
+ send, repeatedly, **progress** information to APT.
+4. The solver sends back to APT an **answer**, i.e. either a *solution*
+ or an *error* report.
+5. The external solver exits
+
+
+### Scenario
+
+A scenario is a text file encoded in a format very similar to the "Deb
+822" format (AKA "the format used by Debian `Packages` files"). A
+scenario consists of two distinct parts: a **request** and a **package
+universe**, occurring in that order. The request consists of a single
+Deb 822 stanza, while the package universe consists of several such
+stanzas. All stanzas occurring in a scenario are separated by an empty
+line.
+
+
+#### Request
+
+Within a dependency solving scenario, a request represents the action on
+installed packages requested by the user.
+
+A request is a single Deb 822 stanza opened by a mandatory Request field
+and followed by a mixture of action and preference fields.
+
+The value of the **Request:** field is a string describing the EDSP
+protocol which will be used to communicate. At present, the string must
+be `EDSP 0.4`.
+
+a unique request identifier, such as an
+UUID. Request fields are mainly used to identify the beginning of a
+request stanza; their actual values are otherwise not used by the EDSP
+protocol.
+
+The following **action fields** are supported in request stanzas:
+
+- **Install:** (optional, defaults to the empty string) A space
+ separated list of package names, with *no version attached*, to
+ install. This field denotes a list of packages that the user wants to
+ install, usually via an APT `install` request.
+
+- **Remove:** (optional, defaults to the empty string) Same syntax of
+ Install. This field denotes a list of packages that the user wants to
+ remove, usually via APT `remove` or `purge` requests.
+
+- **Upgrade:** (optional, defaults to `no`). Allowed values: `yes`,
+ `no`. When set to `yes`, an upgrade of all installed packages has been
+ requested, usually via an APT `upgrade` request.
+
+- **Dist-Upgrade:** (optional, defaults to `no`). Allowed values: `yes`,
+ `no`. Same as Upgrade, but for APT `dist-upgrade` requests.
+
+- **Autoremove:** (optional, defaults to `no`). Allowed values: `yes`,
+ `no`. When set to `yes`, a clean up of unused automatically installed
+ packages has been requested, usually via an APT `autoremove` request.
+
+The following **preference fields** are supported in request stanzas:
+
+- **Strict-Pinning:** (optional, defaults to `yes`). Allowed values:
+ `yes`, `no`. When set to `yes`, APT pinning is strict, in the sense
+ that the solver must not propose to install packages which are not APT
+ candidates (see the `APT-Pin` and `APT-Candidate` fields in the
+ package universe). When set to `no`, the solver does only a best
+ effort attempt to install APT candidates. Usually, the value of this
+ field comes from the `APT::Solver::Strict-Pinning` configuration
+ option.
+
+- **Preferences:** a solver-specific optimization string, usually coming
+ from the `APT::Solver::Preferences` configuration option.
+
+
+#### Package universe
+
+A package universe is a list of Deb 822 stanzas, one per package, called
+**package stanzas**. Each package stanzas starts with a Package
+field. The following fields are supported in package stanzas:
+
+- All fields contained in the dpkg database, with the exception of
+ fields marked as "internal" (see the manpage `dpkg-query (1)`). Among
+ those fields, the following are mandatory for all package stanzas:
+ Package, Version, Architecture.
+
+ It is recommended not to pass the Description field to external
+ solvers or, alternatively, to trim it to the short description only.
+
+- **Installed:** (optional, defaults to `no`). Allowed values: `yes`,
+ `no`. When set to `yes`, the corresponding package is currently
+ installed.
+
+ Note: the Status field present in the dpkg database must not be passed
+ to the external solver, as it's an internal dpkg field. Installed and
+ other fields permit to encode the most relevant aspects of Status in
+ communications with solvers.
+
+- **Hold:** (optional, defaults to `no`). Allowed values: `yes`,
+ `no`. When set to `yes`, the corresponding package is marked as "on
+ hold" by dpkg.
+
+- **APT-ID:** (mandatory). Unique package identifier, according to APT.
+
+- **APT-Pin:** (mandatory). Must be an integer. Package pin value,
+ according to APT policy.
+
+- **APT-Candidate:** (optional, defaults to `no`). Allowed values:
+ `yes`, `no`. When set to `yes`, the corresponding package is the APT
+ candidate for installation among all available packages with the same
+ name.
+
+- **APT-Automatic:** (optional, defaults to `no`). Allowed values:
+ `yes`, `no`. When set to `yes`, the corresponding package is marked by
+ APT as automatic installed. Note that automatic installed packages
+ should be removed by the solver only when the Autoremove action is
+ requested (see Request section).
+
+### Answer
+
+An answer from the external solver to APT is either a *solution* or an
+*error*.
+
+The following invariant on **exit codes** must hold true. When the
+external solver is *able to find a solution*, it will write the solution
+to standard output and then exit with an exit code of 0. When the
+external solver is *unable to find a solution* (and s aware of that), it
+will write an error to standard output and then exit with an exit code
+of 0. An exit code other than 0 will be interpreted as a solver crash
+with no meaningful error about dependency resolution to convey to the
+user.
+
+
+#### Solution
+
+A solution is a list of Deb 822 stanzas. Each of them could be an
+install stanza (telling APT to install a specific package), a remove
+stanza (telling APT to remove one), or an autoremove stanza (telling APT
+about the *future* possibility of removing a package using the
+Autoremove action).
+
+An **install stanza** starts with an Install field and supports the
+following fields:
+
+- **Install:** (mandatory). The value is a package identifier,
+ referencing one of the package stanzas of the package universe via its
+ APT-ID field.
+
+- All fields supported by package stanzas.
+
+**Remove stanzas** are similar to install stanzas, but have **Remove**
+fields instead of Install fields.
+
+**Autoremove stanzas** are similar to install stanzas, but have
+**Autoremove** fields instead of Install fields. Autoremove stanzas
+should be output so that APT can inform the user of which packages they
+can now autoremove, as a consequence of the executed action. However,
+this protocol makes no assumption on the fact that a subsequent
+invocation of an Autoremove action will actually remove the very same
+packages indicated by Autoremove stanzas in the former solution.
+
+In terms of expressivity, install and remove stanzas can carry one
+single field each, as APT-IDs are enough to pinpoint packages to be
+installed/removed. Nonetheless, for protocol readability, it is
+recommended that solvers either add unconditionally the fields Package,
+Version, and Architecture to all install/remove stanzas or,
+alternatively, that they support a `--verbose` command line flag that
+explicitly enables the output of those fields in solutions.
+
+
+#### Error
+
+An error is a single Deb 822 stanza, starting the field Error. The
+following fields are supported in error stanzas:
+
+- **Error:** (mandatory). The value of this field is ignored, although
+ it should be a unique error identifier, such as a UUID.
+
+- **Message:** (mandatory). The value of this field is a text string,
+ meant to be read by humans, that explains the cause of the solver
+ error. Message fields might be multi-line, like the Description field
+ in the dpkg database. The first line conveys a short message, which
+ can be explained in more details using subsequent lines.
+
+
+### Progress
+
+During dependency solving, an external solver may send progress
+information to APT using **progress stanzas**. A progress stanza starts
+with the Progress field and might contain the following fields:
+
+- **Progress:** (mandatory). The value of this field is a date and time
+ timestamp, in RFC 2822 format. The timestamp provides a time
+ annotation for the progress report.
+
+- **Percentage:** (optional). An integer from 0 to 100, representing the
+ completion of the dependency solving process, as declared by the
+ solver.
+
+- **Message:** (optional). A textual message, meant to be read by the
+ APT user, telling what is going on within the dependency solving
+ (e.g. the current phase of dependency solving, as declared by the
+ solver).
+
+
+# Future extensions
+
+Potential future extensions to this protocol, listed in no specific
+order, include:
+
+- fixed error types to identify common failures across solvers and
+ enable APT to translate error messages
+- structured error data to explain failures in terms of packages and
+ dependencies
diff --git a/doc/po/de.po b/doc/po/de.po
index 5cb2b708d..a608161d3 100644
--- a/doc/po/de.po
+++ b/doc/po/de.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: apt-doc 0.8.14-1\n"
"Report-Msgid-Bugs-To: APT Development Team <deity@lists.debian.org>\n"
-"POT-Creation-Date: 2011-02-14 13:42+0100\n"
+"POT-Creation-Date: 2011-06-08 16:54+0300\n"
"PO-Revision-Date: 2011-05-31 21:00+0100\n"
"Last-Translator: Chris Leick <c.leick@vollbio.de>\n"
"Language-Team: German <debian-l10n-german@lists.debian.org>\n"
@@ -735,7 +735,7 @@ msgstr ""
#. type: Content of: <refentry><refsect1><title>
#: apt-cache.8.xml:64 apt-cdrom.8.xml:50 apt-config.8.xml:50
#: apt-extracttemplates.1.xml:46 apt-ftparchive.1.xml:59 apt-get.8.xml:114
-#: apt-key.8.xml:38 apt-mark.8.xml:55 apt-secure.8.xml:43
+#: apt-key.8.xml:38 apt-mark.8.xml:56 apt-secure.8.xml:43
#: apt-sortpkgs.1.xml:47 apt.conf.5.xml:42 apt_preferences.5.xml:36
#: sources.list.5.xml:36
msgid "Description"
@@ -1254,7 +1254,7 @@ msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
#: apt-cache.8.xml:278 apt-config.8.xml:96 apt-extracttemplates.1.xml:59
-#: apt-ftparchive.1.xml:525 apt-get.8.xml:331 apt-mark.8.xml:92
+#: apt-ftparchive.1.xml:525 apt-get.8.xml:331 apt-mark.8.xml:126
#: apt-sortpkgs.1.xml:57 apt.conf.5.xml:560 apt.conf.5.xml:582
msgid "options"
msgstr "Optionen"
@@ -1282,7 +1282,7 @@ msgstr ""
"pkgcache</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-cache.8.xml:288 apt-ftparchive.1.xml:568 apt-get.8.xml:393
+#: apt-cache.8.xml:288 apt-ftparchive.1.xml:571 apt-get.8.xml:393
#: apt-sortpkgs.1.xml:61
msgid "<option>-s</option>"
msgstr "<option>-s</option>"
@@ -1310,12 +1310,12 @@ msgstr ""
"srcpkgcache</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-cache.8.xml:296 apt-ftparchive.1.xml:542 apt-get.8.xml:383
+#: apt-cache.8.xml:296 apt-ftparchive.1.xml:545 apt-get.8.xml:383
msgid "<option>-q</option>"
msgstr "<option>-q</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-cache.8.xml:296 apt-ftparchive.1.xml:542 apt-get.8.xml:383
+#: apt-cache.8.xml:296 apt-ftparchive.1.xml:545 apt-get.8.xml:383
msgid "<option>--quiet</option>"
msgstr "<option>--quiet</option>"
@@ -1430,7 +1430,7 @@ msgstr ""
"Konfigurationselement: <literal>APT::Cache::ShowFull</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-cache.8.xml:328 apt-cdrom.8.xml:134 apt-ftparchive.1.xml:580
+#: apt-cache.8.xml:328 apt-cdrom.8.xml:134 apt-ftparchive.1.xml:583
msgid "<option>-a</option>"
msgstr "<option>-a</option>"
@@ -1547,14 +1547,14 @@ msgstr ""
#. type: Content of: <refentry><refsect1><variablelist>
#: apt-cache.8.xml:367 apt-cdrom.8.xml:153 apt-config.8.xml:101
-#: apt-extracttemplates.1.xml:70 apt-ftparchive.1.xml:608 apt-get.8.xml:570
-#: apt-sortpkgs.1.xml:67
+#: apt-extracttemplates.1.xml:70 apt-ftparchive.1.xml:611 apt-get.8.xml:570
+#: apt-mark.8.xml:140 apt-sortpkgs.1.xml:67
msgid "&apt-commonoptions;"
msgstr "&apt-commonoptions;"
#. type: Content of: <refentry><refsect1><title>
-#: apt-cache.8.xml:372 apt-get.8.xml:575 apt-key.8.xml:156 apt-mark.8.xml:125
-#: apt.conf.5.xml:1093 apt_preferences.5.xml:649
+#: apt-cache.8.xml:372 apt-get.8.xml:575 apt-key.8.xml:172 apt-mark.8.xml:144
+#: apt.conf.5.xml:1093 apt_preferences.5.xml:697
msgid "Files"
msgstr "Dateien"
@@ -1565,9 +1565,9 @@ msgstr "&file-sourceslist; &file-statelists;"
#. type: Content of: <refentry><refsect1><title>
#: apt-cache.8.xml:379 apt-cdrom.8.xml:158 apt-config.8.xml:106
-#: apt-extracttemplates.1.xml:77 apt-ftparchive.1.xml:624 apt-get.8.xml:585
-#: apt-key.8.xml:177 apt-mark.8.xml:131 apt-secure.8.xml:185
-#: apt-sortpkgs.1.xml:72 apt.conf.5.xml:1099 apt_preferences.5.xml:656
+#: apt-extracttemplates.1.xml:77 apt-ftparchive.1.xml:627 apt-get.8.xml:585
+#: apt-key.8.xml:193 apt-mark.8.xml:150 apt-secure.8.xml:185
+#: apt-sortpkgs.1.xml:72 apt.conf.5.xml:1099 apt_preferences.5.xml:704
#: sources.list.5.xml:234
msgid "See Also"
msgstr "Siehe auch"
@@ -1579,8 +1579,8 @@ msgstr "&apt-conf;, &sources-list;, &apt-get;"
#. type: Content of: <refentry><refsect1><title>
#: apt-cache.8.xml:384 apt-cdrom.8.xml:163 apt-config.8.xml:111
-#: apt-extracttemplates.1.xml:81 apt-ftparchive.1.xml:628 apt-get.8.xml:591
-#: apt-mark.8.xml:135 apt-sortpkgs.1.xml:76
+#: apt-extracttemplates.1.xml:81 apt-ftparchive.1.xml:631 apt-get.8.xml:591
+#: apt-mark.8.xml:154 apt-sortpkgs.1.xml:76
msgid "Diagnostics"
msgstr "Diagnose"
@@ -1709,12 +1709,12 @@ msgstr ""
"<placeholder type=\"variablelist\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><title>
-#: apt-cdrom.8.xml:94 apt-key.8.xml:142
+#: apt-cdrom.8.xml:94 apt-key.8.xml:158
msgid "Options"
msgstr "Optionen"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-cdrom.8.xml:98 apt-ftparchive.1.xml:536 apt-get.8.xml:345
+#: apt-cdrom.8.xml:98 apt-ftparchive.1.xml:539 apt-get.8.xml:345
msgid "<option>-d</option>"
msgstr "<option>-d</option>"
@@ -1968,7 +1968,7 @@ msgid "Just show the contents of the configuration space."
msgstr "Nur der Inhalt des Konfigurationsbereichs wird angezeigt."
#. type: Content of: <refentry><refsect1><para>
-#: apt-config.8.xml:107 apt-extracttemplates.1.xml:78 apt-ftparchive.1.xml:625
+#: apt-config.8.xml:107 apt-extracttemplates.1.xml:78 apt-ftparchive.1.xml:628
#: apt-sortpkgs.1.xml:73
msgid "&apt-conf;"
msgstr "&apt-conf;"
@@ -3128,27 +3128,43 @@ msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
#: apt-ftparchive.1.xml:529
-msgid "<option>--md5</option>"
-msgstr "<option>--md5</option>"
+msgid ""
+"<option>--md5</option>, <option>--sha1</option>, <option>--sha256</option>"
+msgstr ""
+"<option>--md5</option>, <option>--sha1</option>, <option>--sha256</option>"
+# FIXME <literal>Checksum</literal> im letzten Abschnitt <replaceable>?
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
#: apt-ftparchive.1.xml:531
msgid ""
-"Generate MD5 sums. This defaults to on, when turned off the generated index "
-"files will not have MD5Sum fields where possible. Configuration Item: "
-"<literal>APT::FTPArchive::MD5</literal>"
-msgstr ""
-"Generiert MD5-Summen. Dies ist standardmäßig an, wenn es ausgeschaltet ist, "
-"haben die generierten Indexdateien keine MD5Sum-Felder, sofern dies möglich "
-"ist. Konfigurationselement: <literal>APT::FTPArchive::MD5</literal>"
-
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:536
+"Generate the given checksum. These options default to on, when turned off "
+"the generated index files will not have the checksum fields where possible. "
+"Configuration Items: <literal>APT::FTPArchive::<replaceable>Checksum</"
+"replaceable></literal> and <literal>APT::FTPArchive::<replaceable>Index</"
+"replaceable>::<replaceable>Checksum</replaceable></literal> where "
+"<literal>Index</literal> can be <literal>Packages</literal>, "
+"<literal>Sources</literal> or <literal>Release</literal> and "
+"<literal>Checksum</literal> can be <literal>MD5</literal>, <literal>SHA1</"
+"literal> or <literal>SHA256</literal>."
+msgstr ""
+"erzeugt die vorgegebene Prüfsumme. Diese Optionen sind standardmäßig "
+"aktiviert. Wenn sie deaktiviert sind, werden die erzeugten Indexdateien nach "
+"Möglichkeit keine Prüfsummenfelder erhalten. Konfigurationselemente: "
+"<literal>APT::FTPArchive::<replaceable>Prüfsumme</replaceable></literal> und "
+"<literal>APT::FTPArchive::<replaceable>Index</replaceable>::"
+"<replaceable>Prüfsumme</replaceable></literal>, wobei <literal>Index</"
+"literal> <literal>Packages</literal>, <literal>Sources</literal> oder "
+"<literal>Release</literal> sein kann und <literal>Checksum</literal> "
+"<literal>MD5</literal>, <literal>SHA1</literal> oder <literal>SHA256</"
+"literal> sein kann."
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
+#: apt-ftparchive.1.xml:539
msgid "<option>--db</option>"
msgstr "<option>--db</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:538
+#: apt-ftparchive.1.xml:541
msgid ""
"Use a binary caching DB. This has no effect on the generate command. "
"Configuration Item: <literal>APT::FTPArchive::DB</literal>."
@@ -3158,7 +3174,7 @@ msgstr ""
"DB</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:544
+#: apt-ftparchive.1.xml:547
msgid ""
"Quiet; produces output suitable for logging, omitting progress indicators. "
"More q's will produce more quiet up to a maximum of 2. You can also use "
@@ -3172,12 +3188,12 @@ msgstr ""
"Konfigurationselement: <literal>quiet</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:550
+#: apt-ftparchive.1.xml:553
msgid "<option>--delink</option>"
msgstr "<option>--delink</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:552
+#: apt-ftparchive.1.xml:555
msgid ""
"Perform Delinking. If the <literal>External-Links</literal> setting is used "
"then this option actually enables delinking of the files. It defaults to on "
@@ -3191,12 +3207,12 @@ msgstr ""
"DeLinkAct</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:558
+#: apt-ftparchive.1.xml:561
msgid "<option>--contents</option>"
msgstr "<option>--contents</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:560
+#: apt-ftparchive.1.xml:563
msgid ""
"Perform contents generation. When this option is set and package indexes are "
"being generated with a cache DB then the file listing will also be extracted "
@@ -3212,12 +3228,12 @@ msgstr ""
"Konfigurationselement: <literal>APT::FTPArchive::Contents</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:568
+#: apt-ftparchive.1.xml:571
msgid "<option>--source-override</option>"
msgstr "<option>--source-override</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:570
+#: apt-ftparchive.1.xml:573
msgid ""
"Select the source override file to use with the <literal>sources</literal> "
"command. Configuration Item: <literal>APT::FTPArchive::SourceOverride</"
@@ -3228,12 +3244,12 @@ msgstr ""
"SourceOverride</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:574
+#: apt-ftparchive.1.xml:577
msgid "<option>--readonly</option>"
msgstr "<option>--readonly</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:576
+#: apt-ftparchive.1.xml:579
msgid ""
"Make the caching databases read only. Configuration Item: <literal>APT::"
"FTPArchive::ReadOnlyDB</literal>."
@@ -3242,12 +3258,12 @@ msgstr ""
"<literal>APT::FTPArchive::ReadOnlyDB</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:580
+#: apt-ftparchive.1.xml:583
msgid "<option>--arch</option>"
msgstr "<option>--arch</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:581
+#: apt-ftparchive.1.xml:584
msgid ""
"Accept in the <literal>packages</literal> and <literal>contents</literal> "
"commands only package files matching <literal>*_arch.deb</literal> or "
@@ -3261,12 +3277,12 @@ msgstr ""
"Architecture</literal>."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:587
+#: apt-ftparchive.1.xml:590
msgid "<option>APT::FTPArchive::AlwaysStat</option>"
msgstr "<option>APT::FTPArchive::AlwaysStat</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:589
+#: apt-ftparchive.1.xml:592
msgid ""
"&apt-ftparchive; caches as much as possible of metadata in a cachedb. If "
"packages are recompiled and/or republished with the same version again, this "
@@ -3290,12 +3306,12 @@ msgstr ""
"haben sollte und all diese zusätzlichen Prüfungen daher nutzlos sind."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-ftparchive.1.xml:599
+#: apt-ftparchive.1.xml:602
msgid "<option>APT::FTPArchive::LongDescription</option>"
msgstr "<option>APT::FTPArchive::LongDescription</option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-ftparchive.1.xml:601
+#: apt-ftparchive.1.xml:604
msgid ""
"This configuration option defaults to \"<literal>true</literal>\" and should "
"only be set to <literal>\"false\"</literal> if the Archive generated with "
@@ -3311,19 +3327,19 @@ msgstr ""
"werden kann."
#. type: Content of: <refentry><refsect1><title>
-#: apt-ftparchive.1.xml:613 apt.conf.5.xml:1087 apt_preferences.5.xml:496
+#: apt-ftparchive.1.xml:616 apt.conf.5.xml:1087 apt_preferences.5.xml:544
#: sources.list.5.xml:198
msgid "Examples"
msgstr "Beispiele"
#. type: Content of: <refentry><refsect1><para><programlisting>
-#: apt-ftparchive.1.xml:619
+#: apt-ftparchive.1.xml:622
#, no-wrap
msgid "<command>apt-ftparchive</command> packages <replaceable>directory</replaceable> | <command>gzip</command> > <filename>Packages.gz</filename>\n"
msgstr "<command>apt-ftparchive</command> Pakete <replaceable>Verzeichnis</replaceable> | <command>gzip</command> > <filename>Pakete.gz</filename>\n"
#. type: Content of: <refentry><refsect1><para>
-#: apt-ftparchive.1.xml:615
+#: apt-ftparchive.1.xml:618
msgid ""
"To create a compressed Packages file for a directory containing binary "
"packages (.deb): <placeholder type=\"programlisting\" id=\"0\"/>"
@@ -3333,7 +3349,7 @@ msgstr ""
">"
#. type: Content of: <refentry><refsect1><para>
-#: apt-ftparchive.1.xml:629
+#: apt-ftparchive.1.xml:632
msgid ""
"<command>apt-ftparchive</command> returns zero on normal operation, decimal "
"100 on error."
@@ -4703,8 +4719,24 @@ msgstr ""
"aktualisieren und aus dem Schlüsselbund die Archivschlüssel entfernen, die "
"nicht länger gültig sind."
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
+#: apt-key.8.xml:140
+#, fuzzy
+#| msgid "update"
+msgid "net-update"
+msgstr "update"
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-key.8.xml:144
+msgid ""
+"Update the local keyring with the keys of a key server and removes from the "
+"keyring the archive keys which are no longer valid. This requires an "
+"installed wget and an APT build configured to have a server to fetch from. "
+"APT in Debian does not support this command, but Ubuntu's APT does."
+msgstr ""
+
#. type: Content of: <refentry><refsect1><para>
-#: apt-key.8.xml:143
+#: apt-key.8.xml:159
msgid ""
"Note that options need to be defined before the commands described in the "
"previous section."
@@ -4713,12 +4745,12 @@ msgstr ""
"Befehlen definiert sein müssen."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-key.8.xml:145
+#: apt-key.8.xml:161
msgid "--keyring <replaceable>filename</replaceable>"
msgstr "--keyring <replaceable>Dateiname</replaceable>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-key.8.xml:146
+#: apt-key.8.xml:162
msgid ""
"With this option it is possible to specify a specific keyring file the "
"command should operate on. The default is that a command is executed on the "
@@ -4735,54 +4767,58 @@ msgstr ""
"Schlüssel werden zu diesem hinzugefügt."
#. type: Content of: <refentry><refsect1><variablelist>
-#: apt-key.8.xml:159
+#: apt-key.8.xml:175
msgid "&file-trustedgpg;"
msgstr "&file-trustedgpg;"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-key.8.xml:161
+#: apt-key.8.xml:177
msgid "<filename>/etc/apt/trustdb.gpg</filename>"
msgstr "<filename>/etc/apt/trustdb.gpg</filename>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-key.8.xml:162
+#: apt-key.8.xml:178
msgid "Local trust database of archive keys."
msgstr "Lokale Datenbank vertrauenswürdiger Archivschlüssel."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-key.8.xml:165
+#: apt-key.8.xml:181
msgid "<filename>/usr/share/keyrings/debian-archive-keyring.gpg</filename>"
msgstr "<filename>/usr/share/keyrings/debian-archive-keyring.gpg</filename>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-key.8.xml:166
+#: apt-key.8.xml:182
msgid "Keyring of Debian archive trusted keys."
msgstr "Schlüsselbund vertrauenswürdiger Schlüssel des Debian-Archivs."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-key.8.xml:169
+#: apt-key.8.xml:185
msgid ""
"<filename>/usr/share/keyrings/debian-archive-removed-keys.gpg</filename>"
msgstr ""
"<filename>/usr/share/keyrings/debian-archive-removed-keys.gpg</filename>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-key.8.xml:170
+#: apt-key.8.xml:186
msgid "Keyring of Debian archive removed trusted keys."
msgstr ""
"Schlüsselbund entfernter vertrauenswürdiger Schlüssel des Debian-Archivs."
#. type: Content of: <refentry><refsect1><para>
-#: apt-key.8.xml:179
+#: apt-key.8.xml:195
msgid "&apt-get;, &apt-secure;"
msgstr "&apt-get;, &apt-secure;"
#. The last update date
#. type: Content of: <refentry><refentryinfo>
#: apt-mark.8.xml:16
+#, fuzzy
+#| msgid ""
+#| "&apt-author.moconnor; &apt-author.team; &apt-email; &apt-product; <date>9 "
+#| "August 2009</date>"
msgid ""
-"&apt-author.moconnor; &apt-author.team; &apt-email; &apt-product; <date>9 "
-"August 2009</date>"
+"&apt-author.moconnor; &apt-author.team; &apt-email; &apt-product; <date>21 "
+"April 2011</date>"
msgstr ""
"&apt-author.moconnor; &apt-author.team; &apt-email; &apt-product; <date>9. "
"August 2009</date>"
@@ -4801,13 +4837,22 @@ msgstr ""
#. type: Content of: <refentry><refsynopsisdiv><cmdsynopsis>
#: apt-mark.8.xml:39
+#, fuzzy
+#| msgid ""
+#| " <command>apt-mark</command> <arg><option>-hv</option></arg> "
+#| "<arg><option>-f=<replaceable>FILENAME</replaceable></option></arg> <group "
+#| "choice=\"plain\"> <arg choice=\"plain\"> <group choice=\"req\"> <arg "
+#| "choice=\"plain\">markauto</arg> <arg choice=\"plain\">unmarkauto</arg> </"
+#| "group> <arg choice=\"plain\" rep=\"repeat\"><replaceable>package</"
+#| "replaceable></arg> </arg> <arg choice=\"plain\">showauto</arg> </group>"
msgid ""
" <command>apt-mark</command> <arg><option>-hv</option></arg> <arg><option>-"
"f=<replaceable>FILENAME</replaceable></option></arg> <group choice=\"plain"
"\"> <arg choice=\"plain\"> <group choice=\"req\"> <arg choice=\"plain"
-"\">markauto</arg> <arg choice=\"plain\">unmarkauto</arg> </group> <arg "
+"\">auto</arg> <arg choice=\"plain\">manual</arg> <arg choice=\"plain"
+"\">showauto</arg> <arg choice=\"plain\">showmanual</arg> </group> <arg "
"choice=\"plain\" rep=\"repeat\"><replaceable>package</replaceable></arg> </"
-"arg> <arg choice=\"plain\">showauto</arg> </group>"
+"arg> </group>"
msgstr ""
" <command>apt-mark</command> <arg><option>-hv</option></arg> <arg><option>-"
"f=<replaceable>DATEINAME</replaceable></option></arg> <group choice=\"plain"
@@ -4817,7 +4862,7 @@ msgstr ""
"arg> <arg choice=\"plain\">showauto</arg> </group>"
#. type: Content of: <refentry><refsect1><para>
-#: apt-mark.8.xml:56
+#: apt-mark.8.xml:57
msgid ""
"<command>apt-mark</command> will change whether a package has been marked as "
"being automatically installed."
@@ -4826,7 +4871,7 @@ msgstr ""
"installiert markiert ist."
#. type: Content of: <refentry><refsect1><para>
-#: apt-mark.8.xml:60
+#: apt-mark.8.xml:61
msgid ""
"When you request that a package is installed, and as a result other packages "
"are installed to satisfy its dependencies, the dependencies are marked as "
@@ -4842,14 +4887,21 @@ msgstr ""
"<command>aptitude</command> entfernt."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:68
-msgid "markauto"
+#: apt-mark.8.xml:69
+#, fuzzy
+#| msgid "markauto"
+msgid "auto"
msgstr "markauto"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-mark.8.xml:69
+#: apt-mark.8.xml:70
+#, fuzzy
+#| msgid ""
+#| "<literal>markauto</literal> is used to mark a package as being "
+#| "automatically installed, which will cause the package to be removed when "
+#| "no more manually installed packages depend on this package."
msgid ""
-"<literal>markauto</literal> is used to mark a package as being automatically "
+"<literal>auto</literal> is used to mark a package as being automatically "
"installed, which will cause the package to be removed when no more manually "
"installed packages depend on this package."
msgstr ""
@@ -4858,14 +4910,19 @@ msgstr ""
"keine manuell installierten Pakete von ihm abhängen."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:76
-msgid "unmarkauto"
-msgstr "unmarkauto"
+#: apt-mark.8.xml:77
+msgid "manual"
+msgstr ""
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-mark.8.xml:77
+#: apt-mark.8.xml:78
+#, fuzzy
+#| msgid ""
+#| "<literal>unmarkauto</literal> is used to mark a package as being manually "
+#| "installed, which will prevent the package from being automatically "
+#| "removed if no other packages depend on it."
msgid ""
-"<literal>unmarkauto</literal> is used to mark a package as being manually "
+"<literal>manual</literal> is used to mark a package as being manually "
"installed, which will prevent the package from being automatically removed "
"if no other packages depend on it."
msgstr ""
@@ -4874,28 +4931,102 @@ msgstr ""
"entfernt wird, wenn kein anderes Paket von ihm abhängt."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:84
+#: apt-mark.8.xml:85
+msgid "hold"
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-mark.8.xml:86
+msgid ""
+"<literal>hold</literal> is used to mark a package as hold back, which will "
+"prevent the package from being automatically installed, upgraded or "
+"removed. The command is only a wrapper around <command>dpkg --set-"
+"selections</command> and the state is therefore maintained by &dpkg; and not "
+"effected by the <option>--filename</option> option."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
+#: apt-mark.8.xml:95
+msgid "unhold"
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-mark.8.xml:96
+#, fuzzy
+#| msgid ""
+#| "<literal>showauto</literal> is used to print a list of automatically "
+#| "installed packages with each package on a new line."
+msgid ""
+"<literal>unhold</literal> is used to cancel a previously set hold on a "
+"package to allow all actions again."
+msgstr ""
+"<literal>showauto</literal> wird benutzt, um eine Liste automatisch "
+"installierter Pakete mit einem Paket in jeder neuen Zeile, auszugeben."
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
+#: apt-mark.8.xml:101
msgid "showauto"
msgstr "showauto"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-mark.8.xml:85
+#: apt-mark.8.xml:102
+#, fuzzy
+#| msgid ""
+#| "<literal>showauto</literal> is used to print a list of automatically "
+#| "installed packages with each package on a new line."
msgid ""
"<literal>showauto</literal> is used to print a list of automatically "
-"installed packages with each package on a new line."
+"installed packages with each package on a new line. All automatically "
+"installed packages will be listed if no package is given. If packages are "
+"given only those which are automatically installed will be shown."
msgstr ""
"<literal>showauto</literal> wird benutzt, um eine Liste automatisch "
"installierter Pakete mit einem Paket in jeder neuen Zeile, auszugeben."
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:96
+#: apt-mark.8.xml:109
+#, fuzzy
+#| msgid "showauto"
+msgid "showmanual"
+msgstr "showauto"
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-mark.8.xml:110
+msgid ""
+"<literal>showmanual</literal> can be used in the same way as "
+"<literal>showauto</literal> except that it will print a list of manually "
+"installed packages instead."
+msgstr ""
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
+#: apt-mark.8.xml:116
+#, fuzzy
+#| msgid "showauto"
+msgid "showhold"
+msgstr "showauto"
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
+#: apt-mark.8.xml:117
+#, fuzzy
+#| msgid ""
+#| "<literal>showauto</literal> is used to print a list of automatically "
+#| "installed packages with each package on a new line."
+msgid ""
+"<literal>showhold</literal> is used to print a list of packages on hold in "
+"the same way as for the other show commands."
+msgstr ""
+"<literal>showauto</literal> wird benutzt, um eine Liste automatisch "
+"installierter Pakete mit einem Paket in jeder neuen Zeile, auszugeben."
+
+#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
+#: apt-mark.8.xml:130
msgid ""
"<option>-f=<filename><replaceable>FILENAME</replaceable></filename></option>"
msgstr ""
"<option>-f=<filename><replaceable>DATEINAME</replaceable></filename></option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:97
+#: apt-mark.8.xml:131
msgid ""
"<option>--file=<filename><replaceable>FILENAME</replaceable></filename></"
"option>"
@@ -4904,7 +5035,7 @@ msgstr ""
"option>"
#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-mark.8.xml:100
+#: apt-mark.8.xml:134
msgid ""
"Read/Write package stats from <filename><replaceable>FILENAME</replaceable></"
"filename> instead of the default location, which is "
@@ -4916,48 +5047,18 @@ msgstr ""
"filename> im von Konfigurationselement <literal>Dir::State</literal> "
"definierten Verzeichnis, ist."
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:106
-msgid "<option>-h</option>"
-msgstr "<option>-h</option>"
-
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:107
-msgid "<option>--help</option>"
-msgstr "<option>--help</option>"
-
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-mark.8.xml:108
-msgid "Show a short usage summary."
-msgstr "Eine kurze Zusammenfassung anzeigen."
-
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:114
-msgid "<option>-v</option>"
-msgstr "<option>-v</option>"
-
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><term>
-#: apt-mark.8.xml:115
-msgid "<option>--version</option>"
-msgstr "<option>--version</option>"
-
-#. type: Content of: <refentry><refsect1><variablelist><varlistentry><listitem><para>
-#: apt-mark.8.xml:116
-msgid "Show the program version."
-msgstr "Die Programmversion anzeigen."
-
#. type: Content of: <refentry><refsect1><variablelist>
-#: apt-mark.8.xml:127
+#: apt-mark.8.xml:146
msgid " &file-extended_states;"
msgstr " &file-extended_states;"
#. type: Content of: <refentry><refsect1><para>
-#: apt-mark.8.xml:132
+#: apt-mark.8.xml:151
msgid "&apt-get;,&aptitude;,&apt-conf;"
msgstr "&apt-get;,&aptitude;,&apt-conf;"
#. type: Content of: <refentry><refsect1><para>
-#: apt-mark.8.xml:136
+#: apt-mark.8.xml:155
msgid ""
"<command>apt-mark</command> returns zero on normal operation, non-zero on "
"error."
@@ -7857,8 +7958,9 @@ msgstr "Priorität 1"
#| "<literal>experimental</literal> archive."
msgid ""
"to the versions coming from archives which in their <filename>Release</"
-"filename> files are marked as \"NotAutomatic: yes\" like the debian "
-"experimental archive."
+"filename> files are marked as \"NotAutomatic: yes\" but <emphasis>not</"
+"emphasis> as \"ButAutomaticUpgrades: yes\" like the debian "
+"<literal>experimental</literal> archive."
msgstr ""
"zu den Versionen, die von Archiven kommen, die in deren <filename>Release</"
"filename>-Dateien als »NotAutomatic: yes« markiert sind, aber "
@@ -7866,22 +7968,31 @@ msgstr ""
"<literal>experimental</literal> von Debian."
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:112
+#: apt_preferences.5.xml:113
msgid "priority 100"
msgstr "Priorität 100"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:113
-msgid "to the version that is already installed (if any)."
-msgstr "zu der Version, die bereits installiert ist (wenn vorhanden)."
+#: apt_preferences.5.xml:114
+msgid ""
+"to the version that is already installed (if any) and to the versions coming "
+"from archives which in their <filename>Release</filename> files are marked "
+"as \"NotAutomatic: yes\" and \"ButAutomaticUpgrades: yes\" like the debian "
+"backports archive since <literal>squeeze-backports</literal>."
+msgstr ""
+"zu der Version, die bereits installiert ist (wenn dies der Fall ist) und zu "
+"Versionen, die von Archiven kommen, die in deren <filename>Release</"
+"filename>-Dateien als »NotAutomatic: yes« und »ButAutomaticUpgrades: yes« "
+"markiert sind, wie das Debian-Backports-Archiv seit <literal>squeeze-"
+"backports</literal>."
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:117
+#: apt_preferences.5.xml:121
msgid "priority 500"
msgstr "Priorität 500"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:118
+#: apt_preferences.5.xml:122
msgid ""
"to the versions that are not installed and do not belong to the target "
"release."
@@ -7890,12 +8001,12 @@ msgstr ""
"gehören."
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:122
+#: apt_preferences.5.xml:126
msgid "priority 990"
msgstr "Priorität 990"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:123
+#: apt_preferences.5.xml:127
msgid ""
"to the versions that are not installed and belong to the target release."
msgstr ""
@@ -7913,7 +8024,7 @@ msgstr ""
"Zuweisung: <placeholder type=\"variablelist\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:128
+#: apt_preferences.5.xml:132
#, fuzzy
#| msgid ""
#| "If the target release has not been specified then APT simply assigns "
@@ -7925,9 +8036,10 @@ msgstr ""
msgid ""
"If the target release has not been specified then APT simply assigns "
"priority 100 to all installed package versions and priority 500 to all "
-"uninstalled package versions, expect versions coming from archives which in "
+"uninstalled package versions, except versions coming from archives which in "
"their <filename>Release</filename> files are marked as \"NotAutomatic: yes\" "
-"- these versions get the priority 1."
+"- these versions get the priority 1 or priority 100 if it is additionally "
+"marked as \"ButAutomaticUpgrades: yes\"."
msgstr ""
"Wenn das Ziel-Release nicht angegeben wurde, dann weist APT einfach allen "
"installierten Paketversionen eine Priorität von 100 und allen nicht "
@@ -7938,7 +8050,7 @@ msgstr ""
"markiert sind."
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:134
+#: apt_preferences.5.xml:139
msgid ""
"APT then applies the following rules, listed in order of precedence, to "
"determine which version of a package to install."
@@ -7948,7 +8060,7 @@ msgstr ""
"ist."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:137
+#: apt_preferences.5.xml:142
msgid ""
"Never downgrade unless the priority of an available version exceeds 1000. "
"(\"Downgrading\" is installing a less recent version of a package in place "
@@ -7964,12 +8076,12 @@ msgstr ""
"Downgrading eines Paketes riskant sein kann.)"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:143
+#: apt_preferences.5.xml:148
msgid "Install the highest priority version."
msgstr "Die Version mit der höchsten Priorität installieren."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:144
+#: apt_preferences.5.xml:149
msgid ""
"If two or more versions have the same priority, install the most recent one "
"(that is, the one with the higher version number)."
@@ -7978,7 +8090,7 @@ msgstr ""
"aktuellste installiert (das ist die mit der höheren Versionsnummer)."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:147
+#: apt_preferences.5.xml:152
msgid ""
"If two or more versions have the same priority and version number but either "
"the packages differ in some of their metadata or the <literal>--reinstall</"
@@ -7990,7 +8102,7 @@ msgstr ""
"installierte installiert."
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:153
+#: apt_preferences.5.xml:158
msgid ""
"In a typical situation, the installed version of a package (priority 100) "
"is not as recent as one of the versions available from the sources listed in "
@@ -8006,7 +8118,7 @@ msgstr ""
"upgrade</command> ausgeführt wird."
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:160
+#: apt_preferences.5.xml:165
msgid ""
"More rarely, the installed version of a package is <emphasis>more</emphasis> "
"recent than any of the other available versions. The package will not be "
@@ -8020,7 +8132,7 @@ msgstr ""
"upgrade</command> ausgeführt wird."
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:165
+#: apt_preferences.5.xml:170
msgid ""
"Sometimes the installed version of a package is more recent than the version "
"belonging to the target release, but not as recent as a version belonging to "
@@ -8040,12 +8152,12 @@ msgstr ""
"hat."
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:174
+#: apt_preferences.5.xml:179
msgid "The Effect of APT Preferences"
msgstr "Die Auswirkungen von APT-Einstellungen"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:176
+#: apt_preferences.5.xml:181
msgid ""
"The APT preferences file allows the system administrator to control the "
"assignment of priorities. The file consists of one or more multi-line "
@@ -8059,7 +8171,7 @@ msgstr ""
"allgemeine Gestalt."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:182
+#: apt_preferences.5.xml:187
msgid ""
"The specific form assigns a priority (a \"Pin-Priority\") to one or more "
"specified packages and specified version or version range. For example, the "
@@ -8075,7 +8187,7 @@ msgstr ""
"können durch Leerzeichen getrennt werden."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><programlisting>
-#: apt_preferences.5.xml:189
+#: apt_preferences.5.xml:194
#, no-wrap
msgid ""
"Package: perl\n"
@@ -8087,7 +8199,7 @@ msgstr ""
"Pin-Priority: 1001\n"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:195
+#: apt_preferences.5.xml:200
msgid ""
"The general form assigns a priority to all of the package versions in a "
"given distribution (that is, to all the versions of packages that are listed "
@@ -8102,7 +8214,7 @@ msgstr ""
"ausgebildeten Domänennamen identifiziert wird, eine Priorität zu."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:201
+#: apt_preferences.5.xml:206
msgid ""
"This general-form entry in the APT preferences file applies only to groups "
"of packages. For example, the following record assigns a high priority to "
@@ -8113,7 +8225,7 @@ msgstr ""
"Paketversionen eine hohe Priorität zu, die lokal liegen."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><programlisting>
-#: apt_preferences.5.xml:206
+#: apt_preferences.5.xml:211
#, no-wrap
msgid ""
"Package: *\n"
@@ -8125,7 +8237,7 @@ msgstr ""
"Pin-Priority: 999\n"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:211
+#: apt_preferences.5.xml:216
msgid ""
"A note of caution: the keyword used here is \"<literal>origin</literal>\" "
"which can be used to match a hostname. The following record will assign a "
@@ -8139,7 +8251,7 @@ msgstr ""
"de.debian.org« identifiziert wird."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><programlisting>
-#: apt_preferences.5.xml:215
+#: apt_preferences.5.xml:220
#, no-wrap
msgid ""
"Package: *\n"
@@ -8151,7 +8263,7 @@ msgstr ""
"Pin-Priority: 999\n"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:219
+#: apt_preferences.5.xml:224
msgid ""
"This should <emphasis>not</emphasis> be confused with the Origin of a "
"distribution as specified in a <filename>Release</filename> file. What "
@@ -8166,7 +8278,7 @@ msgstr ""
"oder »Ximian«."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:224
+#: apt_preferences.5.xml:229
msgid ""
"The following record assigns a low priority to all package versions "
"belonging to any distribution whose Archive name is \"<literal>unstable</"
@@ -8177,7 +8289,7 @@ msgstr ""
"Priorität zu."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><programlisting>
-#: apt_preferences.5.xml:228
+#: apt_preferences.5.xml:233
#, no-wrap
msgid ""
"Package: *\n"
@@ -8189,7 +8301,7 @@ msgstr ""
"Pin-Priority: 50\n"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:233
+#: apt_preferences.5.xml:238
msgid ""
"The following record assigns a high priority to all package versions "
"belonging to any distribution whose Codename is \"<literal>&testing-codename;"
@@ -8200,7 +8312,7 @@ msgstr ""
"hohe Priorität zu."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><programlisting>
-#: apt_preferences.5.xml:237
+#: apt_preferences.5.xml:242
#, no-wrap
msgid ""
"Package: *\n"
@@ -8212,7 +8324,7 @@ msgstr ""
"Pin-Priority: 900\n"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:242
+#: apt_preferences.5.xml:247
msgid ""
"The following record assigns a high priority to all package versions "
"belonging to any release whose Archive name is \"<literal>stable</literal>\" "
@@ -8223,7 +8335,7 @@ msgstr ""
"Nummer »<literal>3.0</literal>« ist, eine hohe Priorität zu."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><programlisting>
-#: apt_preferences.5.xml:247
+#: apt_preferences.5.xml:252
#, no-wrap
msgid ""
"Package: *\n"
@@ -8235,17 +8347,85 @@ msgstr ""
"Pin-Priority: 500\n"
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:258
+#: apt_preferences.5.xml:262
+msgid "Regular expressions and glob() syntax"
+msgstr "Reguläre Ausdrücke und glob()-Syntax"
+
+# FIXME: s/expression or/expression) or/
+#. type: Content of: <refentry><refsect1><refsect2><para>
+#: apt_preferences.5.xml:264
+msgid ""
+"APT also supports pinning by glob() expressions and regular expressions "
+"surrounded by /. For example, the following example assigns the priority 500 "
+"to all packages from experimental where the name starts with gnome (as a glob"
+"()-like expression or contains the word kde (as a POSIX extended regular "
+"expression surrounded by slashes)."
+msgstr ""
+"APT unterstützt außerdem Pinning mittels glob()-Ausdrücken und regulären "
+"Ausdrücken, die von »/« umschlossen sind. Das folgende Beispiel weist "
+"beispielsweise allen Paketen aus Experimental die Priorität 500 zu, bei "
+"denen der Name mit »gnome« beginnt (wie ein glob()-artiger Ausdruck) oder "
+"das Wort »kde« enthält (wie ein erweiterter regulärer POSIX-Ausdruck, der "
+"von Schrägstrichen umschlossen wird)."
+
+#. type: Content of: <refentry><refsect1><refsect2><programlisting>
+#: apt_preferences.5.xml:273
+#, no-wrap
+msgid ""
+"Package: gnome* /kde/\n"
+"Pin: release n=experimental\n"
+"Pin-Priority: 500\n"
+msgstr ""
+"Package: gnome* /kde/\n"
+"Pin: release n=experimental\n"
+"Pin-Priority: 500\n"
+
+# FIXME: s/Those/Thus/
+#. type: Content of: <refentry><refsect1><refsect2><para>
+#: apt_preferences.5.xml:279
+msgid ""
+"The rule for those expressions is that they can occur anywhere where a "
+"string can occur. Those, the following pin assigns the priority 990 to all "
+"packages from a release starting with karmic."
+msgstr ""
+"Die Regel für diese Ausdrücke ist, dass sie überall dort auftreten können, "
+"wo eine Zeichenkette auftreten kann. Somit weist die folgende Pin allen "
+"Paketen von einem Release seit Karmic die Priorität 900 zu."
+
+#. type: Content of: <refentry><refsect1><refsect2><programlisting>
+#: apt_preferences.5.xml:285
+#, no-wrap
+msgid ""
+"Package: *\n"
+"Pin: release n=karmic*\n"
+"Pin-Priority: 990\n"
+msgstr ""
+"Package: *\n"
+"Pin: release n=karmic*\n"
+"Pin-Priority: 990\n"
+
+#. type: Content of: <refentry><refsect1><refsect2><literal>
+#: apt_preferences.5.xml:290
+msgid "Package"
+msgstr "Package"
+
+#. type: Content of: <refentry><refsect1><refsect2><literal>
+#: apt_preferences.5.xml:296
+msgid "*"
+msgstr "*"
+
+#. type: Content of: <refentry><refsect1><refsect2><title>
+#: apt_preferences.5.xml:306
msgid "How APT Interprets Priorities"
msgstr "Wie APT Prioritäten interpretiert"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:266
+#: apt_preferences.5.xml:314
msgid "P &gt; 1000"
msgstr "P &gt; 1000"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:267
+#: apt_preferences.5.xml:315
msgid ""
"causes a version to be installed even if this constitutes a downgrade of the "
"package"
@@ -8254,12 +8434,12 @@ msgstr ""
"des Pakets durchführt"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:271
+#: apt_preferences.5.xml:319
msgid "990 &lt; P &lt;=1000"
msgstr "990 &lt; P &lt;=1000"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:272
+#: apt_preferences.5.xml:320
msgid ""
"causes a version to be installed even if it does not come from the target "
"release, unless the installed version is more recent"
@@ -8268,12 +8448,12 @@ msgstr ""
"Ziel-Release kommt, außer wenn die installierte Version aktueller ist"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:277
+#: apt_preferences.5.xml:325
msgid "500 &lt; P &lt;=990"
msgstr "500 &lt; P &lt;=990"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:278
+#: apt_preferences.5.xml:326
msgid ""
"causes a version to be installed unless there is a version available "
"belonging to the target release or the installed version is more recent"
@@ -8283,12 +8463,12 @@ msgstr ""
"neuer ist"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:283
+#: apt_preferences.5.xml:331
msgid "100 &lt; P &lt;=500"
msgstr "100 &lt; P &lt;=500"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:284
+#: apt_preferences.5.xml:332
msgid ""
"causes a version to be installed unless there is a version available "
"belonging to some other distribution or the installed version is more recent"
@@ -8298,12 +8478,12 @@ msgstr ""
"installierte Version neuer ist"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:289
+#: apt_preferences.5.xml:337
msgid "0 &lt; P &lt;=100"
msgstr "0 &lt; P &lt;=100"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:290
+#: apt_preferences.5.xml:338
msgid ""
"causes a version to be installed only if there is no installed version of "
"the package"
@@ -8312,17 +8492,17 @@ msgstr ""
"installierte Version des Pakets gibt"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:294
+#: apt_preferences.5.xml:342
msgid "P &lt; 0"
msgstr "P &lt; 0"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:295
+#: apt_preferences.5.xml:343
msgid "prevents the version from being installed"
msgstr "verhindert das Installieren der Version"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:261
+#: apt_preferences.5.xml:309
msgid ""
"Priorities (P) assigned in the APT preferences file must be positive or "
"negative integers. They are interpreted as follows (roughly speaking): "
@@ -8333,7 +8513,7 @@ msgstr ""
"(grob gesagt): <placeholder type=\"variablelist\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:300
+#: apt_preferences.5.xml:348
msgid ""
"If any specific-form records match an available package version then the "
"first such record determines the priority of the package version. Failing "
@@ -8347,7 +8527,7 @@ msgstr ""
"erste dieser Datensätze die Priorität der Paketversion fest."
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:306
+#: apt_preferences.5.xml:354
msgid ""
"For example, suppose the APT preferences file contains the three records "
"presented earlier:"
@@ -8356,7 +8536,7 @@ msgstr ""
"bereits gezeigten Datensätze:"
#. type: Content of: <refentry><refsect1><refsect2><programlisting>
-#: apt_preferences.5.xml:310
+#: apt_preferences.5.xml:358
#, no-wrap
msgid ""
"Package: perl\n"
@@ -8384,12 +8564,12 @@ msgstr ""
"Pin-Priority: 50\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:323
+#: apt_preferences.5.xml:371
msgid "Then:"
msgstr "Dann:"
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:325
+#: apt_preferences.5.xml:373
msgid ""
"The most recent available version of the <literal>perl</literal> package "
"will be installed, so long as that version's version number begins with "
@@ -8404,7 +8584,7 @@ msgstr ""
"dann wird von <literal>perl</literal> ein Downgrade durchgeführt."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:330
+#: apt_preferences.5.xml:378
msgid ""
"A version of any package other than <literal>perl</literal> that is "
"available from the local system has priority over other versions, even "
@@ -8415,7 +8595,7 @@ msgstr ""
"sogar wenn diese Versionen zum Ziel-Release gehören."
#. type: Content of: <refentry><refsect1><refsect2><para><itemizedlist><listitem><simpara>
-#: apt_preferences.5.xml:334
+#: apt_preferences.5.xml:382
msgid ""
"A version of a package whose origin is not the local system but some other "
"site listed in &sources-list; and which belongs to an <literal>unstable</"
@@ -8429,12 +8609,12 @@ msgstr ""
"Pakets installiert ist."
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:344
+#: apt_preferences.5.xml:392
msgid "Determination of Package Version and Distribution Properties"
msgstr "Festlegung von Paketversion und Distributions-Eigenschaften"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:346
+#: apt_preferences.5.xml:394
msgid ""
"The locations listed in the &sources-list; file should provide "
"<filename>Packages</filename> and <filename>Release</filename> files to "
@@ -8445,27 +8625,27 @@ msgstr ""
"bereitstellen, um die an diesem Ort verfügbaren Pakete zu beschreiben."
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:358
+#: apt_preferences.5.xml:406
msgid "the <literal>Package:</literal> line"
msgstr "die <literal>Package:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:359
+#: apt_preferences.5.xml:407
msgid "gives the package name"
msgstr "gibt den Paketnamen an"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:362 apt_preferences.5.xml:412
+#: apt_preferences.5.xml:410 apt_preferences.5.xml:460
msgid "the <literal>Version:</literal> line"
msgstr "die <literal>Version:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:363
+#: apt_preferences.5.xml:411
msgid "gives the version number for the named package"
msgstr "gibt die Versionsnummer für das genannte Paket an"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:350
+#: apt_preferences.5.xml:398
msgid ""
"The <filename>Packages</filename> file is normally found in the directory "
"<filename>.../dists/<replaceable>dist-name</replaceable>/"
@@ -8486,12 +8666,12 @@ msgstr ""
"Prioritäten relevant: <placeholder type=\"variablelist\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:379
+#: apt_preferences.5.xml:427
msgid "the <literal>Archive:</literal> or <literal>Suite:</literal> line"
msgstr "die <literal>Archive:</literal>- oder <literal>Suite:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:380
+#: apt_preferences.5.xml:428
msgid ""
"names the archive to which all the packages in the directory tree belong. "
"For example, the line \"Archive: stable\" or \"Suite: stable\" specifies "
@@ -8508,18 +8688,18 @@ msgstr ""
"die folgende Zeile benötigen:"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><programlisting>
-#: apt_preferences.5.xml:390
+#: apt_preferences.5.xml:438
#, no-wrap
msgid "Pin: release a=stable\n"
msgstr "Pin: release a=stable\n"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:396
+#: apt_preferences.5.xml:444
msgid "the <literal>Codename:</literal> line"
msgstr "die <literal>Codename:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:397
+#: apt_preferences.5.xml:445
msgid ""
"names the codename to which all the packages in the directory tree belong. "
"For example, the line \"Codename: &testing-codename;\" specifies that all of "
@@ -8536,13 +8716,13 @@ msgstr ""
"anzugeben würde die folgende Zeile benötigen:"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><programlisting>
-#: apt_preferences.5.xml:406
+#: apt_preferences.5.xml:454
#, no-wrap
msgid "Pin: release n=&testing-codename;\n"
msgstr "Pin: release n=&testing-codename;\n"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:413
+#: apt_preferences.5.xml:461
msgid ""
"names the release version. For example, the packages in the tree might "
"belong to Debian GNU/Linux release version 3.0. Note that there is normally "
@@ -8558,7 +8738,7 @@ msgstr ""
"eine der folgenden Zeilen benötigen:"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><programlisting>
-#: apt_preferences.5.xml:422
+#: apt_preferences.5.xml:470
#, no-wrap
msgid ""
"Pin: release v=3.0\n"
@@ -8570,12 +8750,12 @@ msgstr ""
"Pin: release 3.0\n"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:431
+#: apt_preferences.5.xml:479
msgid "the <literal>Component:</literal> line"
msgstr "die <literal>Component:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:432
+#: apt_preferences.5.xml:480
msgid ""
"names the licensing component associated with the packages in the directory "
"tree of the <filename>Release</filename> file. For example, the line "
@@ -8593,18 +8773,18 @@ msgstr ""
"Zeilen benötigen:"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><programlisting>
-#: apt_preferences.5.xml:441
+#: apt_preferences.5.xml:489
#, no-wrap
msgid "Pin: release c=main\n"
msgstr "Pin: release c=main\n"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:447
+#: apt_preferences.5.xml:495
msgid "the <literal>Origin:</literal> line"
msgstr "die <literal>Origin:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:448
+#: apt_preferences.5.xml:496
msgid ""
"names the originator of the packages in the directory tree of the "
"<filename>Release</filename> file. Most commonly, this is <literal>Debian</"
@@ -8616,18 +8796,18 @@ msgstr ""
"in der APT-Einstellungsdatei anzugeben würde die folgende Zeile benötigen:"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><programlisting>
-#: apt_preferences.5.xml:454
+#: apt_preferences.5.xml:502
#, no-wrap
msgid "Pin: release o=Debian\n"
msgstr "Pin: release o=Debian\n"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><term>
-#: apt_preferences.5.xml:460
+#: apt_preferences.5.xml:508
msgid "the <literal>Label:</literal> line"
msgstr "die <literal>Label:</literal>-Zeile"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><simpara>
-#: apt_preferences.5.xml:461
+#: apt_preferences.5.xml:509
msgid ""
"names the label of the packages in the directory tree of the "
"<filename>Release</filename> file. Most commonly, this is <literal>Debian</"
@@ -8640,13 +8820,13 @@ msgstr ""
"die folgende Zeile benötigen:"
#. type: Content of: <refentry><refsect1><refsect2><para><variablelist><varlistentry><listitem><programlisting>
-#: apt_preferences.5.xml:467
+#: apt_preferences.5.xml:515
#, no-wrap
msgid "Pin: release l=Debian\n"
msgstr "Pin: release l=Debian\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:368
+#: apt_preferences.5.xml:416
msgid ""
"The <filename>Release</filename> file is normally found in the directory "
"<filename>.../dists/<replaceable>dist-name</replaceable></filename>: for "
@@ -8669,7 +8849,7 @@ msgstr ""
"APT-Prioritäten relevant: <placeholder type=\"variablelist\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:474
+#: apt_preferences.5.xml:522
msgid ""
"All of the <filename>Packages</filename> and <filename>Release</filename> "
"files retrieved from locations listed in the &sources-list; file are stored "
@@ -8695,12 +8875,12 @@ msgstr ""
"Distribution heruntergeladen wurde."
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:487
+#: apt_preferences.5.xml:535
msgid "Optional Lines in an APT Preferences Record"
msgstr "Optionale Zeilen in einem APT-Einstellungsdatensatz"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:489
+#: apt_preferences.5.xml:537
msgid ""
"Each record in the APT preferences file can optionally begin with one or "
"more lines beginning with the word <literal>Explanation:</literal>. This "
@@ -8711,12 +8891,12 @@ msgstr ""
"anfangen. Dieses stellt einen Platz für Kommentare bereit."
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:498
+#: apt_preferences.5.xml:546
msgid "Tracking Stable"
msgstr "Stable verfolgen"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:506
+#: apt_preferences.5.xml:554
#, no-wrap
msgid ""
"Explanation: Uninstall or do not install any Debian-originated\n"
@@ -8740,7 +8920,7 @@ msgstr ""
"Pin-Priority: -10\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:500
+#: apt_preferences.5.xml:548
msgid ""
"The following APT preferences file will cause APT to assign a priority "
"higher than the default (500) to all package versions belonging to a "
@@ -8755,8 +8935,8 @@ msgstr ""
"Distributionen gehören. <placeholder type=\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:523 apt_preferences.5.xml:569
-#: apt_preferences.5.xml:627
+#: apt_preferences.5.xml:571 apt_preferences.5.xml:617
+#: apt_preferences.5.xml:675
#, no-wrap
msgid ""
"apt-get install <replaceable>package-name</replaceable>\n"
@@ -8768,7 +8948,7 @@ msgstr ""
"apt-get dist-upgrade\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:518
+#: apt_preferences.5.xml:566
msgid ""
"With a suitable &sources-list; file and the above preferences file, any of "
"the following commands will cause APT to upgrade to the latest "
@@ -8781,13 +8961,13 @@ msgstr ""
"\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:535
+#: apt_preferences.5.xml:583
#, no-wrap
msgid "apt-get install <replaceable>package</replaceable>/testing\n"
msgstr "apt-get install <replaceable>Paket</replaceable>/testing\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:529
+#: apt_preferences.5.xml:577
msgid ""
"The following command will cause APT to upgrade the specified package to the "
"latest version from the <literal>testing</literal> distribution; the package "
@@ -8801,12 +8981,12 @@ msgstr ""
"\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:541
+#: apt_preferences.5.xml:589
msgid "Tracking Testing or Unstable"
msgstr "Testing oder Unstable verfolgen"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:550
+#: apt_preferences.5.xml:598
#, no-wrap
msgid ""
"Package: *\n"
@@ -8834,7 +9014,7 @@ msgstr ""
"Pin-Priority: -10\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:543
+#: apt_preferences.5.xml:591
msgid ""
"The following APT preferences file will cause APT to assign a high priority "
"to package versions from the <literal>testing</literal> distribution, a "
@@ -8851,7 +9031,7 @@ msgstr ""
"\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:564
+#: apt_preferences.5.xml:612
msgid ""
"With a suitable &sources-list; file and the above preferences file, any of "
"the following commands will cause APT to upgrade to the latest "
@@ -8864,13 +9044,13 @@ msgstr ""
"\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:584
+#: apt_preferences.5.xml:632
#, no-wrap
msgid "apt-get install <replaceable>package</replaceable>/unstable\n"
msgstr "apt-get install <replaceable>Paket</replaceable>/unstable\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:575
+#: apt_preferences.5.xml:623
msgid ""
"The following command will cause APT to upgrade the specified package to the "
"latest version from the <literal>unstable</literal> distribution. "
@@ -8890,12 +9070,12 @@ msgstr ""
"\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><title>
-#: apt_preferences.5.xml:591
+#: apt_preferences.5.xml:639
msgid "Tracking the evolution of a codename release"
msgstr "Die Entwicklung eines Codename-Releases verfolgen"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:605
+#: apt_preferences.5.xml:653
#, no-wrap
msgid ""
"Explanation: Uninstall or do not install any Debian-originated package versions\n"
@@ -8930,7 +9110,7 @@ msgstr ""
"Pin-Priority: -10\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:593
+#: apt_preferences.5.xml:641
msgid ""
"The following APT preferences file will cause APT to assign a priority "
"higher than the default (500) to all package versions belonging to a "
@@ -8956,7 +9136,7 @@ msgstr ""
"benutzen. <placeholder type=\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:622
+#: apt_preferences.5.xml:670
msgid ""
"With a suitable &sources-list; file and the above preferences file, any of "
"the following commands will cause APT to upgrade to the latest version(s) in "
@@ -8969,13 +9149,13 @@ msgstr ""
"literal> durchzuführen. <placeholder type=\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><refsect2><para><programlisting>
-#: apt_preferences.5.xml:642
+#: apt_preferences.5.xml:690
#, no-wrap
msgid "apt-get install <replaceable>package</replaceable>/sid\n"
msgstr "apt-get install <replaceable>Paket</replaceable>/sid\n"
#. type: Content of: <refentry><refsect1><refsect2><para>
-#: apt_preferences.5.xml:633
+#: apt_preferences.5.xml:681
msgid ""
"The following command will cause APT to upgrade the specified package to the "
"latest version from the <literal>sid</literal> distribution. Thereafter, "
@@ -8995,12 +9175,12 @@ msgstr ""
"\"programlisting\" id=\"0\"/>"
#. type: Content of: <refentry><refsect1><variablelist>
-#: apt_preferences.5.xml:651
+#: apt_preferences.5.xml:699
msgid "&file-preferences;"
msgstr "&file-preferences;"
#. type: Content of: <refentry><refsect1><para>
-#: apt_preferences.5.xml:657
+#: apt_preferences.5.xml:705
msgid "&apt-get; &apt-cache; &apt-conf; &sources-list;"
msgstr "&apt-get; &apt-cache; &apt-conf; &sources-list;"
@@ -11041,99 +11221,42 @@ msgstr " # apt-get -o dir::cache::archives=\"/Platte/\" dist-upgrade"
msgid "Which will use the already fetched archives on the disc."
msgstr "Es wird die bereits auf die Platte heruntergeladenen Archive benutzen."
-#~ msgid ""
-#~ "<option>--md5</option>, <option>--sha1</option>, <option>--sha256</option>"
-#~ msgstr ""
-#~ "<option>--md5</option>, <option>--sha1</option>, <option>--sha256</option>"
+#~ msgid "<option>--md5</option>"
+#~ msgstr "<option>--md5</option>"
-# FIXME <literal>Checksum</literal> im letzten Abschnitt <replaceable>?
#~ msgid ""
-#~ "Generate the given checksum. These options default to on, when turned off "
-#~ "the generated index files will not have the checksum fields where "
-#~ "possible. Configuration Items: <literal>APT::FTPArchive::"
-#~ "<replaceable>Checksum</replaceable></literal> and <literal>APT::"
-#~ "FTPArchive::<replaceable>Index</replaceable>::<replaceable>Checksum</"
-#~ "replaceable></literal> where <literal>Index</literal> can be "
-#~ "<literal>Packages</literal>, <literal>Sources</literal> or "
-#~ "<literal>Release</literal> and <literal>Checksum</literal> can be "
-#~ "<literal>MD5</literal>, <literal>SHA1</literal> or <literal>SHA256</"
-#~ "literal>."
+#~ "Generate MD5 sums. This defaults to on, when turned off the generated "
+#~ "index files will not have MD5Sum fields where possible. Configuration "
+#~ "Item: <literal>APT::FTPArchive::MD5</literal>"
#~ msgstr ""
-#~ "erzeugt die vorgegebene Prüfsumme. Diese Optionen sind standardmäßig "
-#~ "aktiviert. Wenn sie deaktiviert sind, werden die erzeugten Indexdateien "
-#~ "nach Möglichkeit keine Prüfsummenfelder erhalten. Konfigurationselemente: "
-#~ "<literal>APT::FTPArchive::<replaceable>Prüfsumme</replaceable></literal> "
-#~ "und <literal>APT::FTPArchive::<replaceable>Index</replaceable>::"
-#~ "<replaceable>Prüfsumme</replaceable></literal>, wobei <literal>Index</"
-#~ "literal> <literal>Packages</literal>, <literal>Sources</literal> oder "
-#~ "<literal>Release</literal> sein kann und <literal>Checksum</literal> "
-#~ "<literal>MD5</literal>, <literal>SHA1</literal> oder <literal>SHA256</"
-#~ "literal> sein kann."
+#~ "Generiert MD5-Summen. Dies ist standardmäßig an, wenn es ausgeschaltet "
+#~ "ist, haben die generierten Indexdateien keine MD5Sum-Felder, sofern dies "
+#~ "möglich ist. Konfigurationselement: <literal>APT::FTPArchive::MD5</"
+#~ "literal>"
-#~ msgid ""
-#~ "to the version that is already installed (if any) and to the versions "
-#~ "coming from archives which in their <filename>Release</filename> files "
-#~ "are marked as \"NotAutomatic: yes\" and \"ButAutomaticUpgrades: yes\" "
-#~ "like the debian backports archive since <literal>squeeze-backports</"
-#~ "literal>."
-#~ msgstr ""
-#~ "zu der Version, die bereits installiert ist (wenn dies der Fall ist) und "
-#~ "zu Versionen, die von Archiven kommen, die in deren <filename>Release</"
-#~ "filename>-Dateien als »NotAutomatic: yes« und »ButAutomaticUpgrades: yes« "
-#~ "markiert sind, wie das Debian-Backports-Archiv seit <literal>squeeze-"
-#~ "backports</literal>."
+#~ msgid "unmarkauto"
+#~ msgstr "unmarkauto"
-#~ msgid "Regular expressions and glob() syntax"
-#~ msgstr "Reguläre Ausdrücke und glob()-Syntax"
+#~ msgid "<option>-h</option>"
+#~ msgstr "<option>-h</option>"
-# FIXME: s/expression or/expression) or/
-#~ msgid ""
-#~ "APT also supports pinning by glob() expressions and regular expressions "
-#~ "surrounded by /. For example, the following example assigns the priority "
-#~ "500 to all packages from experimental where the name starts with gnome "
-#~ "(as a glob()-like expression or contains the word kde (as a POSIX "
-#~ "extended regular expression surrounded by slashes)."
-#~ msgstr ""
-#~ "APT unterstützt außerdem Pinning mittels glob()-Ausdrücken und regulären "
-#~ "Ausdrücken, die von »/« umschlossen sind. Das folgende Beispiel weist "
-#~ "beispielsweise allen Paketen aus Experimental die Priorität 500 zu, bei "
-#~ "denen der Name mit »gnome« beginnt (wie ein glob()-artiger Ausdruck) oder "
-#~ "das Wort »kde« enthält (wie ein erweiterter regulärer POSIX-Ausdruck, der "
-#~ "von Schrägstrichen umschlossen wird)."
+#~ msgid "<option>--help</option>"
+#~ msgstr "<option>--help</option>"
-#~ msgid ""
-#~ "Package: gnome* /kde/\n"
-#~ "Pin: release n=experimental\n"
-#~ "Pin-Priority: 500\n"
-#~ msgstr ""
-#~ "Package: gnome* /kde/\n"
-#~ "Pin: release n=experimental\n"
-#~ "Pin-Priority: 500\n"
+#~ msgid "Show a short usage summary."
+#~ msgstr "Eine kurze Zusammenfassung anzeigen."
-# FIXME: s/Those/Thus/
-#~ msgid ""
-#~ "The rule for those expressions is that they can occur anywhere where a "
-#~ "string can occur. Those, the following pin assigns the priority 990 to "
-#~ "all packages from a release starting with karmic."
-#~ msgstr ""
-#~ "Die Regel für diese Ausdrücke ist, dass sie überall dort auftreten "
-#~ "können, wo eine Zeichenkette auftreten kann. Somit weist die folgende Pin "
-#~ "allen Paketen von einem Release seit Karmic die Priorität 900 zu."
+#~ msgid "<option>-v</option>"
+#~ msgstr "<option>-v</option>"
-#~ msgid ""
-#~ "Package: *\n"
-#~ "Pin: release n=karmic*\n"
-#~ "Pin-Priority: 990\n"
-#~ msgstr ""
-#~ "Package: *\n"
-#~ "Pin: release n=karmic*\n"
-#~ "Pin-Priority: 990\n"
+#~ msgid "<option>--version</option>"
+#~ msgstr "<option>--version</option>"
-#~ msgid "Package"
-#~ msgstr "Package"
+#~ msgid "Show the program version."
+#~ msgstr "Die Programmversion anzeigen."
-#~ msgid "*"
-#~ msgstr "*"
+#~ msgid "to the version that is already installed (if any)."
+#~ msgstr "zu der Version, die bereits installiert ist (wenn vorhanden)."
#~ msgid "APT package handling utility -- cache manipulator"
#~ msgstr ""
diff --git a/ftparchive/cachedb.cc b/ftparchive/cachedb.cc
index b04244347..7e4c2e9fe 100644
--- a/ftparchive/cachedb.cc
+++ b/ftparchive/cachedb.cc
@@ -16,7 +16,7 @@
#include <apt-pkg/error.h>
#include <apt-pkg/md5.h>
#include <apt-pkg/sha1.h>
-#include <apt-pkg/sha256.h>
+#include <apt-pkg/sha2.h>
#include <apt-pkg/strutl.h>
#include <apt-pkg/configuration.h>
@@ -162,7 +162,8 @@ bool CacheDB::GetCurStat()
// ---------------------------------------------------------------------
bool CacheDB::GetFileInfo(string const &FileName, bool const &DoControl, bool const &DoContents,
bool const &GenContentsOnly, bool const &DoMD5, bool const &DoSHA1,
- bool const &DoSHA256, bool const &checkMtime)
+ bool const &DoSHA256, bool const &DoSHA512,
+ bool const &checkMtime)
{
this->FileName = FileName;
@@ -190,7 +191,9 @@ bool CacheDB::GetFileInfo(string const &FileName, bool const &DoControl, bool co
|| (DoContents && LoadContents(GenContentsOnly) == false)
|| (DoMD5 && GetMD5(false) == false)
|| (DoSHA1 && GetSHA1(false) == false)
- || (DoSHA256 && GetSHA256(false) == false))
+ || (DoSHA256 && GetSHA256(false) == false)
+ || (DoSHA512 && GetSHA512(false) == false)
+ )
{
delete Fd;
Fd = NULL;
@@ -412,6 +415,37 @@ bool CacheDB::GetSHA256(bool const &GenOnly)
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));
+ return true;
+ }
+
+ Stats.SHA512Bytes += CurStat.FileSize;
+
+ if (Fd == NULL && OpenFile() == false)
+ {
+ return false;
+ }
+ SHA512Summation SHA512;
+ if (Fd->Seek(0) == false || SHA512.AddFD(Fd->Fd(),CurStat.FileSize) == false)
+ return false;
+
+ SHA512Res = SHA512.Result();
+ hex2bytes(CurStat.SHA512, SHA512Res.data(), sizeof(CurStat.SHA512));
+ CurStat.Flags |= FlSHA512;
+ return true;
+}
+ /*}}}*/
// CacheDB::Finish - Write back the cache structure /*{{{*/
// ---------------------------------------------------------------------
/* */
diff --git a/ftparchive/cachedb.h b/ftparchive/cachedb.h
index 0ba80909a..15e796325 100644
--- a/ftparchive/cachedb.h
+++ b/ftparchive/cachedb.h
@@ -70,10 +70,13 @@ class CacheDB
bool GetMD5(bool const &GenOnly);
bool GetSHA1(bool const &GenOnly);
bool GetSHA256(bool const &GenOnly);
+ bool GetSHA512(bool const &GenOnly);
// 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)};
+ FlSize=(1<<3), FlSHA1=(1<<4), FlSHA256=(1<<5),
+ FlSHA512=(1<<6)};
+
struct StatStore
{
uint32_t Flags;
@@ -82,6 +85,7 @@ class CacheDB
uint8_t MD5[16];
uint8_t SHA1[20];
uint8_t SHA256[32];
+ uint8_t SHA512[64];
} CurStat;
struct StatStore OldStat;
@@ -98,6 +102,7 @@ class CacheDB
string MD5Res;
string SHA1Res;
string SHA256Res;
+ string SHA512Res;
// Runtime statistics
struct Stats
@@ -106,14 +111,21 @@ class CacheDB
double MD5Bytes;
double SHA1Bytes;
double SHA256Bytes;
+ double SHA512Bytes;
unsigned long Packages;
unsigned long Misses;
unsigned long DeLinkBytes;
inline void Add(const Stats &S) {
- Bytes += S.Bytes; MD5Bytes += S.MD5Bytes; SHA1Bytes += S.SHA1Bytes;
+ Bytes += S.Bytes;
+ MD5Bytes += S.MD5Bytes;
+ SHA1Bytes += S.SHA1Bytes;
SHA256Bytes += S.SHA256Bytes;
- Packages += S.Packages; Misses += S.Misses; DeLinkBytes += S.DeLinkBytes;};
+ SHA512Bytes += S.SHA512Bytes;
+ Packages += S.Packages;
+ Misses += S.Misses;
+ DeLinkBytes += S.DeLinkBytes;
+ };
Stats() : Bytes(0), MD5Bytes(0), SHA1Bytes(0), SHA256Bytes(0), Packages(0), Misses(0), DeLinkBytes(0) {};
} Stats;
@@ -125,7 +137,7 @@ class CacheDB
bool SetFile(string const &FileName,struct stat St,FileFd *Fd);
bool GetFileInfo(string const &FileName, bool const &DoControl, bool const &DoContents, bool const &GenContentsOnly,
- bool const &DoMD5, bool const &DoSHA1, bool const &DoSHA256, bool const &checkMtime = false);
+ bool const &DoMD5, bool const &DoSHA1, bool const &DoSHA256, bool const &DoSHA512, bool const &checkMtime = false);
bool Finish();
bool Clean();
diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc
index 9f12cbf3d..c43e8f4b4 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -20,7 +20,7 @@
#include <apt-pkg/aptconfiguration.h>
#include <apt-pkg/md5.h>
#include <apt-pkg/sha1.h>
-#include <apt-pkg/sha256.h>
+#include <apt-pkg/sha2.h>
#include <apt-pkg/deblistparser.h>
#include <sys/types.h>
@@ -64,6 +64,7 @@ FTWScanner::FTWScanner(string const &Arch): Arch(Arch)
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);
}
/*}}}*/
// FTWScanner::Scanner - FTW Scanner /*{{{*/
@@ -316,6 +317,7 @@ PackagesWriter::PackagesWriter(string const &DB,string const &Overrides,string c
DoMD5 = _config->FindB("APT::FTPArchive::Packages::MD5",DoMD5);
DoSHA1 = _config->FindB("APT::FTPArchive::Packages::SHA1",DoSHA1);
DoSHA256 = _config->FindB("APT::FTPArchive::Packages::SHA256",DoSHA256);
+ DoSHA256 = _config->FindB("APT::FTPArchive::Packages::SHA512",true);
DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false);
DoContents = _config->FindB("APT::FTPArchive::Contents",true);
NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false);
@@ -370,7 +372,7 @@ 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, DoContents, true, DoMD5, DoSHA1, DoSHA256, DoAlwaysStat)
+ if (Db.GetFileInfo(FileName, true, DoContents, true, DoMD5, DoSHA1, DoSHA256, DoSHA512, DoAlwaysStat)
== false)
{
return false;
@@ -446,6 +448,8 @@ bool PackagesWriter::DoPackage(string FileName)
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);
@@ -623,6 +627,7 @@ bool SourcesWriter::DoPackage(string FileName)
MD5Summation MD5;
SHA1Summation SHA1;
SHA256Summation SHA256;
+ SHA256Summation SHA512;
if (DoMD5 == true)
MD5.Add((unsigned char *)Start,BlkEnd - Start);
@@ -630,6 +635,8 @@ bool SourcesWriter::DoPackage(string FileName)
SHA1.Add((unsigned char *)Start,BlkEnd - Start);
if (DoSHA256 == true)
SHA256.Add((unsigned char *)Start,BlkEnd - Start);
+ if (DoSHA512 == true)
+ SHA512.Add((unsigned char *)Start,BlkEnd - Start);
// Add an extra \n to the end, just in case
*BlkEnd++ = '\n';
@@ -740,6 +747,12 @@ bool SourcesWriter::DoPackage(string FileName)
<< strippedName << "\n " << Tags.FindS("Checksums-Sha256");
string const ChecksumsSha256 = ostreamSha256.str();
+ std::ostringstream ostreamSha512;
+ if (Tags.Exists("Checksums-Sha512"))
+ ostreamSha512 << "\n " << string(SHA512.Result()) << " " << St.st_size << " "
+ << strippedName << "\n " << Tags.FindS("Checksums-Sha512");
+ string const ChecksumsSha512 = ostreamSha512.str();
+
// Strip the DirStrip prefix from the FileName and add the PathPrefix
string NewFileName;
if (DirStrip.empty() == false &&
@@ -795,6 +808,8 @@ bool SourcesWriter::DoPackage(string FileName)
SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str());
if (ChecksumsSha256.empty() == false)
SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str());
+ if (ChecksumsSha512.empty() == false)
+ SetTFRewriteData(Changes[End++],"Checksums-Sha512",ChecksumsSha512.c_str());
if (Directory != "./")
SetTFRewriteData(Changes[End++],"Directory",Directory.c_str());
SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str());
@@ -1046,6 +1061,12 @@ bool ReleaseWriter::DoPackage(string FileName)
CheckSums[NewFileName].SHA256 = SHA256.Result();
}
+ if (DoSHA512 == true)
+ {
+ SHA512Summation SHA512;
+ SHA512.AddFD(fd.Fd(), fd.Size());
+ CheckSums[NewFileName].SHA512 = SHA512.Result();
+ }
fd.Close();
return true;
@@ -1092,4 +1113,16 @@ void ReleaseWriter::Finish()
(*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 %32ld %s\n",
+ (*I).second.SHA512.c_str(),
+ (*I).second.size,
+ (*I).first.c_str());
+ }
+
}
diff --git a/ftparchive/writer.h b/ftparchive/writer.h
index ce0eab7af..c6026e954 100644
--- a/ftparchive/writer.h
+++ b/ftparchive/writer.h
@@ -63,6 +63,7 @@ class FTWScanner
bool DoMD5;
bool DoSHA1;
bool DoSHA256;
+ bool DoSHA512;
unsigned long DeLinkLimit;
string InternalPrefix;
@@ -195,6 +196,7 @@ protected:
string MD5;
string SHA1;
string SHA256;
+ string SHA512;
// Limited by FileFd::Size()
unsigned long size;
~CheckSum() {};
diff --git a/po/apt-all.pot b/po/apt-all.pot
index 73ed82195..b409363d0 100644
--- a/po/apt-all.pot
+++ b/po/apt-all.pot
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-01-12 17:42+0100\n"
+"POT-Creation-Date: 2011-06-29 12:34+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,155 +17,159 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: cmdline/apt-cache.cc:156
+#: cmdline/apt-cache.cc:154
#, c-format
msgid "Package %s version %s has an unmet dep:\n"
msgstr ""
-#: cmdline/apt-cache.cc:284
+#: cmdline/apt-cache.cc:282
msgid "Total package names: "
msgstr ""
-#: cmdline/apt-cache.cc:286
+#: cmdline/apt-cache.cc:284
msgid "Total package structures: "
msgstr ""
-#: cmdline/apt-cache.cc:326
+#: cmdline/apt-cache.cc:324
msgid " Normal packages: "
msgstr ""
-#: cmdline/apt-cache.cc:327
+#: cmdline/apt-cache.cc:325
msgid " Pure virtual packages: "
msgstr ""
-#: cmdline/apt-cache.cc:328
+#: cmdline/apt-cache.cc:326
msgid " Single virtual packages: "
msgstr ""
-#: cmdline/apt-cache.cc:329
+#: cmdline/apt-cache.cc:327
msgid " Mixed virtual packages: "
msgstr ""
-#: cmdline/apt-cache.cc:330
+#: cmdline/apt-cache.cc:328
msgid " Missing: "
msgstr ""
-#: cmdline/apt-cache.cc:332
+#: cmdline/apt-cache.cc:330
msgid "Total distinct versions: "
msgstr ""
-#: cmdline/apt-cache.cc:334
+#: cmdline/apt-cache.cc:332
msgid "Total distinct descriptions: "
msgstr ""
-#: cmdline/apt-cache.cc:336
+#: cmdline/apt-cache.cc:334
msgid "Total dependencies: "
msgstr ""
-#: cmdline/apt-cache.cc:339
+#: cmdline/apt-cache.cc:337
msgid "Total ver/file relations: "
msgstr ""
-#: cmdline/apt-cache.cc:341
+#: cmdline/apt-cache.cc:339
msgid "Total Desc/File relations: "
msgstr ""
-#: cmdline/apt-cache.cc:343
+#: cmdline/apt-cache.cc:341
msgid "Total Provides mappings: "
msgstr ""
-#: cmdline/apt-cache.cc:355
+#: cmdline/apt-cache.cc:353
msgid "Total globbed strings: "
msgstr ""
-#: cmdline/apt-cache.cc:369
+#: cmdline/apt-cache.cc:367
msgid "Total dependency version space: "
msgstr ""
-#: cmdline/apt-cache.cc:374
+#: cmdline/apt-cache.cc:372
msgid "Total slack space: "
msgstr ""
-#: cmdline/apt-cache.cc:382
+#: cmdline/apt-cache.cc:380
msgid "Total space accounted for: "
msgstr ""
-#: cmdline/apt-cache.cc:513 cmdline/apt-cache.cc:1194
+#: cmdline/apt-cache.cc:511 cmdline/apt-cache.cc:1139
#, c-format
msgid "Package file %s is out of sync."
msgstr ""
-#: cmdline/apt-cache.cc:1273
+#: cmdline/apt-cache.cc:589 cmdline/apt-cache.cc:1374
+#: cmdline/apt-cache.cc:1376 cmdline/apt-cache.cc:1453 cmdline/apt-mark.cc:37
+#: cmdline/apt-mark.cc:84 cmdline/apt-mark.cc:160
+msgid "No packages found"
+msgstr ""
+
+#: cmdline/apt-cache.cc:1218
msgid "You must give at least one search pattern"
msgstr ""
-#: cmdline/apt-cache.cc:1429 cmdline/apt-cache.cc:1431
-#: cmdline/apt-cache.cc:1508
-msgid "No packages found"
+#: cmdline/apt-cache.cc:1353
+msgid "This command is deprecated. Please use 'apt-mark showauto' instead."
msgstr ""
-#: cmdline/apt-cache.cc:1503 apt-pkg/cacheset.cc:440
+#: cmdline/apt-cache.cc:1448 apt-pkg/cacheset.cc:440
#, c-format
msgid "Unable to locate package %s"
msgstr ""
-#: cmdline/apt-cache.cc:1533
+#: cmdline/apt-cache.cc:1478
msgid "Package files:"
msgstr ""
-#: cmdline/apt-cache.cc:1540 cmdline/apt-cache.cc:1638
+#: cmdline/apt-cache.cc:1485 cmdline/apt-cache.cc:1576
msgid "Cache is out of sync, can't x-ref a package file"
msgstr ""
#. Show any packages have explicit pins
-#: cmdline/apt-cache.cc:1554
+#: cmdline/apt-cache.cc:1499
msgid "Pinned packages:"
msgstr ""
-#: cmdline/apt-cache.cc:1566 cmdline/apt-cache.cc:1618
+#: cmdline/apt-cache.cc:1511 cmdline/apt-cache.cc:1556
msgid "(not found)"
msgstr ""
-#: cmdline/apt-cache.cc:1575
+#: cmdline/apt-cache.cc:1519
msgid " Installed: "
msgstr ""
-#: cmdline/apt-cache.cc:1576
+#: cmdline/apt-cache.cc:1520
msgid " Candidate: "
msgstr ""
-#: cmdline/apt-cache.cc:1600 cmdline/apt-cache.cc:1608
+#: cmdline/apt-cache.cc:1538 cmdline/apt-cache.cc:1546
msgid "(none)"
msgstr ""
-#: cmdline/apt-cache.cc:1615
+#: cmdline/apt-cache.cc:1553
msgid " Package pin: "
msgstr ""
#. Show the priority tables
-#: cmdline/apt-cache.cc:1624
+#: cmdline/apt-cache.cc:1562
msgid " Version table:"
msgstr ""
-#: cmdline/apt-cache.cc:1738 cmdline/apt-cdrom.cc:197 cmdline/apt-config.cc:70
+#: cmdline/apt-cache.cc:1675 cmdline/apt-cdrom.cc:197 cmdline/apt-config.cc:73
#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:589
-#: cmdline/apt-get.cc:2793 cmdline/apt-sortpkgs.cc:144
+#: cmdline/apt-get.cc:3126 cmdline/apt-internal-solver.cc:30
+#: cmdline/apt-mark.cc:264 cmdline/apt-sortpkgs.cc:144
#, c-format
msgid "%s %s for %s compiled on %s %s\n"
msgstr ""
-#: cmdline/apt-cache.cc:1745
+#: cmdline/apt-cache.cc:1682
msgid ""
"Usage: apt-cache [options] command\n"
-" apt-cache [options] add file1 [file2 ...]\n"
" apt-cache [options] showpkg pkg1 [pkg2 ...]\n"
" apt-cache [options] showsrc pkg1 [pkg2 ...]\n"
"\n"
-"apt-cache is a low-level tool used to manipulate APT's binary\n"
-"cache files, and query information from them\n"
+"apt-cache is a low-level tool used to query information\n"
+"from APT's binary cache files\n"
"\n"
"Commands:\n"
-" add - Add a package file to the source cache\n"
" gencaches - Build both the package and source cache\n"
" showpkg - Show some general information for a single package\n"
" showsrc - Show source records\n"
@@ -175,7 +179,6 @@ msgid ""
" unmet - Show unmet dependencies\n"
" search - Search the package list for a regex pattern\n"
" show - Show a readable record for the package\n"
-" showauto - Display a list of automatically installed packages\n"
" depends - Show raw dependency information for a package\n"
" rdepends - Show reverse dependency information for a package\n"
" pkgnames - List the names of all packages in the system\n"
@@ -211,11 +214,11 @@ msgstr ""
msgid "Repeat this process for the rest of the CDs in your set."
msgstr ""
-#: cmdline/apt-config.cc:41
+#: cmdline/apt-config.cc:44
msgid "Arguments not in pairs"
msgstr ""
-#: cmdline/apt-config.cc:76
+#: cmdline/apt-config.cc:79
msgid ""
"Usage: apt-config [options] command\n"
"\n"
@@ -250,7 +253,7 @@ msgid ""
" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
msgstr ""
-#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:1171
+#: cmdline/apt-extracttemplates.cc:267 apt-pkg/pkgcachegen.cc:1149
#, c-format
msgid "Unable to write to %s"
msgstr ""
@@ -361,105 +364,100 @@ msgstr ""
msgid "Failed to stat %s"
msgstr ""
-#: ftparchive/cachedb.cc:242
+#: ftparchive/cachedb.cc:245
msgid "Archive has no control record"
msgstr ""
-#: ftparchive/cachedb.cc:448
+#: ftparchive/cachedb.cc:482
msgid "Unable to get a cursor"
msgstr ""
-#: ftparchive/writer.cc:73
+#: ftparchive/writer.cc:79
#, c-format
msgid "W: Unable to read directory %s\n"
msgstr ""
-#: ftparchive/writer.cc:78
+#: ftparchive/writer.cc:84
#, c-format
msgid "W: Unable to stat %s\n"
msgstr ""
-#: ftparchive/writer.cc:134
+#: ftparchive/writer.cc:140
msgid "E: "
msgstr ""
-#: ftparchive/writer.cc:136
+#: ftparchive/writer.cc:142
msgid "W: "
msgstr ""
-#: ftparchive/writer.cc:143
+#: ftparchive/writer.cc:149
msgid "E: Errors apply to file "
msgstr ""
-#: ftparchive/writer.cc:161 ftparchive/writer.cc:193
+#: ftparchive/writer.cc:167 ftparchive/writer.cc:199
#, c-format
msgid "Failed to resolve %s"
msgstr ""
-#: ftparchive/writer.cc:174
+#: ftparchive/writer.cc:180
msgid "Tree walking failed"
msgstr ""
-#: ftparchive/writer.cc:201
+#: ftparchive/writer.cc:207
#, c-format
msgid "Failed to open %s"
msgstr ""
-#: ftparchive/writer.cc:260
+#: ftparchive/writer.cc:266
#, c-format
msgid " DeLink %s [%s]\n"
msgstr ""
-#: ftparchive/writer.cc:268
+#: ftparchive/writer.cc:274
#, c-format
msgid "Failed to readlink %s"
msgstr ""
-#: ftparchive/writer.cc:272
+#: ftparchive/writer.cc:278
#, c-format
msgid "Failed to unlink %s"
msgstr ""
-#: ftparchive/writer.cc:279
+#: ftparchive/writer.cc:285
#, c-format
msgid "*** Failed to link %s to %s"
msgstr ""
-#: ftparchive/writer.cc:289
+#: ftparchive/writer.cc:295
#, c-format
msgid " DeLink limit of %sB hit.\n"
msgstr ""
-#: ftparchive/writer.cc:393
+#: ftparchive/writer.cc:400
msgid "Archive had no package field"
msgstr ""
-#: ftparchive/writer.cc:401 ftparchive/writer.cc:688
+#: ftparchive/writer.cc:408 ftparchive/writer.cc:710
#, c-format
msgid " %s has no override entry\n"
msgstr ""
-#: ftparchive/writer.cc:464 ftparchive/writer.cc:793
+#: ftparchive/writer.cc:476 ftparchive/writer.cc:826
#, c-format
msgid " %s maintainer is %s not %s\n"
msgstr ""
-#: ftparchive/writer.cc:698
+#: ftparchive/writer.cc:720
#, c-format
msgid " %s has no source override entry\n"
msgstr ""
-#: ftparchive/writer.cc:702
+#: ftparchive/writer.cc:724
#, c-format
msgid " %s has no binary override entry either\n"
msgstr ""
-#: ftparchive/contents.cc:321
-#, c-format
-msgid "Internal error, could not locate member %s"
-msgstr ""
-
-#: ftparchive/contents.cc:358 ftparchive/contents.cc:389
+#: ftparchive/contents.cc:337 ftparchive/contents.cc:368
msgid "realloc - Failed to allocate memory"
msgstr ""
@@ -488,63 +486,63 @@ msgstr ""
msgid "Failed to read the override file %s"
msgstr ""
-#: ftparchive/multicompress.cc:72
+#: ftparchive/multicompress.cc:67
#, c-format
msgid "Unknown compression algorithm '%s'"
msgstr ""
-#: ftparchive/multicompress.cc:102
+#: ftparchive/multicompress.cc:97
#, c-format
msgid "Compressed output %s needs a compression set"
msgstr ""
-#: ftparchive/multicompress.cc:169 methods/rsh.cc:91
+#: ftparchive/multicompress.cc:165 methods/rsh.cc:91
msgid "Failed to create IPC pipe to subprocess"
msgstr ""
-#: ftparchive/multicompress.cc:195
+#: ftparchive/multicompress.cc:191
msgid "Failed to create FILE*"
msgstr ""
-#: ftparchive/multicompress.cc:198
+#: ftparchive/multicompress.cc:194
msgid "Failed to fork"
msgstr ""
-#: ftparchive/multicompress.cc:212
+#: ftparchive/multicompress.cc:208
msgid "Compress child"
msgstr ""
-#: ftparchive/multicompress.cc:235
+#: ftparchive/multicompress.cc:231
#, c-format
msgid "Internal error, failed to create %s"
msgstr ""
-#: ftparchive/multicompress.cc:286
+#: ftparchive/multicompress.cc:282
msgid "Failed to create subprocess IPC"
msgstr ""
-#: ftparchive/multicompress.cc:321
+#: ftparchive/multicompress.cc:319
msgid "Failed to exec compressor "
msgstr ""
-#: ftparchive/multicompress.cc:360
+#: ftparchive/multicompress.cc:358
msgid "decompressor"
msgstr ""
-#: ftparchive/multicompress.cc:403
+#: ftparchive/multicompress.cc:401
msgid "IO to subprocess/file failed"
msgstr ""
-#: ftparchive/multicompress.cc:455
+#: ftparchive/multicompress.cc:453
msgid "Failed to read while computing MD5"
msgstr ""
-#: ftparchive/multicompress.cc:472
+#: ftparchive/multicompress.cc:470
#, c-format
msgid "Problem unlinking %s"
msgstr ""
-#: ftparchive/multicompress.cc:487 apt-inst/extract.cc:185
+#: ftparchive/multicompress.cc:485 apt-inst/extract.cc:185
#, c-format
msgid "Failed to rename %s to %s"
msgstr ""
@@ -592,94 +590,94 @@ msgstr ""
msgid " or"
msgstr ""
-#: cmdline/apt-get.cc:392
+#: cmdline/apt-get.cc:390
msgid "The following NEW packages will be installed:"
msgstr ""
-#: cmdline/apt-get.cc:420
+#: cmdline/apt-get.cc:416
msgid "The following packages will be REMOVED:"
msgstr ""
-#: cmdline/apt-get.cc:442
+#: cmdline/apt-get.cc:438
msgid "The following packages have been kept back:"
msgstr ""
-#: cmdline/apt-get.cc:465
+#: cmdline/apt-get.cc:459
msgid "The following packages will be upgraded:"
msgstr ""
-#: cmdline/apt-get.cc:488
+#: cmdline/apt-get.cc:480
msgid "The following packages will be DOWNGRADED:"
msgstr ""
-#: cmdline/apt-get.cc:508
+#: cmdline/apt-get.cc:500
msgid "The following held packages will be changed:"
msgstr ""
-#: cmdline/apt-get.cc:563
+#: cmdline/apt-get.cc:555
#, c-format
msgid "%s (due to %s) "
msgstr ""
-#: cmdline/apt-get.cc:571
+#: cmdline/apt-get.cc:563
msgid ""
"WARNING: The following essential packages will be removed.\n"
"This should NOT be done unless you know exactly what you are doing!"
msgstr ""
-#: cmdline/apt-get.cc:605
+#: cmdline/apt-get.cc:594
#, c-format
msgid "%lu upgraded, %lu newly installed, "
msgstr ""
-#: cmdline/apt-get.cc:609
+#: cmdline/apt-get.cc:598
#, c-format
msgid "%lu reinstalled, "
msgstr ""
-#: cmdline/apt-get.cc:611
+#: cmdline/apt-get.cc:600
#, c-format
msgid "%lu downgraded, "
msgstr ""
-#: cmdline/apt-get.cc:613
+#: cmdline/apt-get.cc:602
#, c-format
msgid "%lu to remove and %lu not upgraded.\n"
msgstr ""
-#: cmdline/apt-get.cc:617
+#: cmdline/apt-get.cc:606
#, c-format
msgid "%lu not fully installed or removed.\n"
msgstr ""
-#: cmdline/apt-get.cc:639
+#: cmdline/apt-get.cc:628
#, c-format
msgid "Note, selecting '%s' for task '%s'\n"
msgstr ""
-#: cmdline/apt-get.cc:645
+#: cmdline/apt-get.cc:634
#, c-format
msgid "Note, selecting '%s' for regex '%s'\n"
msgstr ""
-#: cmdline/apt-get.cc:662
+#: cmdline/apt-get.cc:651
#, c-format
msgid "Package %s is a virtual package provided by:\n"
msgstr ""
-#: cmdline/apt-get.cc:673
+#: cmdline/apt-get.cc:662
msgid " [Installed]"
msgstr ""
-#: cmdline/apt-get.cc:682
+#: cmdline/apt-get.cc:671
msgid " [Not candidate version]"
msgstr ""
-#: cmdline/apt-get.cc:684
+#: cmdline/apt-get.cc:673
msgid "You should explicitly select one to install."
msgstr ""
-#: cmdline/apt-get.cc:687
+#: cmdline/apt-get.cc:676
#, c-format
msgid ""
"Package %s is not available, but is referred to by another package.\n"
@@ -687,177 +685,177 @@ msgid ""
"is only available from another source\n"
msgstr ""
-#: cmdline/apt-get.cc:705
+#: cmdline/apt-get.cc:694
msgid "However the following packages replace it:"
msgstr ""
-#: cmdline/apt-get.cc:717
+#: cmdline/apt-get.cc:706
#, c-format
msgid "Package '%s' has no installation candidate"
msgstr ""
-#: cmdline/apt-get.cc:728
+#: cmdline/apt-get.cc:717
#, c-format
msgid "Virtual packages like '%s' can't be removed\n"
msgstr ""
-#: cmdline/apt-get.cc:759
+#: cmdline/apt-get.cc:748
#, c-format
msgid "Note, selecting '%s' instead of '%s'\n"
msgstr ""
-#: cmdline/apt-get.cc:789
+#: cmdline/apt-get.cc:778
#, c-format
msgid "Skipping %s, it is already installed and upgrade is not set.\n"
msgstr ""
-#: cmdline/apt-get.cc:793
+#: cmdline/apt-get.cc:782
#, c-format
msgid "Skipping %s, it is not installed and only upgrades are requested.\n"
msgstr ""
-#: cmdline/apt-get.cc:803
+#: cmdline/apt-get.cc:794
#, c-format
msgid "Reinstallation of %s is not possible, it cannot be downloaded.\n"
msgstr ""
-#: cmdline/apt-get.cc:808
+#: cmdline/apt-get.cc:799
#, c-format
msgid "%s is already the newest version.\n"
msgstr ""
-#: cmdline/apt-get.cc:827 cmdline/apt-get.cc:2027
+#: cmdline/apt-get.cc:818 cmdline/apt-get.cc:2082 cmdline/apt-mark.cc:59
#, c-format
msgid "%s set to manually installed.\n"
msgstr ""
-#: cmdline/apt-get.cc:853
+#: cmdline/apt-get.cc:844
#, c-format
msgid "Selected version '%s' (%s) for '%s'\n"
msgstr ""
-#: cmdline/apt-get.cc:858
+#: cmdline/apt-get.cc:849
#, c-format
msgid "Selected version '%s' (%s) for '%s' because of '%s'\n"
msgstr ""
-#: cmdline/apt-get.cc:898
+#: cmdline/apt-get.cc:893
#, c-format
msgid "Package %s is not installed, so not removed\n"
msgstr ""
-#: cmdline/apt-get.cc:973
+#: cmdline/apt-get.cc:971
msgid "Correcting dependencies..."
msgstr ""
-#: cmdline/apt-get.cc:976
+#: cmdline/apt-get.cc:974
msgid " failed."
msgstr ""
-#: cmdline/apt-get.cc:979
+#: cmdline/apt-get.cc:977
msgid "Unable to correct dependencies"
msgstr ""
-#: cmdline/apt-get.cc:982
+#: cmdline/apt-get.cc:980
msgid "Unable to minimize the upgrade set"
msgstr ""
-#: cmdline/apt-get.cc:984
+#: cmdline/apt-get.cc:982
msgid " Done"
msgstr ""
-#: cmdline/apt-get.cc:988
+#: cmdline/apt-get.cc:986
msgid "You might want to run 'apt-get -f install' to correct these."
msgstr ""
-#: cmdline/apt-get.cc:991
+#: cmdline/apt-get.cc:989
msgid "Unmet dependencies. Try using -f."
msgstr ""
-#: cmdline/apt-get.cc:1016
+#: cmdline/apt-get.cc:1014
msgid "WARNING: The following packages cannot be authenticated!"
msgstr ""
-#: cmdline/apt-get.cc:1020
+#: cmdline/apt-get.cc:1018
msgid "Authentication warning overridden.\n"
msgstr ""
-#: cmdline/apt-get.cc:1027
+#: cmdline/apt-get.cc:1025
msgid "Install these packages without verification [y/N]? "
msgstr ""
-#: cmdline/apt-get.cc:1029
+#: cmdline/apt-get.cc:1027
msgid "Some packages could not be authenticated"
msgstr ""
-#: cmdline/apt-get.cc:1038 cmdline/apt-get.cc:1199
+#: cmdline/apt-get.cc:1036 cmdline/apt-get.cc:1197
msgid "There are problems and -y was used without --force-yes"
msgstr ""
-#: cmdline/apt-get.cc:1079
+#: cmdline/apt-get.cc:1077
msgid "Internal error, InstallPackages was called with broken packages!"
msgstr ""
-#: cmdline/apt-get.cc:1088
+#: cmdline/apt-get.cc:1086
msgid "Packages need to be removed but remove is disabled."
msgstr ""
-#: cmdline/apt-get.cc:1099
+#: cmdline/apt-get.cc:1097
msgid "Internal error, Ordering didn't finish"
msgstr ""
-#: cmdline/apt-get.cc:1137
+#: cmdline/apt-get.cc:1135
msgid "How odd.. The sizes didn't match, email apt@packages.debian.org"
msgstr ""
#. TRANSLATOR: The required space between number and unit is already included
#. in the replacement strings, so %sB will be correctly translate in e.g. 1,5 MB
-#: cmdline/apt-get.cc:1144
+#: cmdline/apt-get.cc:1142
#, c-format
msgid "Need to get %sB/%sB of archives.\n"
msgstr ""
#. TRANSLATOR: The required space between number and unit is already included
#. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB
-#: cmdline/apt-get.cc:1149
+#: cmdline/apt-get.cc:1147
#, c-format
msgid "Need to get %sB of archives.\n"
msgstr ""
#. TRANSLATOR: The required space between number and unit is already included
#. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB
-#: cmdline/apt-get.cc:1156
+#: cmdline/apt-get.cc:1154
#, c-format
msgid "After this operation, %sB of additional disk space will be used.\n"
msgstr ""
#. TRANSLATOR: The required space between number and unit is already included
#. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB
-#: cmdline/apt-get.cc:1161
+#: cmdline/apt-get.cc:1159
#, c-format
msgid "After this operation, %sB disk space will be freed.\n"
msgstr ""
-#: cmdline/apt-get.cc:1176 cmdline/apt-get.cc:1179 cmdline/apt-get.cc:2367
-#: cmdline/apt-get.cc:2370
+#: cmdline/apt-get.cc:1174 cmdline/apt-get.cc:1177 cmdline/apt-get.cc:2496
+#: cmdline/apt-get.cc:2499
#, c-format
msgid "Couldn't determine free space in %s"
msgstr ""
-#: cmdline/apt-get.cc:1189
+#: cmdline/apt-get.cc:1187
#, c-format
msgid "You don't have enough free space in %s."
msgstr ""
-#: cmdline/apt-get.cc:1205 cmdline/apt-get.cc:1225
+#: cmdline/apt-get.cc:1203 cmdline/apt-get.cc:1223
msgid "Trivial Only specified but this is not a trivial operation."
msgstr ""
-#: cmdline/apt-get.cc:1207
+#: cmdline/apt-get.cc:1205
msgid "Yes, do as I say!"
msgstr ""
-#: cmdline/apt-get.cc:1209
+#: cmdline/apt-get.cc:1207
#, c-format
msgid ""
"You are about to do something potentially harmful.\n"
@@ -865,46 +863,46 @@ msgid ""
" ?] "
msgstr ""
-#: cmdline/apt-get.cc:1215 cmdline/apt-get.cc:1234
+#: cmdline/apt-get.cc:1213 cmdline/apt-get.cc:1232
msgid "Abort."
msgstr ""
-#: cmdline/apt-get.cc:1230
+#: cmdline/apt-get.cc:1228
msgid "Do you want to continue [Y/n]? "
msgstr ""
-#: cmdline/apt-get.cc:1302 cmdline/apt-get.cc:2427 apt-pkg/algorithms.cc:1470
+#: cmdline/apt-get.cc:1300 cmdline/apt-get.cc:2561 apt-pkg/algorithms.cc:1453
#, c-format
msgid "Failed to fetch %s %s\n"
msgstr ""
-#: cmdline/apt-get.cc:1320
+#: cmdline/apt-get.cc:1318
msgid "Some files failed to download"
msgstr ""
-#: cmdline/apt-get.cc:1321 cmdline/apt-get.cc:2436
+#: cmdline/apt-get.cc:1319 cmdline/apt-get.cc:2573
msgid "Download complete and in download only mode"
msgstr ""
-#: cmdline/apt-get.cc:1327
+#: cmdline/apt-get.cc:1325
msgid ""
"Unable to fetch some archives, maybe run apt-get update or try with --fix-"
"missing?"
msgstr ""
-#: cmdline/apt-get.cc:1331
+#: cmdline/apt-get.cc:1329
msgid "--fix-missing and media swapping is not currently supported"
msgstr ""
-#: cmdline/apt-get.cc:1336
+#: cmdline/apt-get.cc:1334
msgid "Unable to correct missing packages."
msgstr ""
-#: cmdline/apt-get.cc:1337
+#: cmdline/apt-get.cc:1335
msgid "Aborting install."
msgstr ""
-#: cmdline/apt-get.cc:1365
+#: cmdline/apt-get.cc:1363
msgid ""
"The following package disappeared from your system as\n"
"all files have been overwritten by other packages:"
@@ -914,35 +912,35 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: cmdline/apt-get.cc:1369
+#: cmdline/apt-get.cc:1367
msgid "Note: This is done automatic and on purpose by dpkg."
msgstr ""
-#: cmdline/apt-get.cc:1499
+#: cmdline/apt-get.cc:1497
#, c-format
msgid "Ignore unavailable target release '%s' of package '%s'"
msgstr ""
-#: cmdline/apt-get.cc:1531
+#: cmdline/apt-get.cc:1529
#, c-format
msgid "Picking '%s' as source package instead of '%s'\n"
msgstr ""
#. if (VerTag.empty() == false && Last == 0)
-#: cmdline/apt-get.cc:1569
+#: cmdline/apt-get.cc:1567
#, c-format
msgid "Ignore unavailable version '%s' of package '%s'"
msgstr ""
-#: cmdline/apt-get.cc:1585
+#: cmdline/apt-get.cc:1583
msgid "The update command takes no arguments"
msgstr ""
-#: cmdline/apt-get.cc:1647
+#: cmdline/apt-get.cc:1645
msgid "We are not supposed to delete stuff, can't start AutoRemover"
msgstr ""
-#: cmdline/apt-get.cc:1699
+#: cmdline/apt-get.cc:1740
msgid ""
"Hmm, seems like the AutoRemover destroyed something which really\n"
"shouldn't happen. Please file a bug report against apt."
@@ -958,15 +956,15 @@ msgstr ""
#. "that package should be filed.") << endl;
#. }
#.
-#: cmdline/apt-get.cc:1702 cmdline/apt-get.cc:1858
+#: cmdline/apt-get.cc:1743 cmdline/apt-get.cc:1912
msgid "The following information may help to resolve the situation:"
msgstr ""
-#: cmdline/apt-get.cc:1706
+#: cmdline/apt-get.cc:1747
msgid "Internal Error, AutoRemover broke stuff"
msgstr ""
-#: cmdline/apt-get.cc:1713
+#: cmdline/apt-get.cc:1754
msgid ""
"The following package was automatically installed and is no longer required:"
msgid_plural ""
@@ -975,7 +973,7 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: cmdline/apt-get.cc:1717
+#: cmdline/apt-get.cc:1758
#, c-format
msgid "%lu package was automatically installed and is no longer required.\n"
msgid_plural ""
@@ -983,25 +981,25 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: cmdline/apt-get.cc:1719
+#: cmdline/apt-get.cc:1760
msgid "Use 'apt-get autoremove' to remove them."
msgstr ""
-#: cmdline/apt-get.cc:1738
+#: cmdline/apt-get.cc:1779
msgid "Internal error, AllUpgrade broke stuff"
msgstr ""
-#: cmdline/apt-get.cc:1828
+#: cmdline/apt-get.cc:1878
msgid "You might want to run 'apt-get -f install' to correct these:"
msgstr ""
-#: cmdline/apt-get.cc:1831
+#: cmdline/apt-get.cc:1882
msgid ""
"Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a "
"solution)."
msgstr ""
-#: cmdline/apt-get.cc:1843
+#: cmdline/apt-get.cc:1897
msgid ""
"Some packages could not be installed. This may mean that you have\n"
"requested an impossible situation or if you are using the unstable\n"
@@ -1009,69 +1007,80 @@ msgid ""
"or been moved out of Incoming."
msgstr ""
-#: cmdline/apt-get.cc:1861
+#: cmdline/apt-get.cc:1918
msgid "Broken packages"
msgstr ""
-#: cmdline/apt-get.cc:1889
+#: cmdline/apt-get.cc:1944
msgid "The following extra packages will be installed:"
msgstr ""
-#: cmdline/apt-get.cc:1979
+#: cmdline/apt-get.cc:2034
msgid "Suggested packages:"
msgstr ""
-#: cmdline/apt-get.cc:1980
+#: cmdline/apt-get.cc:2035
msgid "Recommended packages:"
msgstr ""
-#: cmdline/apt-get.cc:2022
+#: cmdline/apt-get.cc:2077
#, c-format
msgid "Couldn't find package %s"
msgstr ""
-#: cmdline/apt-get.cc:2029
+#: cmdline/apt-get.cc:2084 cmdline/apt-mark.cc:61
#, c-format
msgid "%s set to automatically installed.\n"
msgstr ""
-#: cmdline/apt-get.cc:2050
+#: cmdline/apt-get.cc:2092 cmdline/apt-mark.cc:105
+msgid ""
+"This command is deprecated. Please use 'apt-mark auto' and 'apt-mark manual' "
+"instead."
+msgstr ""
+
+#: cmdline/apt-get.cc:2108
msgid "Calculating upgrade... "
msgstr ""
-#: cmdline/apt-get.cc:2053 methods/ftp.cc:707 methods/connect.cc:111
+#: cmdline/apt-get.cc:2111 methods/ftp.cc:707 methods/connect.cc:111
msgid "Failed"
msgstr ""
-#: cmdline/apt-get.cc:2058
+#: cmdline/apt-get.cc:2116
msgid "Done"
msgstr ""
-#: cmdline/apt-get.cc:2125 cmdline/apt-get.cc:2133
+#: cmdline/apt-get.cc:2183 cmdline/apt-get.cc:2191
msgid "Internal error, problem resolver broke stuff"
msgstr ""
-#: cmdline/apt-get.cc:2157 cmdline/apt-get.cc:2190
+#: cmdline/apt-get.cc:2215 cmdline/apt-get.cc:2248
msgid "Unable to lock the download directory"
msgstr ""
-#: cmdline/apt-get.cc:2233
+#: cmdline/apt-get.cc:2299
+#, c-format
+msgid "Downloading %s %s"
+msgstr ""
+
+#: cmdline/apt-get.cc:2357
msgid "Must specify at least one package to fetch source for"
msgstr ""
-#: cmdline/apt-get.cc:2273 cmdline/apt-get.cc:2554
+#: cmdline/apt-get.cc:2398 cmdline/apt-get.cc:2694
#, c-format
msgid "Unable to find a source package for %s"
msgstr ""
-#: cmdline/apt-get.cc:2289
+#: cmdline/apt-get.cc:2415
#, c-format
msgid ""
"NOTICE: '%s' packaging is maintained in the '%s' version control system at:\n"
"%s\n"
msgstr ""
-#: cmdline/apt-get.cc:2294
+#: cmdline/apt-get.cc:2420
#, c-format
msgid ""
"Please use:\n"
@@ -1079,115 +1088,120 @@ msgid ""
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
-#: cmdline/apt-get.cc:2345
+#: cmdline/apt-get.cc:2473
#, c-format
msgid "Skipping already downloaded file '%s'\n"
msgstr ""
-#: cmdline/apt-get.cc:2380
+#: cmdline/apt-get.cc:2510
#, c-format
msgid "You don't have enough free space in %s"
msgstr ""
#. TRANSLATOR: The required space between number and unit is already included
#. in the replacement strings, so %sB will be correctly translate in e.g. 1,5 MB
-#: cmdline/apt-get.cc:2388
+#: cmdline/apt-get.cc:2519
#, c-format
msgid "Need to get %sB/%sB of source archives.\n"
msgstr ""
#. TRANSLATOR: The required space between number and unit is already included
#. in the replacement string, so %sB will be correctly translate in e.g. 1,5 MB
-#: cmdline/apt-get.cc:2393
+#: cmdline/apt-get.cc:2524
#, c-format
msgid "Need to get %sB of source archives.\n"
msgstr ""
-#: cmdline/apt-get.cc:2399
+#: cmdline/apt-get.cc:2530
#, c-format
msgid "Fetch source %s\n"
msgstr ""
-#: cmdline/apt-get.cc:2432
+#: cmdline/apt-get.cc:2568
msgid "Failed to fetch some archives."
msgstr ""
-#: cmdline/apt-get.cc:2462
+#: cmdline/apt-get.cc:2599
#, c-format
msgid "Skipping unpack of already unpacked source in %s\n"
msgstr ""
-#: cmdline/apt-get.cc:2474
+#: cmdline/apt-get.cc:2611
#, c-format
msgid "Unpack command '%s' failed.\n"
msgstr ""
-#: cmdline/apt-get.cc:2475
+#: cmdline/apt-get.cc:2612
#, c-format
msgid "Check if the 'dpkg-dev' package is installed.\n"
msgstr ""
-#: cmdline/apt-get.cc:2492
+#: cmdline/apt-get.cc:2629
#, c-format
msgid "Build command '%s' failed.\n"
msgstr ""
-#: cmdline/apt-get.cc:2512
+#: cmdline/apt-get.cc:2649
msgid "Child process failed"
msgstr ""
-#: cmdline/apt-get.cc:2528
+#: cmdline/apt-get.cc:2668
msgid "Must specify at least one package to check builddeps for"
msgstr ""
-#: cmdline/apt-get.cc:2559
+#: cmdline/apt-get.cc:2699
#, c-format
msgid "Unable to get build-dependency information for %s"
msgstr ""
-#: cmdline/apt-get.cc:2579
+#: cmdline/apt-get.cc:2719
#, c-format
msgid "%s has no build depends.\n"
msgstr ""
-#: cmdline/apt-get.cc:2630
+#: cmdline/apt-get.cc:2770
#, c-format
msgid ""
"%s dependency for %s cannot be satisfied because the package %s cannot be "
"found"
msgstr ""
-#: cmdline/apt-get.cc:2683
+#: cmdline/apt-get.cc:2823
#, c-format
msgid ""
"%s dependency for %s cannot be satisfied because no available versions of "
"package %s can satisfy version requirements"
msgstr ""
-#: cmdline/apt-get.cc:2719
+#: cmdline/apt-get.cc:2859
#, c-format
msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new"
msgstr ""
-#: cmdline/apt-get.cc:2746
+#: cmdline/apt-get.cc:2886
#, c-format
msgid "Failed to satisfy %s dependency for %s: %s"
msgstr ""
-#: cmdline/apt-get.cc:2762
+#: cmdline/apt-get.cc:2902
#, c-format
msgid "Build-dependencies for %s could not be satisfied."
msgstr ""
-#: cmdline/apt-get.cc:2767
+#: cmdline/apt-get.cc:2907
msgid "Failed to process build dependencies"
msgstr ""
-#: cmdline/apt-get.cc:2798
+#: cmdline/apt-get.cc:3000 cmdline/apt-get.cc:3012
+#, c-format
+msgid "Changelog for %s (%s)"
+msgstr ""
+
+#: cmdline/apt-get.cc:3131
msgid "Supported modules:"
msgstr ""
-#: cmdline/apt-get.cc:2839
+#: cmdline/apt-get.cc:3172
msgid ""
"Usage: apt-get [options] command\n"
" apt-get [options] install|remove pkg1 [pkg2 ...]\n"
@@ -1211,8 +1225,8 @@ msgid ""
" clean - Erase downloaded archive files\n"
" autoclean - Erase old downloaded archive files\n"
" check - Verify that there are no broken dependencies\n"
-" markauto - Mark the given packages as automatically installed\n"
-" unmarkauto - Mark the given packages as manually installed\n"
+" changelog - Download and display the changelog for the given package\n"
+" download - Download the binary package into the current directory\n"
"\n"
"Options:\n"
" -h This help text.\n"
@@ -1233,7 +1247,7 @@ msgid ""
" This APT has Super Cow Powers.\n"
msgstr ""
-#: cmdline/apt-get.cc:2995
+#: cmdline/apt-get.cc:3335
msgid ""
"NOTE: This is only a simulation!\n"
" apt-get needs root privileges for real execution.\n"
@@ -1275,6 +1289,83 @@ msgid ""
"in the drive '%s' and press enter\n"
msgstr ""
+#: cmdline/apt-internal-solver.cc:34
+msgid ""
+"Usage: apt-internal-resolver\n"
+"\n"
+"apt-internal-resolver is an interface to use the current internal\n"
+"like an external resolver for the APT family for debugging or alike\n"
+"\n"
+"Options:\n"
+" -h This help text.\n"
+" -q Loggable output - no progress indicator\n"
+" -c=? Read this configuration file\n"
+" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
+"apt.conf(5) manual pages for more information and options.\n"
+" This APT has Super Cow Powers.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:46
+#, c-format
+msgid "%s can not be marked as it is not installed.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:52
+#, c-format
+msgid "%s was already set to manually installed.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:54
+#, c-format
+msgid "%s was already set to automatically installed.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:169
+#, c-format
+msgid "%s was already set on hold.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:171
+#, c-format
+msgid "%s was already not hold.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:185 cmdline/apt-mark.cc:207
+#, c-format
+msgid "%s set on hold.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:187 cmdline/apt-mark.cc:212
+#, c-format
+msgid "Canceled hold on %s.\n"
+msgstr ""
+
+#: cmdline/apt-mark.cc:220
+msgid "Executing dpkg failed. Are you root?"
+msgstr ""
+
+#: cmdline/apt-mark.cc:268
+msgid ""
+"Usage: apt-mark [options] {auto|manual} pkg1 [pkg2 ...]\n"
+"\n"
+"apt-mark is a simple command line interface for marking packages\n"
+"as manual or automatical installed. It can also list marks.\n"
+"\n"
+"Commands:\n"
+" auto - Mark the given packages as automatically installed\n"
+" manual - Mark the given packages as manually installed\n"
+"\n"
+"Options:\n"
+" -h This help text.\n"
+" -q Loggable output - no progress indicator\n"
+" -qq No output except for errors\n"
+" -s No-act. Just prints what would be done.\n"
+" -f read/write auto/manual marking in the given file\n"
+" -c=? Read this configuration file\n"
+" -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n"
+"See the apt-mark(8) and apt.conf(5) manual pages for more information."
+msgstr ""
+
#: cmdline/apt-sortpkgs.cc:86
msgid "Unknown package record!"
msgstr ""
@@ -1335,7 +1426,7 @@ msgstr ""
msgid "Failed to exec gzip "
msgstr ""
-#: apt-inst/contrib/extracttar.cc:178 apt-inst/contrib/extracttar.cc:204
+#: apt-inst/contrib/extracttar.cc:178 apt-inst/contrib/extracttar.cc:208
msgid "Corrupted archive"
msgstr ""
@@ -1343,7 +1434,7 @@ msgstr ""
msgid "Tar checksum failed, archive corrupted"
msgstr ""
-#: apt-inst/contrib/extracttar.cc:296
+#: apt-inst/contrib/extracttar.cc:300
#, c-format
msgid "Unknown TAR header type %u, member %s"
msgstr ""
@@ -1404,12 +1495,12 @@ msgstr ""
msgid "Duplicate conf file %s/%s"
msgstr ""
-#: apt-inst/dirstream.cc:41 apt-inst/dirstream.cc:46 apt-inst/dirstream.cc:49
+#: apt-inst/dirstream.cc:41 apt-inst/dirstream.cc:47 apt-inst/dirstream.cc:53
#, c-format
msgid "Failed to write file %s"
msgstr ""
-#: apt-inst/dirstream.cc:92 apt-inst/dirstream.cc:100
+#: apt-inst/dirstream.cc:98 apt-inst/dirstream.cc:106
#, c-format
msgid "Failed to close file %s"
msgstr ""
@@ -1451,28 +1542,28 @@ msgstr ""
msgid "The path is too long"
msgstr ""
-#: apt-inst/extract.cc:414
+#: apt-inst/extract.cc:412
#, c-format
msgid "Overwrite package match with no version for %s"
msgstr ""
-#: apt-inst/extract.cc:431
+#: apt-inst/extract.cc:429
#, c-format
msgid "File %s/%s overwrites the one in the package %s"
msgstr ""
#. Only warn if there are no sources.list.d.
#. Only warn if there is no sources.list file.
-#: apt-inst/extract.cc:464 apt-pkg/contrib/cdromutl.cc:179
-#: apt-pkg/contrib/fileutl.cc:329 apt-pkg/sourcelist.cc:204
-#: apt-pkg/sourcelist.cc:210 apt-pkg/acquire.cc:450 apt-pkg/init.cc:100
-#: apt-pkg/init.cc:108 apt-pkg/clean.cc:33 apt-pkg/policy.cc:307
-#: methods/mirror.cc:87
+#: apt-inst/extract.cc:462 apt-pkg/contrib/cdromutl.cc:179
+#: apt-pkg/contrib/fileutl.cc:343 apt-pkg/sourcelist.cc:204
+#: apt-pkg/sourcelist.cc:210 apt-pkg/acquire.cc:450 apt-pkg/init.cc:102
+#: apt-pkg/init.cc:110 apt-pkg/clean.cc:33 apt-pkg/policy.cc:318
+#: methods/mirror.cc:91
#, c-format
msgid "Unable to read %s"
msgstr ""
-#: apt-inst/extract.cc:491
+#: apt-inst/extract.cc:489
#, c-format
msgid "Unable to stat %s"
msgstr ""
@@ -1496,9 +1587,9 @@ msgstr ""
msgid "The info and temp directories need to be on the same filesystem"
msgstr ""
-#: apt-inst/deb/dpkgdb.cc:135 apt-pkg/pkgcachegen.cc:1070
-#: apt-pkg/pkgcachegen.cc:1174 apt-pkg/pkgcachegen.cc:1180
-#: apt-pkg/pkgcachegen.cc:1326
+#: apt-inst/deb/dpkgdb.cc:135 apt-pkg/pkgcachegen.cc:1048
+#: apt-pkg/pkgcachegen.cc:1152 apt-pkg/pkgcachegen.cc:1158
+#: apt-pkg/pkgcachegen.cc:1304
msgid "Reading package lists"
msgstr ""
@@ -1571,51 +1662,57 @@ msgstr ""
msgid "Error parsing MD5. Offset %lu"
msgstr ""
-#: apt-inst/deb/debfile.cc:38 apt-inst/deb/debfile.cc:43
+#: apt-inst/deb/debfile.cc:39 apt-inst/deb/debfile.cc:44
#, c-format
msgid "This is not a valid DEB archive, missing '%s' member"
msgstr ""
-#: apt-inst/deb/debfile.cc:50
+#. FIXME: add data.tar.xz here - adding it now would require a Translation round for a very small gain
+#: apt-inst/deb/debfile.cc:53
#, c-format
msgid "This is not a valid DEB archive, it has no '%s', '%s' or '%s' member"
msgstr ""
-#: apt-inst/deb/debfile.cc:110
+#: apt-inst/deb/debfile.cc:113
#, c-format
msgid "Couldn't change to %s"
msgstr ""
-#: apt-inst/deb/debfile.cc:140
-msgid "Internal error, could not locate member"
+#: apt-inst/deb/debfile.cc:154
+#, c-format
+msgid "Internal error, could not locate member %s"
msgstr ""
-#: apt-inst/deb/debfile.cc:173
+#: apt-inst/deb/debfile.cc:189
msgid "Failed to locate a valid control file"
msgstr ""
-#: apt-inst/deb/debfile.cc:258
+#: apt-inst/deb/debfile.cc:274
msgid "Unparsable control file"
msgstr ""
-#: methods/bzip2.cc:65
+#: methods/bzip2.cc:60 methods/gzip.cc:52
+msgid "Empty files can't be valid archives"
+msgstr ""
+
+#: methods/bzip2.cc:64
#, c-format
msgid "Couldn't open pipe for %s"
msgstr ""
-#: methods/bzip2.cc:109
+#: methods/bzip2.cc:108
#, c-format
msgid "Read error from %s process"
msgstr ""
-#: methods/bzip2.cc:141 methods/bzip2.cc:150 methods/copy.cc:43
-#: methods/gzip.cc:93 methods/gzip.cc:102 methods/rred.cc:486
-#: methods/rred.cc:495
+#: methods/bzip2.cc:140 methods/bzip2.cc:149 methods/copy.cc:43
+#: methods/gzip.cc:92 methods/gzip.cc:101 methods/rred.cc:524
+#: methods/rred.cc:533
msgid "Failed to stat"
msgstr ""
-#: methods/bzip2.cc:147 methods/copy.cc:80 methods/gzip.cc:99
-#: methods/rred.cc:492
+#: methods/bzip2.cc:146 methods/copy.cc:80 methods/gzip.cc:98
+#: methods/rred.cc:530
msgid "Failed to set modification time"
msgstr ""
@@ -1643,7 +1740,7 @@ msgstr ""
msgid "Disk not found."
msgstr ""
-#: methods/cdrom.cc:258 methods/file.cc:79 methods/rsh.cc:264
+#: methods/cdrom.cc:258 methods/file.cc:79 methods/rsh.cc:265
msgid "File not found"
msgstr ""
@@ -1695,7 +1792,7 @@ msgstr ""
msgid "TYPE failed, server said: %s"
msgstr ""
-#: methods/ftp.cc:335 methods/ftp.cc:446 methods/rsh.cc:183 methods/rsh.cc:226
+#: methods/ftp.cc:335 methods/ftp.cc:446 methods/rsh.cc:184 methods/rsh.cc:227
msgid "Connection timeout"
msgstr ""
@@ -1703,11 +1800,11 @@ msgstr ""
msgid "Server closed the connection"
msgstr ""
-#: methods/ftp.cc:344 apt-pkg/contrib/fileutl.cc:802 methods/rsh.cc:190
+#: methods/ftp.cc:344 apt-pkg/contrib/fileutl.cc:820 methods/rsh.cc:191
msgid "Read error"
msgstr ""
-#: methods/ftp.cc:351 methods/rsh.cc:197
+#: methods/ftp.cc:351 methods/rsh.cc:198
msgid "A response overflowed the buffer."
msgstr ""
@@ -1715,7 +1812,7 @@ msgstr ""
msgid "Protocol corruption"
msgstr ""
-#: methods/ftp.cc:452 apt-pkg/contrib/fileutl.cc:844 methods/rsh.cc:232
+#: methods/ftp.cc:452 apt-pkg/contrib/fileutl.cc:862 methods/rsh.cc:233
msgid "Write error"
msgstr ""
@@ -1769,7 +1866,7 @@ msgstr ""
msgid "Unable to accept connection"
msgstr ""
-#: methods/ftp.cc:869 methods/http.cc:1006 methods/rsh.cc:302
+#: methods/ftp.cc:869 methods/http.cc:1023 methods/rsh.cc:303
msgid "Problem hashing file"
msgstr ""
@@ -1778,7 +1875,7 @@ msgstr ""
msgid "Unable to fetch file, server said '%s'"
msgstr ""
-#: methods/ftp.cc:897 methods/rsh.cc:321
+#: methods/ftp.cc:897 methods/rsh.cc:322
msgid "Data socket timed out"
msgstr ""
@@ -1828,7 +1925,7 @@ msgstr ""
#. We say this mainly because the pause here is for the
#. ssh connection that is still going
-#: methods/connect.cc:149 methods/rsh.cc:424
+#: methods/connect.cc:149 methods/rsh.cc:425
#, c-format
msgid "Connecting to %s"
msgstr ""
@@ -1919,47 +2016,47 @@ msgstr ""
msgid "Unknown date format"
msgstr ""
-#: methods/http.cc:799
+#: methods/http.cc:800
msgid "Select failed"
msgstr ""
-#: methods/http.cc:804
+#: methods/http.cc:805
msgid "Connection timed out"
msgstr ""
-#: methods/http.cc:827
+#: methods/http.cc:828
msgid "Error writing to output file"
msgstr ""
-#: methods/http.cc:858
+#: methods/http.cc:859
msgid "Error writing to file"
msgstr ""
-#: methods/http.cc:886
+#: methods/http.cc:887
msgid "Error writing to the file"
msgstr ""
-#: methods/http.cc:900
+#: methods/http.cc:901
msgid "Error reading from server. Remote end closed connection"
msgstr ""
-#: methods/http.cc:902
+#: methods/http.cc:903
msgid "Error reading from server"
msgstr ""
-#: methods/http.cc:991 apt-pkg/contrib/mmap.cc:281
+#: methods/http.cc:1008 apt-pkg/contrib/mmap.cc:291
msgid "Failed to truncate file"
msgstr ""
-#: methods/http.cc:1160
+#: methods/http.cc:1183
msgid "Bad header data"
msgstr ""
-#: methods/http.cc:1177 methods/http.cc:1232
+#: methods/http.cc:1200 methods/http.cc:1255
msgid "Connection failed"
msgstr ""
-#: methods/http.cc:1324
+#: methods/http.cc:1347
msgid "Internal error"
msgstr ""
@@ -1972,7 +2069,7 @@ msgstr ""
msgid "Couldn't duplicate file descriptor %i"
msgstr ""
-#: apt-pkg/contrib/mmap.cc:97 apt-pkg/contrib/mmap.cc:250
+#: apt-pkg/contrib/mmap.cc:97 apt-pkg/contrib/mmap.cc:258
#, c-format
msgid "Couldn't make mmap of %lu bytes"
msgstr ""
@@ -1985,21 +2082,21 @@ msgstr ""
msgid "Unable to synchronize mmap"
msgstr ""
-#: apt-pkg/contrib/mmap.cc:300
+#: apt-pkg/contrib/mmap.cc:310
#, c-format
msgid ""
"Dynamic MMap ran out of room. Please increase the size of APT::Cache-Limit. "
"Current value: %lu. (man 5 apt.conf)"
msgstr ""
-#: apt-pkg/contrib/mmap.cc:399
+#: apt-pkg/contrib/mmap.cc:409
#, c-format
msgid ""
"Unable to increase the size of the MMap as the limit of %lu bytes is already "
"reached."
msgstr ""
-#: apt-pkg/contrib/mmap.cc:402
+#: apt-pkg/contrib/mmap.cc:412
msgid ""
"Unable to increase size of the MMap as automatic growing is disabled by user."
msgstr ""
@@ -2028,7 +2125,7 @@ msgstr ""
msgid "%lis"
msgstr ""
-#: apt-pkg/contrib/strutl.cc:1119
+#: apt-pkg/contrib/strutl.cc:1138
#, c-format
msgid "Selection %s not found"
msgstr ""
@@ -2088,12 +2185,12 @@ msgstr ""
msgid "Syntax error %s:%u: Extra junk at end of file"
msgstr ""
-#: apt-pkg/contrib/progress.cc:153
+#: apt-pkg/contrib/progress.cc:144
#, c-format
msgid "%c%s... Error!"
msgstr ""
-#: apt-pkg/contrib/progress.cc:155
+#: apt-pkg/contrib/progress.cc:146
#, c-format
msgid "%c%s... Done"
msgstr ""
@@ -2151,106 +2248,122 @@ msgstr ""
#: apt-pkg/contrib/cdromutl.cc:175 apt-pkg/contrib/cdromutl.cc:209
#: apt-pkg/acquire.cc:456 apt-pkg/acquire.cc:481 apt-pkg/clean.cc:39
-#: methods/mirror.cc:93
+#: methods/mirror.cc:97
#, c-format
msgid "Unable to change to %s"
msgstr ""
-#: apt-pkg/contrib/cdromutl.cc:217
+#: apt-pkg/contrib/cdromutl.cc:220
msgid "Failed to stat the cdrom"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:154
+#: apt-pkg/contrib/fileutl.cc:168
#, c-format
msgid "Not using locking for read only lock file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:159
+#: apt-pkg/contrib/fileutl.cc:173
#, c-format
msgid "Could not open lock file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:177
+#: apt-pkg/contrib/fileutl.cc:191
#, c-format
msgid "Not using locking for nfs mounted lock file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:181
+#: apt-pkg/contrib/fileutl.cc:195
#, c-format
msgid "Could not get lock %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:321
+#: apt-pkg/contrib/fileutl.cc:335
#, c-format
msgid "List of files can't be created as '%s' is not a directory"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:661
+#: apt-pkg/contrib/fileutl.cc:362
+#, c-format
+msgid "Ignoring '%s' in directory '%s' as it is not a regular file"
+msgstr ""
+
+#: apt-pkg/contrib/fileutl.cc:380
+#, c-format
+msgid "Ignoring file '%s' in directory '%s' as it has no filename extension"
+msgstr ""
+
+#: apt-pkg/contrib/fileutl.cc:389
+#, c-format
+msgid ""
+"Ignoring file '%s' in directory '%s' as it has an invalid filename extension"
+msgstr ""
+
+#: apt-pkg/contrib/fileutl.cc:679
#, c-format
msgid "Waited for %s but it wasn't there"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:673
+#: apt-pkg/contrib/fileutl.cc:691
#, c-format
msgid "Sub-process %s received a segmentation fault."
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:675
+#: apt-pkg/contrib/fileutl.cc:693
#, c-format
msgid "Sub-process %s received signal %u."
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:679
+#: apt-pkg/contrib/fileutl.cc:697
#, c-format
msgid "Sub-process %s returned an error code (%u)"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:681
+#: apt-pkg/contrib/fileutl.cc:699
#, c-format
msgid "Sub-process %s exited unexpectedly"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:746
+#: apt-pkg/contrib/fileutl.cc:764
#, c-format
msgid "Could not open file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:763
+#: apt-pkg/contrib/fileutl.cc:781
#, c-format
msgid "Could not open file descriptor %d"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:823
+#: apt-pkg/contrib/fileutl.cc:841
#, c-format
msgid "read, still have %lu to read but none left"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:856
+#: apt-pkg/contrib/fileutl.cc:874
#, c-format
msgid "write, still have %lu to write but couldn't"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:985
+#: apt-pkg/contrib/fileutl.cc:1010
#, c-format
msgid "Problem closing the gzip file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:988
+#: apt-pkg/contrib/fileutl.cc:1013
#, c-format
msgid "Problem closing the file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:993
+#: apt-pkg/contrib/fileutl.cc:1018
#, c-format
msgid "Problem renaming the file %s to %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:1004
+#: apt-pkg/contrib/fileutl.cc:1029
#, c-format
msgid "Problem unlinking the file %s"
msgstr ""
-#: apt-pkg/contrib/fileutl.cc:1017
+#: apt-pkg/contrib/fileutl.cc:1042
msgid "Problem syncing the file"
msgstr ""
@@ -2275,59 +2388,59 @@ msgstr ""
msgid "The package cache was built for a different architecture"
msgstr ""
-#: apt-pkg/pkgcache.cc:293
+#: apt-pkg/pkgcache.cc:299
msgid "Depends"
msgstr ""
-#: apt-pkg/pkgcache.cc:293
+#: apt-pkg/pkgcache.cc:299
msgid "PreDepends"
msgstr ""
-#: apt-pkg/pkgcache.cc:293
+#: apt-pkg/pkgcache.cc:299
msgid "Suggests"
msgstr ""
-#: apt-pkg/pkgcache.cc:294
+#: apt-pkg/pkgcache.cc:300
msgid "Recommends"
msgstr ""
-#: apt-pkg/pkgcache.cc:294
+#: apt-pkg/pkgcache.cc:300
msgid "Conflicts"
msgstr ""
-#: apt-pkg/pkgcache.cc:294
+#: apt-pkg/pkgcache.cc:300
msgid "Replaces"
msgstr ""
-#: apt-pkg/pkgcache.cc:295
+#: apt-pkg/pkgcache.cc:301
msgid "Obsoletes"
msgstr ""
-#: apt-pkg/pkgcache.cc:295
+#: apt-pkg/pkgcache.cc:301
msgid "Breaks"
msgstr ""
-#: apt-pkg/pkgcache.cc:295
+#: apt-pkg/pkgcache.cc:301
msgid "Enhances"
msgstr ""
-#: apt-pkg/pkgcache.cc:306
+#: apt-pkg/pkgcache.cc:312
msgid "important"
msgstr ""
-#: apt-pkg/pkgcache.cc:306
+#: apt-pkg/pkgcache.cc:312
msgid "required"
msgstr ""
-#: apt-pkg/pkgcache.cc:306
+#: apt-pkg/pkgcache.cc:312
msgid "standard"
msgstr ""
-#: apt-pkg/pkgcache.cc:307
+#: apt-pkg/pkgcache.cc:313
msgid "optional"
msgstr ""
-#: apt-pkg/pkgcache.cc:307
+#: apt-pkg/pkgcache.cc:313
msgid "extra"
msgstr ""
@@ -2357,17 +2470,12 @@ msgstr ""
msgid "Failed to write temporary StateFile %s"
msgstr ""
-#: apt-pkg/depcache.cc:922
-#, c-format
-msgid "Internal error, group '%s' has no installable pseudo package"
-msgstr ""
-
-#: apt-pkg/tagfile.cc:102
+#: apt-pkg/tagfile.cc:123
#, c-format
msgid "Unable to parse package file %s (1)"
msgstr ""
-#: apt-pkg/tagfile.cc:189
+#: apt-pkg/tagfile.cc:210
#, c-format
msgid "Unable to parse package file %s (2)"
msgstr ""
@@ -2427,7 +2535,7 @@ msgstr ""
msgid "Opening %s"
msgstr ""
-#: apt-pkg/sourcelist.cc:261 apt-pkg/cdrom.cc:438
+#: apt-pkg/sourcelist.cc:261 apt-pkg/cdrom.cc:444
#, c-format
msgid "Line %u too long in source list %s."
msgstr ""
@@ -2442,14 +2550,14 @@ msgstr ""
msgid "Type '%s' is not known on line %u in source list %s"
msgstr ""
-#: apt-pkg/packagemanager.cc:331 apt-pkg/packagemanager.cc:616
+#: apt-pkg/packagemanager.cc:335 apt-pkg/packagemanager.cc:623
#, c-format
msgid ""
"Could not perform immediate configuration on '%s'. Please see man 5 apt.conf "
"under APT::Immediate-Configure for details. (%d)"
msgstr ""
-#: apt-pkg/packagemanager.cc:452
+#: apt-pkg/packagemanager.cc:456
#, c-format
msgid ""
"This installation run will require temporarily removing the essential "
@@ -2457,7 +2565,7 @@ msgid ""
"you really want to do it, activate the APT::Force-LoopBreak option."
msgstr ""
-#: apt-pkg/packagemanager.cc:495
+#: apt-pkg/packagemanager.cc:501
#, c-format
msgid ""
"Could not perform immediate configuration on already unpacked '%s'. Please "
@@ -2469,25 +2577,25 @@ msgstr ""
msgid "Index file type '%s' is not supported"
msgstr ""
-#: apt-pkg/algorithms.cc:292
+#: apt-pkg/algorithms.cc:250
#, c-format
msgid ""
"The package %s needs to be reinstalled, but I can't find an archive for it."
msgstr ""
-#: apt-pkg/algorithms.cc:1218
+#: apt-pkg/algorithms.cc:1186
msgid ""
"Error, pkgProblemResolver::Resolve generated breaks, this may be caused by "
"held packages."
msgstr ""
-#: apt-pkg/algorithms.cc:1220
+#: apt-pkg/algorithms.cc:1188
msgid "Unable to correct problems, you have held broken packages."
msgstr ""
-#: apt-pkg/algorithms.cc:1496 apt-pkg/algorithms.cc:1498
+#: apt-pkg/algorithms.cc:1479 apt-pkg/algorithms.cc:1481
msgid ""
-"Some index files failed to download, they have been ignored, or old ones "
+"Some index files failed to download. They have been ignored, or old ones "
"used instead."
msgstr ""
@@ -2528,17 +2636,17 @@ msgstr ""
msgid "Method %s did not start correctly"
msgstr ""
-#: apt-pkg/acquire-worker.cc:413
+#: apt-pkg/acquire-worker.cc:423
#, c-format
msgid "Please insert the disc labeled: '%s' in the drive '%s' and press enter."
msgstr ""
-#: apt-pkg/init.cc:143
+#: apt-pkg/init.cc:145
#, c-format
msgid "Packaging system '%s' is not supported"
msgstr ""
-#: apt-pkg/init.cc:159
+#: apt-pkg/init.cc:161
msgid "Unable to determine a suitable packaging system type"
msgstr ""
@@ -2563,17 +2671,17 @@ msgstr ""
msgid "The list of sources could not be read."
msgstr ""
-#: apt-pkg/policy.cc:344
+#: apt-pkg/policy.cc:355
#, c-format
msgid "Invalid record in the preferences file %s, no Package header"
msgstr ""
-#: apt-pkg/policy.cc:366
+#: apt-pkg/policy.cc:377
#, c-format
msgid "Did not understand pin type %s"
msgstr ""
-#: apt-pkg/policy.cc:374
+#: apt-pkg/policy.cc:385
msgid "No priority (or zero) specified for pin"
msgstr ""
@@ -2581,155 +2689,168 @@ msgstr ""
msgid "Cache has an incompatible versioning system"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:198
+#: apt-pkg/pkgcachegen.cc:187
#, c-format
msgid "Error occurred while processing %s (NewPackage)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:215
+#: apt-pkg/pkgcachegen.cc:204
#, c-format
msgid "Error occurred while processing %s (UsePackage1)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:253
+#: apt-pkg/pkgcachegen.cc:242
#, c-format
msgid "Error occurred while processing %s (NewFileDesc1)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:285
+#: apt-pkg/pkgcachegen.cc:274
#, c-format
msgid "Error occurred while processing %s (UsePackage2)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:289
+#: apt-pkg/pkgcachegen.cc:278
#, c-format
msgid "Error occurred while processing %s (NewFileVer1)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:306 apt-pkg/pkgcachegen.cc:316
-#: apt-pkg/pkgcachegen.cc:324
+#: apt-pkg/pkgcachegen.cc:295 apt-pkg/pkgcachegen.cc:305
+#: apt-pkg/pkgcachegen.cc:313
#, c-format
msgid "Error occurred while processing %s (NewVersion%d)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:320
+#: apt-pkg/pkgcachegen.cc:309
#, c-format
msgid "Error occurred while processing %s (UsePackage3)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:353
+#: apt-pkg/pkgcachegen.cc:342
#, c-format
msgid "Error occurred while processing %s (NewFileDesc2)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:360
+#: apt-pkg/pkgcachegen.cc:348
msgid "Wow, you exceeded the number of package names this APT is capable of."
msgstr ""
-#: apt-pkg/pkgcachegen.cc:363
+#: apt-pkg/pkgcachegen.cc:351
msgid "Wow, you exceeded the number of versions this APT is capable of."
msgstr ""
-#: apt-pkg/pkgcachegen.cc:366
+#: apt-pkg/pkgcachegen.cc:354
msgid "Wow, you exceeded the number of descriptions this APT is capable of."
msgstr ""
-#: apt-pkg/pkgcachegen.cc:369
+#: apt-pkg/pkgcachegen.cc:357
msgid "Wow, you exceeded the number of dependencies this APT is capable of."
msgstr ""
-#: apt-pkg/pkgcachegen.cc:398
+#: apt-pkg/pkgcachegen.cc:386
#, c-format
msgid "Error occurred while processing %s (FindPkg)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:412
+#: apt-pkg/pkgcachegen.cc:400
#, c-format
msgid "Error occurred while processing %s (CollectFileProvides)"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:418
+#: apt-pkg/pkgcachegen.cc:406
#, c-format
msgid "Package %s %s was not found while processing file dependencies"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:982
+#: apt-pkg/pkgcachegen.cc:960
#, c-format
msgid "Couldn't stat source package list %s"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:1087
+#: apt-pkg/pkgcachegen.cc:1065
msgid "Collecting File Provides"
msgstr ""
-#: apt-pkg/pkgcachegen.cc:1265 apt-pkg/pkgcachegen.cc:1272
+#: apt-pkg/pkgcachegen.cc:1243 apt-pkg/pkgcachegen.cc:1250
msgid "IO Error saving source cache"
msgstr ""
-#: apt-pkg/acquire-item.cc:136
+#: apt-pkg/acquire-item.cc:135
#, c-format
msgid "rename failed, %s (%s -> %s)."
msgstr ""
-#: apt-pkg/acquire-item.cc:484
+#: apt-pkg/acquire-item.cc:636
msgid "MD5Sum mismatch"
msgstr ""
-#: apt-pkg/acquire-item.cc:746 apt-pkg/acquire-item.cc:1574
-#: apt-pkg/acquire-item.cc:1717
+#: apt-pkg/acquire-item.cc:900 apt-pkg/acquire-item.cc:1850
+#: apt-pkg/acquire-item.cc:1993
msgid "Hash Sum mismatch"
msgstr ""
-#: apt-pkg/acquire-item.cc:1244
+#: apt-pkg/acquire-item.cc:1388
+#, c-format
+msgid ""
+"Unable to find expected entry '%s' in Release file (Wrong sources.list entry "
+"or malformed file)"
+msgstr ""
+
+#: apt-pkg/acquire-item.cc:1403
+#, c-format
+msgid "Unable to find hash sum for '%s' in Release file"
+msgstr ""
+
+#: apt-pkg/acquire-item.cc:1439
msgid "There is no public key available for the following key IDs:\n"
msgstr ""
#. TRANSLATOR: The first %s is the URL of the bad Release file, the second is
#. the time since then the file is invalid - formated in the same way as in
#. the download progress display (e.g. 7d 3h 42min 1s)
-#: apt-pkg/acquire-item.cc:1281
+#: apt-pkg/acquire-item.cc:1476
#, c-format
msgid "Release file expired, ignoring %s (invalid since %s)"
msgstr ""
-#: apt-pkg/acquire-item.cc:1302
+#: apt-pkg/acquire-item.cc:1497
#, c-format
msgid "Conflicting distribution: %s (expected %s but got %s)"
msgstr ""
-#: apt-pkg/acquire-item.cc:1328
+#: apt-pkg/acquire-item.cc:1530
#, c-format
msgid ""
"A error occurred during the signature verification. The repository is not "
"updated and the previous index files will be used. GPG error: %s: %s\n"
msgstr ""
-#: apt-pkg/acquire-item.cc:1337
+#. Invalid signature file, reject (LP: #346386) (Closes: #627642)
+#: apt-pkg/acquire-item.cc:1540 apt-pkg/acquire-item.cc:1545
#, c-format
msgid "GPG error: %s: %s"
msgstr ""
-#: apt-pkg/acquire-item.cc:1365
+#: apt-pkg/acquire-item.cc:1637
#, c-format
msgid ""
"I wasn't able to locate a file for the %s package. This might mean you need "
"to manually fix this package. (due to missing arch)"
msgstr ""
-#: apt-pkg/acquire-item.cc:1424
+#: apt-pkg/acquire-item.cc:1696
#, c-format
msgid ""
"I wasn't able to locate a file for the %s package. This might mean you need "
"to manually fix this package."
msgstr ""
-#: apt-pkg/acquire-item.cc:1479
+#: apt-pkg/acquire-item.cc:1755
#, c-format
msgid ""
"The package index files are corrupted. No Filename: field for package %s."
msgstr ""
-#: apt-pkg/acquire-item.cc:1566
+#: apt-pkg/acquire-item.cc:1842
msgid "Size mismatch"
msgstr ""
@@ -2738,130 +2859,129 @@ msgstr ""
msgid "Unable to parse Release file %s"
msgstr ""
-#: apt-pkg/indexrecords.cc:60
+#: apt-pkg/indexrecords.cc:63
#, c-format
msgid "No sections in Release file %s"
msgstr ""
-#: apt-pkg/indexrecords.cc:94
+#: apt-pkg/indexrecords.cc:97
#, c-format
msgid "No Hash entry in Release file %s"
msgstr ""
-#: apt-pkg/indexrecords.cc:107
+#: apt-pkg/indexrecords.cc:110
#, c-format
msgid "Invalid 'Valid-Until' entry in Release file %s"
msgstr ""
-#: apt-pkg/indexrecords.cc:122
+#: apt-pkg/indexrecords.cc:125
#, c-format
msgid "Invalid 'Date' entry in Release file %s"
msgstr ""
-#: apt-pkg/vendorlist.cc:66
+#: apt-pkg/vendorlist.cc:71
#, c-format
msgid "Vendor block %s contains no fingerprint"
msgstr ""
-#: apt-pkg/cdrom.cc:518
+#: apt-pkg/cdrom.cc:525
#, c-format
msgid ""
"Using CD-ROM mount point %s\n"
"Mounting CD-ROM\n"
msgstr ""
-#: apt-pkg/cdrom.cc:527 apt-pkg/cdrom.cc:615
+#: apt-pkg/cdrom.cc:534 apt-pkg/cdrom.cc:631
msgid "Identifying.. "
msgstr ""
-#: apt-pkg/cdrom.cc:552
+#: apt-pkg/cdrom.cc:562
#, c-format
msgid "Stored label: %s\n"
msgstr ""
-#: apt-pkg/cdrom.cc:559 apt-pkg/cdrom.cc:827
+#: apt-pkg/cdrom.cc:571 apt-pkg/cdrom.cc:847
msgid "Unmounting CD-ROM...\n"
msgstr ""
-#: apt-pkg/cdrom.cc:578
+#: apt-pkg/cdrom.cc:591
#, c-format
msgid "Using CD-ROM mount point %s\n"
msgstr ""
-#: apt-pkg/cdrom.cc:596
+#: apt-pkg/cdrom.cc:609
msgid "Unmounting CD-ROM\n"
msgstr ""
-#: apt-pkg/cdrom.cc:600
+#: apt-pkg/cdrom.cc:614
msgid "Waiting for disc...\n"
msgstr ""
-#. Mount the new CDROM
-#: apt-pkg/cdrom.cc:608
+#: apt-pkg/cdrom.cc:623
msgid "Mounting CD-ROM...\n"
msgstr ""
-#: apt-pkg/cdrom.cc:626
+#: apt-pkg/cdrom.cc:642
msgid "Scanning disc for index files..\n"
msgstr ""
-#: apt-pkg/cdrom.cc:666
+#: apt-pkg/cdrom.cc:684
#, c-format
msgid ""
"Found %zu package indexes, %zu source indexes, %zu translation indexes and "
"%zu signatures\n"
msgstr ""
-#: apt-pkg/cdrom.cc:677
+#: apt-pkg/cdrom.cc:695
msgid ""
"Unable to locate any package files, perhaps this is not a Debian Disc or the "
"wrong architecture?"
msgstr ""
-#: apt-pkg/cdrom.cc:703
+#: apt-pkg/cdrom.cc:722
#, c-format
msgid "Found label '%s'\n"
msgstr ""
-#: apt-pkg/cdrom.cc:732
+#: apt-pkg/cdrom.cc:751
msgid "That is not a valid name, try again.\n"
msgstr ""
-#: apt-pkg/cdrom.cc:748
+#: apt-pkg/cdrom.cc:768
#, c-format
msgid ""
"This disc is called: \n"
"'%s'\n"
msgstr ""
-#: apt-pkg/cdrom.cc:752
+#: apt-pkg/cdrom.cc:770
msgid "Copying package lists..."
msgstr ""
-#: apt-pkg/cdrom.cc:778
+#: apt-pkg/cdrom.cc:797
msgid "Writing new source list\n"
msgstr ""
-#: apt-pkg/cdrom.cc:787
+#: apt-pkg/cdrom.cc:805
msgid "Source list entries for this disc are:\n"
msgstr ""
-#: apt-pkg/indexcopy.cc:270 apt-pkg/indexcopy.cc:908
+#: apt-pkg/indexcopy.cc:270 apt-pkg/indexcopy.cc:909
#, c-format
msgid "Wrote %i records.\n"
msgstr ""
-#: apt-pkg/indexcopy.cc:272 apt-pkg/indexcopy.cc:910
+#: apt-pkg/indexcopy.cc:272 apt-pkg/indexcopy.cc:911
#, c-format
msgid "Wrote %i records with %i missing files.\n"
msgstr ""
-#: apt-pkg/indexcopy.cc:275 apt-pkg/indexcopy.cc:913
+#: apt-pkg/indexcopy.cc:275 apt-pkg/indexcopy.cc:914
#, c-format
msgid "Wrote %i records with %i mismatched files\n"
msgstr ""
-#: apt-pkg/indexcopy.cc:278 apt-pkg/indexcopy.cc:916
+#: apt-pkg/indexcopy.cc:278 apt-pkg/indexcopy.cc:917
#, c-format
msgid "Wrote %i records with %i missing files and %i mismatched files\n"
msgstr ""
@@ -2928,177 +3048,204 @@ msgstr ""
msgid "Can't select installed version from package %s as it is not installed"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:52
+#: apt-pkg/edsp.cc:32 apt-pkg/edsp.cc:52
+msgid "Send scenario to solver"
+msgstr ""
+
+#: apt-pkg/edsp.cc:204
+msgid "Send request to solver"
+msgstr ""
+
+#: apt-pkg/edsp.cc:272
+msgid "Prepare for receiving solution"
+msgstr ""
+
+#: apt-pkg/edsp.cc:279
+msgid "External solver failed without a proper error message"
+msgstr ""
+
+#: apt-pkg/edsp.cc:550 apt-pkg/edsp.cc:553 apt-pkg/edsp.cc:558
+msgid "Execute external solver"
+msgstr ""
+
+#: apt-pkg/deb/dpkgpm.cc:69
#, c-format
msgid "Installing %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:53 apt-pkg/deb/dpkgpm.cc:823
+#: apt-pkg/deb/dpkgpm.cc:70 apt-pkg/deb/dpkgpm.cc:864
#, c-format
msgid "Configuring %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:54 apt-pkg/deb/dpkgpm.cc:830
+#: apt-pkg/deb/dpkgpm.cc:71 apt-pkg/deb/dpkgpm.cc:871
#, c-format
msgid "Removing %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:55
+#: apt-pkg/deb/dpkgpm.cc:72
#, c-format
msgid "Completely removing %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:56
+#: apt-pkg/deb/dpkgpm.cc:73
#, c-format
msgid "Noting disappearance of %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:57
+#: apt-pkg/deb/dpkgpm.cc:74
#, c-format
msgid "Running post-installation trigger %s"
msgstr ""
#. FIXME: use a better string after freeze
-#: apt-pkg/deb/dpkgpm.cc:646
+#: apt-pkg/deb/dpkgpm.cc:670
#, c-format
msgid "Directory '%s' missing"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:661 apt-pkg/deb/dpkgpm.cc:675
+#: apt-pkg/deb/dpkgpm.cc:685 apt-pkg/deb/dpkgpm.cc:705
#, c-format
msgid "Could not open file '%s'"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:816
+#: apt-pkg/deb/dpkgpm.cc:857
#, c-format
msgid "Preparing %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:817
+#: apt-pkg/deb/dpkgpm.cc:858
#, c-format
msgid "Unpacking %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:822
+#: apt-pkg/deb/dpkgpm.cc:863
#, c-format
msgid "Preparing to configure %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:824
+#: apt-pkg/deb/dpkgpm.cc:865
#, c-format
msgid "Installed %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:829
+#: apt-pkg/deb/dpkgpm.cc:870
#, c-format
msgid "Preparing for removal of %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:831
+#: apt-pkg/deb/dpkgpm.cc:872
#, c-format
msgid "Removed %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:836
+#: apt-pkg/deb/dpkgpm.cc:877
#, c-format
msgid "Preparing to completely remove %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:837
+#: apt-pkg/deb/dpkgpm.cc:878
#, c-format
msgid "Completely removed %s"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1043
+#: apt-pkg/deb/dpkgpm.cc:1098
msgid "Can not write log, openpty() failed (/dev/pts not mounted?)\n"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1074
+#: apt-pkg/deb/dpkgpm.cc:1129
msgid "Running dpkg"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1277
+#: apt-pkg/deb/dpkgpm.cc:1354
msgid "No apport report written because MaxReports is reached already"
msgstr ""
#. check if its not a follow up error
-#: apt-pkg/deb/dpkgpm.cc:1282
+#: apt-pkg/deb/dpkgpm.cc:1359
msgid "dependency problems - leaving unconfigured"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1284
+#: apt-pkg/deb/dpkgpm.cc:1361
msgid ""
"No apport report written because the error message indicates its a followup "
"error from a previous failure."
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1290
+#: apt-pkg/deb/dpkgpm.cc:1367
msgid ""
"No apport report written because the error message indicates a disk full "
"error"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1296
+#: apt-pkg/deb/dpkgpm.cc:1373
msgid ""
"No apport report written because the error message indicates a out of memory "
"error"
msgstr ""
-#: apt-pkg/deb/dpkgpm.cc:1303
+#: apt-pkg/deb/dpkgpm.cc:1380
msgid ""
"No apport report written because the error message indicates a dpkg I/O error"
msgstr ""
-#: apt-pkg/deb/debsystem.cc:69
+#: apt-pkg/deb/debsystem.cc:79
#, c-format
msgid ""
"Unable to lock the administration directory (%s), is another process using "
"it?"
msgstr ""
-#: apt-pkg/deb/debsystem.cc:72
+#: apt-pkg/deb/debsystem.cc:82
#, c-format
msgid "Unable to lock the administration directory (%s), are you root?"
msgstr ""
#. TRANSLATORS: the %s contains the recovery command, usually
#. dpkg --configure -a
-#: apt-pkg/deb/debsystem.cc:88
+#: apt-pkg/deb/debsystem.cc:98
#, c-format
msgid ""
"dpkg was interrupted, you must manually run '%s' to correct the problem. "
msgstr ""
-#: apt-pkg/deb/debsystem.cc:106
+#: apt-pkg/deb/debsystem.cc:116
msgid "Not locked"
msgstr ""
#. FIXME: fallback to a default mirror here instead
#. and provide a config option to define that default
-#: methods/mirror.cc:200
+#: methods/mirror.cc:260
#, c-format
msgid "No mirror file '%s' found "
msgstr ""
-#: methods/mirror.cc:343
+#. FIXME: fallback to a default mirror here instead
+#. and provide a config option to define that default
+#: methods/mirror.cc:267
+#, c-format
+msgid "Can not read mirror file '%s'"
+msgstr ""
+
+#: methods/mirror.cc:422
#, c-format
msgid "[Mirror: %s]"
msgstr ""
-#: methods/rred.cc:465
+#: methods/rred.cc:503
#, c-format
msgid ""
"Could not patch %s with mmap and with file operation usage - the patch seems "
"to be corrupt."
msgstr ""
-#: methods/rred.cc:470
+#: methods/rred.cc:508
#, c-format
msgid ""
"Could not patch %s with mmap (but no mmap specific fail) - the patch seems "
"to be corrupt."
msgstr ""
-#: methods/rsh.cc:329
+#: methods/rsh.cc:330
msgid "Connection closed prematurely"
msgstr ""
diff --git a/test/hash.cc b/test/hash.cc
index cfdb4ea9d..88f09fca0 100644
--- a/test/hash.cc
+++ b/test/hash.cc
@@ -1,6 +1,6 @@
#include <apt-pkg/md5.h>
#include <apt-pkg/sha1.h>
-#include <apt-pkg/sha256.h>
+#include <apt-pkg/sha2.h>
#include <apt-pkg/strutl.h>
#include <iostream>
@@ -10,9 +10,17 @@ template <class T> void Test(const char *In,const char *Out)
{
T Sum;
Sum.Add(In);
- cout << Sum.Result().Value() << endl;
- if (stringcasecmp(Sum.Result().Value(),Out) != 0)
+
+ cout << "expected: '" << Out << "'" << endl;
+ cout << "got : '" << Sum.Result().Value() << "'" << endl;
+ cout << "got : '" << Sum.Result().Value() << "'" << endl;
+ cout << "got : '" << Sum.Result().Value() << "'" << endl;
+ if (stringcasecmp(Sum.Result().Value(), Out) != 0) {
+ cout << "FAIL" << endl << endl;
abort();
+ } else {
+ cout << "PASS" << endl << endl;
+ }
}
template <class T> void TestMill(const char *Out)
@@ -34,9 +42,8 @@ template <class T> void TestMill(const char *Out)
Count = 0;
}
}
-
- cout << Sum.Result().Value() << endl;
- if (stringcasecmp(Sum.Result().Value(),Out) != 0)
+
+ if (stringcasecmp(Sum.Result().Value(), Out) != 0)
abort();
}
@@ -62,8 +69,13 @@ int main()
// SHA-256, From FIPS 180-2
Test<SHA256Summation>("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1");
-
+ // SHA-512, From
+ Test<SHA512Summation>(
+ "abc",
+ "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"
+ "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f");
+
return 0;
}
diff --git a/test/integration/test-handling-broken-orgroups b/test/integration/test-handling-broken-orgroups
index d88ad0000..20b314074 100755
--- a/test/integration/test-handling-broken-orgroups
+++ b/test/integration/test-handling-broken-orgroups
@@ -58,7 +58,7 @@ The following information may help to resolve the situation:
The following packages have unmet dependencies:
coolstuff-broken : Depends: cool2 but it is not installable or
stuff2 but it is not installable
-E: Broken packages' aptget install coolstuff-broken -s
+E: Unable to correct problems, you have held broken packages.' aptget install coolstuff-broken -s
testequal 'Reading package lists...
Building dependency tree...
@@ -105,4 +105,4 @@ The following information may help to resolve the situation:
The following packages have unmet dependencies:
coolstuff-provided-broken : Depends: cool2 but it is not installable or
stuff-abi-2
-E: Broken packages' aptget install coolstuff-provided-broken -s
+E: Unable to correct problems, you have held broken packages.' aptget install coolstuff-provided-broken -s
diff --git a/test/integration/test-release-candidate-switching b/test/integration/test-release-candidate-switching
index b6dbe99db..0970cb935 100755
--- a/test/integration/test-release-candidate-switching
+++ b/test/integration/test-release-candidate-switching
@@ -416,4 +416,4 @@ The following information may help to resolve the situation:
The following packages have unmet dependencies:
uninstallablepkg : Depends: libmtp8 (>= 10:0.20.1) but it is not going to be installed
Depends: amarok-utils (= 2.3.2-2+exp) but 2.3.1-1+sid is to be installed
-E: Broken packages" aptget install uninstallablepkg/experimental --trivial-only -V -q=0
+E: Unable to correct problems, you have held broken packages." aptget install uninstallablepkg/experimental --trivial-only -V -q=0