#!/usr/bin/perl -w
#
# Author: Rune Nordbe Skillingstad <runesk@linpro.no>
#
# Mark packages and the depending packages for install recursivly.
#
# $Id: dpkg-selectforinstall 5301 2005-12-23 16:36:40Z white-guest $
#

use strict;

my $debug = 0;
my %depends = ();

sub dump {
    my $current = "";
    local *APT;
    open(APT, "apt-cache dump|") || die "Can't run apt-cache";
    while(<APT>) {
        if(/^Package: (\S+)/) {
            $current = $1;
        }
        if(/Depends: (\S+)/) {
            if($current) {
                $depends{$current}{$1} = 1;
            }
        }
    }
    close(APT);
}

sub getselections {
    my %packages = ();
    local *DEP;
    open(DEP, "dpkg --get-selections |") || die "Can't run dpkg";
    while(<DEP>) {
        if(/^(\S+).*install$/) {
            $packages{$1} = 1;
        }
    }
    close(DEP);
    return %packages;
}

sub mark {
    my($package, %packages) = @_;
    if($packages{$package}) {
        return %packages;
    } else {
        $packages{$package} = 1;
    }
    my $alt = 0;
    my $hit = "";
    if($depends{$package}) {
        foreach my $pack (keys %{$depends{$package}}) {
            %packages = &mark($pack, %packages);
        }
    }
    return %packages;
}

if($< != 0) {
    print STDERR "You're not superuser! Go away!\n";
    exit 1;
}

if(!$ARGV[0]) {
    print STDERR "Usage $0 <package>\n";
    exit 2;
}

my %packages = &getselections();
# read dump from apt-cache
&dump();

# supports multiple packages
for(my $i = 0; $i < @ARGV; $i++) {
    %packages = &mark($ARGV[$i], %packages);
}


if ($debug) {
    open(DPKG, "|cat") || die "Cant' run cat";
} else {
    open(DPKG, "|dpkg --set-selections") || die "Can't run dpkg";
}
foreach my $package (sort keys %packages) {
    print "Marking '$package' for install\n" if $debug;
    print DPKG "$package install\n";
}
close(DPKG);
