Просмотр исходного кода

don't construct MetaIndex acquire items with IndexTargets

We don't have to initialize the Release files with a set of IndexTargets
to acquire, but instead wait for the Release file to be acquired and
only then ask which IndexTargets to get.

Git-Dch: Ignore
David Kalnischkies лет назад: 10
Родитель
Сommit
a8f565d3f6
3 измененных файлов с 41 добавлено и 57 удалено
  1. 38 44
      apt-pkg/acquire-item.cc
  2. 1 9
      apt-pkg/acquire-item.h
  3. 2 4
      apt-pkg/deb/debmetaindex.cc

+ 38 - 44
apt-pkg/acquire-item.cc

@@ -934,10 +934,8 @@ static void LoadLastMetaIndexParser(pkgAcqMetaClearSig * const TransactionManage
 // AcqMetaBase - Constructor						/*{{{*/
 // AcqMetaBase - Constructor						/*{{{*/
 pkgAcqMetaBase::pkgAcqMetaBase(pkgAcquire * const Owner,
 pkgAcqMetaBase::pkgAcqMetaBase(pkgAcquire * const Owner,
       pkgAcqMetaClearSig * const TransactionManager,
       pkgAcqMetaClearSig * const TransactionManager,
-      std::vector<IndexTarget> const &IndexTargets,
       IndexTarget const &DataTarget)
       IndexTarget const &DataTarget)
 : pkgAcqTransactionItem(Owner, TransactionManager, DataTarget), d(NULL),
 : pkgAcqTransactionItem(Owner, TransactionManager, DataTarget), d(NULL),
-   IndexTargets(IndexTargets),
    AuthPass(false), IMSHit(false), State(TransactionStarted)
    AuthPass(false), IMSHit(false), State(TransactionStarted)
 {
 {
 }
 }
@@ -1199,9 +1197,7 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify)			/*{{{*/
    ExpectedAdditionalItems = 0;
    ExpectedAdditionalItems = 0;
 
 
    bool const metaBaseSupportsByHash = TransactionManager->MetaIndexParser->GetSupportsAcquireByHash();
    bool const metaBaseSupportsByHash = TransactionManager->MetaIndexParser->GetSupportsAcquireByHash();
