summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLamont Granquist <lamont@scriptkiddie.org>2018-11-20 10:40:44 -0800
committerTim Smith <tsmith@chef.io>2018-11-27 17:10:28 -0800
commit9d220947bdf7c2b38d777a94c099b55e4c94f342 (patch)
treeace4601d9b4d5e71b53a293516cc2fbd079b1f2e
parent852b6eb69e9d11acd32c6d756dfbb9473d97a4ac (diff)
downloadchef-9d220947bdf7c2b38d777a94c099b55e4c94f342.tar.gz
add --allow-downgrades to apt-get
Signed-off-by: Lamont Granquist <lamont@scriptkiddie.org>
-rw-r--r--lib/chef/provider/package/apt.rb16
-rw-r--r--spec/unit/provider/package/apt_spec.rb12
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
)