#include <apt-pkg/debmetaindex.h>
#include <apt-pkg/debindexfile.h>
#include <apt-pkg/strutl.h>
+#include <apt-pkg/fileutl.h>
#include <apt-pkg/acquire-item.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/aptconfiguration.h>
+#include <apt-pkg/indexrecords.h>
+#include <apt-pkg/sourcelist.h>
#include <apt-pkg/error.h>
#include <set>
+#include <algorithm>
using namespace std;
{
string Res ="";
if (Dist[Dist.size() - 1] != '/')
- Res += Section + "/i18n/";
+ Res += Section + "/i18n/Translation-";
return Res + Type;
}
}
}
- std::vector<std::string> const lang = APT::Configuration::getLanguages(true);
+ std::vector<std::string> lang = APT::Configuration::getLanguages(true);
+ std::vector<std::string>::iterator lend = std::remove(lang.begin(), lang.end(), "none");
+ if (lend != lang.end())
+ lang.erase(lend);
+
if (lang.empty() == true)
return IndexTargets;
- // get the Translations:
- // - if its a dists-style repository get the i18n/Index first
- // - if its flat try to acquire files by guessing
- if (Dist[Dist.size() - 1] == '/') {
- for (std::set<std::string>::const_iterator s = sections.begin();
- s != sections.end(); ++s) {
- for (std::vector<std::string>::const_iterator l = lang.begin();
- l != lang.end(); ++l) {
- if (*l == "none") continue;
- IndexTarget * Target = new OptionalIndexTarget();
- Target->ShortDesc = "Translation-" + *l;
- Target->MetaKey = TranslationIndexURISuffix(l->c_str(), *s);
- Target->URI = TranslationIndexURI(l->c_str(), *s);
- Target->Description = Info (Target->ShortDesc.c_str(), *s);
- IndexTargets->push_back(Target);
- }
- }
- } else {
- for (std::set<std::string>::const_iterator s = sections.begin();
- s != sections.end(); ++s) {
+ // get the Translation-* files, later we will skip download of non-existent if we have an index
+ for (std::set<std::string>::const_iterator s = sections.begin();
+ s != sections.end(); ++s) {
+ for (std::vector<std::string>::const_iterator l = lang.begin();
+ l != lang.end(); ++l) {
IndexTarget * Target = new OptionalIndexTarget();
- Target->ShortDesc = "TranslationIndex";
- Target->MetaKey = TranslationIndexURISuffix("Index", *s);
- Target->URI = TranslationIndexURI("Index", *s);
+ Target->ShortDesc = "Translation-" + *l;
+ Target->MetaKey = TranslationIndexURISuffix(l->c_str(), *s);
+ Target->URI = TranslationIndexURI(l->c_str(), *s);
Target->Description = Info (Target->ShortDesc.c_str(), *s);
- IndexTargets->push_back (Target);
+ IndexTargets->push_back(Target);
}
}
/*}}}*/
bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const
{
+ bool const tryInRelease = _config->FindB("Acquire::TryInRelease", true);
+
// special case for --print-uris
if (GetAll) {
vector <struct IndexTarget *> *targets = ComputeIndexTargets();
new pkgAcqIndex(Owner, (*Target)->URI, (*Target)->Description,
(*Target)->ShortDesc, HashString());
}
+ delete targets;
+
+ // this is normally created in pkgAcqMetaSig, but if we run
+ // in --print-uris mode, we add it here
+ if (tryInRelease == false)
+ new pkgAcqMetaIndex(Owner, MetaIndexURI("Release"),
+ MetaIndexInfo("Release"), "Release",
+ MetaIndexURI("Release.gpg"),
+ ComputeIndexTargets(),
+ new indexRecords (Dist));
}
- new pkgAcqMetaClearSig(Owner, MetaIndexURI("InRelease"),
- MetaIndexInfo("InRelease"), "InRelease",
- MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
- MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
- ComputeIndexTargets(),
- new indexRecords (Dist));
+ if (tryInRelease == true)
+ new pkgAcqMetaClearSig(Owner, MetaIndexURI("InRelease"),
+ MetaIndexInfo("InRelease"), "InRelease",
+ MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
+ MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
+ ComputeIndexTargets(),
+ new indexRecords (Dist));
+ else
+ new pkgAcqMetaSig(Owner, MetaIndexURI("Release.gpg"),
+ MetaIndexInfo("Release.gpg"), "Release.gpg",
+ MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
+ ComputeIndexTargets(),
+ new indexRecords (Dist));
- return true;
+ return true;
}
void debReleaseIndex::SetTrusted(bool const Trusted)
string const &Dist, string const &Section,
bool const &IsSrc, map<string, string> const &Options) const
{
- map<string, string>::const_iterator const arch = Options.find("arch");
- vector<string> const Archs =
+ // parse arch=, arch+= and arch-= settings
+ map<string, string>::const_iterator arch = Options.find("arch");
+ vector<string> Archs =
(arch != Options.end()) ? VectorizeString(arch->second, ',') :
APT::Configuration::getArchitectures();
+ if ((arch = Options.find("arch+")) != Options.end())
+ {
+ std::vector<std::string> const plusArch = VectorizeString(arch->second, ',');
+ for (std::vector<std::string>::const_iterator plus = plusArch.begin(); plus != plusArch.end(); ++plus)
+ if (std::find(Archs.begin(), Archs.end(), *plus) == Archs.end())
+ Archs.push_back(*plus);
+ }
+ if ((arch = Options.find("arch-")) != Options.end())
+ {
+ std::vector<std::string> const minusArch = VectorizeString(arch->second, ',');
+ for (std::vector<std::string>::const_iterator minus = minusArch.begin(); minus != minusArch.end(); ++minus)
+ {
+ std::vector<std::string>::iterator kill = std::find(Archs.begin(), Archs.end(), *minus);
+ if (kill != Archs.end())
+ Archs.erase(kill);
+ }
+ }
+
map<string, string>::const_iterator const trusted = Options.find("trusted");
for (vector<metaIndex *>::const_iterator I = List.begin();