diff --git a/lib/puppet/provider/package/yum.rb b/lib/puppet/provider/package/yum.rb
index 581a446..d78a705 100755
--- a/lib/puppet/provider/package/yum.rb
+++ b/lib/puppet/provider/package/yum.rb
@@ -104,5 +104,14 @@ Puppet::Type.type(:package).provide :yum, :parent => :rpm, :source => :rpm do
def purge
yum "-y", :erase, @resource[:name]
end
+
+
+ def self.combine(resource_names)
+
+
+
+ output = yum "-d", "0", "-e", "0", "-y", :install, resource_names
+
+ end
end
diff --git a/lib/puppet/transaction.rb b/lib/puppet/transaction.rb
index 37f51b2..4ba0ecc 100644
--- a/lib/puppet/transaction.rb
+++ b/lib/puppet/transaction.rb
@@ -219,7 +219,11 @@ class Transaction
seconds = thinmark do
- events += apply(resource)
+ if combineable?(resource)
+ events += combine(resource)
+ else
+ events += apply(resource)
+ end
end
if children and ! resource.depthfirst?
@@ -473,7 +477,101 @@ class Transaction
end
end
end
+
+
+
+
+
+
+
+
+
+ def combineable?(resource)
+ if resource.provider.class.respond_to?(:combine) and
+ ! resource.noop and
+ ! skip?(resource) and
+ resource[:combine] == :true and
+ [:present,:latest,:installed].include?(resource[:ensure]) and
+ changes = resource.evaluate and
+ allow_processing?(resource,changes) and
+ ! changes.empty?
+ puts resource.to_yaml
+ return true
+ else
+ return false
+ end
+ end
+
+
+ def combine(resource)
+
+ provider_class = resource.provider.class
+
+ @multiple_install_events ||= {}
+ @multiple_install_events[provider_class] ||= {}
+
+ if events = @multiple_install_events[provider_class][resource.name]
+ return events
+ end
+
+
+ resources = catalog.vertices.reject { |r|
+
+ !r.provider.class.equal?(provider_class) or !combineable?(r)
+
+
+ }.collect { |r|
+
+ changes = r.evaluate
+ changes = [changes] unless changes.is_a?(Array)
+
+ if changes.length > 0
+ @resourcemetrics[:out_of_sync] += 1
+ end
+
+ changes.each { |c|
+ @changes << c
+ @count += 1
+ }
+
+ resourceevents = [Puppet::Transaction::Event.new(r.name, r)]
+
+
+ r.cache(:synced, Time.now)
+
+ if r.respond_to?(:flush)
+ r.flush
+ end
+
+
+
+ if r.self_refresh? and ! r.deleting?
+
+
+
+ events = resourceevents.collect { |e| e.name }
+ set_trigger(Puppet::Relationship.new(r,r, :callback => :refresh, :event => events))
+ end
+
+ @multiple_install_events[provider_class][r.name] = resourceevents
+
+ r
+ }
+
+
+ resource_names = resources.collect { |r|
+ r[:name]
+ }
+
+
+ if resource_names.length > 0
+ output = provider_class.combine(resource_names)
+ end
+
+ @multiple_install_events[provider_class][resource.name]
+ end
+
def prepare
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index 655f9e0..2c507ed 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -277,6 +277,14 @@ module Puppet
newvalues(:true, :false)
end
+ newparam(:combine) do
+ desc "Tells package provider if the packet installation have to be
+ perform in a single call by the packet manager or if it has to
+ be executed alone."
+ defaultto :false
+ newvalues(:true, :false)
+ end
+
autorequire(:file) do
autos = []
[:responsefile, :adminfile].each { |param|