#!/mit/watchmaker/vaxbin/perl
	eval "exec /mit/watchmaker/vaxbin/perl -S $0 $*"
		if $running_under_some_shell;

# $Header: makedist.SH,v 2.0.1.1 88/08/04 23:55:14 lwall Exp $
#
# $Log:	makedist.SH,v $
# Revision 2.0.1.1  88/08/04  23:55:14  lwall
# 
# patch1: depends on perlpath now
# 
# Revision 2.0  88/06/28  23:12:17  lwall
# Baseline.
# 

$DIST='/mit/watchmaker/vaxsrc/dist/kit';
$ENV{'DIST'} = $DIST;

do 'getopt.pl';
do Getopt("s");

$MAXKITSIZE = 50000 unless $MAXKITSIZE = $opt_s;
$KITOVERHEAD = 1700;
$FILEOVERHEAD = 90;
$NEWMANI = 'MANIFEST.new';
$MANI = 'MANIFEST';

do readpackage();

$ENV{'package'} = $package;
$ENV{'baserev'} = $baserev;

unlink <$package.kit? $package.kit??>;

do manifake();

sub manifake {
    # make MANIFEST and MANIFEST.new say the same thing
    if (! -f $NEWMANI) {
	if (-f $MANI) {
	    open(IN,$MANI) || die "Can't open $MANI";
	    open(OUT,">$NEWMANI") || die "Can't create $NEWMANI";
	    while (<IN>) {
		next if 1 .. /---/;
		s/(\s+)[0-9]*\s*/$1/;
	    }
	    close IN; close OUT;
	}
	else {
die "You need to make a MANIFEST.new file, with names and descriptions.\n";
	}
    }
}

do kitlists();

sub kitlists {
    open(IN,$NEWMANI) || die "Can't open $NEWMANI";
    @files = <IN>;
    close IN;
    for (@files) {
	s/\s.*\n//;
	($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,$ctime,
	   $blksize,$blocks) = stat($_);
	$size += 1000000 if /README/;
	$size{$_} = $size;
    }

    sub revnum { $size{$a} < $size{$b} ? 1 : $size{$a} > $size{$b} ? -1 : 0; }
    @files = sort revnum @files;

    for (@files) {
	$size = $size{$_};
	$size -= 1000000 if /README/;
	$i=1;
	while (($newtot = int($tot[$i] + $size + $size/40 + $FILEOVERHEAD)) >
	    $MAXKITSIZE-$KITOVERHEAD && $tot[$i]) {
	      $i++;
	}
	$tot[$i] = $newtot;
	print "Adding $_ to kit $i giving $newtot bytes\n" if $opt_v;
	$kit{$_} = $i;
	$list[$i] .= " $_";
    }
}

do manimake();

# make MANIFEST and MANIFEST.new say the same thing
sub manimake {
    die "You don't have a $NEWMANI file.  Run manifake.\n"
	unless -f "$NEWMANI";
    open(NEWMANI,$NEWMANI) || die "Can't read $NEWMANI";
    while (<NEWMANI>) {
	($key,$val) = ($_,'') unless ($key,$val) = /^(\S+)\s+(.*)/;
	$comment{$key} = $val;
    }
    close NEWMANI;

    open(MANI,">$MANI") || die "Can't create $MANI.\n";
    print MANI
"After all the $package kits are run you should have the following files:

Filename		Kit Description
--------		--- -----------
";
    for (sort keys(comment)) {
	printf MANI "%-24s%2s %s\n",$_,$kit{$_},$comment{$_};
    }
    close MANI;
}

$numkits = $#list;
if ($numkits > 9) {
    $sp = '%02d';
}
else {
    $sp = '%d';
}

for ($kitnum = 1; $kitnum <= $numkits; $kitnum++) {
    $list = $list[$kitnum];
    $kit = sprintf("$package.kit" . $sp,$kitnum);
    print "*** Making $kit ***\n" if $opt_v;
    open(KIT,">$kit") || die "Can't create $kit.\n";

    do kitleader();

    @files = split(' ',$list);
    reset 'X';
    for $file (@files) {
	$_ = $file;
	while (s|^(.*)/.*$|$1|) {
	    push(@Xdirs,$_) unless $Xseen{$_}++;
	}
    }
    print KIT "mkdir ",join(' ', sort @Xdirs)," 2>/dev/null\n";

    foreach $file (@files) {
	print "\t",$file,"\n" if $opt_v;
	print KIT "echo Extracting $file\n";
	print KIT "sed >$file <<'!STUFFY!FUNK!' -e 's/X//'\n";
	open file;
	while (<file>) {
	    print KIT 'X',$_;
	}
	close file;
	print KIT "!STUFFY!FUNK!\n";
    }
    do kittrailer();
    chmod 0755, $kit;
}

sub kitleader {
    print KIT
"#! /bin/sh

# Make a new directory for the $package sources, cd to it, and run kits 1
# thru $numkits through sh.  When all $numkits kits have been run, read README.

echo \"This is $package $baserev kit $kitnum (of $numkits).  If kit $kitnum is complete, the line\"
echo '\"'\"End of kit $kitnum (of $numkits)\"'\" will echo at the end.'
echo \"\"
export PATH || (echo \"You didn't use sh, you clunch.\" ; kill \$\$)
";
}

sub kittrailer {
    $rangelist = '';
    for ($i = 1; $i <= $numkits; $i++) {
	$rangelist .= ' ' . $i;
    }
    print KIT
"echo \"\"
echo \"End of kit $kitnum (of $numkits)\"
cat /dev/null >kit${kitnum}isdone
run=''
config=''
for iskit in$rangelist; do
    if test -f kit\${iskit}isdone; then
	run=\"\$run \$iskit\"
    else
	todo=\"\$todo \$iskit\"
    fi
done
case \$todo in
    '')
	echo \"You have run all your kits.  Please read README and then type Configure.\"
	chmod 755 Configure
	;;
    *)  echo \"You have run\$run.\"
	echo \"You still need to run\$todo.\"
	;;
esac
: Someone might mail this, so...
exit
";
}
sub readpackage {
    if (! -f '.package') {
        if (-f '../.package' || -f '../../.package') {
            die "Run in top level directory only.\n";
        }
        else {
            die "No .package file!  Run packinit.\n";
        }
    }
    open(package,'.package');
    while (<package>) {
        next if /^:/;
        next if /^#/;
        if (($var,$val) = /^\s*(\w+)=(.*)/) {
            $val = "\"$val\"" unless $val =~ /^['"]/;
            eval "\$$var = $val;";
        }
    }
    close package;
}

