#!/usr/bin/ruby
#
# Copyrigh (c) 2002 Masato Taruishi <taru@debian.org>
# Licensed under GPL
#
# List all packages wihch have some relationship to the specified packages
#
# Example:
#
# To list all packages on which debpartial depends or recommends recursively
#
#  listdep --field Depends,Recommends debpartial
#
# To list all packages on which debpartial depends from the specified file
#
#  listdep --file /var/lib/apt/lists/ftp.debian.org_debian_dists_unstable_main_binary-i386_Packages debpartial
#
require "debian"
require "getoptlong"

$packages_files = ["/var/lib/dpkg/available"]
$handle_field = ["Depends"]

opt_parser = GetoptLong.new
opt_parser.set_options(['--file', '-f', GetoptLong::REQUIRED_ARGUMENT],
		       ['--field', '-F', GetoptLong::REQUIRED_ARGUMENT])

begin
  opt_parser.each_option do |optname, optargs|
    case optname
    when '--file'
      $packages_files = optargs.split(',')

    when '--field'
      $handle_field = optargs.split(',')
    end
  end
rescue GetoptLong::AmbigousOption, GetoptLong::NeedlessArgument,
       GetoptLong::MissingArgument, GetoptLong::InvalidOption
  $stderr.puts "usage: #{$0} [--field field,field..] [--file file,file] <package>..."
  exit 1
end

if ARGV.size == 0
  $stderr.puts "usage: #{$0} [--field field,field..] [--file file,file] <package>..."
  exit 1
end

$packages_files.each do |packages_file|
  if $packages == nil
    $packages = Debian::Packages.new(packages_file, [], $handle_field)
  else
    $packages.add(Debian::Packages.new(packages_file, [], $handle_field))
  end
end


$pkgs = []

ARGV.each do |p|
   if $packages[p]
     $pkgs << p
   end
end

def list
  $pkgs.each do |d|
    $handle_field.each do |field|
      if $packages[d] && $packages[d][field] != nil
	$packages[d][field].split(',|\|').each do |name|
	  name.gsub!(/ |(\(.*\))/, "")
	  if $packages[name] && (! $pkgs.include?(name))
	    $pkgs << name
	    list
	  end
	end
      end
    end
  end
end

list
puts $pkgs.reverse