-   for (std::vector <IndexTarget>::iterator Target = IndexTargets.begin();
-        Target != IndexTargets.end();
-        ++Target)
+   for (auto Target : TransactionManager->MetaIndexParser->GetIndexTargets())
    {
    {
       // all is an implementation detail. Users shouldn't use this as arch
       // all is an implementation detail. Users shouldn't use this as arch
       // We need this support trickery here as e.g. Debian has binary-all files already,
       // We need this support trickery here as e.g. Debian has binary-all files already,
@@ -1209,36 +1205,36 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify)			/*{{{*/
       // download time, bandwidth and diskspace for nothing, BUT Debian doesn't feature all
       // download time, bandwidth and diskspace for nothing, BUT Debian doesn't feature all
       // in the set of supported architectures, so we can filter based on this property rather
       // in the set of supported architectures, so we can filter based on this property rather
       // than invent an entirely new flag we would need to carry for all of eternity.
       // than invent an entirely new flag we would need to carry for all of eternity.
-      if (Target->Option(IndexTarget::ARCHITECTURE) == "all")
+      if (Target.Option(IndexTarget::ARCHITECTURE) == "all")
       {
       {
 	 if (TransactionManager->MetaIndexParser->IsArchitectureSupported("all") == false ||
 	 if (TransactionManager->MetaIndexParser->IsArchitectureSupported("all") == false ||
-	       TransactionManager->MetaIndexParser->IsArchitectureAllSupportedFor(*Target) == false)
+	       TransactionManager->MetaIndexParser->IsArchitectureAllSupportedFor(Target) == false)
 	 {
 	 {
-	    new CleanupItem(Owner, TransactionManager, *Target);
+	    new CleanupItem(Owner, TransactionManager, Target);
 	    continue;
 	    continue;
 	 }
 	 }
       }
       }
 
 
-      bool trypdiff = Target->OptionBool(IndexTarget::PDIFFS);
+      bool trypdiff = Target.OptionBool(IndexTarget::PDIFFS);
       if (verify == true)
       if (verify == true)
       {
       {
-	 if (TransactionManager->MetaIndexParser->Exists(Target->MetaKey) == false)
+	 if (TransactionManager->MetaIndexParser->Exists(Target.MetaKey) == false)
 	 {
 	 {
 	    // optional targets that we do not have in the Release file are skipped
 	    // optional targets that we do not have in the Release file are skipped
-	    if (Target->IsOptional)
+	    if (Target.IsOptional)
 	    {
 	    {
-	       new CleanupItem(Owner, TransactionManager, *Target);
+	       new CleanupItem(Owner, TransactionManager, Target);
 	       continue;
 	       continue;
 	    }
 	    }
 
 
-	    std::string const &arch = Target->Option(IndexTarget::ARCHITECTURE);
+	    std::string const &arch = Target.Option(IndexTarget::ARCHITECTURE);
 	    if (arch.empty() == false)
 	    if (arch.empty() == false)
 	    {
 	    {
 	       if (TransactionManager->MetaIndexParser->IsArchitectureSupported(arch) == false)
 	       if (TransactionManager->MetaIndexParser->IsArchitectureSupported(arch) == false)
 	       {
 	       {
-		  new CleanupItem(Owner, TransactionManager, *Target);
+		  new CleanupItem(Owner, TransactionManager, Target);
 		  _error->Notice(_("Skipping acquire of configured file '%s' as repository '%s' doesn't support architecture '%s'"),
 		  _error->Notice(_("Skipping acquire of configured file '%s' as repository '%s' doesn't support architecture '%s'"),
-			Target->MetaKey.c_str(), TransactionManager->Target.Description.c_str(), arch.c_str());
+			Target.MetaKey.c_str(), TransactionManager->Target.Description.c_str(), arch.c_str());
 		  continue;
 		  continue;
 	       }
 	       }
 	       // if the architecture is officially supported but currently no packages for it available,
 	       // if the architecture is officially supported but currently no packages for it available,
@@ -1246,49 +1242,49 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify)			/*{{{*/
 	       // if we don't know which architectures are supported, we do NOT ignore it to notify user about this
 	       // if we don't know which architectures are supported, we do NOT ignore it to notify user about this
 	       if (TransactionManager->MetaIndexParser->IsArchitectureSupported("*undefined*") == false)
 	       if (TransactionManager->MetaIndexParser->IsArchitectureSupported("*undefined*") == false)
 	       {
 	       {
-		  new CleanupItem(Owner, TransactionManager, *Target);
+		  new CleanupItem(Owner, TransactionManager, Target);
 		  continue;
 		  continue;
 	       }
 	       }
 	    }
 	    }
 
 
 	    Status = StatAuthError;
 	    Status = StatAuthError;
-	    strprintf(ErrorText, _("Unable to find expected entry '%s' in Release file (Wrong sources.list entry or malformed file)"), Target->MetaKey.c_str());
+	    strprintf(ErrorText, _("Unable to find expected entry '%s' in Release file (Wrong sources.list entry or malformed file)"), Target.MetaKey.c_str());
 	    return;
 	    return;
 	 }
 	 }
 	 else
 	 else
 	 {
 	 {
-	    auto const hashes = GetExpectedHashesFor(Target->MetaKey);
+	    auto const hashes = GetExpectedHashesFor(Target.MetaKey);
 	    if (hashes.empty() == false)
 	    if (hashes.empty() == false)
 	    {
 	    {
 	       if (hashes.usable() == false)
 	       if (hashes.usable() == false)
 	       {
 	       {
-		  new CleanupItem(Owner, TransactionManager, *Target);
+		  new CleanupItem(Owner, TransactionManager, Target);
 		  _error->Warning(_("Skipping acquire of configured file '%s' as repository '%s' provides only weak security information for it"),
 		  _error->Warning(_("Skipping acquire of configured file '%s' as repository '%s' provides only weak security information for it"),
-			Target->MetaKey.c_str(), TransactionManager->Target.Description.c_str());
+			Target.MetaKey.c_str(), TransactionManager->Target.Description.c_str());
 		  continue;
 		  continue;
 	       }
 	       }
 	       // empty files are skipped as acquiring the very small compressed files is a waste of time
 	       // empty files are skipped as acquiring the very small compressed files is a waste of time
 	       else if (hashes.FileSize() == 0)
 	       else if (hashes.FileSize() == 0)
 	       {
 	       {
-		  new CleanupItem(Owner, TransactionManager, *Target);
+		  new CleanupItem(Owner, TransactionManager, Target);
 		  continue;
 		  continue;
 	       }
 	       }
 	    }
 	    }
 	 }
 	 }
 
 
 	 // autoselect the compression method
 	 // autoselect the compression method
-	 std::vector<std::string> types = VectorizeString(Target->Option(IndexTarget::COMPRESSIONTYPES), ' ');
+	 std::vector<std::string> types = VectorizeString(Target.Option(IndexTarget::COMPRESSIONTYPES), ' ');
 	 types.erase(std::remove_if(types.begin(), types.end(), [&](std::string const &t) {
 	 types.erase(std::remove_if(types.begin(), types.end(), [&](std::string const &t) {
 	    if (t == "uncompressed")
 	    if (t == "uncompressed")
-	       return TransactionManager->MetaIndexParser->Exists(Target->MetaKey) == false;
-	    std::string const MetaKey = Target->MetaKey + "." + t;
+	       return TransactionManager->MetaIndexParser->Exists(Target.MetaKey) == false;
+	    std::string const MetaKey = Target.MetaKey + "." + t;
 	    return TransactionManager->MetaIndexParser->Exists(MetaKey) == false;
 	    return TransactionManager->MetaIndexParser->Exists(MetaKey) == false;
 	 }), types.end());
 	 }), types.end());
 	 if (types.empty() == false)
 	 if (types.empty() == false)
 	 {
 	 {
 	    std::ostringstream os;
 	    std::ostringstream os;
 	    // add the special compressiontype byhash first if supported
 	    // add the special compressiontype byhash first if supported
-	    std::string const useByHashConf = Target->Option(IndexTarget::BY_HASH);
+	    std::string const useByHashConf = Target.Option(IndexTarget::BY_HASH);
 	    bool useByHash = false;
 	    bool useByHash = false;
 	    if(useByHashConf == "force")
 	    if(useByHashConf == "force")
 	       useByHash = true;
 	       useByHash = true;
@@ -1298,12 +1294,12 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify)			/*{{{*/
 	       os << "by-hash ";
 	       os << "by-hash ";
 	    std::copy(types.begin(), types.end()-1, std::ostream_iterator<std::string>(os, " "));
 	    std::copy(types.begin(), types.end()-1, std::ostream_iterator<std::string>(os, " "));
 	    os << *types.rbegin();
 	    os << *types.rbegin();
-	    Target->Options["COMPRESSIONTYPES"] = os.str();
+	    Target.Options["COMPRESSIONTYPES"] = os.str();
 	 }
 	 }
 	 else
 	 else
-	    Target->Options["COMPRESSIONTYPES"].clear();
+	    Target.Options["COMPRESSIONTYPES"].clear();
 
 
-	 std::string filename = GetExistingFilename(GetFinalFileNameFromURI(Target->URI));
+	 std::string filename = GetExistingFilename(GetFinalFileNameFromURI(Target.URI));
 	 if (filename.empty() == false)
 	 if (filename.empty() == false)
 	 {
 	 {
 	    // if the Release file is a hit and we have an index it must be the current one
 	    // if the Release file is a hit and we have an index it must be the current one
@@ -1314,8 +1310,8 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify)			/*{{{*/
 	       // see if the file changed since the last Release file
 	       // see if the file changed since the last Release file
 	       // we use the uncompressed files as we might compress differently compared to the server,
 	       // we use the uncompressed files as we might compress differently compared to the server,
 	       // so the hashes might not match, even if they contain the same data.
 	       // so the hashes might not match, even if they contain the same data.
-	       HashStringList const newFile = GetExpectedHashesFromFor(TransactionManager->MetaIndexParser, Target->MetaKey);
-	       HashStringList const oldFile = GetExpectedHashesFromFor(TransactionManager->LastMetaIndexParser, Target->MetaKey);
+	       HashStringList const newFile = GetExpectedHashesFromFor(TransactionManager->MetaIndexParser, Target.MetaKey);
+	       HashStringList const oldFile = GetExpectedHashesFromFor(TransactionManager->LastMetaIndexParser, Target.MetaKey);
 	       if (newFile != oldFile)
 	       if (newFile != oldFile)
 		  filename.clear();
 		  filename.clear();
 	    }
 	    }
