]> git.saurik.com Git - apt.git/commitdiff
add pkgAcquire::TransactionHasError()
authorMichael Vogt <mvo@ubuntu.com>
Fri, 18 Jul 2014 21:41:29 +0000 (23:41 +0200)
committerMichael Vogt <mvo@ubuntu.com>
Mon, 21 Jul 2014 06:17:17 +0000 (08:17 +0200)
apt-pkg/acquire-item.cc
apt-pkg/acquire.cc
apt-pkg/acquire.h
test/integration/test-apt-update-transactions [new file with mode: 0755]

index bd11ba66c699b5ff28f28b9395452bd421a5553a..81afdf4b17f3b53b8506812048ba2ec25bdc9679 100644 (file)
@@ -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);
 }
 
 
index 2e2e39d51b0371adb4cfb54188b798c8e77e8b17..4b82fa46dc0b075954b7b142ede02870af8f06ed 100644 (file)
@@ -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());
       }
    }
 }
index 0b955cc766c34241bc7b3a99a89a03cbc8e525bc..7f51dd8f57f1f044d808f7c6c3ef23eaad4fb0b3 100644 (file)
@@ -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.
     *
diff --git a/test/integration/test-apt-update-transactions b/test/integration/test-apt-update-transactions
new file mode 100755 (executable)
index 0000000..ee8d20d
--- /dev/null
@@ -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