#!/usr/bin/perl -w
#
# Author: Petter Reinholdtsen <pere@hungry.com>
# Date:   2001-12-08
#
# Parse Debian APT cache and display how much disk space a package
# would use (including all dependencies) if installed.

use vars qw($debug %info @headers);

$debug = 0;

@headers = ("Installed-Size", "Size", "Version", "Depends");

sub load_available_packages
{
    open(APT, "apt-cache dumpavail |") || die "Unable to start apt-cache";
    my $pkg;
    while (<APT>) {
	chomp;
	$pkg = $1 if (/^Package: (.+)$/);
	my $i;
	for $i (@headers) {
	    if (/^$i: (.+)/) {
		$info{$pkg}{$i} = $1;
		print "Found $i $1\n" if ($debug > 1);
	    }
	}
    }
    close(APT);
}

sub isizeof {
    my @pkgs = @_;

    my $isize = 0;

    for $pkg (@pkgs) {
	# Only add the first package in an optional list
	$pkg =~ s/\s*\|\s*.+//;
	# Remove version specifier
	$pkg =~ s/\s*\(.+\)//;

	next if (exists $included{$pkg});

	print "  Checking size of \'$pkg\'\n" if ($debug);
	if (exists $info{$pkg}{"Installed-Size"}) {
	    $isize += $info{$pkg}{"Installed-Size"};
	} else {
	    print STDERR "Missing isize for \'$pkg\'\n";
	}
	$included{$pkg} = 1;

	if ( exists $info{$pkg}{"Depends"} ) {
	    $isize += isizeof(split(/\s*,\s*/, $info{$pkg}{"Depends"}));
	}
    }
    print "  isizeof(@pkgs) = $isize\n" if ($debug);
    return $isize;
}

sub dump_pkg_info {
    my $pkg = shift;

    if ( ! exists $info{$pkg}) {
	print "No \'$pkg\' package\n";
    } else {
	%included = ();
	my $isize = isizeof($pkg);
	printf "%10d %s\n", $isize, $pkg;
    }
}

load_available_packages();

my $pkg;
for $pkg (@ARGV) {
    dump_pkg_info($pkg);
}

