瀏覽代碼

use pkgAcqMetaBase as the transactionManager

Michael Vogt 11 年之前
父節點
當前提交
715c65de1f
共有 5 個文件被更改,包括 146 次插入148 次删除
  1. 112 51
      apt-pkg/acquire-item.cc
  2. 32 20
      apt-pkg/acquire-item.h
  3. 0 69
      apt-pkg/acquire.cc
  4. 0 5
      apt-pkg/acquire.h
  5. 2 3
      apt-pkg/deb/debmetaindex.cc

+ 112 - 51
apt-pkg/acquire-item.cc

@@ -66,13 +66,15 @@ static void printHashSumComparision(std::string const &URI, HashStringList const
 // Acquire::Item::Item - Constructor					/*{{{*/
 // Acquire::Item::Item - Constructor					/*{{{*/
 pkgAcquire::Item::Item(pkgAcquire *Owner,
 pkgAcquire::Item::Item(pkgAcquire *Owner,
                        HashStringList const &ExpectedHashes,
                        HashStringList const &ExpectedHashes,
-                       unsigned long TransactionID)
+                       pkgAcqMetaBase *TransactionManager)
    : Owner(Owner), FileSize(0), PartialSize(0), Mode(0), ID(0), Complete(false),
    : Owner(Owner), FileSize(0), PartialSize(0), Mode(0), ID(0), Complete(false),
-     Local(false), QueueCounter(0), TransactionID(TransactionID),
+     Local(false), QueueCounter(0), TransactionManager(TransactionManager),
      ExpectedAdditionalItems(0), ExpectedHashes(ExpectedHashes)
      ExpectedAdditionalItems(0), ExpectedHashes(ExpectedHashes)
 {
 {
    Owner->Add(this);
    Owner->Add(this);
    Status = StatIdle;
    Status = StatIdle;
+   if(TransactionManager != NULL)
+      TransactionManager->Add(this);
 }
 }
 									/*}}}*/
 									/*}}}*/
 // Acquire::Item::~Item - Destructor					/*{{{*/
 // Acquire::Item::~Item - Destructor					/*{{{*/
@@ -245,11 +247,11 @@ void pkgAcquire::Item::ReportMirrorFailure(string FailCode)
  * the original packages file
  * the original packages file
  */
  */
 pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
 pkgAcqDiffIndex::pkgAcqDiffIndex(pkgAcquire *Owner,
-                                 unsigned long TransactionID,
+                                 pkgAcqMetaBase *TransactionManager,
                                  IndexTarget const * const Target,
                                  IndexTarget const * const Target,
 				 HashStringList const &ExpectedHashes,
 				 HashStringList const &ExpectedHashes,
                                  indexRecords *MetaIndexParser)
                                  indexRecords *MetaIndexParser)
-   : pkgAcqBaseIndex(Owner, TransactionID, Target, ExpectedHashes, 
+   : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, 
                      MetaIndexParser)
                      MetaIndexParser)
 {
 {
    
    
@@ -348,7 +350,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile)		/*{{{*/
 	    std::clog << "Package file is up-to-date" << std::endl;
 	    std::clog << "Package file is up-to-date" << std::endl;
 	 // list cleanup needs to know that this file as well as the already
 	 // list cleanup needs to know that this file as well as the already
 	 // present index is ours, so we create an empty diff to save it for us
 	 // present index is ours, so we create an empty diff to save it for us
-	 new pkgAcqIndexDiffs(Owner, TransactionID, Target, 
+	 new pkgAcqIndexDiffs(Owner, TransactionManager, Target, 
                               ExpectedHashes, MetaIndexParser, 
                               ExpectedHashes, MetaIndexParser, 
                               ServerSha1, available_patches);
                               ServerSha1, available_patches);
 	 return true;
 	 return true;
@@ -436,7 +438,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile)		/*{{{*/
 
 
 	 if (pdiff_merge == false)
 	 if (pdiff_merge == false)
          {
          {
-	    new pkgAcqIndexDiffs(Owner, TransactionID, Target, ExpectedHashes, 
+	    new pkgAcqIndexDiffs(Owner, TransactionManager, Target, ExpectedHashes, 
                                  MetaIndexParser,
                                  MetaIndexParser,
                                  ServerSha1, available_patches);
                                  ServerSha1, available_patches);
          }
          }
@@ -445,7 +447,7 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string IndexDiffFile)		/*{{{*/
 	    std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size());
 	    std::vector<pkgAcqIndexMergeDiffs*> *diffs = new std::vector<pkgAcqIndexMergeDiffs*>(available_patches.size());
 	    for(size_t i = 0; i < available_patches.size(); ++i)
 	    for(size_t i = 0; i < available_patches.size(); ++i)
 	       (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner,
 	       (*diffs)[i] = new pkgAcqIndexMergeDiffs(Owner,
-                                                       TransactionID,
+                                                       TransactionManager,
                                                        Target,
                                                        Target,
                                                        ExpectedHashes,
                                                        ExpectedHashes,
                                                        MetaIndexParser,
                                                        MetaIndexParser,
@@ -474,7 +476,7 @@ void pkgAcqDiffIndex::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)/
       std::clog << "pkgAcqDiffIndex failed: " << Desc.URI << " with " << Message << std::endl
       std::clog << "pkgAcqDiffIndex failed: " << Desc.URI << " with " << Message << std::endl
 		<< "Falling back to normal index file acquire" << std::endl;
 		<< "Falling back to normal index file acquire" << std::endl;
 
 
-   new pkgAcqIndex(Owner, TransactionID, Target, ExpectedHashes, MetaIndexParser);
+   new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser);
 
 
    Complete = false;
    Complete = false;
    Status = StatDone;
    Status = StatDone;
