summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apt-pkg/acquire-item.cc7
-rw-r--r--apt-pkg/acquire.cc23
-rw-r--r--apt-pkg/acquire.h1
-rwxr-xr-xtest/integration/test-apt-update-transactions23
4 files changed, 48 insertions, 6 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index bd11ba66c..81afdf4b1 100644
--- a/apt-pkg/acquire-item.cc
+++ b/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);
}
diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc
index 2e2e39d51..4b82fa46d 100644
--- a/apt-pkg/acquire.cc
+++ b/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());
}
}
}
diff --git a/apt-pkg/acquire.h b/apt-pkg/acquire.h
index 0b955cc76..7f51dd8f5 100644
--- a/apt-pkg/acquire.h
+++ b/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.
*
diff --git a/test/integration/test-apt-update-transactions b/test/integration/test-apt-update-transactions
new file mode 100755
index 000000000..ee8d20dbf
--- /dev/null
+++ b/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