Skip to content

Commit c5a6351

Browse files
committed
Redo the portage provider. We use the on disk cache to look up the current version, and do the emerge search only if the candidate version is needed.
This speeds up running chef immensely on Gentoo systems.
1 parent e8a386c commit c5a6351

1 file changed

Lines changed: 30 additions & 14 deletions

File tree

chef/lib/chef/provider/package/portage.rb

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,22 @@ class Portage < Chef::Provider::Package
2828
def load_current_resource
2929
@current_resource = Chef::Resource::Package.new(@new_resource.name)
3030
@current_resource.package_name(@new_resource.package_name)
31-
32-
status = popen4("emerge --color n --nospinner --search #{@new_resource.package_name.split('/').last}") do |pid, stdin, stdout, stderr|
33-
available, installed = parse_emerge(@new_resource.package_name, stdout.read)
34-
35-
if installed == "[ Not Installed ]"
36-
@current_resource.version(nil)
37-
else
38-
@current_resource.version(installed)
39-
end
40-
@candidate_version = available
41-
end
4231

43-
unless status.exitstatus == 0
44-
raise Chef::Exceptions::Package, "emerge --search failed - #{status.inspect}!"
32+
category = @new_resource.package_name.split('/').first
33+
pkg = @new_resource.package_name.split('/').last
34+
35+
@current_resource.version(nil)
36+
37+
if( ::File.exists?("/var/db/pkg/#{category}") )
38+
Dir.entries("/var/db/pkg/#{category}").each do |entry|
39+
if(entry =~ /^#{pkg}-(.+)/)
40+
@current_resource.version($1)
41+
Chef::Log.debug("Got current version #{$1}")
42+
break
43+
end
44+
end
4545
end
46-
46+
4747
@current_resource
4848
end
4949

@@ -65,6 +65,22 @@ def parse_emerge(package, txt)
6565
available = installed unless available
6666
[available, installed]
6767
end
68+
69+
def candidate_version
70+
return @candidate_version if @candidate_version
71+
72+
status = popen4("emerge --color n --nospinner --search #{@new_resource.package_name.split('/').last}") do |pid, stdin, stdout, stderr|
73+
available, installed = parse_emerge(@new_resource.package_name, stdout.read)
74+
@candidate_version = available
75+
end
76+
77+
unless status.exitstatus == 0
78+
raise Chef::Exceptions::Package, "emerge --search failed - #{status.inspect}!"
79+
end
80+
81+
@candidate_version
82+
83+
end
6884

6985

7086
def install_package(name, version)

0 commit comments

Comments
 (0)