From 3abe575f326d7e9000aee91c967d1ea529bda345 Mon Sep 17 00:00:00 2001 From: Kenneth Kalmer Date: Thu, 4 Feb 2010 12:08:17 +0200 Subject: [PATCH] Attempt to infer package category when missing (Gentoo provider) [CHEF-425] --- chef/lib/chef/provider/package/portage.rb | 19 +++++++++++++++++++ .../unit/provider/package/portage_spec.rb | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/chef/lib/chef/provider/package/portage.rb b/chef/lib/chef/provider/package/portage.rb index a219a94a45c..b2bb656498d 100644 --- a/chef/lib/chef/provider/package/portage.rb +++ b/chef/lib/chef/provider/package/portage.rb @@ -34,6 +34,25 @@ def load_current_resource if category == pkg Chef::Log.info("Package name '#{pkg}' does not include a category!") + + possible_categories = [] + Dir.entries("/var/db/pkg").each do |cat| + Dir.entries("/var/db/pkg/#{cat}").each do |entry| + if(entry =~ /^#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)/) + possible_categories << cat + break + end + end + end + + if possible_categories.size == 1 + category = possible_categories.shift + Chef::Log.info("Infered '#{category}' as category for '#{pkg}'") + @new_resource.package_name([ category, pkg ].join('/')) + @current_resource.package_name([ category, pkg ].join('/')) + elsif possible_categories.size > 1 + Chef::Log.info("Possible categories for '#{pkg}' can be #{possible_categories.join(', ')}. Not changing package name") + end end @current_resource.version(nil) diff --git a/chef/spec/unit/provider/package/portage_spec.rb b/chef/spec/unit/provider/package/portage_spec.rb index fb992fcccaa..d2053466c6a 100644 --- a/chef/spec/unit/provider/package/portage_spec.rb +++ b/chef/spec/unit/provider/package/portage_spec.rb @@ -192,7 +192,26 @@ it "should log a warning on load_current_resource" do Chef::Log.should_receive(:info).with("Package name 'git' does not include a category!") + ::Dir.stub!(:entries).and_return([]) @provider.load_current_resource end + + it "should resolve the category if only on category was found" do + ::File.stub!(:exists?).and_return(true) + ::Dir.stub!(:entries).and_return(['dev-util'], ['git-1.6.3.3']) + #Chef::Log.should_receive(:info).once.with("Infered 'dev-util' as category name for 'git'") + + @provider.load_current_resource + @provider.current_resource.package_name.should == "dev-util/git" + end + + it "should not resolve the category if multiple entries were found" do + ::File.stub!(:exists?).and_return(true) + ::Dir.stub!(:entries).and_return(['dev-util', 'app-admin'], ['git-1.6.3.3'], ['git-0.9.9']) + #Chef::Log.should_receive(:info).once.with("Possible categories for 'git' can be dev-util, app-admin. Not changing package name") + + @provider.load_current_resource + @provider.current_resource.package_name.should == "git" + end end