From 7c1dca1439b956a085b09c73fdbe5a66af20241b Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 7 May 2016 16:45:35 +0200 Subject: download arch:all also for NATIVE_ARCHITECTURE indextargets It looks a bit strange on the outside to have multiple "native architecture", but all is considered an implementation detail and e.g. packages of arch:all are in dependency resolution equal to native packages. --- apt-pkg/deb/debmetaindex.cc | 200 +++++++++++---------- test/integration/test-apt-acquire-additional-files | 26 ++- 2 files changed, 122 insertions(+), 104 deletions(-) diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc index 91adbb484..260686cc7 100644 --- a/apt-pkg/deb/debmetaindex.cc +++ b/apt-pkg/deb/debmetaindex.cc @@ -153,7 +153,8 @@ static void GetIndexTargetsFor(char const * const Type, std::string const &URI, } DefKeepCompressedAs += "uncompressed"; } - std::string const NativeArch = _config->Find("APT::Architecture"); + + std::vector const NativeArchs = { _config->Find("APT::Architecture"), "all" }; bool const GzipIndex = _config->FindB("Acquire::GzipIndexes", false); for (std::vector::const_iterator E = entries.begin(); E != entries.end(); ++E) { @@ -206,113 +207,120 @@ static void GetIndexTargetsFor(char const * const Type, std::string const &URI, for (std::vector::const_iterator A = E->Architectures.begin(); A != E->Architectures.end(); ++A) { - // available in templates - std::map Options; - Options.insert(std::make_pair("SITE", Site)); - Options.insert(std::make_pair("RELEASE", Release)); - if (tplMetaKey.find("$(COMPONENT)") != std::string::npos) - Options.insert(std::make_pair("COMPONENT", E->Name)); - if (tplMetaKey.find("$(LANGUAGE)") != std::string::npos) - Options.insert(std::make_pair("LANGUAGE", *L)); - if (tplMetaKey.find("$(ARCHITECTURE)") != std::string::npos) - Options.insert(std::make_pair("ARCHITECTURE", *A)); - else if (tplMetaKey.find("$(NATIVE_ARCHITECTURE)") != std::string::npos) - Options.insert(std::make_pair("ARCHITECTURE", NativeArch)); - if (tplMetaKey.find("$(NATIVE_ARCHITECTURE)") != std::string::npos) - Options.insert(std::make_pair("NATIVE_ARCHITECTURE", NativeArch)); - - std::string MetaKey = tplMetaKey; - std::string ShortDesc = tplShortDesc; - std::string LongDesc = tplLongDesc; - for (std::map::const_iterator O = Options.begin(); O != Options.end(); ++O) + for (auto const &NativeArch: NativeArchs) { - MetaKey = SubstVar(MetaKey, std::string("$(") + O->first + ")", O->second); - ShortDesc = SubstVar(ShortDesc, std::string("$(") + O->first + ")", O->second); - LongDesc = SubstVar(LongDesc, std::string("$(") + O->first + ")", O->second); - } + constexpr static auto BreakPoint = "$(NATIVE_ARCHITECTURE)"; + // available in templates + std::map Options; + Options.insert(std::make_pair("SITE", Site)); + Options.insert(std::make_pair("RELEASE", Release)); + if (tplMetaKey.find("$(COMPONENT)") != std::string::npos) + Options.insert(std::make_pair("COMPONENT", E->Name)); + if (tplMetaKey.find("$(LANGUAGE)") != std::string::npos) + Options.insert(std::make_pair("LANGUAGE", *L)); + if (tplMetaKey.find("$(ARCHITECTURE)") != std::string::npos) + Options.insert(std::make_pair("ARCHITECTURE", *A)); + else if (tplMetaKey.find("$(NATIVE_ARCHITECTURE)") != std::string::npos) + Options.insert(std::make_pair("ARCHITECTURE", NativeArch)); + if (tplMetaKey.find("$(NATIVE_ARCHITECTURE)") != std::string::npos) + Options.insert(std::make_pair("NATIVE_ARCHITECTURE", NativeArch)); + + std::string MetaKey = tplMetaKey; + std::string ShortDesc = tplShortDesc; + std::string LongDesc = tplLongDesc; + for (std::map::const_iterator O = Options.begin(); O != Options.end(); ++O) + { + MetaKey = SubstVar(MetaKey, std::string("$(") + O->first + ")", O->second); + ShortDesc = SubstVar(ShortDesc, std::string("$(") + O->first + ")", O->second); + LongDesc = SubstVar(LongDesc, std::string("$(") + O->first + ")", O->second); + } - { - auto const dup = std::find_if(IndexTargets.begin(), IndexTargets.end(), [&](IndexTarget const &IT) { - return MetaKey == IT.MetaKey && baseURI == IT.Option(IndexTarget::BASE_URI) && - E->sourcesEntry == IT.Option(IndexTarget::SOURCESENTRY) && *T == IT.Option(IndexTarget::CREATED_BY); - }); - if (dup != IndexTargets.end()) { - if (tplMetaKey.find("$(ARCHITECTURE)") == std::string::npos) - break; - continue; + auto const dup = std::find_if(IndexTargets.begin(), IndexTargets.end(), [&](IndexTarget const &IT) { + return MetaKey == IT.MetaKey && baseURI == IT.Option(IndexTarget::BASE_URI) && + E->sourcesEntry == IT.Option(IndexTarget::SOURCESENTRY) && *T == IT.Option(IndexTarget::CREATED_BY); + }); + if (dup != IndexTargets.end()) + { + if (tplMetaKey.find(BreakPoint) == std::string::npos) + break; + continue; + } } - } - { - auto const dup = std::find_if(IndexTargets.begin(), IndexTargets.end(), [&](IndexTarget const &IT) { - return MetaKey == IT.MetaKey && baseURI == IT.Option(IndexTarget::BASE_URI) && - E->sourcesEntry == IT.Option(IndexTarget::SOURCESENTRY) && *T != IT.Option(IndexTarget::CREATED_BY); - }); - if (dup != IndexTargets.end()) { - std::string const dupT = dup->Option(IndexTarget::CREATED_BY); - std::string const dupEntry = dup->Option(IndexTarget::SOURCESENTRY); - //TRANSLATOR: an identifier like Packages; Releasefile key indicating - // a file like main/binary-amd64/Packages; another identifier like Contents; - // filename and linenumber of the sources.list entry currently parsed - _error->Warning(_("Target %s wants to acquire the same file (%s) as %s from source %s"), - T->c_str(), MetaKey.c_str(), dupT.c_str(), dupEntry.c_str()); - if (tplMetaKey.find("$(ARCHITECTURE)") == std::string::npos) - break; - continue; + auto const dup = std::find_if(IndexTargets.begin(), IndexTargets.end(), [&](IndexTarget const &IT) { + return MetaKey == IT.MetaKey && baseURI == IT.Option(IndexTarget::BASE_URI) && + E->sourcesEntry == IT.Option(IndexTarget::SOURCESENTRY) && *T != IT.Option(IndexTarget::CREATED_BY); + }); + if (dup != IndexTargets.end()) + { + std::string const dupT = dup->Option(IndexTarget::CREATED_BY); + std::string const dupEntry = dup->Option(IndexTarget::SOURCESENTRY); + //TRANSLATOR: an identifier like Packages; Releasefile key indicating + // a file like main/binary-amd64/Packages; another identifier like Contents; + // filename and linenumber of the sources.list entry currently parsed + _error->Warning(_("Target %s wants to acquire the same file (%s) as %s from source %s"), + T->c_str(), MetaKey.c_str(), dupT.c_str(), dupEntry.c_str()); + if (tplMetaKey.find(BreakPoint) == std::string::npos) + break; + continue; + } } - } - { - auto const dup = std::find_if(IndexTargets.begin(), IndexTargets.end(), [&](IndexTarget const &T) { - return MetaKey == T.MetaKey && baseURI == T.Option(IndexTarget::BASE_URI) && - E->sourcesEntry != T.Option(IndexTarget::SOURCESENTRY); - }); - if (dup != IndexTargets.end()) { - std::string const dupEntry = dup->Option(IndexTarget::SOURCESENTRY); - //TRANSLATOR: an identifier like Packages; Releasefile key indicating - // a file like main/binary-amd64/Packages; filename and linenumber of - // two sources.list entries - _error->Warning(_("Target %s (%s) is configured multiple times in %s and %s"), - T->c_str(), MetaKey.c_str(), dupEntry.c_str(), E->sourcesEntry.c_str()); - if (tplMetaKey.find("$(ARCHITECTURE)") == std::string::npos) - break; - continue; + auto const dup = std::find_if(IndexTargets.begin(), IndexTargets.end(), [&](IndexTarget const &T) { + return MetaKey == T.MetaKey && baseURI == T.Option(IndexTarget::BASE_URI) && + E->sourcesEntry != T.Option(IndexTarget::SOURCESENTRY); + }); + if (dup != IndexTargets.end()) + { + std::string const dupEntry = dup->Option(IndexTarget::SOURCESENTRY); + //TRANSLATOR: an identifier like Packages; Releasefile key indicating + // a file like main/binary-amd64/Packages; filename and linenumber of + // two sources.list entries + _error->Warning(_("Target %s (%s) is configured multiple times in %s and %s"), + T->c_str(), MetaKey.c_str(), dupEntry.c_str(), E->sourcesEntry.c_str()); + if (tplMetaKey.find(BreakPoint) == std::string::npos) + break; + continue; + } } - } - // not available in templates, but in the indextarget - Options.insert(std::make_pair("BASE_URI", baseURI)); - Options.insert(std::make_pair("REPO_URI", URI)); - Options.insert(std::make_pair("TARGET_OF", Type)); - Options.insert(std::make_pair("CREATED_BY", *T)); - Options.insert(std::make_pair("PDIFFS", UsePDiffs ? "yes" : "no")); - Options.insert(std::make_pair("BY_HASH", UseByHash)); - Options.insert(std::make_pair("DEFAULTENABLED", DefaultEnabled ? "yes" : "no")); - Options.insert(std::make_pair("COMPRESSIONTYPES", CompressionTypes)); - Options.insert(std::make_pair("KEEPCOMPRESSEDAS", KeepCompressedAs)); - Options.insert(std::make_pair("SOURCESENTRY", E->sourcesEntry)); - - bool IsOpt = IsOptional; - if (IsOpt == false) - { - auto const arch = Options.find("ARCHITECTURE"); - if (arch != Options.end() && arch->second == "all") - IsOpt = true; - } + // not available in templates, but in the indextarget + Options.insert(std::make_pair("BASE_URI", baseURI)); + Options.insert(std::make_pair("REPO_URI", URI)); + Options.insert(std::make_pair("TARGET_OF", Type)); + Options.insert(std::make_pair("CREATED_BY", *T)); + Options.insert(std::make_pair("PDIFFS", UsePDiffs ? "yes" : "no")); + Options.insert(std::make_pair("BY_HASH", UseByHash)); + Options.insert(std::make_pair("DEFAULTENABLED", DefaultEnabled ? "yes" : "no")); + Options.insert(std::make_pair("COMPRESSIONTYPES", CompressionTypes)); + Options.insert(std::make_pair("KEEPCOMPRESSEDAS", KeepCompressedAs)); + Options.insert(std::make_pair("SOURCESENTRY", E->sourcesEntry)); + + bool IsOpt = IsOptional; + if (IsOpt == false) + { + auto const arch = Options.find("ARCHITECTURE"); + if (arch != Options.end() && arch->second == "all") + IsOpt = true; + } - IndexTarget Target( - MetaKey, - ShortDesc, - LongDesc, - Options.find("BASE_URI")->second + MetaKey, - IsOpt, - KeepCompressed, - Options - ); - IndexTargets.push_back(Target); + IndexTarget Target( + MetaKey, + ShortDesc, + LongDesc, + Options.find("BASE_URI")->second + MetaKey, + IsOpt, + KeepCompressed, + Options + ); + IndexTargets.push_back(Target); + + if (tplMetaKey.find(BreakPoint) == std::string::npos) + break; + } if (tplMetaKey.find("$(ARCHITECTURE)") == std::string::npos) break; diff --git a/test/integration/test-apt-acquire-additional-files b/test/integration/test-apt-acquire-additional-files index afeeadd4f..3420aa29d 100755 --- a/test/integration/test-apt-acquire-additional-files +++ b/test/integration/test-apt-acquire-additional-files @@ -128,8 +128,9 @@ Acquire::IndexTargets::deb::Contents { }; EOF -# the last line is utter bogus of course, but how should apt know… -testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 +runthistest() { + # the last lines are utter bogus of course, but how should apt know… + testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost:${APTHTTPPORT}_dists_unstable_InRelease 0 'http://localhost:${APTHTTPPORT}/dists/unstable/main/source/Sources.xz' localhost:${APTHTTPPORT}_dists_unstable_main_source_Sources 0 'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-amd64/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-amd64_Packages 0 'http://localhost:${APTHTTPPORT}/dists/unstable/main/binary-all/Packages.xz' localhost:${APTHTTPPORT}_dists_unstable_main_binary-all_Packages 0 @@ -137,16 +138,25 @@ testequal "'http://localhost:${APTHTTPPORT}/dists/unstable/InRelease' localhost: 'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-amd64.gz.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz 0 'http://localhost:${APTHTTPPORT}/dists/unstable/main/Contents-all.gz.xz' localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz 0 " aptget update --print-uris -testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease + testsuccessequal "Hit:1 http://localhost:${APTHTTPPORT} unstable InRelease Get:2 http://localhost:${APTHTTPPORT} unstable/main amd64 Contents.gz [$(stat -c%s aptarchive/dists/unstable/main/Contents-amd64.gz) B] Get:3 http://localhost:${APTHTTPPORT} unstable/main all Contents.gz [$(stat -c%s aptarchive/dists/unstable/main/Contents-all.gz) B] Reading package lists..." aptget update -testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" find rootdir/var/lib/apt/lists -name '*Contents-amd64*' -testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" find rootdir/var/lib/apt/lists -name '*Contents-all*' -testequal "$(readfile Contents-amd64.gz Contents-all.gz)" aptget indextargets --format '$(FILENAME)' 'Created-By: Contents' -testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" 'aptarchive/dists/unstable/main/Contents-amd64.gz' -testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" 'aptarchive/dists/unstable/main/Contents-all.gz' + testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" find rootdir/var/lib/apt/lists -name '*Contents-amd64*' + testequal "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" find rootdir/var/lib/apt/lists -name '*Contents-all*' + testequal "$(readfile Contents-amd64.gz Contents-all.gz)" aptget indextargets --format '$(FILENAME)' 'Created-By: Contents' + testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz" 'aptarchive/dists/unstable/main/Contents-amd64.gz' + testsuccess cmp "rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz" 'aptarchive/dists/unstable/main/Contents-all.gz' +} +runthistest + +msgmsg "Compressed Contents file from native architecture" +echo 'Acquire::IndexTargets::deb::Contents::MetaKey "$(COMPONENT)/Contents-$(NATIVE_ARCHITECTURE).gz";' >> rootdir/etc/apt/apt.conf.d/content-target.conf +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-amd64.gz +rm ./rootdir/var/lib/apt/lists/localhost:${APTHTTPPORT}_dists_unstable_main_Contents-all.gz +testempty aptget indextargets --format '$(FILENAME)' 'Created-By: Contents' +runthistest rm -f rootdir/etc/apt/apt.conf.d/content-target.conf msgmsg "No Contents file" -- cgit v1.2.3