blob: 4ea7aea4e3452a0160c998647c15a85828626dff [file] [log] [blame]
<?php
/******************************************************************************
* Copyright (c) 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial implementation
****************************************************************************/
function doLatest($releases, $label = "Releases")
{
global $showMax, $showAll, $sortBy;
if (sizeof($releases)>0)
{
print "<div class=\"homeitem3col\">\n";
print "<a name=\"latest\"></a><h3>Latest $label</h3>\n";
print "<ul class=\"releases\">\n";
$c = 0;
foreach ($releases as $rID => $rbranch)
{
$ID = preg_replace("/^(\d{12})([IMNRS])$/", "$2$1", $rID);
$branch = preg_replace("/.$/", "", $rbranch);
print outputBuild($branch, $ID, $c++);
if (!$showAll && $c == $showMax && $c < sizeof($releases))
{
print showToggle($showAll, $showMax, $sortBy, sizeof($releases));
break;
}
else if ($showAll && sizeof($releases) > $showMax && $c == sizeof($releases))
{
print showToggle($showAll, $showMax, $sortBy, sizeof($releases));
}
}
print "</ul>\n";
print "</div>\n";
}
}
function reorderAndSplitArray($arr, $buildTypes)
{
// the first dimension's order is preserved (kept as it is in the config file)
// sort the second dimension using the IMNRS order in $buildTypes
// rsort the third dimension
$new = array();
$rels = array();
foreach ($buildTypes as $br => $types)
{
foreach ($types as $bt => $names)
{
if ($bt == "R" && isset($arr[$br][$bt]))
{
$id = $arr[$br][$bt][0];
$rels[substr($id,1) . $bt] = $br . $bt;
}
else if (array_key_exists($br, $arr) && array_key_exists($bt, $arr[$br]) && is_array($arr[$br][$bt]))
{
$new[$br][$bt] = $arr[$br][$bt];
rsort($new[$br][$bt]);
}
}
}
return array($new,$rels);
}
function getBuildsFromDirs() // massage the builds into more useful structures
{
global $PWD, $sortBy;
$branchDirs = loadDirSimple($PWD, ".*", "d");
$buildDirs = array();
foreach ($branchDirs as $branch)
{
if ($branch != "OLD")
{
$buildDirs[$branch] = loadDirSimple("$PWD/$branch", "[IMNRS]\d{12}", "d");
}
}
$builds_temp = array();
foreach ($buildDirs as $br => $dirList)
{
foreach ($dirList as $dir)
{
$ty = substr($dir, 0, 1); //first char
if ($sortBy != "date")
{
$builds_temp[$br][$ty][] = $dir;
}
else
{
$dttm = substr($dir, 1); // last 12 digits
$a = $dttm . $ty;
$b = $br . $ty;
$builds_temp[$a] = $b;
}
}
}
return $builds_temp;
}
function getBuildTypes($branches, $buildtypes)
{
$arr = array();
foreach ($branches as $branch)
{
foreach (array_keys($buildtypes) as $z)
{
if (!array_key_exists($branch, $arr))
{
$arr[$branch] = array();
}
// [2.0][N]
$arr[$branch][$z] = "$branch {$buildtypes[$z]} Build";
}
}
return $arr;
}
function IDtoDateStamp($ID, $style) // given N200402121441, return date("D, j M Y -- H:i (O)")
{
$styles = array('Y/m/d H:i', "D, j M Y -- H:i (O)", 'Y/m/d');
$m = null;
if (preg_match("/(\d{4})(\d\d)(\d\d)(?:_)?(\d\d)(\d\d)/", $ID, $m))
{
$ts = mktime($m[4], $m[5], 0, $m[2], $m[3], $m[1]);
return date($styles[$style], $ts);
}
return "";
}
function createFileLinks($dls, $PWD, $branch, $ID, $pre2, $filePreProj, $ziplabel = "") // the new way - use a ziplabel pregen'd from a dir list!
{
global $PR, $suf, $proj, $projct, $filePreStatic, $extraZips, $projects, $showBuildResults;
$uu = 0;
if (!$ziplabel)
{
$zips_in_folder = loadDirSimple("$PWD/$branch/$ID/", "(\.zip|\.tar\.gz)", "f");
$ziplabel = preg_replace("/(.+)\-([^\-]+)(\.zip|\.tar\.gz)/", "$2", $zips_in_folder[0]); // grab first entry
}
$cnt=-1; // for use with static prefix list
if (!isset($dls[$proj]) && isset($dls["/"]))
{
$dls[$proj] = $dls["/"];
}
if (!isset($dls[$proj]))
{
// set default
$flip = array_flip($projects);
$dls[$proj] = array($flip[$projct] => array(
"<acronym title=\"Archived Update Site\"> <img alt=\"Click to download archived All-In-One p2 Repo Update Site\" src=\"/gmf-tooling/images/download-update-zip.gif\"/> <b style=\"color:green\">All-In-One Update Site</b></acronym>" => "-tooling-update",
"SDK (Tooling, Runtime Extension)" => "-tooling-sdk",
"Runtime Extension only" => "-tooling-runtime",
"Automated Tests" => "-tests",
"Simplemap (Optional, Requires SDK)"=>"-tooling-simplemap",
"Xtend2 Generators (Optional, Requires SDK)"=>"-tooling-xtend2",
));
}
$echo_out_all = "";
if (!$showBuildResults)
{
foreach (array_keys($dls[$proj]) as $z)
{
$echo_out_all .= "<li class=\"separator\"><img src=\"/gmf-tooling/images/downloadLink.gif\" alt=\"Download\"/> " . fileFound("$PWD/", "$branch/$ID/", "$z Build Artifacts") . "</li>\n";
break;
}
}
else
{
foreach (array_keys($dls[$proj]) as $z)
{
$echo_out = "";
foreach ($dls[$proj][$z] as $label => $u)
{
$cnt++;
if (!is_array($u)) // for compatibilty with uml2, where there's no "RT" value in $u
{
$u = $u ? array("$u") : array("");
}
// support EMF page with three different valid prefixes which can
// overlap when searched using dynamic check below
if ($filePreStatic && is_array($filePreStatic) && array_key_exists($proj,$filePreStatic))
{
$filePreProj = array($filePreStatic[$proj][$cnt]); // just one value to check
}
$filePreProj = array('gmf');
$tries = array();
foreach ($u as $ux)
{
foreach ($filePreProj as $filePre)
{
$tries[] = "$branch/$ID/$pre2$filePre$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
$tries[] = "$branch/$ID/$filePre$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
$tries[] = "$branch/$ID/$pre2$filePre$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
$tries[] = "$branch/$ID/$filePre$ux-incubation-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
$tries[] = "$branch/$ID/$filePre-tooling$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
}
}
$outNotFound = "<i><b>$pre2</b>$filePre";
if (sizeof($u) > 1 ) {
$outNotFound .= "</i>{"; foreach ($u as $ui => $ux) {
$outNotFound .= ($ui>0 ? "," : "") . $ux;
} $outNotFound .= "}<i>";
}
else
{
$outNotFound .= $u[0];
}
$outNotFound .= "-$ziplabel ...</i>";
$out = "";
foreach ($tries as $y)
{
if (is_file("$PWD/$y"))
{
$out = fileFound("$PWD/", $y, $label);
break;
}else{
if(strpos($y, 'update')){
$name = str_replace('update', 'tooling-update' , $y);
$out = fileFound("$PWD/", $y, $label);
break;
};
if(strpos($y, 'tooling-sdk')){
$name = str_replace('tooling-sdk', 'sdk' , $y);
$out = fileFound("$PWD/", $y, $label);
break;
}
break;
}
}
if ($out)
{
$echo_out .= "<li class=\"separator\">\n";
$echo_out .= $out;
$echo_out .= "</li>\n";
}
else if (!isset($extraZips) || !is_array($extraZips) || !in_array($filePre . $u[0],$extraZips)) // $extraZips defined in downloads/index.php if necessary
{
// $echo_out .= "<li>\n";
// $echo_out .= $outNotFound;
// $echo_out .= "</li>\n";
}
$uu++;
}
if ($echo_out) // if the whole category is empty, don't show it (eg., GEF)
{
$echo_out_all .= "<li><img src=\"/gmf-tooling/images/downloadLink.gif\" alt=\"Download\"/>$z\n<ul>\n" . $echo_out . "</ul>\n</li>\n";
}
}
}
return $echo_out_all;
}
/* if $styled = 0 or false, return text only */
function showBuildResults($PWD, $path, $styled=1) // given path to /../downloads/drops/M200402021234/
{
global $downloadPre, $pre, $numzips, $PR, $projct;
$mid = "$downloadPre/$PR" . ($projct == "" ? $projct : "/$projct") . "/downloads/drops/";
$out = "";
$buildlog = "$PWD${path}buildlog.txt";
$buildlog_cache = null;
clearstatcache();
$warnings = 0;
$errors = 0;
$failures = 0;
$didnotruns = 0;
$result = "";
$icon = "";
$indexHTML = "";
$compilelogSummary = "";
$link = "";
$link2 = "";
$ID = substr($path, -14);
if (!$icon && (is_file("$PWD${path}index.html") || is_file("$PWD${path}index.php")))
{
$indexHTML = is_file("$PWD${path}index.html") ? file_get_contents("$PWD${path}index.html") : "";
$zips = loadDirSimple($PWD . $path, "(\.zip|\.tar\.gz)", "f"); // get files count
$md5s = is_dir($PWD . $path . "/checksum") ? loadDirSimple($PWD . $path . "/checksum", "(\.zip\.md5|\.tar\.gz\.md5)", "f") :
loadDirSimple($PWD . $path, "(\.zip\.md5|\.tar\.gz\.md5)", "f"); // get files count
if ((sizeof($zips) >= $numzips && sizeof($md5s) >= $numzips))
{
//check testresults/chkpii/ for results
if (is_file("$PWD${path}testresults/chkpii/org.eclipse.nls.summary.txt"))
{
$chkpiiResults = file_get_contents("$PWD${path}testresults/chkpii/org.eclipse.nls.summary.txt");
// eg, file contains:
//htm: 6 E, 0 W
//xml: 1 E, 1 W
//properties: 0 E, 2 W
$regs = null;
preg_match_all("/^\S+: (\d+) E, (\d+) W$/m", $chkpiiResults, $regs);
for ($i = 0; $i < sizeof($regs[0]); $i++)
{
$errors += $regs[1][$i];
$warnings += $regs[2][$i];
$icon = "not";
$link = "$pre$mid${path}testresults/chkpii/";
$link2 = "$pre$mid${path}testresults/chkpii/";
}
}
// check JUnit results
$files = loadDirSimple("$PWD${path}testresults/xml/", ".xml", "f");
$out = "";
$noProblems = true;
foreach ($files as $file)
{
$results = getTestResultsJUnitXML("$PWD${path}testresults/xml/" . $file);
if ($results && is_array($results))
{
$errors += $results[0];
$failures += $results[1];
$didnotruns += $results[2];
$icon = "not";
$results = null;
}
}
//check compilelogs/summary.txt for results
if (is_file("$PWD${path}compilelogs/summary.txt"))
{
$compilelogSummary = file_get_contents("$PWD${path}compilelogs/summary.txt");
$link2 = "http://www.eclipse.org/$PR/downloads/testResults.php?hl=1&amp;project=$projct&amp;ID=" . substr($path, 0, strlen($path) - 1);
if ($compilelogSummary)
{
$m = null;
if (preg_match("/(\d+)P, (\d+)W, (\d+)E, (\d+)F/", $compilelogSummary, $m))
{
$warnings += $m[2];
$errors += $m[3];
$failures += $m[4];
}
}
}
if ($errors)
{
$icon = "not";
$result = "ERROR";
}
else if ($didnotruns)
{
$icon = "not";
$result = "CAUTION";
}
else
{
$icon = ($warnings ? "check-maybe" : "check");
$result = "";
}
//parse out the check/fail icons in index.html, if we haven't failed already
if ($icon != "not" && $indexHTML)
{
if (preg_match("/<font size=\"-1\" color=\"#FF0000\">skipped<\/font>/", $indexHTML))
{
$icon = "check-maybe";
$result = "Skipped ";
}
else if (preg_match("/(?:<!-- Examples -->.*FAIL\.gif|FAIL\.gif.*<!-- Automated Tests -->)/s", $indexHTML))
{
$icon = "not";
$result = "FAILED ";
}
else if (preg_match("/<!-- Automated Tests -->.*FAIL\.gif.*<!-- Examples -->/s", $indexHTML))
{
$icon = "check-tests-failed";
$result = "TESTS FAILED ";
}
}
}
}
if (!$icon)
{
// display in progress icon & link to log
$result = "...";
$icon = "question";
}
clearstatcache();
if (!$result && !is_dir("$PWD${path}testresults/xml/"))
{
$result = "Skipped ";
$icon = "check-maybe";
}
if (!$link) // return a string with icon, result, and counts (if applic)
{
$link = "http://download.eclipse.org/" . $mid . $path . "buildlog.txt";
}
if (!$link2) // link to console log in progress if it exists
{
$ID = substr($path, -14);
$conlog = "${path}testing/${ID}testing/linux.gtk_consolelog.txt";
$testlog = "http://www.eclipse.org/$PR/downloads/testResults.php?hl=1&amp;project=$projct&amp;ID=" . substr($path, 0, strlen($path) - 1);
$link2 = (is_file("$PWD$conlog") ? "$mid$conlog" : (is_file("$PWD$testlog") ? "$testlog" : $link));
$result = (is_file("$PWD$conlog") ? "Testing..." : $result);
}
if ($styled)
{
$out .= "<a " .
(preg_match("/FAIL|CAUTION|ERROR/", $result) || $didnotruns > 0 || $errors > 0 || $failures > 0 ? "class=\"fail\" " :
(preg_match("/Testing|Stalled|Skipped/",$result) || $warnings > 0 ? "class=\"warning\" " :
"class=\"success\" ") ) .
"href=\"$link2\">$result";
}
else
{
$out .= (preg_match("/FAIL|CAUTION|ERROR/", $result) || $didnotruns > 0 || $errors > 0 || $failures > 0 ? "FAILURE / " :
(preg_match("/Testing|Stalled|Skipped/",$result) || $warnings > 0 ? "WARNING / " :
"SUCCESS / ") ) .
"$result";
}
if ($errors == 0 && $failures == 0 && $warnings == 0 && !$result)
{
$out .= "OK";
}
else
{
$out .= ($result && $result != "..." && $result != "Skipped" ? ": " : "");
$out2 = "";
$out2 .= ($didnotruns > 0 ? "$didnotruns D N R, " : "");
$out2 .= ($errors > 0 ? "$errors E, " : "");
$out2 .= ($failures > 0 ? "$failures F, " : "");
$out2 .= ($warnings > 0 ? "$warnings W" : "");
$out .= preg_replace("/^(.+), $/","$1",$out2);
}
if ($styled)
{
$out .= "</a> <a href=\"$link\"><img src=\"/modeling/images/$icon.gif\" alt=\"$icon\"/></a>";
}
$replacements = array(
"SUCCESS / Success" => "SUCCESS",
"SUCCESS / ..." => "UNKNOWN",
"FAILURE / FAILED: " => "FAILED"
);
foreach ($replacements as $match => $replace)
{
if ($out == $match) $out = $replace;
}
return array(
$out,
$link2,
$link
);
}
function fileFound($PWD, $url, $label, $md5AlignRight = true, $icon = null)
{
global $downloadScript, $downloadPre, $PR, $proj;
$out = "";
$mid = "/modeling/gmp/gmf-tooling/downloads/drops/";
$md5files = array("$url.md5", preg_replace("#/([^/]+$)#", "/checksum/$1", $url) . ".md5");
foreach ($md5files as $md5file)
{
if (is_file($PWD.$md5file))
{
$out .= "<span style=\"float:right;\">&nbsp;&nbsp;" . pretty_size(filesize("$PWD$url")) . " (<a href='" .
"$downloadScript$mid$url.md5'>md5</a>)</span>";
break;
}
}
return "<span style=\"float:left;clear:left;\"><a href=\"$downloadScript$mid$url\">$icon</a>&nbsp;<a href=\"$downloadScript$mid$url\">$label</a></span>" . $out;
}
function doNLSLinksList($packs, $cols, $subcols, $packSuf, $folder, $isArchive = false)
{
global $downloadScript, $downloadPre, $PR, $proj, $projct;
foreach ($packs as $name => $packPre)
{
foreach ($cols as $alt => $packMid)
{
print "<li><img src=\"/gmf-tooling/images/downloadLink.gif\" alt=\"$alt\"/> $alt: ";
$ret = array();
if (sizeof($subcols) > 2)
{
print "<ul>\n";
$cnt = 0;
foreach ($subcols as $alt2 => $packMid2)
{
if ($cnt > 0 && $cnt % 2 == 0)
{
print "<li>" . join(", ", $ret) . "</li>\n";
$ret = array();
}
$ret[] = "<a href=\"" . ($isArchive ? "http://archive.eclipse.org" : $downloadScript) .
"$downloadPre/$PR$proj/downloads/drops/$folder$packPre$packMid-$packMid2$packSuf\">$alt2</a>";
$cnt++;
}
if (sizeof($ret) > 0)
{
print "<li>" . join(", ", $ret) . "</li>\n";
}
print "</ul>\n";
}
else
{
foreach ($subcols as $alt2 => $packMid2)
{
$ret[] = "<a href=\"" . ($isArchive ? "http://archive.eclipse.org" : $downloadScript) .
"$downloadPre/$PR$proj/downloads/drops/$folder$packPre$packMid-$packMid2$packSuf\">$alt2</a>";
}
print join(", ", $ret);
}
print "</li>\n";
}
}
}
function grep($pattern, $file, $file_cache = null)
{
$filec = $file_cache ? $file_cache : loadFile($file);
foreach ($filec as $z)
{
if (preg_match($pattern, $z))
{
$filec = array();
return true;
}
}
$filec = array();
return false;
}
function loadFile($file)
{
$maxfilesize = 64*1024; // 64K file limit
$filec = array();
if (is_file($file) && is_readable($file))
{
if (filesize($file) < ($maxfilesize))
{
$filec = file($file);
}
else
{
exec("tail -n50 $file", $filec); // just grab the last n lines
}
}
return $filec;
}
/* if $styled = 0 or false, return text only */
function getExtraTestsResults($branch, $ID, $styled=1)
{
global $jdk14testsPWD, $jdk50testsPWD, $jdk60testsPWD, $testsPWD;
$tests = "";
$s = array(0 => "");
$t = array(0 => "");
return array($s, $t, $tests);
}
function toPlainTextSummaries($summary)
{
global $debug, $PR, $projct;
if ($debug > 0) print htmlspecialchars($summary)."<br/>";
$miniSummary = "";
$textSummary = "";
// <a href="/modeling/emf/build/log-viewer.php?jdk50test=2.2.4/R200710030400/200710030422/" class="warning">511 W, 3 D</a>
// <a href="/modeling/emf/build/log-viewer.php?jdk50test=2.2.4/R200710030400/200710030422/"><img src="/modeling/images/check.gif" alt="OK"/></a>
// <a href="/modeling/emf/build/log-viewer.php?jdk50test=2.4.0/N200712241351/200712241410/">...</a>
$pattern = "#<a href=\"[^\"]+\?([^\"]+)=([^\"]+)\"(| class=\"[^\"]+\")>([^<]+)</a>#";
preg_match_all($pattern, $summary, $out, PREG_SET_ORDER);
/* [1] => jdk50test
[2] => /modeling/emf/build/log-viewer.php?jdk50test=2.2.4/R200710030400/200710030422/
[4] => 511 W, 3 D
*/
if (sizeof($out) > 0)
{
if ($debug > 0) {
print "\n-------1-------\n<br/><pre>"; print_r($out); print "</pre><br/>\n";
}
foreach ($out as $set)
{
$url = "http://" . $_SERVER["SERVER_NAME"] . "/" . $PR . "/" . $projct . "/" . $set[1] . "s/" . $set[2] . "testlog.txt";
$miniSummary .= " [" . strtoupper(str_replace("test", "", $set[1])) . ": " . $set[4] . "]";
$textSummary .= strtoupper(str_replace("test", "", $set[1])) . " Test (" . $set[4] . ")\t" . $url . "\n";
}
}
$patterns = array(
// <a href="../../../modeling/emf/tests/2.2.4/R200710030400/200710030422/results/svt.html"><img src="/modeling/images/check.gif" alt="OK"/></a>
"#<a href=\"([^\"]+/results/([^\"]+).html)\"><img src=\"[^\"]+/images/[^\"]+.gif\" alt=\"([^\"]+)\"\/></a>#",
// <a href="../../../modeling/emf/tests/2.2.4/R200710030400/200710030432/results/svt.html" class="fail">1 F</a>
"#<a href=\"([^\"]+/results/([^\"]+).html)\" class=\"[^\"]+\">([^\<]+)</a>#",
);
$failedPattern =
// <a href="../../../modeling/emf/tests/2.4.0/N200712241351/200712241410/testlog.txt"><img src="/modeling/images/not.gif" alt="FAILED"/></a>
"#<a href=\"([^\"]+/modeling/emf/(tests)/[^\"]+)\"><img src=\"[^\"]+/images/[^\"]+.gif\" alt=\"([^\"]+)\"\/></a>#"
;
$foundURLs = array();
foreach ($patterns as $pattern)
{
$set = null;
$out = array();
$outFail = array();
preg_match_all($pattern, $summary, $out, PREG_SET_ORDER);
preg_match_all($failedPattern, $summary, $outFail, PREG_SET_ORDER);
/* [1] => ../../../modeling/emf/tests/2.2.4/R200710030400/200710030422/results/bvt.html
[2] => bvt
[3] => OK
*/
$sets = sizeof($out) > 0 ? $out : $outFail;
if ($debug > 0) {
print "\n-------2-------\n<br/><pre>"; print_r($sets); print "</pre><br/>\n";
}
foreach ($sets as $set)
{
if (!in_array($set[1], $foundURLs)) {
$foundURLs[] = $set[1];
$url = str_replace("../../..", "http://" . $_SERVER["SERVER_NAME"], $set[1]);
$miniSummary .= " [" . strtoupper($set[2]) . ": " . $set[3] . "]";
$textSummary .= strtoupper($set[2]) . " Test (" . $set[3] . ")\t" . $url . "\n";
}
}
}
return array($miniSummary,$textSummary);
}
function outputBuild($branch, $ID, $c)
{
global $PWD, $dls, $filePre, $proj, $showBuildResults, $sortBy, $projct, $jdk14testsPWD, $jdk50testsPWD, $jdk60testsPWD, $testsPWD, $deps, $PR, $hiddenBuilds;
# suppress hidden builds for public server
foreach ($hiddenBuilds as $hb) {
if (trim($hb) == "$PR/$branch/$ID")
{
debug("Build $PR/$branch/$ID is hidden, pending mirror replication.", 1);
return "";
}
}
$pre2 = (is_dir("$PWD/$branch/$ID/eclipse/$ID/") ? "eclipse/$branch/$ID/" : "");
$zips_in_folder = loadDirSimple("$PWD/$branch/$ID/", "(\.zip|\.tar\.gz)", "f");
$ziplabel = (sizeof($zips_in_folder) < 1) ? $ID :
preg_replace("/(.+)\-([^\-]+)(\.zip|\.tar\.gz)/", "$2", $zips_in_folder[0]); // grab first entry
// generalize for any relabelled build, thus 2.0.1/M200405061234/*-2.0.2.zip is possible; label = 2.0.2
$IDlabel = $ziplabel;
$opts = loadBuildConfig("$PWD/$branch/$ID/build.cfg", $deps);
$ret = "<li>\n";
$buildResults = $showBuildResults ? showBuildResults("$PWD/", "$branch/$ID/") && !isset($opts["hudson.job.url"]) : array("");
$extraTestsResults = $showBuildResults ? getExtraTestsResults($branch, $ID) : array(array(), "", "");
$ret .= "<div>" . $buildResults[0] . join("", preg_replace("/^(.+)$/", "<span>$1</span>", $extraTestsResults[0])) . "</div>";
$ret .= "<a href=\"javascript:toggle('r$ID')\">" .
"<i>" . ($sortBy == "date" && $IDlabel != $branch ? "$branch / " : "") . "$IDlabel</i> " .
"(" . IDtoDateStamp($ID, 2) . ")" .
"</a>" .
"<a name=\"$ID\"></a> " .
"<a href=\"?showAll=1&amp;hlbuild=$ID" .
($sortBy == "date" ? "&amp;sortBy=date" : "") .
"&amp;project=$projct#$ID\">" .
"<img alt=\"Link to this build\" src=\"/gmf-tooling/images/download-expand.png\"/>" .
"</a>" .
((isset($opts["noclean"]) && $opts["noclean"]) || is_dir("$PWD/$branch/$ID/eclipse/$ID") ? doNoclean("$PWD/$branch/$ID") : "");
$ret .= "<ul id=\"r$ID\"" . (($c == 0 && !isset($_GET["hlbuild"])) || isset($_GET["hlbuild"]) && $ID == $_GET["hlbuild"] ? "" : " style=\"display: none\"") . ">\n";
if (!isset($filePre[$proj]) && isset($filePre["/"]))
{
$filePre[$proj] = $filePre["/"];
}
if (!isset($filePre[$proj]))
{
$topProj = preg_replace("#.+/(.+)#","$1", $PR);
$filePre[$proj] = array($projct);
}
$ret .= createFileLinks($dls, $PWD, $branch, $ID, $pre2, $filePre[$proj], $ziplabel);
$ret .= $extraTestsResults[2];
$ret .= getBuildArtifacts("$PWD", "$branch/$ID");
$ret .= "</ul>\n";
$ret .= "</li>\n";
return $ret;
}
function doNoclean($dir)
{
global $PR,$projct;
$sizeondisk = pretty_size(dirsize($dir));
$versionAndBuildID = explode("/",$dir); $versionAndBuildID = $versionAndBuildID[sizeof($versionAndBuildID) - 2] . "/" . $versionAndBuildID[sizeof($versionAndBuildID) - 1];
return " <a href=\"/$PR/$projct/build/clean.php?versionAndBuildID=$versionAndBuildID\"><span class=\"noclean\"><acronym title=\"Failed builds do not purge temp files automatically -- click here to do so!\">Size on disk: $sizeondisk</acronym></span>" .
" <img alt=\"Purge releng materials before promoting this build!\" src=\"/modeling/images/bug.png\"/></a>";
}
function loadBuildConfig($file, $deps)
{
$lines = (is_file($file) && is_readable($file) ? file($file) : array());
$opts = array();
foreach ($lines as $z)
{
$regs = null;
// Modeling build style
if (preg_match("/^((?:" . join("|", array_keys($deps)) . ")(?:DownloadURL|File|BuildURL))=(.{2,})$/", $z, $regs))
{
$opts[$regs[1]] = $regs[2];
}
// Athena build style
else if (preg_match("/^(.+\.(?:download\.url|file|buildurl|url|name|id))=(.{2,})$/", $z, $regs))
{
#print "[ " . $regs[1] . " = " . $regs[2] . " ]<br/>";
$opts[$regs[1]] = $regs[2];
}
else if (preg_match("#^(buildAlias|noclean)=(.+)$#", $z, $regs))
{
$opts[$regs[1]] = trim($regs[2]);
}
else if (preg_match("#^(javaHome|JAVA_HOME|java.home)=(.+)$#", $z, $regs))
{
# TODO: change this to an exec to use java --version instead
# TODO: why is build.cfg not being found?
$rp = realpath($regs[2]);
$opts[$regs[1]] = ($rp && $rp != $regs[2] ? preg_replace("#.+/([^/]+)#", "$1", $regs[2]) . " (" . preg_replace("#.+/([^/]+)#", "$1", $rp) . ")" : preg_replace("#.+/([^/]+)#", "$1", $regs[2]));
}
}
return $opts;
}
function getBuildArtifacts($dir, $branchID)
{
global $downloadPre, $PR, $deps, $proj, $projct, $debug;
$PR = "$PR" . ($proj != "/" ? $proj : ""); # to allow for modeling/emf
$mid = "$downloadPre/$PR" . "/downloads/drops/";
$file = "$dir/$branchID/build.cfg";
$havedeps = array();
$opts = loadBuildConfig($file, $deps);
$ret = "";
# ANy: Added to depict details via Hudson build job
if (isset($opts["hudson.job.url"])){
$ret .= "<li>\n";
$ret .= "<img src=\"/modeling/images/dl-more.gif\" alt=\"More info about this build\"/> Build Details\n";
$ret .= "<ul>\n";
$ret .= "<li>Hudson job <a href=\"" . $opts["hudson.job.url"] . "\">" . $opts["hudson.job.name"] . " #" . $opts["hudson.job.id"] . "</a></li>\n";
$ret .= "</ul>\n";
$ret .= "</li>\n";
}
return $ret;
}
function hudsonURLcleanup($vanity)
{
$vanity = preg_replace("#hudson job cbi#","",$vanity);
$vanity = preg_replace("#Snapshot|snapshot#","",$vanity);
$vanity = preg_replace("#(lastSuccessful[^ ]+|lastStable[^ ]+)#","",$vanity);
$vanity = preg_replace("#artifact#","",$vanity);
$vanity = preg_replace("#base#","",$vanity);
$vanity = preg_replace("#[ ]+#"," ",$vanity);
return $vanity;
}
function showToggle($showAll, $showMax, $sortBy, $count)
{
global $projct;
$ret = "<li><a href=\"" . $_SERVER["PHP_SELF"] . "?project=".$projct."&amp;showAll=" . ($showAll == "1" ? "" : "1") . "&amp;showMax=$showMax&amp;sortBy=$sortBy\">" . ($showAll != "1" ? "show all $count" : "show only $showMax") . "...</a></li>\n";
return $ret;
}
function showArchived($oldrels)
{
global $PR, $proj;
$thresh = sizeof($oldrels) > 5 ? ceil(sizeof($oldrels)/3) : 6;
#print "<div id=\"midcolumn\">\n";
print "<h3><a name=\"archives\"></a>Archived Releases</h3>\n";
print "<p>Older " . project_name($proj) . " releases have been moved to archive.eclipse.org, and can be accessed here:</p>";
print '<table cellspacing="0" cellpadding="0" border="0" style="margin:0"><tr valign="top">'."\n";
print "<td><ul id=\"archives\">\n";
$cnt=-1;
foreach (array_keys($oldrels) as $z)
{
$cnt++;
if ($cnt % $thresh == 0)
{
print "</ul></td><td><ul id=\"archives\">\n";
}
if (!$z || $oldrels[$z] === null)
{
$cnt--; # spacer
}
else if (!is_array($oldrels[$z]))
{
print "<li style=''><a href=\"http://archive.eclipse.org/$PR$proj/downloads/drops/$z/R$oldrels[$z]/\">$z</a> (" . IDtoDateStamp($oldrels[$z], 2) . ")</li>\n";
}
else // optional syntax with hardcoded datestamp and URL, like for old EMF/SDO/XSD 1.x builds
{
print "<li><a href=\"" . $oldrels[$z][1] . "\">$z</a> (" . $oldrels[$z][0] . ")</li>\n";
}
}
print "</ul>\n";
print "</td>";
print "</tr></table>\n";
#print "</div>\n";
}
function getTestResultsJUnitXML($file)
{
$data = array();
exec("head -3 $file | grep \"<testsuite\"", $data); // possibly faster than file($file), but might break on some servers (eg., exec() is disabled on www.eclipse.org, so warnings are thrown)
foreach ($data as $line)
{
// <testsuite errors="0" failures="0" ...>
$matches = null;
if (preg_match("/<testsuite errors=\"(\d+)\" failures=\"(\d+).+\"/", $line, $matches))
{
return array($matches[1], $matches[2], 0);
}
else if (preg_match("/<testsuite.+failures=\"(\d+)\" errors=\"(\d+)\".+/", $line, $matches))
{
return array($matches[2], $matches[1], 0);
}
else if (false!==strpos($line,"<testsuites/>") || false!==strpos($line,"<testsuites />") || false!==strpos($line,"<testsuites></testsuites>") || false!==strpos($line,"Failed to invoke suite")) // no tests run!
{
return array(0, 0, 1);
}
}
return array(0, 0, 0); # Errors, Failures, DNRs
}
?>