#!/usr/bin/perl


$checkver=shift;

$base=$0;
$slackver=$0;

$slackver=~s/^.*check_order.pl//;
if(length($slackver)==0) {
  if(open(F,"/etc/slackware-version"))
  {
     $slackver=<F>;
     ($slackver)=($slackver=~m/([\d\.]+)/);
     close(F);
  }
  else { $slackver="14.2"; }
}
else {
  $slackver=substr($slackver,1);
}
$file="installation_order-$slackver.txt";

if($base=~m/\//) {
  $base=substr($0,0,rindex($0,'/'));
}
else {
  $base=".";
}

sub dopack {
  my $pack=shift;
  $todo{$pack}=-1;
  if($checkver)
  {
    print STDERR "Checking $pack...\n";
    $file="$pack.SlackBuild";
    if(! -f "$pack/$file") {
      $file=`cd $pack;\\ls *.SlackBuild|head -1`;
    }
    system("cd $pack ; checkver.pl $file \`if [[ -f x11-build-script.sh ]]; then echo x11.SlackBuild ; fi\`");
  }
  else
  {
    print "- $pack\n";
  }
}

sub scan {
  $prefix=shift;
  foreach(sort keys %todo)
  {
    if(m/$prefix/ && $todo{$_}>0) {
      dopack($_);
    }
  }
}

@ls=split(' ',`\\ls`);
foreach(@ls) {
  if(-d $_) {
    $todo{$_}=1;
  }
}



if(open(F,"$base/$file"))
{
  while(<F>) {
    if(m/^- /)
    {
      ($pack)=m/^- (\S+)/;
      if($pack=~m/\//)
      {
        ($dir,$pack)=split('/',$pack);
      }
      if($todo{$pack}>0) {
        dopack($pack);
      }
      elsif($pack eq "x11") {
        ($tag,$dpack,$sec,$prg)=split(' ');
	if($sec=~m/^\(/) {
	  $sec=$prg=undef;
	}
	elsif($prg=~m/^\(/)
	{
	  $prg=undef;
	}
	if(length($prg)>0) { 
	  $pack=$prg;
	  if($todo{$pack}>0) {
	    dopack($pack);
	  }
	}
	else {
	  if($sec eq "xserver") { scan("^xorg-server"); }
	  elsif($sec eq "app") { scan("^".join('$|^',qw(appres bdftopcf beforelight bitmap compiz editres fonttosfnt fslsfonts fstobdf iceauth ico intel listres luit mkcomposecache mkfontdir mkfontscale oclock rendercheck rgb sessreg setxkbmap showfont smproxy transset twm viewres x11perf xauth xbacklight xbiff xcalc xclipboard xclock xcm xcmsdb xcompmgr xconsole xcursorgen xdbedizzy xditview xdm xdpyinfo xdriinfo xedit xev xeyes xf86dga xfd xfontsel xfs xfsinfo xgamma xgc xhost xinit xinput xkbcomp xkbevd xkbprint xkbutils xkill xload xlogo xlsatoms xlsclients xlsfonts xmag xman xmessage xmh xmodmap xmore xpr xprop xrandr xrdb xrefresh xscope xset xsetroot xsm xstdcmap xvidtune xvinfo xwd xwininfo xwud)).'$'); }
	  elsif($sec eq "data") { scan("^".join('$|^',qw(xbitmaps xcursor-themes xkeyboard-config)).'$'); }
	  elsif($sec eq "doc") { scan('^xorg-docs|^xorg-sgml'); }
	  elsif($sec eq "driver") { scan('^xf86-'); }
	  elsif($sec eq "font") { scan('^encodings$|^font-adobe|^font-alias|^font-arabic|^font-bh|^font-bitstream|^font-[cdijmsw]|^font-util|^font-xfree86'); }
	  elsif($sec eq "lib") { scan('^libX|^libFS|^libICE|^libSM|^libdmx|^libfontenc|^libpciaccess|^libxkbfile|^libxshm|^pixman|^xtrans$'); }
	  elsif($sec eq "proto") { scan('proto$|^evieext$'); }
	  elsif($sec eq "util") { scan("^".join('$|^',qw(gccmakedep imake lndir makedepend util-macros xorg-cf-files)).'$'); }
	  elsif($sec eq "xcb") { scan('^libxcb|^libpthread-stubs|^xcb-|^xpyb'); }
	}
      }
      elsif($pack eq "" && $dir eq "xfce")
      {
        scan("^xfce|^[Tt]hunar|^xfconf|^xfdesktop|^xfwm4|^libxfce|^gtk-xfce|^orage|^tumbler|^exo|^garcon");
      }
      elsif($pack eq "" && $dir eq "kde")
      {
        scan("^kde");
      }
    }
  }
  close(F);
  print "#OTHERS:\n";
  foreach(sort keys %todo)
  {
    if($todo{$_}>0) {
      dopack($_);
    }
  }
}
else {
  print STDERR "ERROR: cannot open order file '$base/$file': $!\n";
}
