Bug#536029: Patch update
Package: apt
Version: 0.7.21
Severity: normal
Attached a patch update. The patch now parses the options (previously
vendor) field and uses the "arch" key, if given, to limit sources.list
entries to those archs.
MfG
Goswin
-- Package-specific info:
-- (/etc/apt/preferences present, but not submitted) --
-- (/etc/apt/sources.list present, but not submitted) --
-- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.26-xen-1 (SMP w/2 CPU cores)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/bash
Versions of packages apt depends on:
ii debian-archive-keyring 2009.01.31 GnuPG archive keys of the Debian a
ii libc6 2.9-18 GNU C Library: Shared libraries
ii libgcc1 1:4.4.0-10 GCC support library
ii libstdc++6 4.4.0-10 The GNU Standard C++ Library v3
apt recommends no packages.
Versions of packages apt suggests:
pn apt-doc <none> (no description available)
ii aptitude 0.4.11.11-1+b1 terminal-based package manager
ii bzip2 1.0.5-3 high-quality block-sorting file co
ii dpkg-dev 1.15.3 Debian package development tools
ii lzma 4.43-14 Compression method of 7z format in
ii python-apt 0.7.10.4 Python interface to libapt-pkg
-- no debconf information
diff -Nru apt-0.7.21/apt-pkg/cdrom.cc apt-0.7.21a0.mrvn.1/apt-pkg/cdrom.cc
--- apt-0.7.21/apt-pkg/cdrom.cc 2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/cdrom.cc 2009-07-13 08:53:50.000000000 +0200
@@ -217,33 +217,41 @@
/* Here we drop everything that is not this machines arch */
bool pkgCdrom::DropBinaryArch(vector<string> &List)
{
- char S[300];
- snprintf(S,sizeof(S),"/binary-%s/",
- _config->Find("Apt::Architecture").c_str());
-
+ string Arch = _config->Find("Apt::Architecture");
+ vector<string> Archs = _config->FindList("Apt::Architectures");
+
for (unsigned int I = 0; I < List.size(); I++)
{
const char *Str = List[I].c_str();
- const char *Res;
- if ((Res = strstr(Str,"/binary-")) == 0)
+ const char *Start, *End;
+ char Tmp[300];
+ if ((Start = strstr(Str,"/binary-")) == 0)
continue;
+ Start += 8;
+ if ((End = strstr(Start,"/")) == 0 || Start == End)
+ continue;
+ --End;
+
+ // Create temp string
+ strncpy(Tmp,Start,End-Start);
+ Tmp[End-Start] = 0;
+
+ // Check if arch matches
+ bool matching = false;
+ if (Arch == Tmp) matching = true;
+ for(vector<string>::const_iterator J = Archs.begin();
+ !matching && J != Archs.end(); ++J) {
+ if (*J == Tmp) matching = true;
+ }
// Weird, remove it.
- if (strlen(Res) < strlen(S))
+ if (!matching)
{
List.erase(List.begin() + I);
I--;
continue;
}
-
- // See if it is our arch
- if (stringcmp(Res,Res + strlen(S),S) == 0)
- continue;
-
- // Erase it
- List.erase(List.begin() + I);
- I--;
}
return true;
diff -Nru apt-0.7.21/apt-pkg/clean.cc apt-0.7.21a0.mrvn.1/apt-pkg/clean.cc
--- apt-0.7.21/apt-pkg/clean.cc 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/clean.cc 2009-07-13 08:53:50.000000000 +0200
@@ -77,8 +77,9 @@
if (*I != '.')
continue;
string Arch = DeQuoteString(string(Start,I-Start));
-
- if (Arch != "all" && Arch != MyArch)
+
+ if (Arch != "all" && Arch != MyArch
+ && !_config->Member("APT::architectures", Arch))
continue;
// Lookup the package
diff -Nru apt-0.7.21/apt-pkg/contrib/configuration.cc apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.cc
--- apt-0.7.21/apt-pkg/contrib/configuration.cc 2009-04-08 22:58:28.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.cc 2009-07-13 08:53:50.000000000 +0200
@@ -223,6 +223,27 @@
return Res;
}
/*}}}*/
+// Configuration::FindList - Find a list of values /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+vector<string> Configuration::FindList(const string Name) const
+{
+ vector<string> Vec;
+ const Item *Top = Lookup(Name.c_str());
+ if (Top == 0 || Top->Child == 0)
+ return Vec;
+
+ Item *I;
+ I = Top->Child;
+
+ while(I != NULL)
+ {
+ Vec.push_back(I->Value);
+ I = I->Next;
+ }
+ return Vec;
+}
+ /*}}}*/
// Configuration::FindI - Find an integer value /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -370,6 +391,30 @@
}
/*}}}*/
+// Configuration::Member - Check if Value is member of a list /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool Configuration::Member(const string Name, string Value)
+{
+ Item *Top = Lookup(Name.c_str(),false);
+ if (Top == 0 || Top->Child == 0)
+ return false;
+
+ Item *I;
+ I = Top->Child;
+
+ while(I != NULL)
+ {
+ if(I->Value == Value)
+ {
+ return true;
+ } else {
+ I = I->Next;
+ }
+ }
+ return false;
+}
+ /*}}}*/
// Configuration::Clear - Clear an entire tree /*{{{*/
// ---------------------------------------------------------------------
/* */
diff -Nru apt-0.7.21/apt-pkg/contrib/configuration.h apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.h
--- apt-0.7.21/apt-pkg/contrib/configuration.h 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/contrib/configuration.h 2009-07-13 08:53:50.000000000 +0200
@@ -32,8 +32,10 @@
#include <string>
#include <iostream>
+#include <vector>
using std::string;
+using std::vector;
class Configuration
{
@@ -70,6 +72,7 @@
string Find(const string Name,const char *Default = 0) const {return Find(Name.c_str(),Default);};
string FindFile(const char *Name,const char *Default = 0) const;
string FindDir(const char *Name,const char *Default = 0) const;
+ vector<string> FindList(const string Name) const;
int FindI(const char *Name,int Default = 0) const;
int FindI(const string Name,int Default = 0) const {return FindI(Name.c_str(),Default);};
bool FindB(const char *Name,bool Default = false) const;
@@ -92,6 +95,9 @@
void Clear(const string List, string Value);
void Clear(const string List, int Value);
+ // check if Value is member of a list
+ bool Member(const string Name, const string Value);
+
inline const Item *Tree(const char *Name) const {return Lookup(Name);};
inline void Dump() { Dump(std::clog); };
diff -Nru apt-0.7.21/apt-pkg/deb/debindexfile.cc apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.cc
--- apt-0.7.21/apt-pkg/deb/debindexfile.cc 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.cc 2009-07-13 08:53:50.000000000 +0200
@@ -28,7 +28,7 @@
// ---------------------------------------------------------------------
/* */
debSourcesIndex::debSourcesIndex(string URI,string Dist,string Section,bool Trusted) :
- pkgIndexFile(Trusted), URI(URI), Dist(Dist), Section(Section)
+ pkgIndexFile(Trusted, "source"), URI(URI), Dist(Dist), Section(Section)
{
}
/*}}}*/
@@ -149,8 +149,8 @@
// PackagesIndex::debPackagesIndex - Contructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-debPackagesIndex::debPackagesIndex(string URI,string Dist,string Section,bool Trusted) :
- pkgIndexFile(Trusted), URI(URI), Dist(Dist), Section(Section)
+debPackagesIndex::debPackagesIndex(string URI,string Dist,string Section,bool Trusted,string Architecture) :
+ pkgIndexFile(Trusted,Architecture), URI(URI), Dist(Dist), Section(Section)
{
}
/*}}}*/
@@ -171,6 +171,8 @@
Res += " ";
Res += Ver.ParentPkg().Name();
Res += " ";
+ Res += Ver.Arch();
+ Res += " ";
Res += Ver.VerStr();
return Res;
}
@@ -204,6 +206,8 @@
else
Info += Dist + '/' + Section;
Info += " ";
+ Info += Arch;
+ Info += " ";
Info += Type;
return Info;
}
@@ -227,7 +231,7 @@
}
else
Res = URI + "dists/" + Dist + '/' + Section +
- "/binary-" + _config->Find("APT::Architecture") + '/';
+ "/binary-" + Arch + '/';
Res += Type;
return Res;
@@ -280,13 +284,13 @@
return _error->Error("Problem with MergeList %s",PackageFile.c_str());
// Check the release file
- string ReleaseFile = debReleaseIndex(URI,Dist).MetaIndexFile("Release");
+ string ReleaseFile = debReleaseIndex(URI,Dist,Arch).MetaIndexFile("Release");
if (FileExists(ReleaseFile) == true)
{
FileFd Rel(ReleaseFile,FileFd::ReadOnly);
if (_error->PendingError() == true)
return false;
- Parser.LoadReleaseInfo(File,Rel,Section);
+ Parser.LoadReleaseInfo(File,Rel,Section,Arch);
}
return true;
@@ -320,7 +324,7 @@
// ---------------------------------------------------------------------
/* */
debTranslationsIndex::debTranslationsIndex(string URI,string Dist,string Section) :
- pkgIndexFile(true), URI(URI), Dist(Dist), Section(Section)
+ pkgIndexFile(true,"translation"), URI(URI), Dist(Dist), Section(Section)
{
}
/*}}}*/
@@ -483,7 +487,7 @@
// StatusIndex::debStatusIndex - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
-debStatusIndex::debStatusIndex(string File) : pkgIndexFile(true), File(File)
+debStatusIndex::debStatusIndex(string File) : pkgIndexFile(true,"status"), File(File)
{
}
/*}}}*/
diff -Nru apt-0.7.21/apt-pkg/deb/debindexfile.h apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.h
--- apt-0.7.21/apt-pkg/deb/debindexfile.h 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debindexfile.h 2009-07-13 08:53:50.000000000 +0200
@@ -60,7 +60,7 @@
virtual string ArchiveURI(string File) const {return URI + File;};
// Interface for acquire
- virtual string Describe(bool Short) const;
+ virtual string Describe(bool Short) const;
// Interface for the Cache Generator
virtual bool Exists() const;
@@ -69,7 +69,7 @@
virtual bool Merge(pkgCacheGenerator &Gen,OpProgress &Prog) const;
virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
- debPackagesIndex(string URI,string Dist,string Section,bool Trusted);
+ debPackagesIndex(string URI,string Dist,string Section,bool Trusted,string Architecture);
};
class debTranslationsIndex : public pkgIndexFile
@@ -89,7 +89,7 @@
virtual const Type *GetType() const;
// Interface for acquire
- virtual string Describe(bool Short) const;
+ virtual string Describe(bool Short) const;
virtual bool GetIndexes(pkgAcquire *Owner) const;
// Interface for the Cache Generator
@@ -122,7 +122,7 @@
virtual string ArchiveURI(string File) const {return URI + File;};
// Interface for acquire
- virtual string Describe(bool Short) const;
+ virtual string Describe(bool Short) const;
// Interface for the record parsers
virtual pkgSrcRecords::Parser *CreateSrcParser() const;
diff -Nru apt-0.7.21/apt-pkg/deb/deblistparser.cc apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.cc
--- apt-0.7.21/apt-pkg/deb/deblistparser.cc 2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.cc 2009-07-13 08:53:50.000000000 +0200
@@ -34,7 +34,9 @@
/* */
debListParser::debListParser(FileFd *File) : Tags(File)
{
+ // FIXME: get arch from options field?
Arch = _config->Find("APT::architecture");
+ Archs = _config->FindList("APT::architectures");
}
/*}}}*/
// ListParser::UniqFindTagWrite - Find the tag and write a unq string /*{{{*/
@@ -439,6 +441,7 @@
if (ParseArchFlags == true)
{
+ // FIXME: needs investigating
string arch = _config->Find("APT::Architecture");
// Parse an architecture
@@ -604,6 +607,12 @@
if (stringcmp(Start,Stop,"all") == 0)
return true;
+ for (vector<string>::const_iterator I = Archs.begin();
+ I != Archs.end(); ++I) {
+ if (stringcmp(*I,Start,Stop) == 0)
+ return true;
+ }
+
iOffset = Tags.Offset();
}
return false;
@@ -613,15 +622,15 @@
// ---------------------------------------------------------------------
/* */
bool debListParser::LoadReleaseInfo(pkgCache::PkgFileIterator FileI,
- FileFd &File, string component)
+ FileFd &File, string component,
+ string Arch)
{
pkgTagFile Tags(&File, File.Size() + 256); // XXX
pkgTagSection Section;
if (Tags.Step(Section) == false)
return false;
- //mvo: I don't think we need to fill that in (it's unused since apt-0.6)
- //FileI->Architecture = WriteUniqString(Arch);
+ FileI->Architecture = WriteUniqString(Arch);
// apt-secure does no longer download individual (per-section) Release
// file. to provide Component pinning we use the section name now
diff -Nru apt-0.7.21/apt-pkg/deb/deblistparser.h apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.h
--- apt-0.7.21/apt-pkg/deb/deblistparser.h 2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/deblistparser.h 2009-07-13 08:53:50.000000000 +0200
@@ -11,10 +11,14 @@
#ifndef PKGLIB_DEBLISTPARSER_H
#define PKGLIB_DEBLISTPARSER_H
+#include <vector>
+
#include <apt-pkg/pkgcachegen.h>
#include <apt-pkg/indexfile.h>
#include <apt-pkg/tagfile.h>
+using std::vector;
+
class debListParser : public pkgCacheGenerator::ListParser
{
public:
@@ -32,7 +36,8 @@
pkgTagSection Section;
unsigned long iOffset;
string Arch;
-
+ vector<string> Archs;
+
unsigned long UniqFindTagWrite(const char *Tag);
bool ParseStatus(pkgCache::PkgIterator Pkg,pkgCache::VerIterator Ver);
bool ParseDepends(pkgCache::VerIterator Ver,const char *Tag,
@@ -60,7 +65,7 @@
virtual bool Step();
bool LoadReleaseInfo(pkgCache::PkgFileIterator FileI,FileFd &File,
- string section);
+ string section,string Arch);
static const char *ParseDepends(const char *Start,const char *Stop,
string &Package,string &Ver,unsigned int &Op,
diff -Nru apt-0.7.21/apt-pkg/deb/debmetaindex.cc apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.cc
--- apt-0.7.21/apt-pkg/deb/debmetaindex.cc 2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.cc 2009-07-13 09:45:30.000000000 +0200
@@ -5,11 +5,10 @@
#include <apt-pkg/strutl.h>
#include <apt-pkg/acquire-item.h>
#include <apt-pkg/configuration.h>
-#include <apt-pkg/error.h>
using namespace std;
-string debReleaseIndex::Info(const char *Type, const string Section) const
+string debReleaseIndex::Info(const char *Type, const string Section, const string Arch) const
{
string Info = ::URI::SiteOnly(URI) + ' ';
if (Dist[Dist.size() - 1] == '/')
@@ -20,6 +19,8 @@
else
Info += Dist + '/' + Section;
Info += " ";
+ Info += Arch;
+ Info += " ";
Info += Type;
return Info;
}
@@ -60,16 +61,16 @@
return Res;
}
-string debReleaseIndex::IndexURISuffix(const char *Type, const string Section) const
+string debReleaseIndex::IndexURISuffix(const char *Type, const string Section, const string Arch) const
{
string Res ="";
if (Dist[Dist.size() - 1] != '/')
- Res += Section + "/binary-" + _config->Find("APT::Architecture") + '/';
+ Res += Section + "/binary-" + Arch + '/';
return Res + Type;
}
-string debReleaseIndex::IndexURI(const char *Type, const string Section) const
+string debReleaseIndex::IndexURI(const char *Type, const string Section, const string Architecture) const
{
if (Dist[Dist.size() - 1] == '/')
{
@@ -81,7 +82,7 @@
return Res + Type;
}
else
- return URI + "dists/" + Dist + '/' + IndexURISuffix(Type, Section);
+ return URI + "dists/" + Dist + '/' + IndexURISuffix(Type, Section, Architecture);
}
string debReleaseIndex::SourceIndexURISuffix(const char *Type, const string Section) const
@@ -107,7 +108,15 @@
return URI + "dists/" + Dist + "/" + SourceIndexURISuffix(Type, Section);
}
-debReleaseIndex::debReleaseIndex(string URI,string Dist)
+debReleaseIndex::debReleaseIndex(string URI,string Dist,vector<string> Archs) : metaIndex(Archs)
+{
+ this->URI = URI;
+ this->Dist = Dist;
+ this->Indexes = NULL;
+ this->Type = "deb";
+}
+
+debReleaseIndex::debReleaseIndex(string URI,string Dist,string Arch) : metaIndex(Arch)
{
this->URI = URI;
this->Dist = Dist;
@@ -122,17 +131,30 @@
I != SectionEntries.end();
I++)
{
- IndexTarget * Target = new IndexTarget();
- Target->ShortDesc = (*I)->IsSrc ? "Sources" : "Packages";
- Target->MetaKey
- = (*I)->IsSrc ? SourceIndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section)
- : IndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section);
- Target->URI
- = (*I)->IsSrc ? SourceIndexURI(Target->ShortDesc.c_str(), (*I)->Section)
- : IndexURI(Target->ShortDesc.c_str(), (*I)->Section);
+ if ((*I)->IsSrc) {
+ IndexTarget * Target = new IndexTarget();
+ Target->ShortDesc = "Sources";
+ Target->MetaKey
+ = SourceIndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section);
+ Target->URI
+ = SourceIndexURI(Target->ShortDesc.c_str(), (*I)->Section);
+ Target->Description
+ = Info (Target->ShortDesc.c_str(), (*I)->Section, "source");
+ IndexTargets->push_back (Target);
+ } else {
+ for (vector<string>::const_iterator J = Archs.begin();
+ J != Archs.end(); ++J) {
+ IndexTarget * Target = new IndexTarget();
+ Target->ShortDesc = "Packages";
+ Target->MetaKey
+ = IndexURISuffix(Target->ShortDesc.c_str(), (*I)->Section, *J);
+ Target->URI
+ = IndexURI(Target->ShortDesc.c_str(), (*I)->Section, *J);
- Target->Description = Info (Target->ShortDesc.c_str(), (*I)->Section);
- IndexTargets->push_back (Target);
+ Target->Description = Info (Target->ShortDesc.c_str(), (*I)->Section, *J);
+ IndexTargets->push_back (Target);
+ }
+ }
}
return IndexTargets;
}
@@ -201,7 +223,10 @@
Indexes->push_back(new debSourcesIndex (URI, Dist, (*I)->Section, IsTrusted()));
else
{
- Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted()));
+ for (vector<string>::const_iterator J = Archs.begin();
+ J != Archs.end(); ++J) {
+ Indexes->push_back(new debPackagesIndex (URI, Dist, (*I)->Section, IsTrusted(),*J));
+ }
Indexes->push_back(new debTranslationsIndex(URI, Dist, (*I)->Section));
}
}
@@ -223,8 +248,9 @@
{
protected:
- bool CreateItemInternal(vector<metaIndex *> &List,string URI,
- string Dist,string Section,
+ bool CreateItemInternal(vector<metaIndex *> &List,
+ map<string, string> Options,
+ string URI,string Dist,string Section,
bool IsSrc) const
{
for (vector<metaIndex *>::const_iterator I = List.begin();
@@ -242,13 +268,28 @@
if (Deb->GetURI() == URI && Deb->GetDist() == Dist)
{
Deb->PushSectionEntry(new debReleaseIndex::debSectionEntry(Section, IsSrc));
+ // FIXME: push archs
return true;
}
}
}
// No currently created Release file indexes this entry, so we create a new one.
// XXX determine whether this release is trusted or not
- debReleaseIndex *Deb = new debReleaseIndex(URI,Dist);
+ // FIXME: get archs from options
+ vector<string> Archs;
+ if (Options["arch"] == "") {
+ Archs = _config->FindList("APT::architectures");
+ } else {
+ string str = Options["arch"] + ",";
+ size_t start = 0, end = 0;
+ while(start < str.length()) {
+ while(str[end] != ',') ++end;
+ Archs.push_back(string(str,start,end-start));
+ start = end+1;
+ ++end;
+ }
+ }
+ debReleaseIndex *Deb = new debReleaseIndex(URI,Dist,Archs);
Deb->PushSectionEntry (new debReleaseIndex::debSectionEntry(Section, IsSrc));
List.push_back(Deb);
return true;
@@ -259,10 +300,10 @@
{
public:
- bool CreateItem(vector<metaIndex *> &List,string URI,
- string Dist,string Section) const
+ bool CreateItem(vector<metaIndex *> &List,map<string,string> Options,
+ string URI,string Dist,string Section) const
{
- return CreateItemInternal(List, URI, Dist, Section, false);
+ return CreateItemInternal(List, Options, URI, Dist, Section, false);
}
debSLTypeDeb()
@@ -276,10 +317,10 @@
{
public:
- bool CreateItem(vector<metaIndex *> &List,string URI,
- string Dist,string Section) const
+ bool CreateItem(vector<metaIndex *> &List,map<string,string> Options,
+ string URI,string Dist,string Section) const
{
- return CreateItemInternal(List, URI, Dist, Section, true);
+ return CreateItemInternal(List, Options, URI, Dist, Section, true);
}
debSLTypeDebSrc()
diff -Nru apt-0.7.21/apt-pkg/deb/debmetaindex.h apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.h
--- apt-0.7.21/apt-pkg/deb/debmetaindex.h 2008-06-09 23:10:09.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/deb/debmetaindex.h 2009-07-13 08:53:50.000000000 +0200
@@ -21,17 +21,18 @@
public:
- debReleaseIndex(string URI, string Dist);
+ debReleaseIndex(string URI,string Dist,vector<string> Archs);
+ debReleaseIndex(string URI,string Dist,string Arch);
virtual string ArchiveURI(string File) const {return URI + File;};
virtual bool GetIndexes(pkgAcquire *Owner, bool GetAll=false) const;
vector <struct IndexTarget *>* ComputeIndexTargets() const;
- string Info(const char *Type, const string Section) const;
+ string Info(const char *Type, const string Section, const string Arch) const;
string MetaIndexInfo(const char *Type) const;
string MetaIndexFile(const char *Types) const;
string MetaIndexURI(const char *Type) const;
- string IndexURI(const char *Type, const string Section) const;
- string IndexURISuffix(const char *Type, const string Section) const;
+ string IndexURI(const char *Type, const string Section, const string Architecture) const;
+ string IndexURISuffix(const char *Type, const string Section, const string Architecture) const;
string SourceIndexURI(const char *Type, const string Section) const;
string SourceIndexURISuffix(const char *Type, const string Section) const;
virtual vector <pkgIndexFile *> *GetIndexFiles();
diff -Nru apt-0.7.21/apt-pkg/indexcopy.cc apt-0.7.21a0.mrvn.1/apt-pkg/indexcopy.cc
--- apt-0.7.21/apt-pkg/indexcopy.cc 2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/indexcopy.cc 2009-07-13 08:53:50.000000000 +0200
@@ -378,6 +378,7 @@
void IndexCopy::ConvertToSourceList(string CD,string &Path)
{
char S[300];
+ // FIXME: allow for APT::Architectures
snprintf(S,sizeof(S),"binary-%s",_config->Find("Apt::Architecture").c_str());
// Strip the cdrom base path
diff -Nru apt-0.7.21/apt-pkg/indexfile.h apt-0.7.21a0.mrvn.1/apt-pkg/indexfile.h
--- apt-0.7.21/apt-pkg/indexfile.h 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/indexfile.h 2009-07-13 08:53:50.000000000 +0200
@@ -37,7 +37,8 @@
{
protected:
bool Trusted;
-
+ string Arch;
+
public:
class Type
@@ -83,8 +84,9 @@
static string LanguageCode();
bool IsTrusted() const { return Trusted; };
-
- pkgIndexFile(bool Trusted): Trusted(Trusted) {};
+ string GetArch() const { return Arch; };
+
+ pkgIndexFile(bool Trusted,string Arch): Trusted(Trusted), Arch(Arch) {};
virtual ~pkgIndexFile() {};
};
diff -Nru apt-0.7.21/apt-pkg/init.cc apt-0.7.21a0.mrvn.1/apt-pkg/init.cc
--- apt-0.7.21/apt-pkg/init.cc 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/init.cc 2009-07-13 09:45:18.000000000 +0200
@@ -95,7 +95,12 @@
if (Res == false)
return false;
-
+
+ // If APT::Architectures is unset initialize with APT::Architecture
+ if (Cnf.Tree("APT::Architectures") == NULL) {
+ Cnf.Set("APT::Architectures::", Cnf.Find("APT::Architecture"));
+ }
+
if (Cnf.FindB("Debug::pkgInitConfig",false) == true)
Cnf.Dump();
diff -Nru apt-0.7.21/apt-pkg/metaindex.h apt-0.7.21a0.mrvn.1/apt-pkg/metaindex.h
--- apt-0.7.21/apt-pkg/metaindex.h 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/metaindex.h 2009-07-13 08:53:50.000000000 +0200
@@ -3,6 +3,7 @@
#include <string>
+#include <vector>
#include <apt-pkg/pkgcache.h>
#include <apt-pkg/srcrecords.h>
#include <apt-pkg/pkgrecords.h>
@@ -10,6 +11,7 @@
#include <apt-pkg/vendor.h>
using std::string;
+using std::vector;
class pkgAcquire;
class pkgCacheGenerator;
@@ -23,6 +25,7 @@
string URI;
string Dist;
bool Trusted;
+ vector<string> Archs;
public:
@@ -39,6 +42,8 @@
virtual vector<pkgIndexFile *> *GetIndexFiles() = 0;
virtual bool IsTrusted() const = 0;
+ metaIndex(vector<string> Archs) : Archs(Archs) { };
+ metaIndex(string Arch) { Archs.push_back(Arch); };
virtual ~metaIndex() {};
};
diff -Nru apt-0.7.21/apt-pkg/pkgcache.cc apt-0.7.21a0.mrvn.1/apt-pkg/pkgcache.cc
--- apt-0.7.21/apt-pkg/pkgcache.cc 2009-04-09 04:31:56.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/pkgcache.cc 2009-07-13 08:53:50.000000000 +0200
@@ -147,7 +147,8 @@
(VS = pkgVersioningSystem::GetVS(StrP + HeaderP->VerSysName)) == 0)
return _error->Error(_("This APT does not support the versioning system '%s'"),StrP + HeaderP->VerSysName);
- // Chcek the arhcitecture
+ // Check the architecture
+ // FIXME: Should this check architectures?
if (HeaderP->Architecture == 0 ||
_config->Find("APT::Architecture") != StrP + HeaderP->Architecture)
return _error->Error(_("The package cache was built for a different architecture"));
@@ -611,6 +612,8 @@
Res = Res + (Res.empty() == true?"l=":",l=") + Label();
if (Component() != 0)
Res = Res + (Res.empty() == true?"c=":",c=") + Component();
+ if (Architecture() != 0)
+ Res = Res + (Res.empty() == true?"b=":",b=") + Architecture();
return Res;
}
/*}}}*/
diff -Nru apt-0.7.21/apt-pkg/policy.cc apt-0.7.21a0.mrvn.1/apt-pkg/policy.cc
--- apt-0.7.21/apt-pkg/policy.cc 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/policy.cc 2009-07-13 08:53:50.000000000 +0200
@@ -71,7 +71,10 @@
PFPriority[I->ID] = 100;
else
if ((I->Flags & pkgCache::Flag::NotAutomatic) == pkgCache::Flag::NotAutomatic)
- PFPriority[I->ID] = 1;
+ PFPriority[I->ID] = 2;
+ // FIXME: reduce priority if not native arch
+ if (I.Architecture() == 0 || (I.Architecture() != string("all") && I.Architecture() != string("amd64")))
+ --PFPriority[I->ID];
}
// Apply the defaults..
diff -Nru apt-0.7.21/apt-pkg/sourcelist.cc apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.cc
--- apt-0.7.21/apt-pkg/sourcelist.cc 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.cc 2009-07-13 09:45:55.000000000 +0200
@@ -79,6 +79,7 @@
Weird types may override this. */
bool pkgSourceList::Type::ParseLine(vector<metaIndex *> &List,
const char *Buffer,
+ map<string, string> Options,
unsigned long CurLine,
string File) const
{
@@ -100,7 +101,7 @@
if (ParseQuoteWord(Buffer,Section) == true)
return _error->Error(_("Malformed line %lu in source list %s (absolute dist)"),CurLine,File.c_str());
Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
- return CreateItem(List,URI,Dist,Section);
+ return CreateItem(List,Options,URI,Dist,Section);
}
// Grab the rest of the dists
@@ -109,7 +110,7 @@
do
{
- if (CreateItem(List,URI,Dist,Section) == false)
+ if (CreateItem(List,Options,URI,Dist,Section) == false)
return false;
}
while (ParseQuoteWord(Buffer,Section) == true);
@@ -239,36 +240,39 @@
if (Parse == 0)
return _error->Error(_("Type '%s' is not known on line %u in source list %s"),LineType.c_str(),CurLine,File.c_str());
- // Vendor name specified
+ map<string,string> Options;
if (C[0] == '[')
{
- string VendorID;
+ string str;
- if (ParseQuoteWord(C,VendorID) == false)
- return _error->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine,File.c_str());
+ if (ParseQuoteWord(C,str) == false)
+ return _error->Error(_("Malformed line %u in source list %s ([options])"),CurLine,File.c_str());
- if (VendorID.length() < 2 || VendorID.end()[-1] != ']')
- return _error->Error(_("Malformed line %u in source list %s (vendor id)"),CurLine,File.c_str());
- VendorID = string(VendorID,1,VendorID.size()-2);
-
-// for (vector<const Vendor *>::const_iterator iter = VendorList.begin();
-// iter != VendorList.end(); iter++)
-// {
-// if ((*iter)->GetVendorID() == VendorID)
-// {
-// if (_config->FindB("Debug::sourceList", false))
-// std::cerr << "Comparing VendorID \"" << VendorID << "\" with \"" << (*iter)->GetVendorID() << '"' << std::endl;
-// Verifier = *iter;
-// break;
-// }
-// }
-
-// if (Verifier == 0)
-// return _error->Error(_("Unknown vendor ID '%s' in line %u of source list %s"),
-// VendorID.c_str(),CurLine,File.c_str());
+ if (str.length() < 2 || str.end()[-1] != ']')
+ return _error->Error(_("Malformed line %u in source list %s ([options])"),CurLine,File.c_str());
+ str = string(str,1,str.size()-2);
+
+ size_t start = 0;
+ while(start < str.size()) {
+ while(start < str.size() && str[start] == ' ')
+ ++start;
+ if (start >= str.size())
+ return _error->Error(_("Malformed line %u in source list %s ([options])"),CurLine,File.c_str());
+ size_t middle = start + 1;
+ while(middle < str.size() && str[middle] != '=' && str[middle] != ';')
+ ++middle;
+ if (str[middle] != '=' || middle >= str.size())
+ return _error->Error(_("Malformed line %u in source list %s ([options])"),CurLine,File.c_str());
+ string Key = string(str,start,middle-start);
+ size_t end = middle + 1;
+ while(end < str.size() && str[end] != ';')
+ ++end;
+ Options[Key]=string(str,middle + 1,end-middle-1);
+ start = end + 1;
+ }
}
- if (Parse->ParseLine(SrcList,C,CurLine,File) == false)
+ if (Parse->ParseLine(SrcList,C,Options,CurLine,File) == false)
return false;
}
return true;
diff -Nru apt-0.7.21/apt-pkg/sourcelist.h apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.h
--- apt-0.7.21/apt-pkg/sourcelist.h 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/sourcelist.h 2009-07-13 08:53:50.000000000 +0200
@@ -29,12 +29,13 @@
#include <string>
#include <vector>
+#include <map>
#include <apt-pkg/pkgcache.h>
#include <apt-pkg/metaindex.h>
using std::string;
using std::vector;
-
+using std::map;
class pkgAquire;
class pkgSourceList
@@ -57,8 +58,10 @@
bool FixupURI(string &URI) const;
virtual bool ParseLine(vector<metaIndex *> &List,
const char *Buffer,
+ map<string, string> Options,
unsigned long CurLine,string File) const;
- virtual bool CreateItem(vector<metaIndex *> &List,string URI,
+ virtual bool CreateItem(vector<metaIndex *> &List,
+ map<string, string> Options, string URI,
string Dist,string Section) const = 0;
Type();
virtual ~Type() {};
diff -Nru apt-0.7.21/apt-pkg/versionmatch.cc apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.cc
--- apt-0.7.21/apt-pkg/versionmatch.cc 2008-11-24 10:32:23.000000000 +0100
+++ apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.cc 2009-07-13 08:53:50.000000000 +0200
@@ -98,6 +98,8 @@
RelLabel = Fragments[J]+2;
else if (stringcasecmp(Fragments[J],Fragments[J]+2,"c=") == 0)
RelComponent = Fragments[J]+2;
+ else if (stringcasecmp(Fragments[J],Fragments[J]+2,"b=") == 0)
+ RelArch = Fragments[J]+2;
}
if (RelVerStr.end()[-1] == '*')
@@ -175,7 +177,7 @@
if (RelVerStr.empty() == true && RelOrigin.empty() == true &&
RelArchive.empty() == true && RelLabel.empty() == true &&
- RelComponent.empty() == true)
+ RelComponent.empty() == true && RelArch.empty() == true)
return false;
if (RelVerStr.empty() == false)
@@ -200,6 +202,9 @@
if (File->Component == 0 ||
stringcasecmp(RelComponent,File.Component()) != 0)
return false;
+ // FIXME:
+ // if (RelArch.empty() == false)
+ // compare arch
return true;
}
diff -Nru apt-0.7.21/apt-pkg/versionmatch.h apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.h
--- apt-0.7.21/apt-pkg/versionmatch.h 2008-06-09 23:10:08.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/apt-pkg/versionmatch.h 2009-07-13 08:53:50.000000000 +0200
@@ -20,6 +20,7 @@
Archive (a=)
Label (l=)
Component (c=)
+ Build architecture (b=)
If there are no equals signs in the string then it is scanned in short
form - if it starts with a number it is Version otherwise it is an
Archive.
@@ -50,6 +51,7 @@
string RelArchive;
string RelLabel;
string RelComponent;
+ string RelArch;
bool MatchAll;
// Origin Matching
diff -Nru apt-0.7.21/cmdline/apt-get.cc apt-0.7.21a0.mrvn.1/cmdline/apt-get.cc
--- apt-0.7.21/cmdline/apt-get.cc 2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/cmdline/apt-get.cc 2009-07-13 08:53:50.000000000 +0200
@@ -1360,7 +1360,7 @@
// Create the progress
AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
-
+
// Just print out the uris an exit if the --print-uris flag was used
if (_config->FindB("APT::Get::Print-URIs") == true)
{
diff -Nru apt-0.7.21/configure apt-0.7.21a0.mrvn.1/configure
--- apt-0.7.21/configure 2009-04-14 14:21:45.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/configure 2009-07-13 08:53:50.000000000 +0200
@@ -1901,7 +1901,7 @@
cat >>confdefs.h <<_ACEOF
-#define VERSION "0.7.21"
+#define VERSION "0.7.21a0.mrvn.1"
_ACEOF
PACKAGE="apt"
diff -Nru apt-0.7.21/configure.in apt-0.7.21a0.mrvn.1/configure.in
--- apt-0.7.21/configure.in 2009-04-14 14:21:18.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/configure.in 2009-07-13 08:53:50.000000000 +0200
@@ -18,7 +18,7 @@
AC_CONFIG_HEADER(include/config.h:buildlib/config.h.in include/apti18n.h:buildlib/apti18n.h.in)
dnl -- SET THIS TO THE RELEASE VERSION --
-AC_DEFINE_UNQUOTED(VERSION,"0.7.21")
+AC_DEFINE_UNQUOTED(VERSION,"0.7.21a0.mrvn.1")
PACKAGE="apt"
AC_DEFINE_UNQUOTED(PACKAGE,"$PACKAGE")
AC_SUBST(PACKAGE)
diff -Nru apt-0.7.21/debian/changelog apt-0.7.21a0.mrvn.1/debian/changelog
--- apt-0.7.21/debian/changelog 2009-04-14 14:20:29.000000000 +0200
+++ apt-0.7.21a0.mrvn.1/debian/changelog 2009-07-13 08:53:50.000000000 +0200
@@ -1,3 +1,10 @@
+apt (0.7.21a0.mrvn.1) unstable; urgency=low
+
+ [ Goswin von Brederlow ]
+ * Add architectures config option
+
+ -- Goswin von Brederlow <goswin-v-b@web.de> Mon, 06 Jul 2009 15:39:48 +0200
+
apt (0.7.21) unstable; urgency=low
[ Christian Perrier ]
Reply to: