diff options
author | Julian Andres Klode <jak@debian.org> | 2015-08-27 00:28:47 +0200 |
---|---|---|
committer | Julian Andres Klode <jak@debian.org> | 2015-08-27 13:27:44 +0200 |
commit | 848fd2a65fa2aef296d44c9a19b89ac272ca12fe (patch) | |
tree | 11d50e57c34045c3d368164f7eb69d62928d0e0a | |
parent | b6192267c23ffda1b9c8328537a5f2c83e176c26 (diff) |
install: Set a local deb as the candidate for that package
This ensures that we can install .deb files that are not the
candidate for a given package.
-rw-r--r-- | apt-private/private-install.cc | 12 | ||||
-rwxr-xr-x | test/integration/test-apt-get-install-deb | 18 |
2 files changed, 30 insertions, 0 deletions
diff --git a/apt-private/private-install.cc b/apt-private/private-install.cc index 844fcbc7e..3647ca99d 100644 --- a/apt-private/private-install.cc +++ b/apt-private/private-install.cc @@ -675,6 +675,18 @@ bool DoInstall(CommandLine &CmdL) 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)) return false; diff --git a/test/integration/test-apt-get-install-deb b/test/integration/test-apt-get-install-deb index bd720bede..65951cede 100755 --- a/test/integration/test-apt-get-install-deb +++ b/test/integration/test-apt-get-install-deb @@ -60,3 +60,21 @@ The following NEW packages will be installed: Remv foo:i386 [1.0] Inst foo (1.0 local-deb [amd64]) Conf foo (1.0 local-deb [amd64])" aptget install ./incoming/foo_1.0_amd64.deb -s -q=0 + +# Check that installing the local deb works if it is not the candidate +echo "Package: foo +Pin: version 1.0 +Pin-Priority: -1" > rootdir/etc/apt/preferences + +testsuccessequal "Reading package lists... +Building dependency tree... +Reading state information... +Note, selecting 'foo' instead of './incoming/foo_1.0_amd64.deb' +The following packages will be REMOVED: + foo:i386 +The following NEW packages will be installed: + foo +0 upgraded, 1 newly installed, 1 to remove and 0 not upgraded. +Remv foo:i386 [1.0] +Inst foo (1.0 local-deb [amd64]) +Conf foo (1.0 local-deb [amd64])" aptget install ./incoming/foo_1.0_amd64.deb -s -q=0 |