@@ -517,13 +519,13 @@ void pkgAcqDiffIndex::Done(string Message,unsigned long long Size,HashStringList
  * for each diff and the index
  * for each diff and the index
  */
  */
 pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
 pkgAcqIndexDiffs::pkgAcqIndexDiffs(pkgAcquire *Owner,
-                                   unsigned long TransactionID,
+                                   pkgAcqMetaBase *TransactionManager,
                                    struct IndexTarget const * const Target,
                                    struct IndexTarget const * const Target,
                                    HashStringList const &ExpectedHashes,
                                    HashStringList const &ExpectedHashes,
                                    indexRecords *MetaIndexParser,
                                    indexRecords *MetaIndexParser,
 				   string ServerSha1,
 				   string ServerSha1,
 				   vector<DiffInfo> diffs)
 				   vector<DiffInfo> diffs)
-   : pkgAcqBaseIndex(Owner, TransactionID, Target, ExpectedHashes, MetaIndexParser),
+   : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser),
      available_patches(diffs), ServerSha1(ServerSha1)
      available_patches(diffs), ServerSha1(ServerSha1)
 {
 {
    
    
@@ -555,7 +557,7 @@ void pkgAcqIndexDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*Cnf*/)
    if(Debug)
    if(Debug)
       std::clog << "pkgAcqIndexDiffs failed: " << Desc.URI << " with " << Message << std::endl
       std::clog << "pkgAcqIndexDiffs failed: " << Desc.URI << " with " << Message << std::endl
 		<< "Falling back to normal index file acquire" << std::endl;
 		<< "Falling back to normal index file acquire" << std::endl;
-   new pkgAcqIndex(Owner, TransactionID, Target, ExpectedHashes, MetaIndexParser);
+   new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser);
    Finish();
    Finish();
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -704,7 +706,7 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size, HashStringLi
 
 
       // see if there is more to download
       // see if there is more to download
       if(available_patches.empty() == false) {
       if(available_patches.empty() == false) {
-	 new pkgAcqIndexDiffs(Owner, TransactionID, Target,
+	 new pkgAcqIndexDiffs(Owner, TransactionManager, Target,
 			      ExpectedHashes, MetaIndexParser,
 			      ExpectedHashes, MetaIndexParser,
                               ServerSha1, available_patches);
                               ServerSha1, available_patches);
 	 return Finish();
 	 return Finish();
@@ -715,13 +717,13 @@ void pkgAcqIndexDiffs::Done(string Message,unsigned long long Size, HashStringLi
 									/*}}}*/
 									/*}}}*/
 // AcqIndexMergeDiffs::AcqIndexMergeDiffs - Constructor			/*{{{*/
 // AcqIndexMergeDiffs::AcqIndexMergeDiffs - Constructor			/*{{{*/
 pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
 pkgAcqIndexMergeDiffs::pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
-                                             unsigned long TransactionID,
+                                             pkgAcqMetaBase *TransactionManager,
                                              struct IndexTarget const * const Target,
                                              struct IndexTarget const * const Target,
                                              HashStringList const &ExpectedHashes,
                                              HashStringList const &ExpectedHashes,
                                              indexRecords *MetaIndexParser,
                                              indexRecords *MetaIndexParser,
                                              DiffInfo const &patch,
                                              DiffInfo const &patch,
                                              std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches)
                                              std::vector<pkgAcqIndexMergeDiffs*> const * const allPatches)
-  : pkgAcqBaseIndex(Owner, TransactionID, Target, ExpectedHashes, MetaIndexParser),
+  : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser),
      patch(patch), allPatches(allPatches), State(StateFetchDiff)
      patch(patch), allPatches(allPatches), State(StateFetchDiff)
 {
 {
 
 
@@ -764,7 +766,7 @@ void pkgAcqIndexMergeDiffs::Failed(string Message,pkgAcquire::MethodConfig * /*C
    // first failure means we should fallback
    // first failure means we should fallback
    State = StateErrorDiff;
    State = StateErrorDiff;
    std::clog << "Falling back to normal index file acquire" << std::endl;
    std::clog << "Falling back to normal index file acquire" << std::endl;
-   new pkgAcqIndex(Owner, TransactionID, Target, ExpectedHashes, MetaIndexParser);
+   new pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser);
 }
 }
 									/*}}}*/
 									/*}}}*/
 void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,HashStringList const &Hashes,	/*{{{*/
 void pkgAcqIndexMergeDiffs::Done(string Message,unsigned long long Size,HashStringList const &Hashes,	/*{{{*/
@@ -855,18 +857,18 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
    Init(URI, URIDesc, ShortDesc);
    Init(URI, URIDesc, ShortDesc);
 
 
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-      std::clog << "New pkgIndex with TransactionID "
-                << TransactionID << std::endl;
+      std::clog << "New pkgIndex with TransactionManager "
+                << TransactionManager << std::endl;
 }
 }
 									/*}}}*/
 									/*}}}*/
 // AcqIndex::AcqIndex - Constructor					/*{{{*/
 // AcqIndex::AcqIndex - Constructor					/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
 pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
-                         unsigned long TransactionID,
+                         pkgAcqMetaBase *TransactionManager,
                          IndexTarget const *Target,
                          IndexTarget const *Target,
 			 HashStringList const &ExpectedHash, 
 			 HashStringList const &ExpectedHash, 
                          indexRecords *MetaIndexParser)
                          indexRecords *MetaIndexParser)
