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

support .deb files in upgrade operations as well

The main part is refactoring through to allow hiding the magic needed to
support .deb files in deeper layers of libapt so that frontends have
less exposure to Debian specific classes like debDebPkgFileIndex.
David Kalnischkies лет назад: 10
Родитель
Сommit
14341a7ee1

+ 2 - 8
apt-pkg/cacheset.cc

@@ -441,14 +441,6 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
 					   CacheSetHelper::VerSelector const fallback,
 					   CacheSetHelper::VerSelector const fallback,
 					   CacheSetHelper &helper,
 					   CacheSetHelper &helper,
 					   bool const onlyFromName) {
 					   bool const onlyFromName) {
-	PackageSet pkgset;
-	if(FileExists(pkg)) {
-		helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg);
-		if(pkgset.empty() == true)
-			return false;
-		return VersionContainerInterface::FromPackage(vci, Cache, pkgset.begin(), fallback, helper);
-	}
-
 	std::string ver;
 	std::string ver;
 	bool verIsRel = false;
 	bool verIsRel = false;
 	size_t const vertag = pkg.find_last_of("/=");
 	size_t const vertag = pkg.find_last_of("/=");
@@ -457,6 +449,8 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
 		verIsRel = (pkg[vertag] == '/');
 		verIsRel = (pkg[vertag] == '/');
 		pkg.erase(vertag);
 		pkg.erase(vertag);
 	}
 	}