@@ -1327,35 +1323,35 @@ void pkgAcqMetaClearSig::QueueIndexes(bool const verify)			/*{{{*/
 
 
 	 if (filename.empty() == false)
 	 if (filename.empty() == false)
 	 {
 	 {
-	    new NoActionItem(Owner, *Target, filename);
-	    std::string const idxfilename = GetFinalFileNameFromURI(GetDiffIndexURI(*Target));
+	    new NoActionItem(Owner, Target, filename);
+	    std::string const idxfilename = GetFinalFileNameFromURI(GetDiffIndexURI(Target));
 	    if (FileExists(idxfilename))
 	    if (FileExists(idxfilename))
-	       new NoActionItem(Owner, *Target, idxfilename);
+	       new NoActionItem(Owner, Target, idxfilename);
 	    continue;
 	    continue;
 	 }
 	 }
 
 
 	 // check if we have patches available
 	 // check if we have patches available
-	 trypdiff &= TransactionManager->MetaIndexParser->Exists(GetDiffIndexFileName(Target->MetaKey));
+	 trypdiff &= TransactionManager->MetaIndexParser->Exists(GetDiffIndexFileName(Target.MetaKey));
       }
       }
       else
       else
       {
       {
 	 // if we have no file to patch, no point in trying
 	 // if we have no file to patch, no point in trying
-	 trypdiff &= (GetExistingFilename(GetFinalFileNameFromURI(Target->URI)).empty() == false);
+	 trypdiff &= (GetExistingFilename(GetFinalFileNameFromURI(Target.URI)).empty() == false);
       }
       }
 
 
       // no point in patching from local sources
       // no point in patching from local sources
       if (trypdiff)
       if (trypdiff)
       {
       {
-	 std::string const proto = Target->URI.substr(0, strlen("file:/"));
+	 std::string const proto = Target.URI.substr(0, strlen("file:/"));
 	 if (proto == "file:/" || proto == "copy:/" || proto == "cdrom:")
 	 if (proto == "file:/" || proto == "copy:/" || proto == "cdrom:")
 	    trypdiff = false;
 	    trypdiff = false;
       }
       }
 
 
       // Queue the Index file (Packages, Sources, Translation-$foo, …)
       // Queue the Index file (Packages, Sources, Translation-$foo, …)
       if (trypdiff)
       if (trypdiff)
