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

remove uncompressed leftover partial file before pdiff bootstrap

The code already deals with compressed leftovers, but forgot the
uncompressed files. The opertunity is picked to reorder this code and
add debug messages about the actions taken as well as produce such a
leftover file in the associated testcase.
David Kalnischkies лет назад: 10
Родитель
Сommit
ef3c549e00
2 измененных файлов с 27 добавлено и 8 удалено
  1. 21 8
      apt-pkg/acquire-item.cc
  2. 6 0
      test/integration/test-pdiff-usage

+ 21 - 8
apt-pkg/acquire-item.cc

@@ -2103,22 +2103,35 @@ bool pkgAcqDiffIndex::ParseDiffIndex(string const &IndexDiffFile)	/*{{{*/
 
    // clean the plate
    {
+      std::string const Final = GetExistingFilename(CurrentPackagesFile);
+      if (unlikely(Final.empty())) // because we wouldn't be called in such a case
+	 return false;
       std::string const PartialFile = GetPartialFileNameFromURI(Target.URI);
-      std::vector<std::string> exts = APT::Configuration::getCompressorExtensions();
-      for (auto const &ext : exts)
+      if (FileExists(PartialFile) && RemoveFile("Bootstrap-linking", PartialFile) == false)
+      {
+	 if (Debug)
+	    std::clog << "Bootstrap-linking for patching " << CurrentPackagesFile
+	       << " by removing stale " << PartialFile << " failed!" << std::endl;
+	 return false;
+      }
+      for (auto const &ext : APT::Configuration::getCompressorExtensions())
       {
 	 std::string const Partial = PartialFile + ext;
-	 if (FileExists(Partial))
-	    RemoveFile("PDiffs-Bootstrap", Partial);
+	 if (FileExists(Partial) && RemoveFile("Bootstrap-linking", Partial) == false)
+	 {
+	    if (Debug)
+	       std::clog << "Bootstrap-linking for patching " << CurrentPackagesFile
+		  << " by removing stale " << Partial << " failed!" << std::endl;
+	    return false;
+	 }
       }
-      std::string const Final = GetExistingFilename(CurrentPackagesFile);
-      if (unlikely(Final.empty())) // because we wouldn't be called in such a case
-	 return false;
       std::string const Ext = Final.substr(CurrentPackagesFile.length());
       std::string const Partial = PartialFile + Ext;
       if (symlink(Final.c_str(), Partial.c_str()) != 0)
       {
-	 std::clog << "Bootstrap-linking for patching " << CurrentPackagesFile << " by linking " << Final << " to " << Partial << " failed!" << std::endl;
+	 if (Debug)
+	    std::clog << "Bootstrap-linking for patching " << CurrentPackagesFile
+	       << " by linking " << Final << " to " << Partial << " failed!" << std::endl;
 	 return false;
       }
    }

+ 6 - 0
test/integration/test-pdiff-usage

@@ -60,6 +60,9 @@ testrun() {
 " aptcache show apt oldstuff
 	configcompression '.' 'gz'
 
+	# see if the code deals properly with leftover partial files
+	touch rootdir/var/lib/apt/lists-bak/partial/localhost:${APTHTTPPORT}_Packages
+
 	msgmsg "Testcase: apply with one patch: $*"
 	find aptarchive -name 'Packages*' -type f -delete
 	cp "${PKGFILE}-new" aptarchive/Packages
@@ -208,6 +211,9 @@ SHA256-Download:
 	msgmsg "Testcase: pdiff patch bigger than index itself: $*"
 	rm -rf rootdir/var/lib/apt/lists
 	cp -a rootdir/var/lib/apt/lists-bak rootdir/var/lib/apt/lists
+	# the general testcode checks for leftovers in partial, but as this file
+	# is never touched in this test as it exits earlier its not a leftover…
+	rm -f rootdir/var/lib/apt/lists/partial/localhost:${APTHTTPPORT}_Packages
 	cp "${PKGFILE}-new" aptarchive/Packages
 	compressfile 'aptarchive/Packages'
 	mkdir -p aptarchive/Packages.diff