#!/usr/bin/env perl

$diff = 0;
$list = 0;
@tARGV = ();
for (; @ARGV > 0; ) {
    if ($ARGV[0] eq "-diff") {
	$diff = 1;
        shift; next;
    }
    if ($ARGV[0] eq "-list") {
	$list = 1;
        shift; next;
    }
    if ($ARGV[0] eq "-h")     { &usage (); }
    if ($ARGV[0] eq "-help")  { &usage (); }
    if ($ARGV[0] eq "--help") { &usage (); }
    @tARGV = (@tARGV, $ARGV[0]);
    shift;
}
@ARGV = @tARGV;

$distdir = "distributions";

if (!$list && @ARGV != 2) { &usage (); }
if ( $list && @ARGV != 0) { &usage (); }

@files = <$distdir/*.dst>;
foreach $file (@files) {
    open (FILE, $file) || die "ERROR: can't open distribution file\n";
    @sublist = <FILE>;
    close (FILE);
    push @list, @sublist;
    $Ns = @sublist;
    $Nt = @list;
}

$group = $ARGV[0];
$version = $ARGV[1];

$ingroup = 0;
@name = ();
@tag = ();

if ($list) { 
    printf STDERR "Available Distributions\n";
    printf STDERR "%-16s  %7s\n", "Module", "Version";
    printf STDERR "-------------------------\n";
}

foreach $line (@list) {

    ($key) = split (" ", $line);

    # found DISTRIBUTION
    if ($key eq "DISTRIBUTION") {
	($tmp, $word1, $word2) = split (" ", $line);
	if (($word1 eq $group) && ($word2 eq $version)) { $ingroup = 1; }
	if ($list) { printf STDERR "%-16s  %7s\n", $word1, $word2; }
    }
    if (!$ingroup || $list) { next; }

    # found END
    if ($key eq "END") { last; }

    # found USE
    if ($key eq "USE") {
	($tmp, $word1, $word2) = split (" ", $line);
	if ($word2 eq "") {
	    $tag  = "";
	    $name = $word1;
	} else {
	    $tag  = $word1;
	    $name = $word2;
	}	    
	if ($name eq "") { die "missing tag\n"; }
	push @name, $name;
	push @tag, $tag;
    }
}

if ($list) { exit 0; }
if (@name == 0) { die "ERROR: $group $version not found\n"; }

if ($diff) { &difflist (); }

for ($i = 0; $i < @name; $i++) {
    if ($tag[$i] eq "") {
	&vsystem ("cvs co $name[$i]");
    } else {
	&vsystem ("cvs co -r $tag[$i] $name[$i]");
    }	
}

if ($group eq "elixir-config") {
    &vsystem ("mv config $group-$version");
} else {
    &vsystem ("mv ohana $group-$version");
}
&vsystem ("rm -r `find $group-$version -name CVS`");
&vsystem ("tar cvzf tarballs/$group-$version.tgz  $group-$version");
&vsystem ("rm -r $group-$version");

sub vsystem {
    print STDERR "@_\n";
    $status = system ("@_");
    $status;
}

sub usage {
    print STDERR "USAGE: mkdist -list\n   : list valid distributions \n";
    print STDERR "USAGE: mkdist (group) (version)\n   : make a distribution tarball\n";
    print STDERR "USAGE: mkdist -diff (group) (version)\n";
    print STDERR "   : show the difference between the distribution and current tree\n";
    exit 2;
}

sub difflist {

    for ($i = 0; $i < @name; $i++) {
	if ($tag[$i] eq "") {
	    &vsystem ("cvs -q rdiff -s -r HEAD $name[$i]");
	} else {
	    &vsystem ("cvs -q rdiff -s -r $tag[$i] $name[$i]");
	}	
    }
    exit 0;
}
