]> git.pld-linux.org Git - packages/chef.git/blobdiff - poldek.patch
poldek package provider rewritten to support chef-12 package array
[packages/chef.git] / poldek.patch
index 238a4eb2ec4e41a121c7b1b13a30991ccdb14e55..adfe88835fff53d464eab0b2dbc2d21afb6035d1 100644 (file)
@@ -1,14 +1,16 @@
 poldek package manager support
 
-https://tickets.opscode.com/browse/CHEF-4476
-https://github.com/opscode/chef/pull/1225
+https://github.com/chef/chef/pull/7482
 
---- chef-11.12.8/lib/chef/provider/package/poldek.rb   1970-01-01 02:00:00.000000000 +0200
-+++ chef-11.12.8.poldek/lib/chef/provider/package/poldek.rb    2014-12-04 18:27:24.468416380 +0200
-@@ -0,0 +1,123 @@
+diff --git a/lib/chef/provider/package/poldek.rb b/lib/chef/provider/package/poldek.rb
+new file mode 100644
+index 000000000..a4d17ba67
+--- /dev/null
++++ b/lib/chef/provider/package/poldek.rb
+@@ -0,0 +1,137 @@
 +#
 +# Author:: Elan Ruusamäe (glen@pld-linux.org)
-+# Copyright:: Copyright (c) 2013 Elan Ruusamäe
++# Copyright:: Copyright (c) 2013,2018 Elan Ruusamäe
 +# License:: Apache License, Version 2.0
 +#
 +# Licensed under the Apache License, Version 2.0 (the "License");
@@ -28,123 +30,142 @@ https://github.com/opscode/chef/pull/1225
 +require 'chef/provider/package'
 +require 'chef/mixin/shell_out'
 +require 'chef/resource/package'
-+require 'chef/mixin/get_source_from_package'
 +
 +class Chef
 +  class Provider
 +    class Package
 +      class Poldek < Chef::Provider::Package
 +        include Chef::Mixin::ShellOut
-+        attr_accessor :is_virtual_package
++
++        allow_nils
++        use_multipackage_api
++
++        provides :package, platform_family: "pld"
 +
 +        def load_current_resource
-+            Chef::Log.debug("#{@new_resource} loading current resource")
-+            @current_resource = Chef::Resource::Package.new(@new_resource.name)
-+            @current_resource.package_name(@new_resource.package_name)
-+            @current_resource.version(nil)
-+            check_package_state
-+            @current_resource # modified by check_package_state
++          logger.debug("#{new_resource} loading current resource")
++          @current_resource = Chef::Resource::Package.new(new_resource.name)
++          current_resource.package_name(new_resource.package_name)
++          current_resource.version(get_current_versions)
++          current_resource
 +        end
 +
-+        def check_package_state()
-+            Chef::Log.debug("#{@new_resource} checking package #{@new_resource.package_name}")
-+
-+            installed = false
-+            @current_resource.version(nil)
++        def candidate_version
++          @candidate_version ||= get_candidate_versions
++        end
 +
-+            out = shell_out!("rpm -q #{@new_resource.package_name}", :env => nil, :returns => [0,1])
-+            if out.stdout
-+                Chef::Log.debug("rpm STDOUT: #{out.stdout}");
-+                version = version_from_nvra(out.stdout)
-+                if version
-+                    @current_resource.version(version)
-+                    installed = true
-+                end
-+            end
++        def get_current_versions
++          names = package_name_array
++          logger.debug("#{new_resource} checking current version: #{names}")
 +
-+            return installed
++          # rpm works as expected: output is returned in order as input given, even duplicates
++          cmd = rpm("-q", "--qf", "%{NAME} %{VERSION}\n", names)
++          versions_from_name_list(cmd.stdout, names)
 +        end
 +
-+        def candidate_version
-+            Chef::Log.debug("poldek check candidate version for #{@new_resource.package_name}");
-+            return @candidate_version if @candidate_version
-+
-+            update_indexes
-+            cmd = "poldek -q --uniq --skip-installed #{expand_options(@new_resource.options)} --cmd 'ls #{@new_resource.package_name}'"
-+            out = shell_out!(cmd, :env => nil, :returns => [0,1,255])
-+            if out.stdout
-+                Chef::Log.debug("poldek STDOUT: #{out.stdout}");
-+                version = version_from_nvra(out.stdout)
-+                if version
-+                    @candidate_version = version
-+                end
-+            end
-+            unless @candidate_version
-+                raise Chef::Exceptions::Package, "poldek does not have a version of package #{@new_resource.package_name}"
-+            end
-+            @candidate_version
-+        end
++        def get_candidate_versions
++          names = package_name_array
++          logger.debug("#{new_resource} check candidate version");
 +
-+        def install_package(name, version)
-+            Chef::Log.debug("#{@new_resource} installing package #{name}-#{version}")
-+            package = "#{name}-#{version}"
-+            update_indexes
-+            out = shell_out!("poldek --noask #{expand_options(@new_resource.options)} -u #{package}", :env => nil)
++          update_indexes
++
++          # poldek works unexpectedly: packages that don't exist are printed as errors first, and names are de-duplicated
++          cmd = poldek(%w{--uniq --skip-installed} + options.to_a + ["--cmd", "ls --qf '%{NAME} %{VERSION}\n'", names])
++          versions_from_name_list(cmd.stdout, names)
 +        end
 +
-+        def upgrade_package(name, version)
-+            Chef::Log.debug("#{@new_resource} upgrading package #{name}-#{version}")
-+            install_package(name, version)
++        def install_package(names, versions)
++          logger.trace("#{new_resource} installing package #{names} version #{versions}")
++          update_indexes
++          poldek(options, "-u", names)
 +        end
 +