-   : pkgAcqBaseIndex(Owner, TransactionID, Target, ExpectedHash, 
+   : pkgAcqBaseIndex(Owner, TransactionManager, Target, ExpectedHash, 
                      MetaIndexParser), RealURI(Target->URI)
                      MetaIndexParser), RealURI(Target->URI)
 {
 {
    // autoselect the compression method
    // autoselect the compression method
@@ -874,8 +876,8 @@ pkgAcqIndex::pkgAcqIndex(pkgAcquire *Owner,
    Init(Target->URI, Target->Description, Target->ShortDesc);
    Init(Target->URI, Target->Description, Target->ShortDesc);
 
 
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-      std::clog << "New pkgIndex with TransactionID "
-                << TransactionID << std::endl;
+      std::clog << "New pkgIndex with TransactionManager "
+                << TransactionManager << std::endl;
 }
 }
 									/*}}}*/
 									/*}}}*/
 // AcqIndex::AutoSelectCompression - Select compression			/*{{{*/
 // AcqIndex::AutoSelectCompression - Select compression			/*{{{*/
@@ -1014,7 +1016,7 @@ void pkgAcqIndex::Failed(string Message,pkgAcquire::MethodConfig *Cnf)	/*{{{*/
    Item::Failed(Message,Cnf);
    Item::Failed(Message,Cnf);
 
 
    /// cancel the entire transaction
    /// cancel the entire transaction
-   Owner->AbortTransaction(TransactionID);
+   TransactionManager->AbortTransaction();
 }
 }
 									/*}}}*/
 									/*}}}*/
 // pkgAcqIndex::GetFinalFilename - Return the full final file path      /*{{{*/
 // pkgAcqIndex::GetFinalFilename - Return the full final file path      /*{{{*/
@@ -1200,11 +1202,11 @@ pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner,
 }
 }
 									/*}}}*/
 									/*}}}*/
 pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, 
 pkgAcqIndexTrans::pkgAcqIndexTrans(pkgAcquire *Owner, 
-                                   unsigned long TransactionID, 
+                                   pkgAcqMetaBase *TransactionManager, 
                                    IndexTarget const * const Target,
                                    IndexTarget const * const Target,
                                    HashStringList const &ExpectedHashes, 
                                    HashStringList const &ExpectedHashes, 
                                    indexRecords *MetaIndexParser)
                                    indexRecords *MetaIndexParser)
-   : pkgAcqIndex(Owner, TransactionID, Target, ExpectedHashes, MetaIndexParser)
+   : pkgAcqIndex(Owner, TransactionManager, Target, ExpectedHashes, MetaIndexParser)
 {
 {
    // load the filesize
    // load the filesize
    indexRecords::checkSum *Record = MetaIndexParser->Lookup(string(Target->MetaKey));
    indexRecords::checkSum *Record = MetaIndexParser->Lookup(string(Target->MetaKey));
@@ -1254,15 +1256,70 @@ void pkgAcqIndexTrans::Failed(string Message,pkgAcquire::MethodConfig *Cnf)
 }
 }
 									/*}}}*/
 									/*}}}*/
 
 
-pkgAcqMetaSigBase::pkgAcqMetaSigBase(pkgAcquire *Owner,
-                                     HashStringList const &ExpectedHashes,
-                                     unsigned long TransactionID)
-   : Item(Owner, ExpectedHashes, TransactionID)
+void pkgAcqMetaBase::Add(Item *I)
 {
 {
+   Transaction.push_back(I);
 }
 }
+
+void pkgAcqMetaBase::AbortTransaction()
+{
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "AbortTransaction: " << TransactionManager << std::endl;
+
+   for (std::vector<Item*>::iterator I = Transaction.begin();
+        I != Transaction.end(); ++I)
+   {
+      if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+         std::clog << "  Cancel: " << (*I)->DestFile << std::endl;
+      // the transaction will abort, so stop anything that is idle
+      if ((*I)->Status == pkgAcquire::Item::StatIdle)
+         (*I)->Status = pkgAcquire::Item::StatDone;
+   }
+}
+									/*}}}*/
+bool pkgAcqMetaBase::TransactionHasError()
+{
+   for (pkgAcquire::ItemIterator I = Transaction.begin();
+        I != Transaction.end(); ++I)
+      if((*I)->Status != pkgAcquire::Item::StatDone &&
+         (*I)->Status != pkgAcquire::Item::StatIdle)
+         return true;
+
+   return false;
+}
+// Acquire::CommitTransaction - Commit a transaction			/*{{{*/
+void pkgAcqMetaBase::CommitTransaction()
+{
+   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+      std::clog << "CommitTransaction: " << this << std::endl;
+
+   // move new files into place *and* remove files that are not
+   // part of the transaction but are still on disk
+   for (std::vector<Item*>::iterator I = Transaction.begin();
+        I != Transaction.end(); ++I)
+   {
+      if((*I)->PartialFile != "")
+      {
+         if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+            std::clog << "mv " 
+                      << (*I)->PartialFile << " -> " 
+                      <<  (*I)->DestFile << std::endl;
+         Rename((*I)->PartialFile, (*I)->DestFile);
+         chmod((*I)->DestFile.c_str(),0644);
+      } else {
+         if(_config->FindB("Debug::Acquire::Transaction", false) == true)
+            std::clog << "rm " 
+                      <<  (*I)->DestFile << std::endl;
+         unlink((*I)->DestFile.c_str());
+      }
+      // mark that this transaction is finished
+      (*I)->TransactionManager = 0;
+   }
+}
+
                                                                        /*{{{*/
                                                                        /*{{{*/
