]> git.saurik.com Git - apt.git/commitdiff
support .deb files in upgrade operations as well
authorDavid Kalnischkies <david@kalnischkies.de>
Mon, 12 Oct 2015 13:57:53 +0000 (15:57 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Wed, 4 Nov 2015 17:04:01 +0000 (18:04 +0100)
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.

apt-pkg/cacheset.cc
apt-pkg/sourcelist.cc
apt-pkg/sourcelist.h
apt-private/private-install.cc
apt-private/private-install.h
apt-private/private-upgrade.cc
test/integration/test-apt-get-install-deb

index 5e60ef54a371e518e738683d372dbdf58c56b0de..db34c4a20c47d94199018afed4c509c810759fc1 100644 (file)
@@ -441,14 +441,6 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
                                           CacheSetHelper::VerSelector const fallback,
                                           CacheSetHelper &helper,
                                           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;
        bool verIsRel = false;
        size_t const vertag = pkg.find_last_of("/=");
@@ -457,6 +449,8 @@ bool VersionContainerInterface::FromString(VersionContainerInterface * const vci
                verIsRel = (pkg[vertag] == '/');
                pkg.erase(vertag);
        }
+
+       PackageSet pkgset;
        if (onlyFromName == false)
                helper.PackageFrom(CacheSetHelper::STRING, &pkgset, Cache, pkg);
        else {
index 2100b5d3ccac5731ca7c7868cbe035c9eecf2c82..56df976e82eb495ec80a6a4b788eaad23d174440 100644 (file)
@@ -11,6 +11,7 @@
 #include<config.h>
 
 #include <apt-pkg/sourcelist.h>
+#include <apt-pkg/cmndline.h>
 #include <apt-pkg/error.h>
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/strutl.h>
@@ -20,6 +21,7 @@
 #include <apt-pkg/tagfile.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+#include <apt-pkg/debindexfile.h>
 
 #include <ctype.h>
 #include <stddef.h>
@@ -536,7 +538,38 @@ std::vector<pkgIndexFile*> pkgSourceList::GetVolatileFiles() const /*{{{*/
                                                                        /*}}}*/
 void pkgSourceList::AddVolatileFile(pkgIndexFile * const File)         /*{{{*/
 {
-   if (File != NULL)
+   if (File != nullptr)
       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;
+   });
+}
+                                                                       /*}}}*/
index 47a562d1825ad619ca83ae829628468106a716ff..9c2d10a4651c015c9f709a03de50346c633fbbc0 100644 (file)
@@ -46,6 +46,7 @@ class pkgTagSection;
 class pkgAcquire;
 class pkgIndexFile;
 class metaIndex;
+class CommandLine;
 
 class pkgSourceList
 {
@@ -129,6 +130,9 @@ class pkgSourceList
     *  @param File is an index file; pointer-ownership is transferred
     */
    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 */
    std::vector<pkgIndexFile*> GetVolatileFiles() const;
 
index 28b8d9a7b7abe5dff374fb5a64c2a2a8a3b4fee1..a9d93a92abb4cfb75e30dbbc74b63ad80a4e9136 100644 (file)
@@ -21,7 +21,6 @@
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/upgrade.h>
 #include <apt-pkg/install-progress.h>
-#include <apt-pkg/debindexfile.h>
 
 #include <stdlib.h>
 #include <string.h>
@@ -495,11 +494,16 @@ static const unsigned short MOD_REMOVE = 1;
 static const unsigned short MOD_INSTALL = 2;
 
 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;
-   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)
 {
    // 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,
                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)
    {
       helper.showVirtualPackageErrors(Cache);
@@ -656,33 +674,16 @@ struct PkgIsExtraInstalled {
 bool DoInstall(CommandLine &CmdL)
 {
    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
    if (Cache.OpenForInstall() == false || 
        Cache.CheckDeps(CmdL.FileSize() != 1) == 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;
 
    /* Print out a list of packages that are going to be installed extra
index 62276fbff0bb94204a0373bbe1d0261ee1ba0569..551787c3807ad17ec8bf8dc411cde607958b924b 100644 (file)
@@ -18,8 +18,9 @@ class pkgProblemResolver;
 
 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);
+bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, std::vector<const char*> &VolatileCmdL, CacheFile &Cache, int UpgradeMode);
 bool DoCacheManipulationFromCommandLine(CommandLine &CmdL, CacheFile &Cache, int UpgradeMode);
 
 APT_PUBLIC bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
index d13a6af49055a051e17e2e288c0a542ead575ac4..4e0197a3f08464811b4886207b0fbf088729db60 100644 (file)
 static bool UpgradeHelper(CommandLine &CmdL, int UpgradeFlags)
 {
    CacheFile Cache;
+   std::vector<char const *> VolatileCmdL;
+   Cache.GetSourceList()->AddVolatileFiles(CmdL, &VolatileCmdL);
+
    if (Cache.OpenForInstall() == false || Cache.CheckDeps() == false)
       return false;
 
-   if(!DoCacheManipulationFromCommandLine(CmdL, Cache, UpgradeFlags))
+   if(!DoCacheManipulationFromCommandLine(CmdL, VolatileCmdL,  Cache, UpgradeFlags))
       return false;
 
    return InstallPackages(Cache,true);
index 89b7f7299c9b15289f93686820bf81a0471f521c..5af6c5bf7c0a464ba3ba2ec7afdb320adf30b8c0 100755 (executable)
@@ -8,25 +8,21 @@ setupenvironment
 configarchitecture 'amd64' 'i386'
 
 # 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
 cat > foo.rpm <<EOF
 I'm not a deb, I'm a teapot.
 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
 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: 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'
 
 testfailureequal "Reading package lists...