<?php
//
//
//    Copyright 2011 user89104
//
//
//    This file is part of emCORE.
//
//    emCORE is free software: you can redistribute it and/or
//    modify it under the terms of the GNU General Public License as
//    published by the Free Software Foundation, either version 2 of the
//    License, or (at your option) any later version.
//
//    emCORE is distributed in the hope that it will be useful,
//    but WITHOUT ANY WARRANTY; without even the implied warranty of
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
//    See the GNU General Public License for more details.
//
//    You should have received a copy of the GNU General Public License along
//    with emCORE.  If not, see <http://www.gnu.org/licenses/>.
//
//

/************** CONFIG *****************/
$project_dir dirname(__FILE__);
$target_dir 'target';
$error_dir 'errors';
$inprogress_dir 'inprogress';

$builds_limit 10;
$build_types = array('bin''ucl''log''ubi''emcoreapp''emcorelib''bootnote');
/************ END CONFIG ***************/

$projects $libs $apps $errors $targets = array();

$projects_dir dir($project_dir);

while (
false !== ($project $projects_dir->read())) {
    if (
        
'.' === $project[0] ||
        !
is_dir($project_dir DIRECTORY_SEPARATOR $project) ||
        !
is_dir($project_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR $target_dir) ||
        !
is_dir($project_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR $error_dir)
    ) {
        continue;
    }
    
    if (
=== strpos($project'lib')) {
        
$libs[] = $project;
    }
    elseif (
=== strpos($project'app-')) {
        
$apps[] = $project;
    }
    else {
        
$projects[] = $project;
    }
    
    
$targets[$project] = array();
    
$errors[$project] = array();
    
$inprogress[$project] = array();
    
    
$curr_project_dir $project_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR;
    
    
$errors_dir dir($curr_project_dir $error_dir);
    
$progress_dir dir($curr_project_dir $inprogress_dir);

    while (
false !== ($filename $progress_dir->read())) {
        
$curr_file $curr_project_dir $inprogress_dir DIRECTORY_SEPARATOR $filename;

        if (
'.' === $filename[0] || !is_file($curr_file) || !is_readable($curr_file)) {
            continue;
        }

        
$rev substr($filename1);
        
$inprogress_targets file($curr_file);
        
$inprogress[$project][$rev] = array();

        foreach (
$inprogress_targets as $target) {
            
$inprogress[$project][$rev][] = trim($target);
        }
    }
    
$progress_dir->close();
    
krsort($inprogress[$project]);

    while (
false !== ($filename $errors_dir->read())) {
        
$curr_file $curr_project_dir $error_dir DIRECTORY_SEPARATOR $filename;
        
        if (
'.' === $filename[0] || !is_file($curr_file) || !is_readable($curr_file)) {
            continue;
        }
        
        
$rev substr($filename1);
        
$failed_targets file($curr_file);
        
$errors[$project][$rev] = array();
        
        foreach (
$failed_targets as $target) {
            
$errors[$project][$rev][] = trim($target);
        }
    }
    
    
$errors_dir->close();
    
krsort($errors[$project]);

    
$targets_dir dir($curr_project_dir $target_dir . ($project === 'umsboot' '/umsboot' ''));

    while (
false !== ($target $targets_dir->read())) {
        if (
'.' === $target[0] || !is_dir($curr_project_dir $target_dir DIRECTORY_SEPARATOR $target)) {
            continue;
        }
        
        
$targets[$project][] = $target;
    }
    
    
$targets_dir->close();
    
sort($targets[$project]);
}

$projects_dir->close();

sort($projects);
sort($apps);
sort($libs);

$projects array_merge(
    
$projects,
    
array_merge(
        
false !== array_search($apps'app-bootmenu') ?
            array(
'app-bootmenu') :
            array(),
        
false !== array_search($apps'app-uninstaller') ?
            array(
'app-uninstaller') :
            array(),
        
array_diff($apps, array(
            
'app-bootmenu',
            
'app-uninstaller',
        ))
    ),
    
$libs
);

if (isset(
$_GET['src'])) {
    switch (
$_GET['src']) {
        case 
'plain':
            
header('Content-Type: text/plain; charset=utf-8');
            
readfile(__FILE__);
        break;
        case 
'pretty':
            
show_source(__FILE__);
        break;
    }

    exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>freemyipod.org builds</title>
        <link rel="stylesheet" type="text/css" href="css/style.css" />
<?php
if ('%CF%80' === $_SERVER['QUERY_STRING']) { // seecret character
/*
seriously. don't ever think about using this link
unless your nickname is either TheSeven, Farthen or user890104
if we find out that someone is linking directly to it
we are going to change it, but it won't be as cool as it's now :)
*/
?>
        <style type="text/css">
/* <![CDATA[ */
#warning {
    display: none;
}

#builds {
    display: block;
}
/* ]]> */
        </style>