-bool pkgAcqMetaSigBase::GenerateAuthWarning(const std::string &RealURI,
-                                            const std::string &Message)
+bool pkgAcqMetaBase::GenerateAuthWarning(const std::string &RealURI,
+                                         const std::string &Message)
 {
 {
    string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
    string Final = _config->FindDir("Dir::State::lists") + URItoFileName(RealURI);
    
    
@@ -1297,12 +1354,12 @@ bool pkgAcqMetaSigBase::GenerateAuthWarning(const std::string &RealURI,
 
 
 
 
 pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,          		/*{{{*/
 pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,          		/*{{{*/
-                             unsigned long TransactionID,
+                             pkgAcqMetaBase *TransactionManager,
 			     string URI,string URIDesc,string ShortDesc,
 			     string URI,string URIDesc,string ShortDesc,
                              string MetaIndexFile,
                              string MetaIndexFile,
 			     const vector<IndexTarget*>* IndexTargets,
 			     const vector<IndexTarget*>* IndexTargets,
 			     indexRecords* MetaIndexParser) :
 			     indexRecords* MetaIndexParser) :
-   pkgAcqMetaSigBase(Owner, HashStringList(), TransactionID), RealURI(URI), 
+   pkgAcqMetaBase(Owner, HashStringList(), TransactionManager), RealURI(URI), 
    MetaIndexParser(MetaIndexParser), MetaIndexFile(MetaIndexFile),
    MetaIndexParser(MetaIndexParser), MetaIndexFile(MetaIndexFile),
    IndexTargets(IndexTargets), AuthPass(false), IMSHit(false)
    IndexTargets(IndexTargets), AuthPass(false), IMSHit(false)
 {
 {
@@ -1314,10 +1371,10 @@ pkgAcqMetaSig::pkgAcqMetaSig(pkgAcquire *Owner,          		/*{{{*/
    // partial download anyway
    // partial download anyway
    unlink(DestFile.c_str());
    unlink(DestFile.c_str());
 
 
-   // set the TransactionID
+   // set the TransactionManager
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-      std::clog << "New pkgAcqMetaSig with TransactionID "
-                << TransactionID << std::endl;
+      std::clog << "New pkgAcqMetaSig with TransactionManager "
+                << TransactionManager << std::endl;
 
 
    // Create the item
    // Create the item
    Desc.Description = URIDesc;
    Desc.Description = URIDesc;
@@ -1438,22 +1495,26 @@ void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)/*{{{*/
 }
 }
 									/*}}}*/
 									/*}}}*/
 pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner,			/*{{{*/
 pkgAcqMetaIndex::pkgAcqMetaIndex(pkgAcquire *Owner,			/*{{{*/
-                                 unsigned long TransactionID,
+                                 pkgAcqMetaBase *TransactionManager,
 				 string URI,string URIDesc,string ShortDesc,
 				 string URI,string URIDesc,string ShortDesc,
                                  string MetaIndexSigURI,string MetaIndexSigURIDesc, string MetaIndexSigShortDesc,
                                  string MetaIndexSigURI,string MetaIndexSigURIDesc, string MetaIndexSigShortDesc,
 				 const vector<IndexTarget*>* IndexTargets,
 				 const vector<IndexTarget*>* IndexTargets,
 				 indexRecords* MetaIndexParser) :
 				 indexRecords* MetaIndexParser) :
-   pkgAcqMetaSigBase(Owner, HashStringList(), TransactionID), RealURI(URI), IndexTargets(IndexTargets),
+   pkgAcqMetaBase(Owner, HashStringList(), TransactionManager), RealURI(URI), IndexTargets(IndexTargets),
    MetaIndexParser(MetaIndexParser), AuthPass(false), IMSHit(false),
    MetaIndexParser(MetaIndexParser), AuthPass(false), IMSHit(false),
    MetaIndexSigURI(MetaIndexSigURI), MetaIndexSigURIDesc(MetaIndexSigURIDesc),
    MetaIndexSigURI(MetaIndexSigURI), MetaIndexSigURIDesc(MetaIndexSigURIDesc),
    MetaIndexSigShortDesc(MetaIndexSigShortDesc)
    MetaIndexSigShortDesc(MetaIndexSigShortDesc)
 {
 {
-   if(TransactionID == 0)
-      this->TransactionID = (unsigned long)this;
+   if(TransactionManager == NULL)
+   {
+      this->TransactionManager = this;
+      this->TransactionManager->Add(this);
+   }
 
 
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-      std::clog << "New pkgAcqMetaIndex with TransactionID "
-                << TransactionID << std::endl;
+      std::clog << "New pkgAcqMetaIndex with TransactionManager "
+                << this->TransactionManager << std::endl;
+
 
 
    Init(URIDesc, ShortDesc);
    Init(URIDesc, ShortDesc);
 }
 }
@@ -1588,7 +1649,7 @@ void pkgAcqMetaIndex::RetrievalDone(string Message)			/*{{{*/
 
 
    // queue a signature
    // queue a signature
    if(SigFile != DestFile)
    if(SigFile != DestFile)
