瀏覽代碼

ensure compression cleanup even without lists-cleanup

If we store files compressed in lists/ and the file switched compression
formats we happened to retain the "old" format, but by default the
cleanup process catched this oversight and removed the file.
[The initial situation described doesn't arise as we store no files by
default compressed and even with apt-file configuring Contents files, we
don't really have that problem as there is just .gz files for those.]

We solve this by just removing any uncompressed as well as compressed
(we support) file just before we move the 'new' version of the file in.
David Kalnischkies 10 年之前
父節點
當前提交
1866240123
共有 1 個文件被更改,包括 32 次插入5 次删除
  1. 32 5
      apt-pkg/acquire-item.cc

+ 32 - 5
apt-pkg/acquire-item.cc

@@ -388,16 +388,43 @@ bool pkgAcqTransactionItem::TransactionState(TransactionStates const state)
 	 }
 	 break;
       case TransactionCommit:
-	 if(PartialFile != "")
+	 if(PartialFile.empty() == false)
 	 {
-	    if(Debug == true)
-	       std::clog << "mv " << PartialFile << " -> "<< DestFile << " # " << DescURI() << std::endl;
+	    if (PartialFile != DestFile)
+	    {
+	       // ensure that even without lists-cleanup all compressions are nuked
+	       std::string FinalFile = GetFinalFileNameFromURI(Target.URI);
+	       if (FileExists(FinalFile))
+	       {
+		  if(Debug == true)
+		     std::clog << "rm " << FinalFile << " # " << DescURI() << std::endl;
+		  if (RemoveFile("TransactionStates-Cleanup", FinalFile) == false)
+		     return false;
+	       }
+	       for (auto const &ext: APT::Configuration::getCompressorExtensions())
+	       {
+		  auto const Final = FinalFile + ext;
+		  if (FileExists(Final))
+		  {
+		     if(Debug == true)
+			std::clog << "rm " << Final << " # " << DescURI() << std::endl;
+		     if (RemoveFile("TransactionStates-Cleanup", Final) == false)
+			return false;
+		  }
+	       }
+	       if(Debug == true)
+		  std::clog << "mv " << PartialFile << " -> "<< DestFile << " # " << DescURI() << std::endl;
+	       if (Rename(PartialFile, DestFile) == false)
+		  return false;
+	    }
+	    else if(Debug == true)
+	       std::clog << "keep " << PartialFile << " # " << DescURI() << std::endl;
 
-	    Rename(PartialFile, DestFile);
 	 } else {
 	    if(Debug == true)
 	       std::clog << "rm " << DestFile << " # " << DescURI() << std::endl;
-	    RemoveFile("TransactionCommit", DestFile);
+	    if (RemoveFile("TransactionCommit", DestFile) == false)
+	       return false;
 	 }
 	 break;
    }