#!/usr/bin/perl -w
#
# E17 Gentoo build script. 0.2.1
# Only emerge method is actually done, too lazy
# to do a real cvs build :P
# You need to have an updated /etc/portage/package.keywords
# Unofficial e17 docs : http://www.lude.net/edocs/
# Contact: <lycos42@free.fr>
#
#
$version = "0.3.0";
# Changelog:
# 0.3.0   : -Added Non Interactive mode (as requested)
#	     You can now specify manually wanted items
#	     (ex: /path/to/estuff.pl eclair envision engage)
#	    -Added FAQ (show_help())
#	    -Misc fixes (Build $item+fill() now in build function)
#
# 0.2.1   : -Added more eapps...
#           -Misc fixes...
#
# 0.2.0   : -Added 2 new choices
#	     -Compile everything at once.
#	     -Exit :D (no more ctrl-c :D)
#          -Better status, typo fixes.
#
# 0.1.0   : -Initial script
#
# Last Modified : 02/05/2005

# Configuration Values
$build_method = "emerge";

@e17_efl =
(
    "imlib2",
    "dev-db/edb",
    "eet",
    "imlib2_loaders",
    "evas",
    "ecore",
    "epeg",
    "embryo",
    "edje",
    "media-libs/epsilon",
    "esmart",
    "emotion",
    "ewl",
    "engrave",
    "etk",
);

@e17_wm =
(
    "e",
);

@e_modules =
(
    "e_modules-alarm",
    "e_modules-bling",
    "e_modules-cpu",
    "e_modules-deskshow",
    "e_modules-emu",
    "e_modules-flame",
    "e_modules-language",
    "e_modules-mail",
    "e_modules-mem",
    "e_modules-mixer",
    "e_modules-moon",
    "e_modules-net",
    "e_modules-photo",
    "e_modules-rain",
    "e_modules-screenshot",
    "e_modules-slideshow",
    "e_modules-snow",
    "e_modules-taskbar",
    "e_modules-tclock",
    "e_modules-uptime",
    "e_modules-weather",
    "e_modules-winselector",
    "e_modules-wlan",
);

@e17_misc =
(
    "entice",
    "entrance",
    "eclair",
    "examine",
    "equate",
    "embrace",
    "eclips",
    "elicit",
    "elation",
    "envision",
    "enterminus",
    "entropy",
);

#Color
$MODE_BOLD     = "tput bold";
$MODE_NORMAL   = "tput sgr0";

$COLOR_SUCCESS = "tput setf 2";
$COLOR_FAIL    = "tput setf 4";


sub fill
{
    my ($item) = @_;

    my $spaces = 40 - length($item);
    while ($spaces-- > 0)
    {
	print " ";
    }
}

sub show_help
{
    print "**********************************************************************\n";
    print "*                            Help Section                            *\n";
    print "**********************************************************************\n";
    print "\n";
    print "Q: How to use this script ?\n";
    print "A: You have two ways to use it: \n";
    print "	- Interactive mode => Just launch the script without any\n";
    print "	  arguments, and choose the wanted task...\n";
    print "	  Example : /path/to/estuff.pl <Enter> Then 1,...\n";
    print "\n";
    print "	- Non Interactive mode => Just use this script as the emerge\n";
    print "	  command by specifying packages names you want to build.\n";
    print "	  Example : /path/to/estuff.pl eclair envision\n";
    print "\n";
    print "Q: Some items fails quickly ! wtf ?\n";
    print "A: Are you sure that your /etc/portage/package.keywords is containing\n";
    print "   every item this script installs ?\n";
    print "   Have a look at mine here : \n";
    print "   http://lycos42.free.fr/e17/cvs/package.keywords\n";
    print "\n";
    print "Keep in mind that this script should be only used for e17 cvs...\n";
    print "\n";

    print "Press a key to continue...\n";
    $choice = <STDIN>;
    chomp($choice);
    main();
}

sub show_status
{
    my ($status, $last) = @_;

    if ($status == 0)
    {
	print "\n".`$MODE_BOLD`."Built all items successfully !".`$MODE_NORMAL`."\n\n";
    }
    else
    {
	if ($last == 1)
	{
	    print "\n".`$MODE_BOLD`.`$COLOR_FAIL`."Full build encountered errors...".`$MODE_NORMAL`."\n\n";
	}
	else
	{
	    print "\n".`$MODE_BOLD`.`$COLOR_FAIL`."Some items failed ...".`$MODE_NORMAL`."\n\n";
	}
    }

    if ($last == 1)
    {
	print "Press a key to continue...\n";
	$choice = <STDIN>;
	chomp($choice);
	main();
    }
    else
    {
	return $status;
    }
}