-      new pkgAcqMetaSig(Owner, TransactionID, 
+      new pkgAcqMetaSig(Owner, TransactionManager, 
                         MetaIndexSigURI, MetaIndexSigURIDesc,
                         MetaIndexSigURI, MetaIndexSigURIDesc,
                         MetaIndexSigShortDesc, DestFile, IndexTargets, 
                         MetaIndexSigShortDesc, DestFile, IndexTargets, 
                         MetaIndexParser);
                         MetaIndexParser);
@@ -1702,9 +1763,9 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify)				/*{{{*/
 	 {
 	 {
 	    if (_config->FindB("Acquire::PDiffs",true) == true && transInRelease == true &&
 	    if (_config->FindB("Acquire::PDiffs",true) == true && transInRelease == true &&
 		MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true)
 		MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true)
-	       new pkgAcqDiffIndex(Owner, TransactionID, *Target, ExpectedIndexHashes, MetaIndexParser);
+	       new pkgAcqDiffIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser);
 	    else
 	    else
-	       new pkgAcqIndexTrans(Owner, TransactionID, *Target, ExpectedIndexHashes, MetaIndexParser);
+	       new pkgAcqIndexTrans(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser);
 	 }
 	 }
 	 continue;
 	 continue;
       }
       }
@@ -1715,9 +1776,9 @@ void pkgAcqMetaIndex::QueueIndexes(bool verify)				/*{{{*/
          instead, but passing the required info to it is to much hassle */
          instead, but passing the required info to it is to much hassle */
       if(_config->FindB("Acquire::PDiffs",true) == true && (verify == false ||
       if(_config->FindB("Acquire::PDiffs",true) == true && (verify == false ||
 	  MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true))
 	  MetaIndexParser->Exists((*Target)->MetaKey + ".diff/Index") == true))
-	 new pkgAcqDiffIndex(Owner, TransactionID, *Target, ExpectedIndexHashes, MetaIndexParser);
+	 new pkgAcqDiffIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser);
       else
       else
-	 new pkgAcqIndex(Owner, TransactionID, *Target, ExpectedIndexHashes, MetaIndexParser);
+	 new pkgAcqIndex(Owner, TransactionManager, *Target, ExpectedIndexHashes, MetaIndexParser);
    }
    }
 }
 }
 									/*}}}*/
 									/*}}}*/
@@ -1843,9 +1904,9 @@ void pkgAcqMetaIndex::Finished()
 {
 {
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
       std::clog << "Finished: " << DestFile <<std::endl;
       std::clog << "Finished: " << DestFile <<std::endl;
-   if(Owner->TransactionHasError(TransactionID) == false && 
-      TransactionID > 0)
-      Owner->CommitTransaction(TransactionID);
+   if(TransactionManager != NULL &&
+      TransactionManager->TransactionHasError() == false)
+      TransactionManager->CommitTransaction();
 }
 }
 
 
 
 
@@ -1855,7 +1916,7 @@ pkgAcqMetaClearSig::pkgAcqMetaClearSig(pkgAcquire *Owner,		/*{{{*/
 		string const &MetaSigURI, string const &MetaSigURIDesc, string const &MetaSigShortDesc,
 		string const &MetaSigURI, string const &MetaSigURIDesc, string const &MetaSigShortDesc,
 		const vector<IndexTarget*>* IndexTargets,
 		const vector<IndexTarget*>* IndexTargets,
 		indexRecords* MetaIndexParser) :
 		indexRecords* MetaIndexParser) :