+
+	PackageSet pkgset;
 	if (onlyFromName == false)
 	if (onlyFromName == false)
 		helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg);
 		helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg);
 	else {
 	else {

+ 34 - 1
apt-pkg/sourcelist.cc

@@ -11,6 +11,7 @@
 #include<config.h>
 #include<config.h>
 
 
 #include <apt-pkg/sourcelist.h>
 #include <apt-pkg/sourcelist.h>
+#include <apt-pkg/cmndline.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/strutl.h>
 #include <apt-pkg/strutl.h>
@@ -20,6 +21,7 @@
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/debindexfile.h>
 
 
 #include <ctype.h>
 #include <ctype.h>
 #include <stddef.h>
 #include <stddef.h>
@@ -536,7 +538,38 @@ std::vector<pkgIndexFile*> pkgSourceList::GetVolatileFiles() const	/*{{{*/
 									/*}}}*/
 									/*}}}*/
 void pkgSourceList::AddVolatileFile(pkgIndexFile * const File)		/*{{{*/
 void pkgSourceList::AddVolatileFile(pkgIndexFile * const File)		/*{{{*/
 {
 {
-   if (File != NULL)
+   if (File != nullptr)
       VolatileFiles.push_back(File);
       VolatileFiles.push_back(File);
 }
 }
 									/*}}}*/
 									/*}}}*/
+bool pkgSourceList::AddVolatileFile(std::string const &File)		/*{{{*/
+{
+   if (File.empty() || FileExists(File) == false)
+      return false;
+
+   if (flExtension(File) == "deb")
+      AddVolatileFile(new debDebPkgFileIndex(File));
+   else
+      return false;
+
+   return true;
+}
+									/*}}}*/
+void pkgSourceList::AddVolatileFiles(CommandLine &CmdL, std::vector<const char*> * const VolatileCmdL)/*{{{*/
+{
+   std::remove_if(CmdL.FileList + 1, CmdL.FileList + 1 + CmdL.FileSize(), [&](char const * const I) {
+      if (I != nullptr && (I[0] == '/' || (I[0] == '.' && I[1] == '/')))
+      {
+	 if (AddVolatileFile(I))
+	 {
+	    if (VolatileCmdL != nullptr)
+	       VolatileCmdL->push_back(I);
+	 }
+	 else
+	    _error->Error(_("Unsupported file %s given on commandline"), I);
+	 return true;
+      }
+      return false;
+   });
+}
+									/*}}}*/

+ 4 - 0
apt-pkg/sourcelist.h

@@ -46,6 +46,7 @@ class pkgTagSection;
 class pkgAcquire;
 class pkgAcquire;
 class pkgIndexFile;
 class pkgIndexFile;
 class metaIndex;
 class metaIndex;
+class CommandLine;
 
 
 class pkgSourceList
 class pkgSourceList
 {
 {
@@ -129,6 +130,9 @@ class pkgSourceList
     *  @param File is an index file; pointer-ownership is transferred
     *  @param File is an index file; pointer-ownership is transferred
     */
     */
    void AddVolatileFile(pkgIndexFile * const File);
    void AddVolatileFile(pkgIndexFile * const File);
+   bool AddVolatileFile(std::string const &File);
+   void AddVolatileFiles(CommandLine &CmdL, std::vector<const char*> * const VolatileCmdL);
+
    /** @return list of files registered with #AddVolatileFile */
    /** @return list of files registered with #AddVolatileFile */
    std::vector<pkgIndexFile*> GetVolatileFiles() const;
    std::vector<pkgIndexFile*> GetVolatileFiles() const;
 
 

+ 25 - 24
apt-private/private-install.cc

@@ -21,7 +21,6 @@
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/upgrade.h>
 #include <apt-pkg/upgrade.h>
 #include <apt-pkg/install-progress.h>
 #include <apt-pkg/install-progress.h>
-#include <apt-pkg/debindexfile.h>
 
 
 #include <stdlib.h>
 #include <stdlib.h>
 #include <string.h>
 #include <string.h>
@@ -495,11 +494,16 @@ static const unsigned short MOD_REMOVE = 1;
 static const unsigned short MOD_INSTALL = 2;
 static const unsigned short MOD_INSTALL = 2;
 
 
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode)
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode)
+{
+   std::vector<const char*> VolatileCmdL;
+   return DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL, Cache, UpgradeMode);
+}
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache, int UpgradeMode)
 {
 {
    std::map<unsigned short, APT::VersionSet> verset;
    std::map<unsigned short, APT::VersionSet> verset;
-   return DoCacheManipulationFromCommandLine(CmdL, Cache, verset, UpgradeMode);
+   return DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL, Cache, verset, UpgradeMode);
 }
 }
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache,
                                         std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode)
                                         std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode)
 {
 {
    // Enter the special broken fixing mode if the user specified arguments
    // Enter the special broken fixing mode if the user specified arguments
@@ -535,6 +539,20 @@ bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
    verset = APT::VersionSet::GroupedFromCommandLine(Cache,
    verset = APT::VersionSet::GroupedFromCommandLine(Cache,
 		CmdL.FileList + 1, mods, fallback, helper);
 		CmdL.FileList + 1, mods, fallback, helper);
 
 
+   for (auto const &I: VolatileCmdL)
+   {
+      pkgCache::PkgIterator const P = Cache->FindPkg(I);
+      if (P.end())
+	 continue;
+
+      // Set any version providing the .deb as the candidate.
+      for (auto Prv = P.ProvidesList(); Prv.end() == false; Prv++)
+	 Cache.GetDepCache()->SetCandidateVersion(Prv.OwnerVer());
+
+      // via cacheset to have our usual virtual handling
+      APT::VersionContainerInterface::FromPackage(&(verset[MOD_INSTALL]), Cache, P, APT::CacheSetHelper::CANDIDATE, helper);
+   }
+
    if (_error->PendingError() == true)
    if (_error->PendingError() == true)
    {
    {
       helper.showVirtualPackageErrors(Cache);
       helper.showVirtualPackageErrors(Cache);
@@ -656,33 +674,16 @@ struct PkgIsExtraInstalled {
 bool DoInstall(CommandLine &CmdL)
 bool DoInstall(CommandLine &CmdL)
 {
 {
    CacheFile Cache;
    CacheFile Cache;
-   // first check for local pkgs and add them to the cache
-   for (const char **I = CmdL.FileList; *I != 0; I++)
-   {
-      if(FileExists(*I) && flExtension(*I) == "deb")
-	 Cache.GetSourceList()->AddVolatileFile(new debDebPkgFileIndex(*I));
-   }
+   std::vector<char const *> VolatileCmdL;
+   Cache.GetSourceList()->AddVolatileFiles(CmdL, &VolatileCmdL);
 
 
    // then open the cache
    // then open the cache
    if (Cache.OpenForInstall() == false || 
    if (Cache.OpenForInstall() == false || 
        Cache.CheckDeps(CmdL.FileSize() != 1) == false)
        Cache.CheckDeps(CmdL.FileSize() != 1) == false)
       return false;
       return false;
-   
-   std::map<unsigned short, APT::VersionSet> verset;
-
-   for (const char **I = CmdL.FileList; *I != 0; I++) {
-      // Check for local pkgs like in the loop above.
-      if(!FileExists(*I) || flExtension(*I) != "deb")
-	 continue;
-
-      pkgCache::PkgIterator pkg = Cache->FindPkg(*I);
 
 
-      // Set any version providing the .deb as the candidate.
-      for (auto Prv = pkg.ProvidesList(); Prv.end() == false; Prv++)
-	 Cache.GetDepCache()->SetCandidateVersion(Prv.OwnerVer());
-   }
-
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, verset, 0))
+   std::map<unsigned short, APT::VersionSet> verset;
+   if(!DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL, Cache, verset, 0))
       return false;
       return false;
 
 
    /* Print out a list of packages that are going to be installed extra
    /* Print out a list of packages that are going to be installed extra

+ 2 - 1
apt-private/private-install.h

@@ -18,8 +18,9 @@ class pkgProblemResolver;
 
 
 APT_PUBLIC bool DoInstall(CommandLine &Cmd);
 APT_PUBLIC bool DoInstall(CommandLine &Cmd);
 
 
-bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache,
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache,
                                         std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode);
                                         std::map<unsigned short, APT::VersionSet> &verset, int UpgradeMode);
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache, int UpgradeMode);
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode);
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode);
 
 
 APT_PUBLIC bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
 APT_PUBLIC bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,

+ 4 - 1
apt-private/private-upgrade.cc

@@ -19,10 +19,13 @@
 static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
 static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
 {
 {
    CacheFile Cache;
    CacheFile Cache;
+   std::vector<char const *> VolatileCmdL;
+   Cache.GetSourceList()->AddVolatileFiles(CmdL, &VolatileCmdL);
+
    if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false)
    if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false)
       return false;
       return false;
 
 
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, UpgradeFlags))
+   if(!DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL,  Cache, UpgradeFlags))
       return false;
       return false;
 
 
    return InstallPackages(Cache,true);
    return InstallPackages(Cache,true);

+ 5 - 9
test/integration/test-apt-get-install-deb

@@ -8,25 +8,21 @@ setupenvironment
 configarchitecture 'amd64' 'i386'
 configarchitecture 'amd64' 'i386'
 
 
 # regression test for #754904
 # regression test for #754904
-testfailureequal 'E: Unable to locate package /dev/null' aptget install -qq /dev/null
+testfailureequal 'E: Unsupported file /dev/null given on commandline' aptget install -qq /dev/null
 
 
 # only consider .deb files
 # only consider .deb files
 cat > foo.rpm <<EOF
 cat > foo.rpm <<EOF
 I'm not a deb, I'm a teapot.
 I'm not a deb, I'm a teapot.
 EOF
 EOF
-testfailureequal "E: Unable to locate package ./foo.rpm
-E: Couldn't find any package by glob './foo.rpm'
-E: Couldn't find any package by regex './foo.rpm'" aptget install -qq ./foo.rpm
+testfailureequal 'E: Unsupported file ./foo.rpm given on commandline' aptget install -qq ./foo.rpm
 
 
 # and ensure we fail for invalid debs
 # and ensure we fail for invalid debs
 mv foo.rpm foo.deb
 mv foo.rpm foo.deb
-testfailure aptget install ./foo.deb
-testsuccess grep '^E: Sub-process Popen returned an error code' rootdir/tmp/testfailure.output
-testequal "E: Encountered a section with no Package: header
+testfailuremsg "E: Sub-process Popen returned an error code (2)
+E: Encountered a section with no Package: header
 E: Problem with MergeList ${TMPWORKINGDIRECTORY}/foo.deb
 E: Problem with MergeList ${TMPWORKINGDIRECTORY}/foo.deb
-E: The package lists or status file could not be parsed or opened." tail -n 3 rootdir/tmp/testfailure.output
+E: The package lists or status file could not be parsed or opened." aptget install ./foo.deb
 
 
-# fakeroot is currently not found, framwork needs updating
 buildsimplenativepackage 'foo' 'i386,amd64' '1.0'
 buildsimplenativepackage 'foo' 'i386,amd64' '1.0'
 
 
 testfailureequal "Reading package lists...
 testfailureequal "Reading package lists...