sub build
{
    my ($item) = @_;

    print " -> Building $item";
    fill($item);

    if ($build_method eq "emerge")
    {
	if (system("emerge $item &> /dev/null") == 0)
	{
	    print `$MODE_BOLD`."[ ".`$COLOR_SUCCESS`."OK".`$MODE_NORMAL`.`$MODE_BOLD`." ]".`$MODE_NORMAL`."\n";
	    return 0;
	}
	else
	{
	    print `$MODE_BOLD`."[ ".`$COLOR_FAIL`."FAILED".`$MODE_NORMAL`.`$MODE_BOLD`." ]".`$MODE_NORMAL`."\n";
	    return 1;
	}
    }
    elsif ($build_method eq "cvs")
    {
	;# cvs co etc...
    }
}

sub build_all
{
    print `$MODE_BOLD`."Building Everything (this may take a while...)".`$MODE_NORMAL`."\n\n";
    my $totalstatus = 0;


    $totalstatus += build_efl();
    $totalstatus += build_e17();
    $totalstatus += build_e_modules();
    $totalstatus += build_emisc();
    show_status($totalstatus, 1);
}

sub build_efl
{
    print `$MODE_BOLD`."Building Enlightenment Foundation Libraries (EFL)".`$MODE_NORMAL`."\n\n";

    my $status = 0;
    foreach my $item (@e17_efl)
    {
	$status += build($item);
    }
    show_status($status, 0);
}

sub build_e17
{
    print `$MODE_BOLD`."Building Enlightenment 0.17 CVS (e17 module)".`$MODE_NORMAL`."\n\n";

    my $status = 0;
    foreach my $item (@e17_wm)
    {
	$status += build($item);
    }
    show_status($status, 0);
}

sub build_e_modules
{
print `$MODE_BOLD`."Building Enlightenment Modules ".`$MODE_NORMAL`."\n\n";

my $status = 0;
foreach my $item (@e_modules)
{
$status += build($item);
}
show_status($status, 0);
}

sub build_emisc
{
    print `$MODE_BOLD`."Building Enlightenment Misc Applications (engage,entrance,erss,...)".`$MODE_NORMAL`."\n\n";

    my $status = 0;
    foreach my $item (@e17_misc)
    {
	$status += build($item);
    }
    show_status($status, 0);
}

sub main
{
    system("tput clear");
    print "**********************************************************************\n";
    print "*                      E17 Gentoo Autobuilder $version                  *\n";
    print "**********************************************************************\n";
    print "\n";

    print "1) Build Enlightenment Foundation Libraries (EFL)\n";
    print "2) Build Enlightenment 0.17 CVS (e17 module)\n";
    print "3) Build Enlightenment Modules \n";
    print "4) Build Enlightenment Misc Applications (engage,entrance,erss,...)\n";
    print "*) Build Everything ...\n";
    print "\n";
    print "?) Help\n";
    print "0) Exit\n";
    print "\n";
    print "Choice: ";
    $choice = <STDIN>;
    chomp($choice);
    print "\n";

    if ($choice eq "1")	{ build_efl(); }
    elsif ($choice eq "2") { build_e17(); }
    elsif ($choice eq "3") { build_e_modules(); }
    elsif ($choice eq "4") { build_emisc(); }
    elsif ($choice eq "*") { build_all(); }
    elsif ($choice eq "?") { show_help(); }
    elsif ($choice eq "0") { exit 0; }
    else { print "Invalid Choice\n"; sleep (2); main(); }
}


if (@ARGV)
{
    if ($#ARGV == 0 && ($ARGV[0] eq "-h" || $ARGV[0] eq "--help"))
    {
	show_help();
    }
    print `$MODE_BOLD`."Building [@ARGV] ...".`$MODE_NORMAL`."\n\n";
    my $status = 0;
    foreach my $item (@ARGV)
    {
	$status += build($item);
    }
    show_status($status, 1);
}
else
{
    main();
}