-         new pkgAcqDiffIndex(Owner, TransactionManager, *Target);
+         new pkgAcqDiffIndex(Owner, TransactionManager, Target);
       else
       else
-         new pkgAcqIndex(Owner, TransactionManager, *Target);
+         new pkgAcqIndex(Owner, TransactionManager, Target);
    }
    }
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -1447,9 +1443,8 @@ pkgAcqMetaBase::~pkgAcqMetaBase()
 pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire * const Owner,	/*{{{*/
 pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire * const Owner,	/*{{{*/
       IndexTarget const &ClearsignedTarget,
       IndexTarget const &ClearsignedTarget,
       IndexTarget const &DetachedDataTarget, IndexTarget const &DetachedSigTarget,
       IndexTarget const &DetachedDataTarget, IndexTarget const &DetachedSigTarget,
-      std::vector<IndexTarget> const &IndexTargets,
       metaIndex * const MetaIndexParser) :
       metaIndex * const MetaIndexParser) :
-   pkgAcqMetaIndex(Owner, this, ClearsignedTarget, DetachedSigTarget, IndexTargets),
+   pkgAcqMetaIndex(Owner, this, ClearsignedTarget, DetachedSigTarget),
    d(NULL), ClearsignedTarget(ClearsignedTarget),
    d(NULL), ClearsignedTarget(ClearsignedTarget),
    DetachedDataTarget(DetachedDataTarget),
    DetachedDataTarget(DetachedDataTarget),
    MetaIndexParser(MetaIndexParser), LastMetaIndexParser(NULL)
    MetaIndexParser(MetaIndexParser), LastMetaIndexParser(NULL)
