#!/usr/bin/env ruby
# vim: set sw=4 sts=4 et :
require 'Paludis'
include Paludis
class FuckingFuckit
attr_reader :for_fucks_sake
def initialize(package_id)
@package_id = package_id
@for_fucks_sake = []
end
def fuck_spec(ds)
if (ds.kind_of?(ConditionalDepSpec) && ds.condition_met?)
ds.each do |ds2|
fuck_spec(ds2)
end
elsif !ds.kind_of?(ConditionalDepSpec)
if ds.respond_to?(:each)
ds.each do |ds2|
fuck_spec(ds2)
end
else
si = SourceURIFinder.new($env, $env.package_database.fetch_repository(@package_id.repository_name), ds.original_url, ds.filename, '')
si.urimirrorsthenlisted
@for_fucks_sake << si.items
end
end
end
end
class SourceURIFinder
attr_reader :items
def initialize(e, r, u, f, m)
$env = e
@repo = r
@url = u
@filename = f
@mirror = m
@items = [@filename]
end
def urimirrorsthenlisted
add_local_mirrors
add_mirrors
add_listed
end
private
def ensure_trailing(string)
return string[-1] == ?/ ? string : string + '/'
end
def add_local_mirrors
$env.mirrors('*').each do |mirror|
@items << ensure_trailing(mirror) + @filename
end
end
def add_mirrors
$env.mirrors(@mirror).each do |mirror|
@items << ensure_trailing(mirror) + @filename
end
if @repo.mirrors_interface
@repo.mirrors(@mirror).each do |mirror|
@items << ensure_trailing(mirror) + @filename
end
end
end
def add_listed
if @url =~ Regexp.new('^mirror://(.*?)/(.*)$')
this_mirror = $1
original_name = $2
$env.mirrors(this_mirror).each do |mirror|
@items << ensure_trailing(mirror) + @filename
end
if @repo.mirrors_interface
@repo.mirrors(this_mirror).each do |mirror|
@items << ensure_trailing(mirror) + @filename
end
end
else
@items << @url
end
end
end
$0 = File.basename $0
Log.instance.log_level = LogLevel::Warning
Log.instance.program_name = $0
if ARGV.length != 1
puts "Please specify exactly 1 target"
exit 1
end
target = ARGV.first
$env = EnvironmentMaker.instance.make_from_spec('')
db = $env.package_database
$r = db.fetch_repository('gentoo')
dlo = DepListOptions.new
unless target.include? ?/
@spec = $env.set(target)
if @spec.nil?
@spec = parse_user_package_dep_spec(db.fetch_unique_qualified_package_name(target), [])
else
dlo.target_type = DepListTargetType::Set
end
else
@spec = parse_user_package_dep_spec(target, [])
end
dl = DepList.new($env, dlo)
dl.add(@spec, $env.default_destinations)
dl.each do |dle|
next unless DepListEntryKind::Package == dle.kind
$stderr.puts dle.package_id
ff = FuckingFuckit.new(dle.package_id)
ff.fuck_spec(dle.package_id['SRC_URI'].value)
ff.for_fucks_sake.each do |file|
distdir = $r.get_environment_variable(dle.package_id, 'DISTDIR')
puts file.join(',') unless File.exist?(distdir + '/' + file.first)
end
end