-   pkgAcqMetaIndex(Owner, (unsigned long)this, URI, URIDesc, ShortDesc, MetaSigURI, MetaSigURIDesc,MetaSigShortDesc, IndexTargets, MetaIndexParser),
+   pkgAcqMetaIndex(Owner, NULL, URI, URIDesc, ShortDesc, MetaSigURI, MetaSigURIDesc,MetaSigShortDesc, IndexTargets, MetaIndexParser),
        MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
        MetaIndexURI(MetaIndexURI), MetaIndexURIDesc(MetaIndexURIDesc), MetaIndexShortDesc(MetaIndexShortDesc),
        MetaSigURI(MetaSigURI), MetaSigURIDesc(MetaSigURIDesc), MetaSigShortDesc(MetaSigShortDesc)
        MetaSigURI(MetaSigURI), MetaSigURIDesc(MetaSigURIDesc), MetaSigShortDesc(MetaSigShortDesc)
 {
 {
@@ -1940,7 +2001,7 @@ void pkgAcqMetaClearSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf) /*
       PartialFile = "";
       PartialFile = "";
       DestFile = FinalFile;
       DestFile = FinalFile;
 
 
-      new pkgAcqMetaIndex(Owner, TransactionID,
+      new pkgAcqMetaIndex(Owner, TransactionManager,
 			MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
 			MetaIndexURI, MetaIndexURIDesc, MetaIndexShortDesc,
 			MetaSigURI, MetaSigURIDesc, MetaSigShortDesc,
 			MetaSigURI, MetaSigURIDesc, MetaSigShortDesc,
 			IndexTargets, MetaIndexParser);
 			IndexTargets, MetaIndexParser);

+ 32 - 20
apt-pkg/acquire-item.h

@@ -47,7 +47,7 @@ class indexRecords;
 class pkgRecords;
 class pkgRecords;
 class pkgSourceList;
 class pkgSourceList;
 class IndexTarget;
 class IndexTarget;
-class pkgAcqMetaIndex;
+class pkgAcqMetaBase;
 
 
 /** \brief Represents the process by which a pkgAcquire object should	{{{
 /** \brief Represents the process by which a pkgAcquire object should	{{{
  *  retrieve a file or a collection of files.
  *  retrieve a file or a collection of files.
@@ -171,8 +171,8 @@ class pkgAcquire::Item : public WeakPointable
     */
     */
    unsigned int QueueCounter;
    unsigned int QueueCounter;
 
 
-   /** \brief TransactionID */
-   unsigned long TransactionID;
+   /** \brief TransactionManager */
+   pkgAcqMetaBase *TransactionManager;
 
 
    /** \brief The number of additional fetch items that are expected
    /** \brief The number of additional fetch items that are expected
     *  once this item is done.
     *  once this item is done.
@@ -300,7 +300,7 @@ class pkgAcquire::Item : public WeakPointable
     */
     */
    Item(pkgAcquire *Owner,
    Item(pkgAcquire *Owner,
         HashStringList const &ExpectedHashes=HashStringList(),
         HashStringList const &ExpectedHashes=HashStringList(),
-        unsigned long TransactionID=0);
+        pkgAcqMetaBase *TransactionManager=NULL);
 
 
    /** \brief Remove this item from its owner's queue by invoking
    /** \brief Remove this item from its owner's queue by invoking
     *  pkgAcquire::Remove.
     *  pkgAcquire::Remove.
@@ -342,20 +342,32 @@ struct DiffInfo {
 									/*}}}*/
 									/*}}}*/
 									/*}}}*/
 									/*}}}*/
 
 
-class pkgAcqMetaSigBase : public pkgAcquire::Item
+class pkgAcqMetaBase  : public pkgAcquire::Item
 {
 {
    void *d;
    void *d;
 
 
  protected:
  protected:
+   std::vector<Item*> Transaction;
+
+ public:
+   // transaction code
+   void Add(Item *I);
+   void AbortTransaction();
+   bool TransactionHasError();
+   void CommitTransaction();
+
+   // helper for the signature warning
    bool GenerateAuthWarning(const std::string &RealURI,
    bool GenerateAuthWarning(const std::string &RealURI,
                             const std::string &Message);
                             const std::string &Message);
 
 
- public:
-   pkgAcqMetaSigBase(pkgAcquire *Owner,
-                     HashStringList const &ExpectedHashes=HashStringList(),
-                     unsigned long TransactionID=0);
+
+   pkgAcqMetaBase(pkgAcquire *Owner,
+                  HashStringList const &ExpectedHashes=HashStringList(),
+                  pkgAcqMetaBase *TransactionManager=NULL)
+      : Item(Owner, ExpectedHashes, TransactionManager) {};
 };
 };
 
 
+
 /** \brief An item that is responsible for downloading the meta-index	{{{
 /** \brief An item that is responsible for downloading the meta-index	{{{
  *  file (i.e., Release) itself and verifying its signature.
  *  file (i.e., Release) itself and verifying its signature.
  *
  *
@@ -366,7 +378,7 @@ class pkgAcqMetaSigBase : public pkgAcquire::Item
  *  otherwise, the expected hashsums will be "" (causing the
  *  otherwise, the expected hashsums will be "" (causing the
  *  authentication of the index files to be bypassed).
  *  authentication of the index files to be bypassed).
  */
  */
-class pkgAcqMetaIndex : public pkgAcqMetaSigBase
+class pkgAcqMetaIndex : public pkgAcqMetaBase
 {
 {
    void *d;
    void *d;
 
 
@@ -458,7 +470,7 @@ class pkgAcqMetaIndex : public pkgAcqMetaSigBase
 
 
    /** \brief Create a new pkgAcqMetaIndex. */
    /** \brief Create a new pkgAcqMetaIndex. */
    pkgAcqMetaIndex(pkgAcquire *Owner,
    pkgAcqMetaIndex(pkgAcquire *Owner,
-                   unsigned long TransactionID,
+                   pkgAcqMetaBase *TransactionManager,
 		   std::string URI,std::string URIDesc, std::string ShortDesc,
 		   std::string URI,std::string URIDesc, std::string ShortDesc,
                    std::string MetaIndexSigURI, std::string MetaIndexSigURIDesc, std::string MetaIndexSigShortDesc,
                    std::string MetaIndexSigURI, std::string MetaIndexSigURIDesc, std::string MetaIndexSigShortDesc,
 		   const std::vector<IndexTarget*>* IndexTargets,
 		   const std::vector<IndexTarget*>* IndexTargets,
@@ -522,11 +534,11 @@ class pkgAcqBaseIndex : public pkgAcquire::Item
    std::string MetaKey;
    std::string MetaKey;
 
 
    pkgAcqBaseIndex(pkgAcquire *Owner,
    pkgAcqBaseIndex(pkgAcquire *Owner,
-                   unsigned long TransactionID,
+                   pkgAcqMetaBase *TransactionManager,
                    struct IndexTarget const * const Target,
                    struct IndexTarget const * const Target,
                    HashStringList const &ExpectedHashes,
                    HashStringList const &ExpectedHashes,
                    indexRecords *MetaIndexParser)
                    indexRecords *MetaIndexParser)
-      : Item(Owner, ExpectedHashes, TransactionID), Target(Target), 
+      : Item(Owner, ExpectedHashes, TransactionManager), Target(Target), 
         MetaIndexParser(MetaIndexParser) {};
         MetaIndexParser(MetaIndexParser) {};
 };
 };
 									/*}}}*/
 									/*}}}*/
@@ -596,7 +608,7 @@ class pkgAcqDiffIndex : public pkgAcqBaseIndex
     *  \param ExpectedHashes The list file's hashsums which are expected.
     *  \param ExpectedHashes The list file's hashsums which are expected.
     */
     */
    pkgAcqDiffIndex(pkgAcquire *Owner,
    pkgAcqDiffIndex(pkgAcquire *Owner,
-                   unsigned long TransactionID,
+                   pkgAcqMetaBase *TransactionManager,
                    struct IndexTarget const * const Target,
                    struct IndexTarget const * const Target,
                    HashStringList const &ExpectedHashes,
                    HashStringList const &ExpectedHashes,
                    indexRecords *MetaIndexParser);
                    indexRecords *MetaIndexParser);
@@ -687,7 +699,7 @@ class pkgAcqIndexMergeDiffs : public pkgAcqBaseIndex
     *  check if it was the last one to complete the download step
     *  check if it was the last one to complete the download step
     */
     */
    pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
    pkgAcqIndexMergeDiffs(pkgAcquire *Owner,
-                         unsigned long TransactionID,
+                         pkgAcqMetaBase *TransactionManager,
                          struct IndexTarget const * const Target,
                          struct IndexTarget const * const Target,
                          HashStringList const &ExpectedHash,
                          HashStringList const &ExpectedHash,
                          indexRecords *MetaIndexParser,
                          indexRecords *MetaIndexParser,
@@ -818,7 +830,7 @@ class pkgAcqIndexDiffs : public pkgAcqBaseIndex
     *  that depends on it.
     *  that depends on it.
     */
     */
    pkgAcqIndexDiffs(pkgAcquire *Owner,
    pkgAcqIndexDiffs(pkgAcquire *Owner,
-                    unsigned long TransactionID,
+                    pkgAcqMetaBase *TransactionManager,
                     struct IndexTarget const * const Target,
                     struct IndexTarget const * const Target,
                     HashStringList const &ExpectedHash,
                     HashStringList const &ExpectedHash,
                     indexRecords *MetaIndexParser,
                     indexRecords *MetaIndexParser,
@@ -906,7 +918,7 @@ class pkgAcqIndex : public pkgAcqBaseIndex
    pkgAcqIndex(pkgAcquire *Owner,std::string URI,std::string URIDesc,
    pkgAcqIndex(pkgAcquire *Owner,std::string URI,std::string URIDesc,
 	       std::string ShortDesc, HashStringList const &ExpectedHashes,
 	       std::string ShortDesc, HashStringList const &ExpectedHashes,
 	       std::string compressExt="");
 	       std::string compressExt="");
-   pkgAcqIndex(pkgAcquire *Owner, unsigned long TransactionID,
+   pkgAcqIndex(pkgAcquire *Owner, pkgAcqMetaBase *TransactionManager,
                IndexTarget const * const Target,
                IndexTarget const * const Target,
                HashStringList const &ExpectedHash,
                HashStringList const &ExpectedHash,
                indexRecords *MetaIndexParser);
                indexRecords *MetaIndexParser);
@@ -946,7 +958,7 @@ class pkgAcqIndexTrans : public pkgAcqIndex
                     std::string URI,std::string URIDesc,
                     std::string URI,std::string URIDesc,
 		    std::string ShortDesc);
 		    std::string ShortDesc);
    pkgAcqIndexTrans(pkgAcquire *Owner,
    pkgAcqIndexTrans(pkgAcquire *Owner,
-                    unsigned long TransactionID,
+                    pkgAcqMetaBase *TransactionManager,
                     IndexTarget const * const Target,
                     IndexTarget const * const Target,
                     HashStringList const &ExpectedHashes,
                     HashStringList const &ExpectedHashes,
                     indexRecords *MetaIndexParser);
                     indexRecords *MetaIndexParser);
@@ -996,7 +1008,7 @@ class OptionalIndexTarget : public IndexTarget
  *
  *
  *  \sa pkgAcqMetaIndex
  *  \sa pkgAcqMetaIndex
  */
  */
-class pkgAcqMetaSig : public pkgAcqMetaSigBase
+class pkgAcqMetaSig : public pkgAcqMetaBase
 {
 {
    void *d;
    void *d;
 
 
@@ -1040,7 +1052,7 @@ class pkgAcqMetaSig : public pkgAcqMetaSigBase
 
 
    /** \brief Create a new pkgAcqMetaSig. */
    /** \brief Create a new pkgAcqMetaSig. */
    pkgAcqMetaSig(pkgAcquire *Owner,
    pkgAcqMetaSig(pkgAcquire *Owner,
-                 unsigned long TransactionID,
+                 pkgAcqMetaBase *TransactionManager,
                  std::string URI,std::string URIDesc, std::string ShortDesc,
                  std::string URI,std::string URIDesc, std::string ShortDesc,
                  std::string MetaIndexFile,
                  std::string MetaIndexFile,
 		 const std::vector<IndexTarget*>* IndexTargets,
 		 const std::vector<IndexTarget*>* IndexTargets,

+ 0 - 69
apt-pkg/acquire.cc

@@ -169,75 +169,6 @@ void pkgAcquire::Remove(Item *Itm)
    }
    }
 }
 }
 									/*}}}*/
 									/*}}}*/
-// Acquire::AbortTransaction - Remove a transaction			/*{{{*/
-void pkgAcquire::AbortTransaction(unsigned long TransactionID)
-{
-   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-      std::clog << "AbortTransaction: " << TransactionID << std::endl;
-
-   std::vector<Item*> Transaction;
-   for (ItemIterator I = Items.begin(); I != Items.end(); ++I)
-      if((*I)->TransactionID == TransactionID)
-         Transaction.push_back(*I);
-   
-   for (std::vector<Item*>::iterator I = Transaction.begin();
-        I != Transaction.end(); ++I)
-   {
-      if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-         std::clog << "  Cancel: " << (*I)->DestFile << std::endl;
-      // the transaction will abort, so stop anything that is idle
-      if ((*I)->Status == pkgAcquire::Item::StatIdle)
-         (*I)->Status = pkgAcquire::Item::StatDone;
-   }
-}
-									/*}}}*/
-bool pkgAcquire::TransactionHasError(unsigned long TransactionID)
-{
-   std::vector<Item*> Transaction;
-   for (ItemIterator I = Items.begin(); I != Items.end(); ++I)
-      if((*I)->TransactionID == TransactionID)
-         if((*I)->Status != pkgAcquire::Item::StatDone &&
-            (*I)->Status != pkgAcquire::Item::StatIdle)
-            return true;
-
-   return false;
-}
-// Acquire::CommitTransaction - Commit a transaction			/*{{{*/
-void pkgAcquire::CommitTransaction(unsigned long TransactionID)
-{
-   if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-      std::clog << "CommitTransaction: " << TransactionID << std::endl;
-
-   std::vector<Item*> Transaction;
-   for (ItemIterator I = Items.begin(); I != Items.end(); ++I)
-      if((*I)->TransactionID == TransactionID)
-         Transaction.push_back(*I);
-   
-   // move new files into place *and* remove files that are not
-   // part of the transaction but are still on disk
-   for (std::vector<Item*>::iterator I = Transaction.begin();
-        I != Transaction.end(); ++I)
-   {
-      if((*I)->PartialFile != "")
-      {
-         if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-            std::clog << "mv " 
-                      << (*I)->PartialFile << " -> " 
-                      <<  (*I)->DestFile << std::endl;
-         Rename((*I)->PartialFile, (*I)->DestFile);
-         chmod((*I)->DestFile.c_str(),0644);
-      } else {
-         if(_config->FindB("Debug::Acquire::Transaction", false) == true)
-            std::clog << "rm " 
-                      <<  (*I)->DestFile << std::endl;
-         unlink((*I)->DestFile.c_str());
-      }
-      // mark that this transaction is finished
-      (*I)->TransactionID = 0;
-   }
-}
-									/*}}}*/
-
 // Acquire::Add - Add a worker						/*{{{*/
 // Acquire::Add - Add a worker						/*{{{*/
 // ---------------------------------------------------------------------
 // ---------------------------------------------------------------------
 /* A list of workers is kept so that the select loop can direct their FD
 /* A list of workers is kept so that the select loop can direct their FD

+ 0 - 5
apt-pkg/acquire.h

@@ -248,11 +248,6 @@ class pkgAcquire
    
    
    public:
    public:
 
 
-   /** \brief Abort a given transaction */
-   void AbortTransaction(unsigned long TransactionID);
-   void CommitTransaction(unsigned long TransactionID);
-   bool TransactionHasError(unsigned long TransactionID);
-
    /** \brief Retrieve information about a fetch method by name.
    /** \brief Retrieve information about a fetch method by name.
     *
     *
     *  \param Access The name of the method to look up.
     *  \param Access The name of the method to look up.

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

@@ -265,14 +265,13 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const
       // this is normally created in pkgAcqMetaSig, but if we run
       // this is normally created in pkgAcqMetaSig, but if we run
       // in --print-uris mode, we add it here
       // in --print-uris mode, we add it here
       if (tryInRelease == false)
       if (tryInRelease == false)
-	 new pkgAcqMetaIndex(Owner, 0,
+	 new pkgAcqMetaIndex(Owner, NULL,
                              MetaIndexURI("Release"),
                              MetaIndexURI("Release"),
                              MetaIndexInfo("Release"), "Release",
                              MetaIndexInfo("Release"), "Release",
                              MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
                              MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
                              ComputeIndexTargets(),
                              ComputeIndexTargets(),
                              new indexRecords (Dist));
                              new indexRecords (Dist));
    }
    }
-
    if (tryInRelease == true)
    if (tryInRelease == true)
       new pkgAcqMetaClearSig(Owner, 
       new pkgAcqMetaClearSig(Owner, 
             MetaIndexURI("InRelease"), MetaIndexInfo("InRelease"), "InRelease",
             MetaIndexURI("InRelease"), MetaIndexInfo("InRelease"), "InRelease",
@@ -281,7 +280,7 @@ bool debReleaseIndex::GetIndexes(pkgAcquire *Owner, bool const &GetAll) const
 	    ComputeIndexTargets(),
 	    ComputeIndexTargets(),
 	    new indexRecords (Dist));
 	    new indexRecords (Dist));
    else
    else
-      new pkgAcqMetaIndex(Owner, 0,
+      new pkgAcqMetaIndex(Owner, NULL,
           MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
           MetaIndexURI("Release"), MetaIndexInfo("Release"), "Release",
           MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
           MetaIndexURI("Release.gpg"), MetaIndexInfo("Release.gpg"), "Release.gpg",
           ComputeIndexTargets(),
           ComputeIndexTargets(),