<?php
}
?>
    </head>
    <body>
        <div id="wrapper">
            <h1>freemyipod.org builds</h1>
            <div id="warning">
                <p class="important"><strong>These are <em>completely untested</em> development builds. They may contain serious bugs that might not be easy to recover from, including data loss or hardware damage.</strong></p>
                <p class="important">Only install these builds if you know what you're doing, most importantly how to recover from all kinds of problems. These builds are entirely unsupported, so you'll be completely on your own.</p>
                <p>With that in mind, if you really want to proceed, the automated builds can be found here:</p>
                <p>
                    <label>
                        <input type="checkbox" id="agreed" />
                        I have read the warning and I still want to access the builds
                    </label>
                </p>
                <p>
                    <button disabled="disabled" id="show_builds">Show builds</button>
                </p>
            </div>
            <div id="builds">
<?php
if (empty($projects)) {
?>
no projects found
<?php
}

foreach (
$projects as $project) {
?>
                <fieldset>
                    <legend><?php echo htmlspecialchars($project); ?></legend>
<?php
    
if (empty($targets[$project])) {
?>
    no builds found
<?php
    
}
?>
                    <table style="border-collapse: collapse">
                        <tr>
                            <th>&nbsp;</th>
<?php
    
foreach ($targets[$project] as $target) {
?>
                            <th>
                                <img src="images/<?php echo $target?>.png" alt="<?php echo $target?>" height="90" />
                                <div><?php echo $target?></div>
                            </th>
<?php
    
}
?>
                        </tr>
<?php
    $limit 
0;
    
    foreach (
$errors[$project] as $rev => $failed_targets) {
        if (
$limit >= $builds_limit) {
            break;
        }
?>
                        <tr>
                            <th><a href="http://websvn.freemyipod.org/revision.php?repname=freemyipod&amp;rev=<?php echo $rev?>">r<?php echo $rev?></a></th>
<?php
        
foreach ($targets[$project] as $target) {
?>
                            <td>
<?php
            
if (in_array($target$failed_targets)) {
?>
                                <div style="color: #f00;">FAILED</div>
<?php
            
}
            else {
                if (
            
array_key_exists($project$inprogress) &&
            
array_key_exists($rev$inprogress[$project]) &&
            
$inprogress[$project][$rev] != false &&
            
in_array($target$inprogress[$project][$rev])
        ) {
?>
                                <div style="color: #ff0;">IN PROGRESS</div>
<?php
                
}
                elseif (array() !== 
glob($project_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR $target_dir DIRECTORY_SEPARATOR $target DIRECTORY_SEPARATOR $project '-' $target '-r' $rev '.*')) {
?>
                                <div style="color: #0f0;">OK</div>
<?php
                
}
                elseif (array() !== 
glob($project_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR $target_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR $target DIRECTORY_SEPARATOR $project '-' $target '-r' $rev '.*') && $project === 'umsboot') {
?>
                                <div style="color: #0f0;">OK</div>
<?php
                
}
                else {
?>
                                &nbsp;
<?php
                
}
            }
            
            foreach (
$build_types as $type) {
                
$prefix $project_dir DIRECTORY_SEPARATOR;
                
$filename $project DIRECTORY_SEPARATOR $target_dir DIRECTORY_SEPARATOR $target DIRECTORY_SEPARATOR $project '-' $target '-r' $rev '.' $type;
                
                if (!
is_readable($prefix $filename) && $project === 'umsboot') {
                    
$filename $project DIRECTORY_SEPARATOR $target_dir DIRECTORY_SEPARATOR $project DIRECTORY_SEPARATOR $target DIRECTORY_SEPARATOR $project '-' $target '-r' $rev '.' $type;
                }
                
                if (
is_readable($prefix $filename)) {
?>
                                <a href="<?php echo $filename?>"><?php echo $type?></a>
<?php
                
}
            }
?>
                            </td>
<?php
        
}
?>
                        </tr>
<?php
        
++$limit;
    }
?>
                    </table>
                </fieldset>
<?php
}
?>
                <div class="clear"></div>
                <p id="view-source">view source: <a href="?src=plain">[plain]</a> <a href="?src=pretty">[pretty]</a></p>
            </div>
        </div>
        <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.8/jquery.min.js"></script>
        <script type="text/javascript" src="js/jquery.blockUI.js"></script>
        <script type="text/javascript" src="js/scripts.js"></script>
    </body>
</html>