#!/usr/bin/env ruby # vim: set sw=4 sts=4 et tw=80 : # ['Paludis','find','getoptlong'].each {|x| require x} include Paludis Log.instance.log_level = LogLevel::Warning Log.instance.program_name = $0 unsafe = false def get_contents(repo) in_contents = { } repo.category_names do |cat| repo.package_names(cat) do |pkg| versions = repo.version_specs(pkg) if versions.length > 1 in_contents[pkg.to_s()] = versions.reverse end end end return in_contents end def each_atom(atom) yield atom if atom.kind_of? PackageDepAtom atom.each { |sub| each_atom(sub) { |sub2| yield sub2 } } if atom.kind_of? CompositeDepAtom end def format_versions(key, value) return key + " (" + value.join(", ") + ")" end def check_deps(repo, versions) needed = [] repo.category_names do |cat| repo.package_names(cat) do |pkg| repo.version_specs(pkg) do |ver| meta = repo.version_metadata(pkg, ver) meta.run_depend().each do |dep| each_atom(dep) { |atom| if versions.has_key? atom.package.to_s print "not removing ", format_versions(atom.package.to_s, versions[atom.package.to_s]), " (dep: ", pkg, "-", ver, ")\n" versions.delete atom.package.to_s end } end end end end return needed end opts = GetoptLong.new( [ '--help', '-h', GetoptLong::NO_ARGUMENT ], [ '--version', '-V', GetoptLong::NO_ARGUMENT ], [ '--log-level', GetoptLong::REQUIRED_ARGUMENT ], [ '--config-suffix', '-c', GetoptLong::REQUIRED_ARGUMENT ], [ '--unsafe', '-u', GetoptLong::NO_ARGUMENT ] ) config_suffix = "" opts.each do | opt, arg | case opt when '--help' puts "Usage: " + $0 + " [options]" puts puts "Options:" puts " --help Display a help message" puts " --version Display program version" puts puts " --log-level level Set log level (debug, qa, warning, silent)" puts " --config-suffix suffix Set configuration suffix)" puts " --unsafe Do nasty stuff" exit 0 when '--version' puts $0.to_s.split(/\//).last + " " + Paludis::Version exit 0 when '--log-level' case arg when 'debug' Paludis::Log.instance.log_level = Paludis::LogLevel::Debug when 'qa' Paludis::Log.instance.log_level = Paludis::LogLevel::Qa when 'warning' Paludis::Log.instance.log_level = Paludis::LogLevel::Warning when 'silent' Paludis::Log.instance.log_level = Paludis::LogLevel::Silent else puts "Bad --log-level value " + arg exit 1 end when '--config-suffix' config_suffix = arg end end Paludis::DefaultConfig::config_suffix = config_suffix db = DefaultEnvironment.instance.package_database multi_versions = {} db.repositories do |repo| next unless repo.format == 'vdb' multi_versions.update get_contents(repo) end necessary = [] db.repositories do |repo| next unless repo.format == 'vdb' necessary += check_deps(repo, multi_versions) end print "Keep:\n" multi_versions.each { |key, val| print format_versions(key.to_s, val[0,1]), "\n" } print "Could remove:\n" multi_versions.each { |key, val| print format_versions(key.to_s, val[1..-1]), "\n" } print "Command:\n" print "paludis -u " multi_versions.each { |key, val| val[1..-1].each { |ver| print "=" + key + "-" + ver.to_s + " " }; } print "\n"