@@ -1547,7 +1542,7 @@ void pkgAcqMetaClearSig::Failed(string const &Message,pkgAcquire::MethodConfig c
       TransactionManager->TransactionStageRemoval(this, GetFinalFilename());
       TransactionManager->TransactionStageRemoval(this, GetFinalFilename());
       Status = StatDone;
       Status = StatDone;
 
 
-      new pkgAcqMetaIndex(Owner, TransactionManager, DetachedDataTarget, DetachedSigTarget, IndexTargets);
+      new pkgAcqMetaIndex(Owner, TransactionManager, DetachedDataTarget, DetachedSigTarget);
    }
    }
    else
    else
    {
    {
@@ -1585,9 +1580,8 @@ void pkgAcqMetaClearSig::Failed(string const &Message,pkgAcquire::MethodConfig c
 pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire * const Owner,		/*{{{*/
 pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire * const Owner,		/*{{{*/
                                  pkgAcqMetaClearSig * const TransactionManager,
                                  pkgAcqMetaClearSig * const TransactionManager,
 				 IndexTarget const &DataTarget,
 				 IndexTarget const &DataTarget,
-				 IndexTarget const &DetachedSigTarget,
-				 vector<IndexTarget> const &IndexTargets) :
-   pkgAcqMetaBase(Owner, TransactionManager, IndexTargets, DataTarget), d(NULL),
+				 IndexTarget const &DetachedSigTarget) :
+   pkgAcqMetaBase(Owner, TransactionManager, DataTarget), d(NULL),
    DetachedSigTarget(DetachedSigTarget)
    DetachedSigTarget(DetachedSigTarget)
 {
 {
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)

+ 1 - 9
apt-pkg/acquire-item.h

@@ -407,11 +407,6 @@ class APT_HIDDEN pkgAcqMetaBase : public pkgAcqTransactionItem		/*{{{*/
  protected:
  protected:
    std::vector<pkgAcqTransactionItem*> Transaction;
    std::vector<pkgAcqTransactionItem*> Transaction;
 
 
-   /** \brief The index files which should be looked up in the meta-index
-    *  and then downloaded.
-    */
-   std::vector<IndexTarget> IndexTargets;
-
    /** \brief If \b true, the index's signature is currently being verified.
    /** \brief If \b true, the index's signature is currently being verified.
     */
     */
    bool AuthPass;
    bool AuthPass;
@@ -484,7 +479,6 @@ class APT_HIDDEN pkgAcqMetaBase : public pkgAcqTransactionItem		/*{{{*/
    virtual std::string GetFinalFilename() const APT_OVERRIDE;
    virtual std::string GetFinalFilename() const APT_OVERRIDE;
 
 
    pkgAcqMetaBase(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager,
    pkgAcqMetaBase(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager,
-		  std::vector<IndexTarget> const &IndexTargets,
 		  IndexTarget const &DataTarget) APT_NONNULL(2, 3);
 		  IndexTarget const &DataTarget) APT_NONNULL(2, 3);
    virtual ~pkgAcqMetaBase();
    virtual ~pkgAcqMetaBase();
 };
 };
