#!/usr/bin/perl -w

#
#    Source modules that we can feasibly strip
# out immediately.
#
my @system_modules = (
	'python', 'bitstream_vera_fonts', 'freetype',
	'jpeg', 'dictionaries', 'libxml2', 'zlib', 'moz'
);

#
# More advanced topics for further work
#
my @incomplete_modules = (
	'curl', 'expat', 'icu', 'libxmlsec',
	'nas', 'neon', 'msfontextract',
	'regexp', 'rhino', 'sablot', 'sane', 'stlport', 'twain',
	'unixODBC', 'x11_extensions'
);

# Perl grep is appallingly useless
sub working_grep($@)
{
  my $match = shift;
  while (my $elem = shift) {
      $elem eq $match && return 1;
  }
  return 0;
}

sub read_modules($)
{
  my $dirh;
  my $path = shift;
  my @elems;
  my @sanity = ( 'solenv', 'sc', 'sw', 'jpeg', 'moz', 'curl', 'io' );

  opendir ($dirh, $path) || die "Can't open $path: $!";  
  while (my $dir = readdir ($dirh)) {
	$dir =~ m/^\./ && next;
	push @elems, $dir;
  }
  closedir ($dirh);

  for my $check (@sanity) {
    working_grep ($check, @elems) || print "Missing module $check\n";
  }

  return @elems;
}

my $dest;
my $src;
my $help = 0;

for my $arg (@ARGV) {
  if ($arg eq '-h' || $arg eq '--help') {
    $help = 1;
  }
  if (!defined $src) {
    $src = $arg;
    -d "./$src" || die "Src dir name: not in this directory : '$src'";

  } elsif (!defined $dest) {
    $dest = $arg;
  }
}

if (!defined $dest) {
  $dest = '.';
}
if (!defined $src) {
  $help = 1;
}

if ($help) {
  print "src-package: <src-fir-name> [<destination-directory>]\n";
  print "  the src will be packed into several archives\n";
  print"   prefixed by the last path element \n";
  exit 0;
}

$src =~ s/\/*$//;
my $basename = $src;
$basename =~ s/.*\///;

my @all_modules = read_modules ($src);
my @core_modules;
my @binfilter_modules;

for my $module (@all_modules) {
    if (working_grep ($module, @system_modules)) {
      # skip - already there
    } elsif ($module eq 'binfilter') {
	push @binfilter_modules, $module;
    } else {
	push @core_modules, $module;
    }
}

sub do_pack($$$)
{
    my ($name, $suffix, $modules) = @_;
    print "Packing $name modules: @{$modules}\n";
    my $args = '';
    for my $module (@{$modules}) {
      $args .= $src . '/' . $module. ' ';
    }
    system ("tar cjf $dest/$basename$suffix.tar.bz2 $args") && die "Failed to pack $basename$suffix: $!";
    system ("md5sum $dest/$basename$suffix.tar.bz2 > $dest/$basename$suffix.tar.bz2.md5") && die "Failed to md5sum";
}

do_pack ("binfilter", "-binfilter", \@binfilter_modules);
do_pack ("system",    "-system",    \@system_modules);
do_pack ("core",      "-core",      \@core_modules);
print "Done.\n";