-+        def remove_package(name, version)
-+            Chef::Log.debug("#{@new_resource} removing package #{name}-#{version}")
-+            package = "#{name}-#{version}"
-+            out = shell_out!("poldek --noask #{expand_options(@new_resource.options)} -e #{package}", :env => nil)
++        def upgrade_package(names, versions)
++          logger.trace("#{new_resource} upgrading package #{names} version #{versions}")
++          install_package(names, versions)
 +        end
 +
-+        def purge_package(name, version)
-+            remove_package(name, version)
++        def remove_package(names, versions)
++          logger.trace("#{new_resource} removing package #{names} version #{versions}")
++          poldek(options, "-e", names)
 +        end
 +
 +        private
 +        @@updated = Hash.new
 +
-+        def version_from_nvra(stdout)
-+            stdout[/^#{Regexp.escape(@new_resource.package_name)}-(.+)/, 1]
-+        end
-+
 +        def update_indexes()
-+            Chef::Log.debug("#{@new_resource} call update indexes #{expand_options(@new_resource.options)}")
-+            checksum = Digest::MD5.hexdigest(@new_resource.options || '').to_s
++            checksum = Digest::MD5.hexdigest(opts).to_s
 +
 +            if @@updated[checksum]
 +                return
 +            end
-+            Chef::Log.debug("#{@new_resource} updating package indexes: #{expand_options(@new_resource.options)}")
-+            shell_out!("poldek --up #{expand_options(@new_resource.options)}", :env => nil)
++
++            logger.debug("#{@new_resource} updating package indexe")
++            poldek("--up", options, :env => nil)
 +            @@updated[checksum] = true
 +        end
++
++        def opts
++          expand_options(options)
++        end
++
++        def versions_from_name_list(input, names)
++          packages = extract_packages(input)
++          versions = match_versions(names, packages)
++          versions
++        end
++
++        def extract_packages(output)
++          packages = {}
++          output.each_line do |line|
++            case line.rstrip
++            when /^package (.+) is not installed$/
++            when /(.+): no such package or directory$/
++            when /^(.+?) (.+)$/
++              packages[$1] = $2
++            end
++          end
++          packages
++        end
++
++        def match_versions(names, packages)
++          names.map do |name|
++            packages[name]
++          end
++        end
++
++        def rpm(*args)
++          shell_out_compact_timeout!("rpm", *args, env: nil, returns: [0, 1])
++        end
++
++        def poldek(*args)
++          shell_out_compact_timeout!(%w{poldek -q --noask}, *args, env: nil, returns: [0, 1, 255])
++        end
 +      end
 +    end
 +  end
 +end
---- chef-11.12.8/lib/chef/providers.rb 2014-12-04 18:27:52.686448859 +0200
-+++ chef-11.12.8.poldek/lib/chef/providers.rb  2014-12-04 18:27:24.438414927 +0200
-@@ -60,6 +60,7 @@
- require 'chef/provider/package/macports'
- require 'chef/provider/package/pacman'
- require 'chef/provider/package/portage'
+diff --git a/lib/chef/providers.rb b/lib/chef/providers.rb
+index cd265b061..075ffd7e8 100644
+--- a/lib/chef/providers.rb
++++ b/lib/chef/providers.rb
+@@ -74,6 +74,7 @@ require "chef/provider/package/macports"
+ require "chef/provider/package/openbsd"
+ require "chef/provider/package/pacman"
+ require "chef/provider/package/portage"
 +require 'chef/provider/package/poldek'
- require 'chef/provider/package/rpm'
- require 'chef/provider/package/rubygems'
- require 'chef/provider/package/yum'
---- chef-11.12.8/lib/chef/resource/poldek_package.rb   1970-01-01 02:00:00.000000000 +0200
-+++ chef-11.12.8.poldek/lib/chef/resource/poldek_package.rb    2014-12-04 18:27:24.438414927 +0200
-@@ -0,0 +1,34 @@
+ require "chef/provider/package/paludis"
+ require "chef/provider/package/rpm"
+ require "chef/provider/package/rubygems"
+diff --git a/lib/chef/resource/poldek_package.rb b/lib/chef/resource/poldek_package.rb
+new file mode 100644
+index 000000000..4db9aa824
+--- /dev/null
++++ b/lib/chef/resource/poldek_package.rb
+@@ -0,0 +1,41 @@
 +#
 +# Author:: Elan Ruusamäe (glen@pld-linux.org)
-+# Copyright:: Copyright (c) 2013 Elan Ruusamäe
++# Copyright:: Copyright (c) 2013,2018 Elan Ruusamäe
 +# License:: Apache License, Version 2.0
 +#
 +# Licensed under the Apache License, Version 2.0 (the "License");
@@ -166,13 +187,20 @@ https://github.com/opscode/chef/pull/1225
 +class Chef
 +  class Resource
 +    class PoldekPackage < Chef::Resource::Package
++      extend Chef::Mixin::Which
 +
-+      def initialize(name, run_context=nil)
-+        super
-+        @resource_name = :poldek_package
-+        @provider = Chef::Provider::Package::Poldek
++      resource_name :poldek_package
++
++      provides :package do
++        which("poldek")
 +      end
 +
++      provides :poldek_package
++
++      description "Use the poldek_package resource to install, upgrade, and remove packages with poldek."
++      introduced "14.3"
++
++      allowed_actions :install, :upgrade, :remove
 +    end
 +  end
 +end
This page took 0.094079 seconds and 4 git commands to generate.