@@ -518,8 +512,7 @@ class APT_HIDDEN pkgAcqMetaIndex : public pkgAcqMetaBase
 
 
    /** \brief Create a new pkgAcqMetaIndex. */
    /** \brief Create a new pkgAcqMetaIndex. */
    pkgAcqMetaIndex(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager,
    pkgAcqMetaIndex(pkgAcquire * const Owner, pkgAcqMetaClearSig * const TransactionManager,
-		   IndexTarget const &DataTarget, IndexTarget const &DetachedSigTarget,
-		   std::vector<IndexTarget> const &IndexTargets) APT_NONNULL(2, 3);
+		   IndexTarget const &DataTarget, IndexTarget const &DetachedSigTarget) APT_NONNULL(2, 3);
    virtual ~pkgAcqMetaIndex();
    virtual ~pkgAcqMetaIndex();
 
 
    friend class pkgAcqMetaSig;
    friend class pkgAcqMetaSig;
@@ -597,7 +590,6 @@ class APT_HIDDEN pkgAcqMetaClearSig : public pkgAcqMetaIndex
 		IndexTarget const &ClearsignedTarget,
 		IndexTarget const &ClearsignedTarget,
 		IndexTarget const &DetachedDataTarget,
 		IndexTarget const &DetachedDataTarget,
 		IndexTarget const &DetachedSigTarget,
 		IndexTarget const &DetachedSigTarget,
-		std::vector<IndexTarget> const &IndexTargets,
 		metaIndex * const MetaIndexParser);
 		metaIndex * const MetaIndexParser);
    virtual ~pkgAcqMetaClearSig();
    virtual ~pkgAcqMetaClearSig();
 };
 };

+ 2 - 4
apt-pkg/deb/debmetaindex.cc

@@ -601,15 +601,13 @@ bool debReleaseIndex::parseSumData(const char *&Start, const char *End,	/*{{{*/
 
 
 bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll)/*{{{*/
 bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll)/*{{{*/
 {
 {
-   std::vector<IndexTarget> const targets = GetIndexTargets();
 #define APT_TARGET(X) IndexTarget("", X, MetaIndexInfo(X), MetaIndexURI(X), false, false, std::map<std::string,std::string>())
 #define APT_TARGET(X) IndexTarget("", X, MetaIndexInfo(X), MetaIndexURI(X), false, false, std::map<std::string,std::string>())
    pkgAcqMetaClearSig * const TransactionManager = new pkgAcqMetaClearSig(Owner,
    pkgAcqMetaClearSig * const TransactionManager = new pkgAcqMetaClearSig(Owner,
-	 APT_TARGET("InRelease"), APT_TARGET("Release"), APT_TARGET("Release.gpg"),
-	 targets, this);
+	 APT_TARGET("InRelease"), APT_TARGET("Release"), APT_TARGET("Release.gpg"), this);
 #undef APT_TARGET
 #undef APT_TARGET
    // special case for --print-uris
    // special case for --print-uris
    if (GetAll)
    if (GetAll)
-      for (auto const &Target: targets)
+      for (auto const &Target: GetIndexTargets())
 	 new pkgAcqIndex(Owner, TransactionManager, Target);
 	 new pkgAcqIndex(Owner, TransactionManager, Target);
 
 
    return true;
    return true;