--- Begin Message ---
- To: Debian Bug Tracking System <submit@bugs.debian.org>
- Subject: Add support to download index files for multiple architectures
- From: Goswin Brederlow <goswin-v-b@web.de>
- Date: Mon, 06 Jul 2009 23:46:52 +0200
- Message-id: <20090706214652.29317.88020.reportbug@frosties.localdomain>
Package: apt
Version: 0.7.21
Severity: wishlist
Tags: patch
Hi,
attached is a patch I would like to get included eventually in apt
that adds the ability to download and process index files for multiple
architectures. This patch has 2 purposes:
1) I believe this will be the first thing that needs to be added to
implement multiarch. So it will be needed at some point anyway.
2) This will remove the hacks ia32-apt-get needs to pull over apt-get.
Ia32-apt-get can then be implemented by setting APT::Architectures and
adding a Apt::Update::Post-Invoke script.
The patch is not yet 100% complete and you will see some FIXMEs in the
patch and in the details below. Things I haven't been able to test yet
like adding a i386 CDrom on amd64 or things I'm unsure about. Any help
there would be appreciated.
On that note: How do I mark the *.bin files as incompatible? The
change in policy breaks compatibility I believe.
What the patch does in detail:
- Add APT::Architectures:: config option and initialize with
APT::Architecture if unset.
- Declare the unused [vendor] field in sources.list as option
field, e.g.
deb [arch=amd64,i386;keyring=blubber.key;have=fun]
FIXME: Parsing of this field is still missing but I pass a
map<string,string> for it around where needed.
- When fetching index files download them for all APT::Architectures
FIXME: use Options["arch"] to override the default
- Enter packages of all APT::Architectures into the package cache.
- Add the architecture to status and progress informations:
Get:1 http://chocos sid/main i386 Packages [7788kB]
- Add b= (Build architecture) to policy:
499 http://chocos sid/main i386 Packages
release v=4.3,o=Debian,a=unstable,l=Debian,c=main,b=i386
- Decrease the pin of the non native archs by 1 and increase default
pin of experimental to 2 (so non-native experimental is 1).
FIXME: 99 /var/lib/dpkg/status
This is so that the native arch will always be prefered unless the
user pins it differently.
As said above the patch is not 100% yet but I feel it is ready for
others to test and comment and maybe help.
MfG
Goswin
-- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (500, 'unstable'), (499, 'unstable')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.29.4-frosties-1
Locale: LANG=C, LC_CTYPE=de_DE (charmap=ISO-8859-1)
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:
ii apt-doc 0.7.21 Documentation for APT
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
ii synaptic 0.62.7 Graphical package manager
-- 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-06 22:44:07.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-06 22:38:05.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-06 16:45:30.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-06 16:43:14.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-06 22:41:51.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-06 17:07:58.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-06 22:12:15.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-06 22:02:03.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-06 20:06:07.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,16 @@
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 = _config->FindList("APT::architectures");
+ debReleaseIndex *Deb = new debReleaseIndex(URI,Dist,Archs);
Deb->PushSectionEntry (new debReleaseIndex::debSectionEntry(Section, IsSrc));
List.push_back(Deb);
return true;
@@ -259,10 +288,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 +305,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-06 20:05:49.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-06 22:53:42.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-06 17:40:08.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-06 18:30:19.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-06 22:54:29.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-06 22:03:25.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-06 22:10:05.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-06 16:37:14.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,7 +240,8 @@
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
+ // FIXME: Parse options
+ map<string,string> Options;
if (C[0] == '[')
{
string VendorID;
@@ -268,7 +270,7 @@
// VendorID.c_str(),CurLine,File.c_str());
}
- 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-06 16:34:11.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-06 21:41:34.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-06 21:39:32.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-06 22:57:22.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-06 18:11:14.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-06 18:11:13.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-06 15:44:09.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 ]
--- End Message ---