From b90faf2486b977aef0183e38a7f9c535a8a61a34 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 17 Jun 2016 13:27:34 +0200 Subject: merge sources.list lines based on Release filename Merging by URI means that having sources lines with different URI methods results in 'strange' warning and error messages, which aren't very friendly from a user point of view as not encoding the method in the filename is effectivly an implementation detail. Merging by filename removes these messages and makes everything "work" even if it isn't working the way it is configured as the indexes aren't acquired over the method given, but over the first method for this release file (which argueably is an implementation detail stemming from the filename encoding, too). So either direction isn't perfectly "right", but personally I prefer "magic" over strange error messages (and doing a full-circle detection of this with its own messages which would need to be translated feels like way too much effort for dubious gain). Closes: 826944 --- apt-pkg/deb/debmetaindex.cc | 42 ++++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 20 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/deb/debmetaindex.cc b/apt-pkg/deb/debmetaindex.cc index f756cdb1f..c70c39a45 100644 --- a/apt-pkg/deb/debmetaindex.cc +++ b/apt-pkg/deb/debmetaindex.cc @@ -80,20 +80,19 @@ std::string debReleaseIndex::MetaIndexFile(const char *Type) const return _config->FindDir("Dir::State::lists") + URItoFileName(MetaIndexURI(Type)); } - -std::string debReleaseIndex::MetaIndexURI(const char *Type) const +static std::string constructMetaIndexURI(std::string URI, std::string const &Dist, char const * const Type) { - std::string Res; - if (Dist == "/") - Res = URI; + ; else if (Dist[Dist.size()-1] == '/') - Res = URI + Dist; + URI += Dist; else - Res = URI + "dists/" + Dist + "/"; - - Res += Type; - return Res; + URI += "dists/" + Dist + "/"; + return URI + Type; +} +std::string debReleaseIndex::MetaIndexURI(const char *Type) const +{ + return constructMetaIndexURI(URI, Dist, Type); } /*}}}*/ // ReleaseIndex Con- and Destructors /*{{{*/ @@ -919,27 +918,30 @@ class APT_HIDDEN debSLTypeDebian : public pkgSourceList::Type /*{{{*/ std::string const &Dist, std::string const &Section, bool const &IsSrc, std::map const &Options) const { - debReleaseIndex *Deb = NULL; - for (std::vector::const_iterator I = List.begin(); - I != List.end(); ++I) + debReleaseIndex * Deb = nullptr; + std::string const FileName = URItoFileName(constructMetaIndexURI(URI, Dist, "Release")); + for (auto const &I: List) { // We only worry about debian entries here - if (strcmp((*I)->GetType(), "deb") != 0) + if (strcmp(I->GetType(), "deb") != 0) + continue; + + auto const D = dynamic_cast(I); + if (unlikely(D == nullptr)) continue; - /* This check insures that there will be only one Release file + /* This check ensures that there will be only one Release file queued for all the Packages files and Sources files it corresponds to. */ - if ((*I)->GetURI() == URI && (*I)->GetDist() == Dist) + if (URItoFileName(D->MetaIndexURI("Release")) == FileName) { - Deb = dynamic_cast(*I); - if (Deb != NULL) - break; + Deb = D; + break; } } // No currently created Release file indexes this entry, so we create a new one. - if (Deb == NULL) + if (Deb == nullptr) { Deb = new debReleaseIndex(URI, Dist); List.push_back(Deb); -- cgit v1.2.3