From d29a5330af408747363c944767f1af2212658bd1 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 2 Sep 2012 18:31:07 +0200 Subject: [PATCH] * apt-pkg/indexcopy.cc: - do not create duplicated flat-archive cdrom sources for foreign architectures on multi-arch cdroms --- apt-pkg/indexcopy.cc | 11 +-- debian/changelog | 4 +- test/libapt/indexcopytosourcelist_test.cc | 86 +++++++++++++++++++++++ test/libapt/makefile | 6 ++ 4 files changed, 102 insertions(+), 5 deletions(-) create mode 100644 test/libapt/indexcopytosourcelist_test.cc diff --git a/apt-pkg/indexcopy.cc b/apt-pkg/indexcopy.cc index c97445326..24defd82c 100644 --- a/apt-pkg/indexcopy.cc +++ b/apt-pkg/indexcopy.cc @@ -350,9 +350,6 @@ bool IndexCopy::ReconstructChop(unsigned long &Chop,string Dir,string File) */ void IndexCopy::ConvertToSourceList(string CD,string &Path) { - char S[300]; - snprintf(S,sizeof(S),"binary-%s",_config->Find("Apt::Architecture").c_str()); - // Strip the cdrom base path Path = string(Path,CD.length()); if (Path.empty() == true) @@ -388,7 +385,13 @@ void IndexCopy::ConvertToSourceList(string CD,string &Path) return; string Binary = string(Path,Slash+1,BinSlash - Slash-1); - if (Binary != S && Binary != "source") + if (strncmp(Binary.c_str(), "binary-", strlen("binary-")) == 0) + { + Binary.erase(0, strlen("binary-")); + if (APT::Configuration::checkArchitecture(Binary) == false) + continue; + } + else if (Binary != "source") continue; Path = Dist + ' ' + Comp; diff --git a/debian/changelog b/debian/changelog index a673040c5..4533d27e3 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,7 +15,9 @@ apt (0.9.7.5) UNRELEASED; urgency=low * doc/apt_preferences.5.xml: - use the correct interval (x <= P < y) for pin value documentation as these are the intervals used by the code (Closes: #685989) - * + * apt-pkg/indexcopy.cc: + - do not create duplicated flat-archive cdrom sources for foreign + architectures on multi-arch cdroms -- David Kalnischkies Sun, 26 Aug 2012 10:49:17 +0200 diff --git a/test/libapt/indexcopytosourcelist_test.cc b/test/libapt/indexcopytosourcelist_test.cc new file mode 100644 index 000000000..69d8fae86 --- /dev/null +++ b/test/libapt/indexcopytosourcelist_test.cc @@ -0,0 +1,86 @@ +#include +#include +#include + +#include + +#include "assert.h" + +class NoCopy : public IndexCopy { +public: + std::string ConvertToSourceList(std::string CD,std::string Path) { + IndexCopy::ConvertToSourceList(CD, Path); + return Path; + } + bool GetFile(std::string &Filename,unsigned long long &Size) { return false; } + bool RewriteEntry(FILE *Target,std::string File) { return false; } + const char *GetFileName() { return NULL; } + const char *Type() { return NULL; } + +}; + +int main(int argc, char const *argv[]) { + NoCopy ic; + std::string const CD("/media/cdrom/"); + + char const * Releases[] = { "unstable", "wheezy-updates", NULL }; + char const * Components[] = { "main", "non-free", NULL }; + + for (char const ** Release = Releases; *Release != NULL; ++Release) { + for (char const ** Component = Components; *Component != NULL; ++Component) { + std::string const Path = std::string("dists/") + *Release + "/" + *Component + "/"; + std::string const Binary = Path + "binary-"; + std::string const A = Binary + "armel/"; + std::string const B = Binary + "mips/"; + std::string const C = Binary + "kfreebsd-mips/"; + std::string const S = Path + "source/"; + std::string const List = std::string(*Release) + " " + *Component; + + _config->Clear("APT"); + APT::Configuration::getArchitectures(false); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), A); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), B); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List); + + _config->Clear("APT"); + _config->Set("APT::Architecture", "mips"); + _config->Set("APT::Architectures::", "mips"); + APT::Configuration::getArchitectures(false); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), A); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), List); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List); + + _config->Clear("APT"); + _config->Set("APT::Architecture", "kfreebsd-mips"); + _config->Set("APT::Architectures::", "kfreebsd-mips"); + APT::Configuration::getArchitectures(false); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), A); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), B); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), List); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List); + + _config->Clear("APT"); + _config->Set("APT::Architecture", "armel"); + _config->Set("APT::Architectures::", "armel"); + APT::Configuration::getArchitectures(false); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), List); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), B); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List); + + _config->Clear("APT"); + _config->Set("APT::Architecture", "armel"); + _config->Set("APT::Architectures::", "armel"); + _config->Set("APT::Architectures::", "mips"); + APT::Configuration::getArchitectures(false); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + A), List); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + B), List); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + C), C); + equals(ic.ConvertToSourceList("/media/cdrom/", CD + S), List); + } + } + + return 0; +} diff --git a/test/libapt/makefile b/test/libapt/makefile index b2e6db2dd..d4d7f175b 100644 --- a/test/libapt/makefile +++ b/test/libapt/makefile @@ -86,3 +86,9 @@ PROGRAM = CdromFindPackages${BASENAME} SLIBS = -lapt-pkg SOURCE = cdromfindpackages_test.cc include $(PROGRAM_H) + +# text IndexCopy::ConvertToSourceList +PROGRAM = IndexCopyToSourceList${BASENAME} +SLIBS = -lapt-pkg +SOURCE = indexcopytosourcelist_test.cc +include $(PROGRAM_H) -- 2.45.2