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

add pkgAcquire::TransactionHasError()

Michael Vogt лет назад: 12
Родитель
Сommit
47aca3cfc1
4 измененных файлов с 48 добавлено и 6 удалено
  1. 4 3
      apt-pkg/acquire-item.cc
  2. 20 3
      apt-pkg/acquire.cc
  3. 1 0
      apt-pkg/acquire.h
  4. 23 0
      test/integration/test-apt-update-transactions

+ 4 - 3
apt-pkg/acquire-item.cc

@@ -1421,12 +1421,12 @@ void pkgAcqMetaSig::Done(string Message,unsigned long long Size, HashStringList
    DestFile += URItoFileName(RealURI);
 
    // queue a pkgAcqMetaIndex to be verified against the sig we just retrieved
-   pkgAcqMetaIndex *mi = new pkgAcqMetaIndex(
+   pkgAcqMetaIndex *metaindex = new pkgAcqMetaIndex(
       Owner, MetaIndexURI, MetaIndexURIDesc, 
       MetaIndexShortDesc,  DestFile, IndexTargets, 
       MetaIndexParser);
 
-   TransactionID = (unsigned long)mi;
+   TransactionID = (unsigned long)metaindex;
 }
 									/*}}}*/
 void pkgAcqMetaSig::Failed(string Message,pkgAcquire::MethodConfig *Cnf)/*{{{*/
@@ -1908,7 +1908,8 @@ void pkgAcqMetaIndex::Finished()
 {
    if(_config->FindB("Debug::Acquire::Transaction", false) == true)
       std::clog << "Finished: " << DestFile <<std::endl;
-   Owner->CommitTransaction((unsigned long)this);
+   if(Owner->TransactionHasError((unsigned long)this) == false)
+      Owner->CommitTransaction((unsigned long)this);
 }
 
 

+ 20 - 3
apt-pkg/acquire.cc

@@ -185,11 +185,21 @@ void pkgAcquire::AbortTransaction(unsigned long TransactionID)
    {
       if(_config->FindB("Debug::Acquire::Transaction", false) == true)
          std::clog << "  Cancel: " << (*I)->DestFile << std::endl;
-      Dequeue(*I);
+      //Dequeue(*I);
       (*I)->Status = pkgAcquire::Item::StatError;
    }
 }
 									/*}}}*/
+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::StatError ||
+            (*I)->Status == pkgAcquire::Item::StatAuthError)
+            return true;
+   return false;
+}
 // Acquire::CommitTransaction - Commit a transaction			/*{{{*/
 void pkgAcquire::CommitTransaction(unsigned long TransactionID)
 {
@@ -201,18 +211,25 @@ void pkgAcquire::CommitTransaction(unsigned long TransactionID)
       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 != "" && 
-         (*I)->Status == pkgAcquire::Item::StatDone)
+      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());
       }
    }
 }

+ 1 - 0
apt-pkg/acquire.h

@@ -251,6 +251,7 @@ class pkgAcquire
    /** \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.
     *

+ 23 - 0
test/integration/test-apt-update-transactions

@@ -0,0 +1,23 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture "i386"
+
+insertpackage 'unstable' 'foo' 'all' '1.0'
+
+setupaptarchive --no-update
+changetowebserver
+
+# break package file
+cat > aptarchive/dists/unstable/main/binary-i386/Packages <<EOF
+Package: bar
+EOF
+compressfile aptarchive/dists/unstable/main/binary-i386/Packages '+1hour'
+
+# ensure that a update will only succeed entirely or not at all
+testfailure aptget update
+testequal "partial" ls rootdir/var/lib/apt/lists