| <?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 $rssfeed, $showMax, $showAll, $sortBy; |
| global $showMax, $showAll, $sortBy; |
| if (sizeof($releases)>0) |
| { |
| print "<div class=\"homeitem3col\">\n"; |
| #print "<a name=\"latest\"></a><h3>${rssfeed}Latest $label</h3>\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=\"/modeling/images/dl-icon-update-zip.gif\"/> <b style=\"color:green\">All-In-One Update Site</b></acronym>" => "gmf-notation-Update", |
| "SDK (Runtime, Source)" => "gmf-sdk-notation", |
| "Runtime" => "gmf-notation", |
| "Automated Tests" => "gmf-tests-notation" |
| )); |
| } |
| |
| $echo_out_all = ""; |
| |
| if (!$showBuildResults) |
| { |
| foreach (array_keys($dls[$proj]) as $z) |
| { |
| $echo_out_all .= "<li class=\"separator\"><img src=\"/modeling/images/dl.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 |
| } |
| |
| $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-incubation-$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/$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; |
| } |
| } |
| 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=\"/modeling/images/dl.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&project=$projct&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&project=$projct&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 = "$downloadPre/$topLevel/$proj/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;\"> " . pretty_size(filesize("$PWD$url")) . " (<a href=\"" . "http://download.eclipse.org" . |
| "$mid$md5file\">md5</a>)</span>"; break; |
| } |
| } |
| #return $md5AlignRight ? $out . "<a href=\"$downloadScript$mid$url\">$label</a>" : |
| # "<a href=\"$downloadScript$mid$url\">$icon</a> <a href=\"$downloadScript$mid$url\">$label</a>" . $out; |
| return "<span style=\"float:left;clear:left;\"><a href=\"$downloadScript$mid$url\">$icon</a> <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=\"/modeling/images/dl.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&hlbuild=$ID" . |
| ($sortBy == "date" ? "&sortBy=date" : "") . |
| "&project=$projct#$ID\">" . |
| "<img alt=\"Link to this build\" src=\"/modeling/images/link.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."&showAll=" . ($showAll == "1" ? "" : "1") . "&showMax=$showMax&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 |
| } |
| ?> |