diff options
author | Lamont Granquist <lamont@scriptkiddie.org> | 2018-11-20 10:40:44 -0800 |
---|---|---|
committer | Lamont Granquist <lamont@scriptkiddie.org> | 2018-11-20 10:55:20 -0800 |
commit | 9ee9facd4c0d51bc3b042edf644c450a9eaaa086 (patch) | |
tree | 7e8f82fe133a935080b4ae382665eb9583f69221 | |
parent | 403bf5a725cac444656606942de95920db7242eb (diff) | |
download | chef-9ee9facd4c0d51bc3b042edf644c450a9eaaa086.tar.gz |
add --allow-downgrades to apt-get
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r-- | lib/chef/provider/package/apt.rb | 16 | ||||
-rw-r--r-- | spec/unit/provider/package/apt_spec.rb | 12 |
2 files changed, 20 insertions, 8 deletions
diff --git a/lib/chef/provider/package/apt.rb b/lib/chef/provider/package/apt.rb index bfb24e502d..de1b106d45 100644 --- a/lib/chef/provider/package/apt.rb +++ b/lib/chef/provider/package/apt.rb @@ -1,6 +1,6 @@ # # Author:: Adam Jacob (<adam@chef.io>) -# Copyright:: Copyright 2008-2017, Chef Software Inc. +# Copyright:: Copyright 2008-2018, Chef Software Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -92,7 +92,8 @@ class Chef package_name = name.zip(version).map do |n, v| package_data[n][:virtual] ? n : "#{n}=#{v}" end - run_noninteractive("apt-get", "-q", "-y", config_file_options, default_release_options, options, "install", package_name) + dgrade = "--allow-downgrades" if supports_allow_downgrade? && allow_downgrade + run_noninteractive("apt-get", "-q", "-y", dgrade, config_file_options, default_release_options, options, "install", package_name) end def upgrade_package(name, version) @@ -133,6 +134,17 @@ class Chef private + # @return [String] version of apt-get which is installed + def apt_version + @apt_version ||= shell_out("apt-get --version").stdout.match(/^apt (\S+)/)[1] + end + + # @return [Boolean] if apt-get supports --allow-downgrades + def supports_allow_downgrade? + return @supports_allow_downgrade unless @supports_allow_downgrade.nil? + @supports_allow_downgrade = ( version_compare(apt_version, "1.1.0") >= 0 ) + end + # compare 2 versions to each other to see which is newer. # this differs from the standard package method because we # need to be able to parse debian version strings which contain diff --git a/spec/unit/provider/package/apt_spec.rb b/spec/unit/provider/package/apt_spec.rb index 05be08f332..7df1a8f3a6 100644 --- a/spec/unit/provider/package/apt_spec.rb +++ b/spec/unit/provider/package/apt_spec.rb @@ -259,7 +259,7 @@ describe Chef::Provider::Package::Apt do describe "install_package" do it "should run apt-get install with the package name and version" do expect(@provider).to receive(:shell_out_compacted!). with( - "apt-get", "-q", "-y", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "install", "irssi=0.8.12-7", + "apt-get", "-q", "-y", "--allow-downgrades", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "install", "irssi=0.8.12-7", env: { "DEBIAN_FRONTEND" => "noninteractive" }, timeout: @timeout ) @@ -268,7 +268,7 @@ describe Chef::Provider::Package::Apt do it "should run apt-get install with the package name and version and options if specified" do expect(@provider).to receive(:shell_out_compacted!).with( - "apt-get", "-q", "-y", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "--force-yes", "install", "irssi=0.8.12-7", + "apt-get", "-q", "-y", "--allow-downgrades", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "--force-yes", "install", "irssi=0.8.12-7", env: { "DEBIAN_FRONTEND" => "noninteractive" }, timeout: @timeout ) @@ -284,7 +284,7 @@ describe Chef::Provider::Package::Apt do @provider.new_resource = @new_resource expect(@provider).to receive(:shell_out_compacted!).with( - "apt-get", "-q", "-y", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "-o", "APT::Default-Release=lenny-backports", "install", "irssi=0.8.12-7", + "apt-get", "-q", "-y", "--allow-downgrades", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "-o", "APT::Default-Release=lenny-backports", "install", "irssi=0.8.12-7", env: { "DEBIAN_FRONTEND" => "noninteractive" }, timeout: @timeout ) @@ -294,7 +294,7 @@ describe Chef::Provider::Package::Apt do it "should run apt-get install with the package name and quotes options if specified" do expect(@provider).to receive(:shell_out_compacted!).with( - "apt-get", "-q", "-y", "--force-yes", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confnew", "install", "irssi=0.8.12-7", + "apt-get", "-q", "-y", "--allow-downgrades", "--force-yes", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confnew", "install", "irssi=0.8.12-7", env: { "DEBIAN_FRONTEND" => "noninteractive" }, timeout: @timeout ) @@ -451,7 +451,7 @@ describe Chef::Provider::Package::Apt do it "should install the package without specifying a version" do @provider.package_data["libmysqlclient15-dev"][:virtual] = true expect(@provider).to receive(:shell_out_compacted!).with( - "apt-get", "-q", "-y", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "install", "libmysqlclient15-dev", + "apt-get", "-q", "-y", "--allow-downgrades", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "install", "libmysqlclient15-dev", env: { "DEBIAN_FRONTEND" => "noninteractive" }, timeout: @timeout ) @@ -487,7 +487,7 @@ describe Chef::Provider::Package::Apt do it "can install a virtual package followed by a non-virtual package" do # https://github.com/chef/chef/issues/2914 expect(@provider).to receive(:shell_out_compacted!).with( - "apt-get", "-q", "-y", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "install", "libmysqlclient15-dev", "irssi=0.8.12-7", + "apt-get", "-q", "-y", "--allow-downgrades", "-o", "Dpkg::Options::=--force-confdef", "-o", "Dpkg::Options::=--force-confold", "install", "libmysqlclient15-dev", "irssi=0.8.12-7", env: { "DEBIAN_FRONTEND" => "noninteractive" }, timeout: @timeout ) |