lib/aptinstaller/aptinstaller.rb in ngauthier-aptinstaller-0.3.1 vs lib/aptinstaller/aptinstaller.rb in ngauthier-aptinstaller-0.3.2
- old
+ new
@@ -3,18 +3,23 @@
class AptInstaller
def self.autopkg(opts = {})
config_yaml = self.read_yaml_file(opts[:config])
packages = self.detect_packages_to_install(config_yaml['packages'])
- if packages.size > 0
+ if packages[:not_installed].size > 0
$stderr.write "\nThe following packages are required by this program but not installed:\n\n"
- packages.each do |package|
- $stderr.write "\t* "+package['executable']
- $stderr.write " (provided by package \"#{package['package']}\")" if package['package']
- $stderr.write "\n"
+ packages[:not_installed].each do |package|
+ $stderr.write "\t* "+package['name']+"\n"
end
- $stderr.write "\nYou can install them by running \"aptinstaller\" in the root of your project\n\n"
+ end
+ if packages[:out_of_date].size > 0
+
+ end
+
+ if packages[:not_installed].size + packages[:out_of_date].size > 0
+ $stderr.write "\nYou can install and upgrade automatically by "
+ $stderr.write "running \"aptinstaller\" in the root of your project\n\n"
exit(1)
end
end
def self.autopkg_install(rails_root = '.')
@@ -25,13 +30,18 @@
$stderr.write "I'm sorry, but we currently only support apt based package systems\n"
$stderr.write "You will have to install the packages yourself\n"
$stderr.flush
exit(1)
end
- if packages.size > 0
- exec("apt-get install #{packages.collect{|p| p['package'] || p['executable'] }.join(" ")}")
- else
+ if packages[:not_installed].size > 0
+ pkg_str = packages[:not_installed].collect{|p| p['name']}.join(" ")
+ system "apt-get install #{pkg_str}"
+ end
+ if packages[:out_of_date].size > 0
+
+ end
+ if packages[:not_installed].size + packages[:out_of_date].size == 0
puts "All dependencies are installed"
end
end
private
@@ -55,13 +65,28 @@
config_yaml
end
def self.detect_packages_to_install(packages)
not_installed = []
+ out_of_date = []
packages.each do |package|
- exec = package['executable']
- pkg = package['package']
- not_installed.push(package) if `which #{exec}`.size == 0
+ not_installed.push(package) unless self.detect_package(package)
+ out_of_date.push(package) unless self.verify_version(package)
end
- not_installed
+ {:not_installed => not_installed, :out_of_date => out_of_date}
+ end
+
+ def self.detect_package(package)
+ info = `aptitude show #{package['name']}`.split("\n")
+ meta = {}
+ info.each{|i|
+ i = i.split(": ")
+ meta[i[0]] = i[1]
+ }
+ return meta['State'] == 'installed'
+ end
+
+ def self.verify_version(package)
+ pkg_name = package['name']
+ return true if package['version'] == nil
end
end