]> git.saurik.com Git - apt.git/commitdiff
fix Alt-Filename handling of file method
authorDavid Kalnischkies <david@kalnischkies.de>
Thu, 14 Apr 2016 14:01:56 +0000 (16:01 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Thu, 14 Apr 2016 14:15:39 +0000 (16:15 +0200)
A silly of-by-one error in the stripping of the extension to check for
the uncompressed filename broken in an attempt to support all
compressions in commit a09f6eb8fc67cd2d836019f448f18580396185e5.

Fixing this highlights also mistakes in the handling of the Alt-Filename
in libapt which would cause apt to remove the file from the repository
(if root has the needed rights – aka the disk isn't readonly or similar)

apt-pkg/acquire-item.cc
methods/file.cc
test/integration/test-apt-update-file

index b2e578629fd0b2fabaf658b458ce5e9a5276587d..0569c6ddabdfa0a0266a33d57daef62366695371 100644 (file)
@@ -437,7 +437,7 @@ bool pkgAcqTransactionItem::TransactionState(TransactionStates const state)
         } else {
            if(Debug == true)
               std::clog << "rm " << DestFile << " # " << DescURI() << std::endl;
-           if (RemoveFile("TransactionCommit", DestFile) == false)
+           if (RemoveFile("TransItem::TransactionCommit", DestFile) == false)
               return false;
         }
         break;
@@ -470,7 +470,7 @@ bool pkgAcqIndex::TransactionState(TransactionStates const state)
         break;
       case TransactionCommit:
         if (EraseFileName.empty() == false)
-           RemoveFile("TransactionCommit", EraseFileName);
+           RemoveFile("AcqIndex::TransactionCommit", EraseFileName);
         break;
    }
    return true;
@@ -2748,9 +2748,8 @@ void pkgAcqIndex::StageDownloadDone(string const &Message)
    // methods like file:// give us an alternative (uncompressed) file
    else if (Target.KeepCompressed == false && AltFilename.empty() == false)
    {
-      if (CurrentCompressionExtension != "uncompressed")
-        DestFile.erase(DestFile.length() - (CurrentCompressionExtension.length() + 1));
       Filename = AltFilename;
+      EraseFileName.clear();
    }
    // Methods like e.g. "file:" will give us a (compressed) FileName that is
    // not the "DestFile" we set, in this case we uncompress from the local file
@@ -2780,7 +2779,7 @@ void pkgAcqIndex::StageDownloadDone(string const &Message)
       DestFile = "/dev/null";
    }
 
-   if (EraseFileName.empty())
+   if (EraseFileName.empty() && Filename != AltFilename)
       EraseFileName = Filename;
 
    // queue uri for the next stage
index 4e3410078fd734ec3eca282e4f61692f3a801733..36f3c39b9b8c2a9fef1fc25893e994f43263d0e6 100644 (file)
@@ -98,7 +98,7 @@ bool FileMethod::Fetch(FetchItem *Itm)
    {
       if (APT::String::Endswith(File, *ext) == true)
       {
-        std::string const unfile = File.substr(0, File.length() - ext->length() - 1);
+        std::string const unfile = File.substr(0, File.length() - ext->length());
         if (stat(unfile.c_str(),&Buf) == 0)
         {
            AltRes.Size = Buf.st_size;
index 369b40f2f284caa1e4e9e1a7359649f90e743d1f..20f6046957fd95b36c2da7c6349b673c52ba1964 100755 (executable)
@@ -40,7 +40,9 @@ if [ "$(id -u)" = '0' ]; then
        exit
 fi
 chmod 555 aptarchive/dists/unstable/main/binary-all
-testsuccess aptget update
+testsuccess aptget update -o Debug::pkgAcquire::Worker=1
+cp -a rootdir/tmp/testsuccess.output rootdir/tmp/update.output
+testsuccess grep '%0aAlt-Filename:%20' rootdir/tmp/update.output
 
 # the release files aren't an IMS-hit, but the indexes are
 redatereleasefiles '+1 hour'